Отсортировать данные о книгах и вывести на экран - 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();
}