Отсортировать данные о книгах и вывести на экран - 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(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д