Помощь - Поиск - Пользователи - Календарь
Полная версия: Записи, файл
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
Merlin
Условие :

Создать типизированный файл, запись которого имеет следующую структуру: номер УДК, фамилию и инициалы автора, название книги, год издания, количество экземпляров данной книги в библиотеке. Вывести на экран в алфавитном порядке название книг, количество экземпляров которых больше 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.
volvo
У тебя проблемы... В С++ нет типизированных файлов. Либо потоки, либо бестиповые файлы, но никак не типизированные...
Merlin
Я знаю, что нет в С++ типизир. файлов, это задание для Паскалевской задачи..

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

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

#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

Что не так ?
volvo
Цитата
Что не так ?
А что, память под 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;
}
Merlin
#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 вроде как объявлен
volvo
Это я забыл исправить...

Не объявлен у тебя p_name... Только name объявлен...
Merlin
Всё исправил, только программа не хочет запускаться.
Может это из за того, что у меня компилятор 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;
}
volvo
Что значит "не хочет запускаться"? Ты ничего и не увидишь - просто будет создан файл "data.txt"... Я тоже проверял на TC++ 3.0
Merlin
А как сделать чтобы можно было самому вводить : год, номер Удк, кол-во книг, название ?
Как в Паскале то есть.
А то мы эти потоки не проходили ещё, а задачу из Паскаля в С++ делать надо.
volvo
Ха... Так в том-то и фишка, что потоку все равно, откуда его прочтут, и кто!!! Можно работать с файлом, можно - с консолью... Если работает вывод в файл, то и это обязано сработать:
cout << a << b;

Получишь вывод на экран. То же самое касается и ВВОДА. Добейся правильного чтения из файла, и сможешь читать из консоли smile.gif
Merlin
#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
volvo
Нет... Это не ко мне. В чистом С я не очень sad.gif

"Королевство маловато... Разгуляться негде." (С)
Merlin
Подскажи как тогда мне сделать чтобы на экране я мог вводить инфу о книгах... ??
А то что то не пойму, в той проге , где потоки, вообще что то сортируется.... ?
volvo
Так лучше?
#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 - не нужно изобретать велосипед...
Merlin
Спасибо за помощь. Теперь и задача работает и мне понятно, почему она работает. cool.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.