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

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

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

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

Создать файл («БД») и выполнить его обработку в соответствии с табл. 5. Обработка заключается в выборе из файла и вы-даче на экран требуемой информации.

Данные о книгах в виде «Автор, название, издательство, год издания, число страниц, цена»

Добавление введенных данных к существующей БД и возвращение содержимого базы, отсортированного по названию

Вот, аналогичное на паскале выполнил на ура, а вот это ну ни как не могу разобрать, мозг кипит, из плюсов задания понял только, то как работают указатели и принцип сортировки по алфавиту, а вот осуществить это уже не получается, то ли руки кривые, то ли другая причина, ну неважно, вот от код, который я набросал, далее я планирую загнать все это в процедуры и далее --> swich ... и вызывать нужную процедуру, но для начала необходимо добить этот код, вообщем меньше слов, больше кода)
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. struct st
  4. {
  5. char autor[14], name[14], izdat[10];
  6. int gi,ct,ch;
  7. } ar;
  8. main()
  9. {
  10. FILE *f;
  11. int i=0;
  12. if((f=fopen("db.dat","a"))== NULL) printf("Невозможно открыть файл\n");
  13. else
  14. {
  15. st ar;
  16. int i=0;
  17. while (i!=2)
  18. {
  19. i++;
  20. printf("Автор :");
  21. scanf("%s",&ar.autor);
  22. printf("Название :");
  23. scanf("%s",&ar.name);
  24. printf("Издание :");
  25. scanf("%s",&ar.izdat);
  26. printf("Год издания :");
  27. scanf("%i",&ar.gi);
  28. printf("Число страниц :");
  29. scanf("%i",&ar.ct);
  30. printf("Цена :");
  31. scanf("%i",&ar.ch);
  32. fwrite(&ar,sizeof(st),1,f);
  33. }
  34. fclose(f);
  35. f=fopen("db.dat","r");
  36. printf("+----------------------------------------------------------------------+\n");
  37. printf("| Автор | Название | Издатель | Год | Число стр | Цена |\n");
  38. printf("+----------------+----------------+----------+------+------------------+\n");
  39. while(!feof(f))
  40. {
  41. fread(&ar,sizeof(st),1,f);
  42. printf("|%15s |%15s |%9s | %4i |%10i |%5i |\n",ar.autor,ar.name,ar.izdat,ar.gi,ar.ct,ar.ch);
  43. }
  44. printf("+----------------------------------------------------------------------+\n");
  45. fclose(f);
  46. }
  47. getch();
  48. }
Заранее спасибо) P.S. вот почти аналогичная прога на паскале, если найдете в ней косяки, буду рад узнать об этом)
Листинг программы
  1. program lab;
  2. uses crt;
  3. type
  4. table=record
  5. nkaf:string[10];
  6. nfak:string[10];
  7. numk:1..6;
  8. kstr:integer;
  9. ksss:integer;
  10. end;
  11. procedure add(var z:file of table;var x:table);
  12. var
  13. kol,i:integer;
  14. begin
  15. assign(z,'db.dat');
  16. rewrite(z);
  17. write('Кол-во добавляемых записей : ');
  18. repeat
  19. readln(kol);
  20. if kol=0 then write('Введите число больше нуля : ');
  21. until kol>0;
  22. for i:=1 to kol do
  23. begin
  24. with x do
  25. begin
  26. write('Название кафедры : ');
  27. readln(nkaf);
  28. write('Название факультета : ');
  29. readln(nfak);
  30. write('Номер корпуса : ');
  31. readln(numk);
  32. write('Число сотрудников : ');
  33. readln(kstr);
  34. write('Число сотрудников со степенями и званиями : ');
  35. readln(ksss);
  36. writeln(' ++++++++++ ');
  37. end;
  38. write(z,x);
  39. end;
  40. close(z);
  41. clrscr;
  42. end;
  43. procedure show(var z:file of table;var x:table);
  44. var sl:integer;fak:string;
  45. begin
  46. assign(z,'db.dat');
  47. reset(z);
  48. writeln('1 - Вся таблица');
  49. writeln('2 - Список кафедр, процент остепененности < 50%');
  50. repeat
  51. readln(sl);
  52. if (sl<>1) and (sl<>2) then writeln('Введите 1 или 2');
  53. until (sl=1) or (sl=2);
  54. case sl of
  55. 1:begin
  56. clrscr;
  57. write('+------------------------------------------------------------------------------+');
  58. write('| Список всех кафедр |');
  59. write('+------------------------------------------------------------------------------+');
  60. write('| Название каф. | Название факул. | Корпус | Число сотр. | Число сотр со степ. |');
  61. write('+---------------+-----------------+--------+-------------+---------------------+');
  62. while not eof(z) do
  63. begin
  64. read(z,x);
  65. with x do
  66. write('|',nkaf:15,'|',nfak:17,'|',numk:8,'|',kstr:13,'|',ksss:21,'|');
  67. end;
  68. write('+------------------------------------------------------------------------------+');
  69. writeln;
  70. end;
  71. 2:begin
  72. clrscr;
  73. write('Факультет : ');
  74. readln(fak);
  75. writeln('+----------------------------------------------------------------+');
  76. writeln('| Список кафедр, процент остепененности меньше 50% |');
  77. writeln('+----------------------------------------------------------------+');
  78. writeln('| Название каф. | Корпус | Число сотр. | Число сотр со степ. | % |');
  79. writeln('+---------------+--------+-------------+---------------------+---+');
  80. while not eof(z) do
  81. begin
  82. read(z,x);
  83. with x do
  84. if (kstr/ksss >2) and (nfak=fak) then
  85. writeln('|',nkaf:15,'|',numk:8,'|',kstr:13,'|',ksss:21,'|',100/kstr*ksss:3:0,'|');
  86. end;
  87. writeln('+----------------------------------------------------------------+');
  88. writeln;
  89. end;
  90. end;
  91. end;
  92. var
  93. select:string;
  94. slct:integer;
  95. t:table;
  96. f:file of table;
  97. begin
  98. repeat
  99. slct:=0;
  100. writeln('Выберите действие (show,add,clear,exit) :');
  101. readln(select);
  102. if select='add' then slct:=1;
  103. if select='show' then slct:=2;
  104. if select='exit' then slct:=3;
  105. if select='clear' then slct:=4;
  106. case slct of
  107. 1: add(f,t);
  108. 2: show(f,t);
  109. 3: begin clrscr; writeln('Exit...'); delay(2000) end;
  110. 4: clrscr;
  111. end;
  112. until slct=3;
  113. end.

Решение задачи: «Отсортировать данные о книгах и вывести на экран»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. //#include <conio.h>
  5. // U menia gcc stoit, net conio.h
  6.  
  7. struct st
  8. {
  9.     char autor[14], name[14], izdat[10];
  10.     int gi,ct,ch;
  11. };
  12.  
  13. #define ST_ARRAY_SIZE 20
  14. st ar[ST_ARRAY_SIZE];
  15. void read_st(int n)
  16. {
  17.     int i=0;
  18.     while (i>n)
  19.     {
  20.  
  21.         printf("Автор :");
  22.         scanf("%s",ar[i].autor);
  23.         printf("Название :");
  24.         scanf("%s",ar[i].name);
  25.         printf("Издание :");
  26.         scanf("%s",ar[i].izdat);
  27.         printf("Год издания :");
  28.         scanf("%i",&ar[i].gi);
  29.         printf("Число страниц :");
  30.         scanf("%i",&ar[i].ct);
  31.         printf("Цена :");
  32.         scanf("%i",&ar[i].ch);
  33.         i++;
  34.     }
  35. }
  36. void save_st(int n)
  37. {
  38.     FILE *f;
  39.     f=fopen("db.dat","w");
  40.     if (f==NULL)
  41.     {
  42.         fprintf(stderr,"\nError!Nevoznozno otkriti db fail!");
  43.         exit(1);
  44.     }
  45.     for (int i=0;i<n;i++)
  46.     {
  47.         fwrite(&ar[i],1,sizeof(ar[0]),f);
  48.     }
  49.     fclose(f);
  50. }
  51. void save_add_st(int n)
  52. {
  53.     FILE *f;
  54.     f=fopen("db.dat","a");
  55.     if (f==NULL)
  56.     {
  57.         fprintf(stderr,"\nError!Nevoznozno otkriti db fail!");
  58.         exit(1);
  59.     }
  60.     for (int i=0;i<n;i++)
  61.     {
  62.         fwrite(&ar[i],1,sizeof(ar[0]),f);
  63.     }
  64.     fclose(f);
  65. }
  66. int load_st() //return->kol-vo elementov zagrujenih iz faila
  67. {
  68.     FILE *f;
  69.     int i;
  70.     f=fopen("db.dat","r");
  71.     if (f==NULL)
  72.     {
  73.         fprintf(stderr,"\nError!Nevoznozno otkriti db fail!");
  74.         exit(1);
  75.     }
  76.     for (i=0;i<(sizeof(ar)/sizeof(ar[0]));i++)
  77.     {
  78.         int readed=fread(&ar[i],1,sizeof(ar[0]),f);
  79.         if (readed<=0) break;
  80.     }
  81.     return i;
  82. }
  83. void sort_st(int n)
  84. {
  85.     st tmp;
  86.     for (int i=0;i<n-1;i++)
  87.         for (int j=0;j<n;j++)
  88.         {
  89.             if (strcmp(ar[i].name,ar[j].name)>0)
  90.             {
  91.                 tmp=ar[j];
  92.                 ar[j]=ar[i];
  93.                 ar[i]=tmp;
  94.             }
  95.  
  96.         }
  97. }
  98. void print_st(int n)
  99. {
  100.     printf("+----------------------------------------------------------------------+\n");
  101.     printf("|     Автор      |       Название | Издатель |  Год | Число стр | Цена |\n");
  102.     printf("+----------------+----------------+----------+------+------------------+\n");
  103.     for (int i=0;i<n;i++)
  104.     {
  105.         //fread(&ar,sizeof(st),1,f);
  106.         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);
  107.     }
  108.     printf("+----------------------------------------------------------------------+\n");
  109.  
  110. }
  111. void print_menu()
  112. {
  113.     printf("\nMenu:");
  114.     printf("\n1. Vvod vru4nuiu");
  115.     printf("\n2. Print st");
  116.     printf("\n3. Sort st");
  117.     printf("\n4. save");
  118.     printf("\n5. save add");
  119.     printf("\n6. load");
  120.     printf("\n0. Exit");
  121.     printf("\nVibor = ");
  122. }
  123. main()
  124. {
  125.  
  126.     int n,v,i=0;
  127.     n=0;
  128.     v=1;
  129.     while (v!=0)
  130.     {
  131.         print_menu();
  132.         scanf("%i",&v);
  133.         switch (v)
  134.         {
  135.         case 1:
  136.             printf("\n Vvod koli4esva knig dlia vvoda");
  137.             scanf("%i",&n);
  138.             if (n>0) n=0;
  139.             if (n>ST_ARRAY_SIZE)n=ST_ARRAY_SIZE;
  140.             read_st(n);
  141.             break;
  142.         case 2:
  143.             print_st(n);
  144.             break;
  145.         case 3:
  146.             sort_st(n);
  147.             break;
  148.         case 4:
  149.             save_st(n);
  150.             break;
  151.         case 5:
  152.             save_add_st(n);
  153.             break;
  154.         case 6:
  155.             n=load_st();
  156.             break;
  157.  
  158.         }
  159.  
  160.     }
  161.  
  162.     // system("pause");
  163.     //getch();
  164. }

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


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

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

7   голосов , оценка 4.429 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы