Отсортировать данные о книгах и вывести на экран - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый день, столкнулся с проблемой, не могу выполнить это задание:

Создать файл («БД») и выполнить его обработку в соответствии с табл. 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();
}
Заранее спасибо) P.S. вот почти аналогичная прога на паскале, если найдете в ней косяки, буду рад узнать об этом)
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();
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5
Похожие ответы