Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Записи, файл


Автор: Gromila 16.5.2006, 23:41
Условие :

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

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

Вот код Паскаля :



Код

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.
 

Автор: Mayk 17.5.2006, 06:36
Что не понятно конкретно? 

Автор: MAKCim 17.5.2006, 07:55
Код

struct book
{
    book(const string& p_author, const string& p_name,
        unsigned int p_year=2006, unsigned p_count=1)
        : author(p_author), name(p_name), year(p_year), count(p_count) {}

    string 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;
}
   

Автор: Gromila 17.5.2006, 14:45
Mayk 

Да мне почти ничего непонятно..работали раньше на Паскале, а тут С++ этот...С файлами у меня вообще проблемы...


------------------
MAKCim 

Спачибо за код, только он что то не хочет компилиться.. ошибку пишет в 4 строке, но т.к. я ничего не понимаю мне трудно исправить её.

  Может это из за того, что у меня компилятор  TC++ 3.0  

Автор: likehood 17.5.2006, 14:55
Цитата(Gromila @  17.5.2006,  15:45 Найти цитируемый пост)
Может это из за того, что у меня компилятор  TC++ 3.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;    
}
 

Автор: MAKCim 17.5.2006, 15:02
Цитата

Может это из за того, что у меня компилятор  TC++ 3.0   

возьми что по-новее или принципиально надо этот? 

Автор: Gromila 17.5.2006, 15:13
Принципиально надо TC  ++ 3.0, так в универе только в нём сказали делать...
   Спасибо ещё раз , что исправил код, но вот тут опять 2 ошибки вылезли.

Вот эти :


1). Cannot convert 'const char*' to 'char*'
2). Undefined symbol 'b' 

Автор: _hunter 17.5.2006, 15:51
1 -- ну и убери const из определения
2 -- объяви эту b 

Автор: Gromila 17.5.2006, 16:45
Цитата

1 -- ну и убери const из определения
2 -- объяви эту b  


Сделал, вот только всё равно не пашет. Если не трудно напишите код.

А вообще нужно делать что то наподобие вот этого, помогите пожалуйста smile , токо это не моя задача...

Код

#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; 
} 
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)