IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Записи, файл, С/C++
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


Условие :

Создать типизированный файл, запись которого имеет следующую структуру: номер УДК, фамилию и инициалы автора, название книги, год издания, количество экземпляров данной книги в библиотеке. Вывести на экран в алфавитном порядке название книг, количество экземпляров которых больше 3.
Создание и обработку файла оформить в виде подпрограмм.

Помогите переделать эту задачу в ( С/С++) mega_chok.gif

Вот код Паскаля :
uses crt;
const n=2;
type knigi=record
fio,name:string[20];
udk:real;
date,kol:integer;
end;
var f:file of knigi;
a:array [1..n] of knigi;
s:string;
i,vybor:integer;
{Создание}
procedure new;
Begin
rewrite(f);
for i:=1 to n do
begin
clrscr;
write('Введите номер Удк');
readln(a[i].udk);
write('Введите Фио ');
readln(a[i].fio);
write('Введите название книги ');
readln(a[i].name);
write('Введите год издания ');
readln(a[i].date);
write('Введите кол-во экземпляров ');
readln(a[i].kol);
write(f,a[i]);
end;
close(f);
End;
{Чтение}
procedure open;
Begin
reset(f);
for i:=1 to n do read(f,a[i]);
close(f);
End;
{Вывод на экран}
procedure print;
var j:integer;
buf:knigi;
Begin
clrscr;
for i:=1 to n-1 do
for j:=i+1 to n do if a[i].name>a[j].name then
begin
buf:=a[i];
a[i]:=a[j];
a[j]:=buf;
end;
writeln(' УДК ФИО Название Дата Кол-во');
for i:=1 to n do if a[i].kol > 3 then
writeln(a[i].udk:5:0,' ',a[i].fio:20,' ',a[i].name:20,' ',a[i].date:5,' ',a[i].kol);
End;
BEGIN
clrscr;
write('1 -Создать, 0 - Открыть ');
readln(vybor);
write(' Полный путь к файлу');
readln(s);
assign(f,s);
if vybor=1 then new;
if vybor=0 then open;
print;
readln;
END.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






У тебя проблемы... В С++ нет типизированных файлов. Либо потоки, либо бестиповые файлы, но никак не типизированные...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


Я знаю, что нет в С++ типизир. файлов, это задание для Паскалевской задачи..

Вот пример как мне надо сделать эту задачу... :
Только я не пойму как мне переделать это для моего условия.

#include <stdio.h>
#define SIZE 100
struct y4astnik {
char name[SIZE],
fam[SIZE],
country[SIZE];
int res[4];
};
void *readln(char *s, int size)
{
int c;
while ((c = getchar()) != '\n' && size-- > 0)
*s++ = c;
*s = 0;
}
int summ(struct y4astnik *p)
{
int i, s;
for (s = i = 0; i < 4; i++)
s += p->res[i];
return s;
}
int main(void) {
struct y4astnik ppl[50];
int i, j;
int n, max;
FILE *f;
char name[256];
printf("total = ");
scanf("%i", &n);
for (i = 0; i < n; i++)
{
readln(ppl[i].name, 1);
printf("Y4astnik %i\n", i + 1);
printf("Name: ");
readln(ppl[i].name, SIZE);
printf("Fam: ");
readln(ppl[i].fam, SIZE);
printf("Country: ");
readln(ppl[i].country, SIZE);
for (j = 0; j < 4; j++)
{
printf("res[%i]: ", j + 1);
scanf("%i", &ppl[i].res[j]);
}
}
max = 0;
for (i = 1; i < n; i++)
if (summ(&ppl[i]) > summ(&ppl[max]))
max = i;
printf("Winner is %i!\n", max + 1);
printf("Name: %s\nFam: %s\nCountry: %s\n", ppl[max].name,
ppl[max].fam, ppl[max].country);
printf("FileName: ");
readln(name, 1);
readln(name, 255);
f = fopen(name, "w");
for (i = 0; i < sizeof(struct y4astnik) * n; i++) {
fprintf(f, "%c", *((char *)ppl + i));
}
fclose(f);
return 0;
}


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +



#include <fstream.h>
struct book
{
book(const char* p_author, const char* p_name,
unsigned int p_year=2006, unsigned p_count=1)
: author(p_author), name(p_name), year(p_year), count(p_count) {}
char *author, *name;
unsigned int year, count;
};
ofstream& operator<<(ofstream& stream, const book& obj)
{
stream<<obj.author<<endl<<obj.name<<endl<<
obj.year<<endl<<obj.count<<endl;
return stream;
}
ifstream& operator>>(ifstream& stream, book& obj)
{
stream>>obj.author>>obj.name>>obj.year>>obj.count;
return stream;
}
int main()
{
book a("a","b"), c("c","d");
ofstream stream("data.dat");
stream<<a<<b;
return 0;
}



Вот что у меня примерно получилось..
Но всё равно ошибки wink.gif

Что не так ?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
Что не так ?
А что, память под char * уже выделять не надо?
#include <string.h>
#include <fstream.h>

struct book
{
book(const char *p_author, const char* p_name,
unsigned int p_year=2006, unsigned p_count=1):
year(p_year), count(p_count)
{
author = new char[strlen(p_author) + 1];
strcpy(author, p_author);
name = new char[strlen(p_name) + 1];
strcpy(name, p_name);
}

~book() {
delete name;
delete author;
}

char *author, *name;
unsigned int year, count;
};

ofstream& operator<<(ofstream& stream, const book& obj) {
stream<<obj.author<<endl<<obj.name<<endl<<
obj.year<<endl<<obj.count<<endl;
return stream;
}
ifstream& operator>>(ifstream& stream, book& obj) {
stream >> obj.author >> obj.name>>obj.year>>obj.count;
return stream;
}

int main() {
book a("a","b"), b("c","d");
ofstream stream("data.txt");
stream << a << b;
return 0;
}
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


#include <string.h>
#include <fstream.h>

struct book
{
book(const char *p_author, const char* p_name,
unsigned int p_year=2006, unsigned p_count=1):
year(p_year), count(p_count)
{
author = new char[strlen(p_author) + 1];
strcpy(author, p_author);
name = new char[strlen(p_name) + 1];
strcpy(name, p_name);
}

~book() {
delete p_name; <----------------------------------- Вот здесь пишет неизв. символ 'p_name '
delete author;
}

char *author, *name;
unsigned int year, count;
};

ofstream& operator<<(ofstream& stream, const book& obj) {
stream<<obj.author<<endl<<obj.name<<endl<<
obj.year<<endl<<obj.count<<endl;
return stream;
}
ifstream& operator>>(ifstream& stream, book& obj) {
stream >> obj.author >> obj.name>>obj.year>>obj.count;
return stream;
}

int main() {
book a("a","b"), b("c","d");
ofstream stream("data.txt");
stream << a << b;
return 0;
}




Спасибо за исправление, но почему комилятор выдаёт ошибку: я отметил в коде "<-----------------"
Ведь p_name вроде как объявлен


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Это я забыл исправить...

Не объявлен у тебя p_name... Только name объявлен...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


Всё исправил, только программа не хочет запускаться.
Может это из за того, что у меня компилятор TC++ 3.0 ? dry.gif , но мне только на нём надо делать.

#include <string.h>
#include <fstream.h>

struct book
{
book(const char *p_author, const char* p_name,
unsigned int p_year=2006, unsigned p_count=1):
year(p_year), count(p_count)
{
author = new char[strlen(p_author) + 1];
strcpy(author, p_author);
name = new char[strlen(p_name) + 1];
strcpy(name, p_name);
}

~book() {
delete p_name; delete author;
}

char *author, *name, *p_name;
unsigned int year, count;
};

ofstream& operator<<(ofstream& stream, const book& obj) {
stream<<obj.author<<endl<<obj.name<<endl<<
obj.year<<endl<<obj.count<<endl;
return stream;
}
ifstream& operator>>(ifstream& stream, book& obj) {
stream >> obj.author >> obj.name>>obj.year>>obj.count;
return stream;
}

int main() {
book a("a","b"), b("c","d");
ofstream stream("data.txt");
stream << a << b;
return 0;
}


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Что значит "не хочет запускаться"? Ты ничего и не увидишь - просто будет создан файл "data.txt"... Я тоже проверял на TC++ 3.0
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


А как сделать чтобы можно было самому вводить : год, номер Удк, кол-во книг, название ?
Как в Паскале то есть.
А то мы эти потоки не проходили ещё, а задачу из Паскаля в С++ делать надо.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Ха... Так в том-то и фишка, что потоку все равно, откуда его прочтут, и кто!!! Можно работать с файлом, можно - с консолью... Если работает вывод в файл, то и это обязано сработать:
cout << a << b;

Получишь вывод на экран. То же самое касается и ВВОДА. Добейся правильного чтения из файла, и сможешь читать из консоли smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


#include <stdio.h>
#include <conio.h>
#include<string.h>
#include<iostream.h>
#define SIZE 100

int col;
FILE * file;

struct One{
char Name[SIZE];
char fio[SIZE];
int god,udk,kol;

};
void *readln(char *s, int size)
{
int c;
while ((c = getchar()) != '\n' && size-- > 0)
*s++ = c;
*s = 0;
}

One Knigi[50];
int i,j;
One buf[50];
void Out()

{ for(int i=0;i<col-1;i++)
for(j=i+1;j<col;j++)
if( Knigi[i].Name>Knigi[j].Name)
{ buf=Knigi[i];
Knigi[i]=Knigi[j];
Knigi[j]=buf;
}
if(Knigi[i].kol>3)
{
printf(file, "%s\n", Knigi[i].Name);
printf(file, "%s\n", Knigi[i].fio);
printf(file, "%d\n", Knigi[i].udk);
printf(file, "%d\n", Knigi[i].kol);
printf(file, "%d\n", Knigi[i].god);
}
}

void main()
{
file = fopen("Out.txt", "w");

clrscr();
printf("\n\n Vvedite kolichestvo sotrudnikov v faile ");
scanf("%u", &col);
for(int i=0;i<col;i++)
{
printf("\n Name ");
readln( Knigi[i].Name,SIZE);
printf("\n Fio ");
readln( Knigi[i].fio, SIZE);
printf("\n Udk");
scanf("%i",&Knigi[i].udk);
printf("\n Kolichestvo");
scanf("%i",&Knigi[i].kol);
printf("\n God");
scanf("%i",&Knigi[i].god);
Out();

}
getche();
fclose(file);
}


Volvo помоги пожалуйста доделать задачу, надо чтобы она была решена без потоков nea.gif


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Нет... Это не ко мне. В чистом С я не очень sad.gif

"Королевство маловато... Разгуляться негде." (С)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


Подскажи как тогда мне сделать чтобы на экране я мог вводить инфу о книгах... ??
А то что то не пойму, в той проге , где потоки, вообще что то сортируется.... ?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Так лучше?
#include <stdio.h>
#include <conio.h>
#include <string.h>

#define SIZE 100

int col;
FILE * file;

typedef struct {

char Name[SIZE];
char fio[SIZE];
int god,udk,kol;

} One;

One Knigi[50];

void readln(char *s, int size) {
int c;
while ((c = getchar()) != '\n' && size-- > 0) *s++ = c;
*s = 0;
}

int sort_function(const void *a, const void *b) {

return( strcmp(((One *)a) -> Name,((One *)b) -> Name) );

}

void Out() {
int i;

qsort((void *)Knigi, col, sizeof(Knigi[0]), sort_function);

for(i = 0; i < col; ++i)
if(Knigi[i].kol > 3) {
fprintf(file,
"%s\n%s\n%d\n%d\n%d\n",
Knigi[i].Name, Knigi[i].fio,
Knigi[i].udk, Knigi[i].kol, Knigi[i].god);
}
}

void main() {
int i;
file = fopen("Out.txt", "w");

clrscr();
printf("\n\n Vvedite kolichestvo sotrudnikov v faile ");
scanf("%u", &col);
for(i=0;i<col;i++)
{
printf("\n Name ");
readln( Knigi[i].Name,SIZE);
printf("\n Fio ");
readln( Knigi[i].fio, SIZE);
printf("\n Udk");
scanf("%i",&Knigi[i].udk);
printf("\n Kolichestvo");
scanf("%i",&Knigi[i].kol);
printf("\n God");
scanf("%i",&Knigi[i].god);

}
Out();
getche();
fclose(file);
}


Только подправь процедуру readln, она не дает вводить "имя", сразу перескакивает на "фамилию"... А сортируется все с использованием стандартной функции qsort - не нужно изобретать велосипед...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 114
Пол: Мужской
Реальное имя: Ден

Репутация: -  0  +


Спасибо за помощь. Теперь и задача работает и мне понятно, почему она работает. cool.gif


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 0:42
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name