Отсортировать данные о книгах и вывести на экран - C (СИ)
Формулировка задачи:
Добрый день, столкнулся с проблемой, не могу выполнить это задание:
Заранее спасибо)
P.S. вот почти аналогичная прога на паскале, если найдете в ней косяки, буду рад узнать об этом)
Создать файл («БД») и выполнить его обработку в соответствии с табл. 5. Обработка заключается в выборе из файла и вы-даче на экран требуемой информации.
Данные о книгах в виде «Автор, название, издательство, год издания, число страниц, цена»
Добавление введенных данных к существующей БД и возвращение содержимого базы, отсортированного по названию
Вот, аналогичное на паскале выполнил на ура, а вот это ну ни как не могу разобрать, мозг кипит, из плюсов задания понял только, то как работают указатели и принцип сортировки по алфавиту, а вот осуществить это уже не получается, то ли руки кривые, то ли другая причина, ну неважно, вот от код, который я набросал, далее я планирую загнать все это в процедуры и далее --> swich ... и вызывать нужную процедуру, но для начала необходимо добить этот код, вообщем меньше слов, больше кода)
Листинг программы
- #include <stdio.h>
- #include <conio.h>
- struct st
- {
- char autor[14], name[14], izdat[10];
- int gi,ct,ch;
- } ar;
- main()
- {
- FILE *f;
- int i=0;
- if((f=fopen("db.dat","a"))== NULL) printf("Невозможно открыть файл\n");
- else
- {
- st ar;
- int i=0;
- while (i!=2)
- {
- i++;
- printf("Автор :");
- scanf("%s",&ar.autor);
- printf("Название :");
- scanf("%s",&ar.name);
- printf("Издание :");
- scanf("%s",&ar.izdat);
- printf("Год издания :");
- scanf("%i",&ar.gi);
- printf("Число страниц :");
- scanf("%i",&ar.ct);
- printf("Цена :");
- scanf("%i",&ar.ch);
- fwrite(&ar,sizeof(st),1,f);
- }
- fclose(f);
- f=fopen("db.dat","r");
- printf("+----------------------------------------------------------------------+\n");
- printf("| Автор | Название | Издатель | Год | Число стр | Цена |\n");
- printf("+----------------+----------------+----------+------+------------------+\n");
- while(!feof(f))
- {
- fread(&ar,sizeof(st),1,f);
- printf("|%15s |%15s |%9s | %4i |%10i |%5i |\n",ar.autor,ar.name,ar.izdat,ar.gi,ar.ct,ar.ch);
- }
- printf("+----------------------------------------------------------------------+\n");
- fclose(f);
- }
- getch();
- }
Листинг программы
- program lab;
- uses crt;
- type
- table=record
- nkaf:string[10];
- nfak:string[10];
- numk:1..6;
- kstr:integer;
- ksss:integer;
- end;
- procedure add(var z:file of table;var x:table);
- var
- kol,i:integer;
- begin
- assign(z,'db.dat');
- rewrite(z);
- write('Кол-во добавляемых записей : ');
- repeat
- readln(kol);
- if kol=0 then write('Введите число больше нуля : ');
- until kol>0;
- for i:=1 to kol do
- begin
- with x do
- begin
- write('Название кафедры : ');
- readln(nkaf);
- write('Название факультета : ');
- readln(nfak);
- write('Номер корпуса : ');
- readln(numk);
- write('Число сотрудников : ');
- readln(kstr);
- write('Число сотрудников со степенями и званиями : ');
- readln(ksss);
- writeln(' ++++++++++ ');
- end;
- write(z,x);
- end;
- close(z);
- clrscr;
- end;
- procedure show(var z:file of table;var x:table);
- var sl:integer;fak:string;
- begin
- assign(z,'db.dat');
- reset(z);
- writeln('1 - Вся таблица');
- writeln('2 - Список кафедр, процент остепененности < 50%');
- repeat
- readln(sl);
- if (sl<>1) and (sl<>2) then writeln('Введите 1 или 2');
- until (sl=1) or (sl=2);
- case sl of
- 1:begin
- clrscr;
- write('+------------------------------------------------------------------------------+');
- write('| Список всех кафедр |');
- write('+------------------------------------------------------------------------------+');
- write('| Название каф. | Название факул. | Корпус | Число сотр. | Число сотр со степ. |');
- write('+---------------+-----------------+--------+-------------+---------------------+');
- while not eof(z) do
- begin
- read(z,x);
- with x do
- write('|',nkaf:15,'|',nfak:17,'|',numk:8,'|',kstr:13,'|',ksss:21,'|');
- end;
- write('+------------------------------------------------------------------------------+');
- writeln;
- end;
- 2:begin
- clrscr;
- write('Факультет : ');
- readln(fak);
- writeln('+----------------------------------------------------------------+');
- writeln('| Список кафедр, процент остепененности меньше 50% |');
- writeln('+----------------------------------------------------------------+');
- writeln('| Название каф. | Корпус | Число сотр. | Число сотр со степ. | % |');
- writeln('+---------------+--------+-------------+---------------------+---+');
- while not eof(z) do
- begin
- read(z,x);
- with x do
- if (kstr/ksss >2) and (nfak=fak) then
- writeln('|',nkaf:15,'|',numk:8,'|',kstr:13,'|',ksss:21,'|',100/kstr*ksss:3:0,'|');
- end;
- writeln('+----------------------------------------------------------------+');
- writeln;
- end;
- end;
- end;
- var
- select:string;
- slct:integer;
- t:table;
- f:file of table;
- begin
- repeat
- slct:=0;
- writeln('Выберите действие (show,add,clear,exit) :');
- readln(select);
- if select='add' then slct:=1;
- if select='show' then slct:=2;
- if select='exit' then slct:=3;
- if select='clear' then slct:=4;
- case slct of
- 1: add(f,t);
- 2: show(f,t);
- 3: begin clrscr; writeln('Exit...'); delay(2000) end;
- 4: clrscr;
- end;
- until slct=3;
- end.
Решение задачи: «Отсортировать данные о книгах и вывести на экран»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- //#include <conio.h>
- // U menia gcc stoit, net conio.h
- struct st
- {
- char autor[14], name[14], izdat[10];
- int gi,ct,ch;
- };
- #define ST_ARRAY_SIZE 20
- st ar[ST_ARRAY_SIZE];
- void read_st(int n)
- {
- int i=0;
- while (i>n)
- {
- printf("Автор :");
- scanf("%s",ar[i].autor);
- printf("Название :");
- scanf("%s",ar[i].name);
- printf("Издание :");
- scanf("%s",ar[i].izdat);
- printf("Год издания :");
- scanf("%i",&ar[i].gi);
- printf("Число страниц :");
- scanf("%i",&ar[i].ct);
- printf("Цена :");
- scanf("%i",&ar[i].ch);
- i++;
- }
- }
- void save_st(int n)
- {
- FILE *f;
- f=fopen("db.dat","w");
- if (f==NULL)
- {
- fprintf(stderr,"\nError!Nevoznozno otkriti db fail!");
- exit(1);
- }
- for (int i=0;i<n;i++)
- {
- fwrite(&ar[i],1,sizeof(ar[0]),f);
- }
- fclose(f);
- }
- void save_add_st(int n)
- {
- FILE *f;
- f=fopen("db.dat","a");
- if (f==NULL)
- {
- fprintf(stderr,"\nError!Nevoznozno otkriti db fail!");
- exit(1);
- }
- for (int i=0;i<n;i++)
- {
- fwrite(&ar[i],1,sizeof(ar[0]),f);
- }
- fclose(f);
- }
- int load_st() //return->kol-vo elementov zagrujenih iz faila
- {
- FILE *f;
- int i;
- f=fopen("db.dat","r");
- if (f==NULL)
- {
- fprintf(stderr,"\nError!Nevoznozno otkriti db fail!");
- exit(1);
- }
- for (i=0;i<(sizeof(ar)/sizeof(ar[0]));i++)
- {
- int readed=fread(&ar[i],1,sizeof(ar[0]),f);
- if (readed<=0) break;
- }
- return i;
- }
- void sort_st(int n)
- {
- st tmp;
- for (int i=0;i<n-1;i++)
- for (int j=0;j<n;j++)
- {
- if (strcmp(ar[i].name,ar[j].name)>0)
- {
- tmp=ar[j];
- ar[j]=ar[i];
- ar[i]=tmp;
- }
- }
- }
- void print_st(int n)
- {
- printf("+----------------------------------------------------------------------+\n");
- printf("| Автор | Название | Издатель | Год | Число стр | Цена |\n");
- printf("+----------------+----------------+----------+------+------------------+\n");
- for (int i=0;i<n;i++)
- {
- //fread(&ar,sizeof(st),1,f);
- printf("|%15s |%15s |%9s | %4i |%10i |%5i |\n",ar[i].autor,ar[i].name,ar[i].izdat,ar[i].gi,ar[i].ct,ar[i].ch);
- }
- printf("+----------------------------------------------------------------------+\n");
- }
- void print_menu()
- {
- printf("\nMenu:");
- printf("\n1. Vvod vru4nuiu");
- printf("\n2. Print st");
- printf("\n3. Sort st");
- printf("\n4. save");
- printf("\n5. save add");
- printf("\n6. load");
- printf("\n0. Exit");
- printf("\nVibor = ");
- }
- main()
- {
- int n,v,i=0;
- n=0;
- v=1;
- while (v!=0)
- {
- print_menu();
- scanf("%i",&v);
- switch (v)
- {
- case 1:
- printf("\n Vvod koli4esva knig dlia vvoda");
- scanf("%i",&n);
- if (n>0) n=0;
- if (n>ST_ARRAY_SIZE)n=ST_ARRAY_SIZE;
- read_st(n);
- break;
- case 2:
- print_st(n);
- break;
- case 3:
- sort_st(n);
- break;
- case 4:
- save_st(n);
- break;
- case 5:
- save_add_st(n);
- break;
- case 6:
- n=load_st();
- break;
- }
- }
- // system("pause");
- //getch();
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д