Объясните, пожалуйста, где и в чём ошибки? - C (СИ)

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

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

Сижу битый час, но чтобы я не изменял проблем либо больше, либо ничего не меняется... Большое спасибо всем, кто откликнется) Само задание: Описать структуру, содержащую поля: 1.Фамилия, имя. 2.Знак зодиака. 3.Дата рождения (массив из трёх чисел). Написать программу, выполняющую следующие действия: 1.Ввод с клавиатуры данных в массив, состоящий из 8 элементов типа ZNAK; записи должны быть упорядочены по датам рождения; 2. Вывод на экран информации о человеке, чья фамилия введена с клавиатуры. Всю эту структуру нужно вставить в файл и работать с ней. P.S. Ещё добавил возможность изменения выбранной структуры по фамилии, но что-то и она нормально работать не хочет...
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <clocale>
  5. #include <stdlib.h>
  6. int p; int kolichestvo=0;
  7. using namespace std;
  8. struct ZNAK {char NAME[20],ZNAK2[15]; unsigned BDAY[3];}BZNAK[8],T;
  9. void input(FILE *); // создание нового файла
  10. void print(FILE *); // просмотр файла (и сортировка по дате рождения)
  11. void app(FILE *); // добавление в файл
  12. void find(FILE *); // поиск по фамилии и, если необходимо, изменение выбранной структуры
  13.  
  14. main()
  15. {
  16. setlocale(LC_CTYPE,"Russian");
  17. char c;
  18. FILE *tf;
  19. printf ("Выберете нужный вам режим:\n");
  20. while (1)
  21. {
  22. puts(" 1 – Новый файл");
  23. puts(" 2 – Просмотр файла");
  24. puts(" 3 – Добавление в файл");
  25. puts(" 4 – Поиск по фамилии и изменение");
  26. puts(" 0 - Выход");
  27. c=getch();
  28. switch(c)
  29. { case '1':input(tf);break;
  30. case '2':print(tf);break;
  31. case '3':app(tf);break;
  32. case '4':find(tf);break;
  33. case '0':return 0;
  34. default : puts(" Неверный режим");
  35. }
  36. }
  37. }
  38.  
  39. void input(FILE *tf)
  40. {
  41. char ch, Number[15]; int k=0,i=0,j;
  42. tf=fopen("file1.dat","wb");
  43. printf("\n Ввод информации о людях:\n");
  44. do
  45. {
  46. printf("\n Фамилия, имя человека: "); gets(BZNAK[i].NAME);
  47. printf(" Знак зодиака: "); gets(BZNAK[i].ZNAK2);
  48. printf("Знак зодиака: (YYYY MM DD)? ");
  49. for(j=0;j<3;j++)
  50. scanf("%u",&BZNAK[i].BDAY[j]);
  51. gets(Number);
  52. k++;
  53. fwrite(&BZNAK[i],sizeof(BZNAK[i]),i,tf);
  54. i++;
  55. kolichestvo=i;
  56. printf("\n Закончить? y/n \n");
  57. printf("\n");
  58. printf("\n");
  59. ch=getch();
  60. }
  61. while (ch != 'y');
  62. fclose(tf);
  63. }
  64.  
  65. void print(FILE *tf)
  66. { int i,j,tg;
  67. tf=fopen("file1.dat","rb");
  68. i=1;
  69. for (i=0;i<kolichestvo;i++)
  70. fread(&BZNAK[i],sizeof(BZNAK[i]),i,tf);
  71. printf ("Записи, упорядоченные по дате рождения:\n");
  72. for(i=0;i<kolichestvo;i++)
  73. for(j=0;j<kolichestvo-i-1;j++)
  74. if((long)1000*BZNAK[j].BDAY[0]+50*BZNAK[j].BDAY[1]+BZNAK[j].BDAY[2]>(long)1000*BZNAK[j+1].BDAY[0]+50*BZNAK[j+1].BDAY[1]+BZNAK[j+1].BDAY[2])
  75. {
  76. T=BZNAK[j];
  77. BZNAK[j]=BZNAK[j+1];
  78. BZNAK[j+1]=T;
  79. }
  80. for(i=0;i<kolichestvo;i++)
  81. {fread(&BZNAK[i],sizeof(BZNAK[i]),1,tf);
  82. printf("\nИмя: %s \nZЗнак зодиака: %s \nДата рождения: %u %u %u\n\n", BZNAK[i].NAME, BZNAK[i].ZNAK2, BZNAK[i].BDAY[0], BZNAK[i].BDAY[1], BZNAK[i].BDAY[2]);
  83.  
  84. }
  85. getch();
  86. }
  87.  
  88. void app(FILE *tf)
  89. {
  90. char ch, Number[15]; int i=kolichestvo,j,k;
  91. tf=fopen("file1.dat","ab");
  92. printf("\n Ввод информации о людях:\n");
  93. do
  94. {
  95. printf("\n Фамилия, имя человека: "); gets(BZNAK[i].NAME);
  96. printf(" Знак зодиака: "); gets(BZNAK[i].ZNAK2);
  97. printf("Дата рождения: (YYYY MM DD)? ");
  98. for(j=0;j<3;j++)
  99. scanf("%u",&BZNAK[i].BDAY[j]);
  100. gets(Number);
  101. k++;
  102. fwrite(&BZNAK[i],sizeof(BZNAK[i]),1,tf);
  103. i++;
  104. kolichestvo=i;
  105. printf("\n Закончить? y/n \n");
  106. printf("\n");
  107. printf("\n");
  108. ch=getch();
  109. }
  110.  
  111. while (ch != 'y');
  112. fclose(tf);
  113. }
  114.  
  115. void find(FILE *tf)
  116. {char c='n', tovR[10],Number[15];
  117. long int i=0,j,k=0,tz,yt;
  118. int z;
  119. tf=fopen("file1.dat","rb+");
  120. puts("Введите искомую фамилию: \n");
  121. gets(tovR);
  122. for (i=0;i<kolichestvo;i++)
  123. fread(&BZNAK[i],sizeof(BZNAK[i]),1,tf);
  124. // while (!feof(tf))
  125. //{
  126. z=strlen(tovR);
  127. j=0;
  128. for(i=0;i<kolichestvo;i++)
  129. if(!strncmp(tovR, BZNAK[i].NAME, z))
  130. {
  131. printf("\nИмя: %s \nЗнак зодиака: %s \nДата рождения: %u %u %u\n\n", BZNAK[i].NAME, BZNAK[i].ZNAK2, BZNAK[i].BDAY[0], BZNAK[i].BDAY[1], BZNAK[i].BDAY[2]);
  132. j=1;
  133. yt=i;
  134. };
  135. if(j==0) printf("Нет такой личности!\n\n");
  136. printf ("\n");
  137. else
  138. {
  139. printf("\n Изменить выбранную структуру? y/n ");
  140. c=getch();
  141. }
  142. if (c=='y')
  143. {
  144. printf("\n Фамилия, имя человека: "); gets(BZNAK[yt].NAME);
  145. printf(" Знак зодиака: "); gets(BZNAK[yt].ZNAK2);
  146. printf("Дата рождения: (YYYY MM DD)? ");
  147. for(j=0;j<3;j++)
  148. scanf("%u",&BZNAK[yt].BDAY[j]);
  149. gets(Number);
  150. // k++;
  151.  
  152. tz=sizeof(BZNAK[yt]);
  153. fseek(tf, -tz, 1);
  154. fwrite(&BZNAK[yt],sizeof(BZNAK[yt]),1,tf);
  155. }
  156. // }
  157. fread(&BZNAK[yt],sizeof(BZNAK[yt]),1,tf);
  158.  
  159. fclose(tf);
  160. }
Есть лишние переменные. Просто не успел убрать

Решение задачи: «Объясните, пожалуйста, где и в чём ошибки?»

textual
Листинг программы
  1. for(i=0;i<=yt;i++)   //yt - та позиция, на которой найдено совпадение по фамилии
  2.   {
  3.       tz=sizeof(BZNAK[i]);
  4.       h=h+tz;
  5.   }
  6.    
  7.    fseek(tf, h, SEEK_SET);
  8.    fwrite(&BZNAK[yt],sizeof(BZNAK[yt]),1,tf);
  9.    fread(&BZNAK[yt],sizeof(BZNAK[yt]),1,tf);

Объяснение кода листинга программы

  1. Переменная i инициализируется как 0 и принимает значения от 0 до yt.
  2. Переменная tz используется для хранения размера (в байтах) массива BZNAK[i].
  3. Переменная h используется для хранения суммы размеров всех массивов BZNAK[i] от 0 до yt.
  4. Переменная tf является файловым дескриптором, который, вероятно, ссылается на файл, в который записывается информация.
  5. Вызов fseek(tf, h, SEEK_SET) используется для перемещения файлового указателя в начало блока данных, который будет записан в файл.
  6. Вызов fwrite(&BZNAK[yt], sizeof(BZNAK[yt]), 1, tf) используется для записи данных из массива BZNAK[yt] в файл.
  7. Вызов fread(&BZNAK[yt], sizeof(BZNAK[yt]), 1, tf) используется для чтения данных из файла обратно в массив BZNAK[yt]. Ошибки в коде не указаны. Однако, убедитесь, что:
    • переменная yt корректно инициализирована и содержит действительное значение;
    • массив BZNAK инициализирован и содержит действительные данные;
    • файл tf корректно открыт и готов к записи/чтению;
    • вызовы функций fseek, fwrite и fread используются с правильными параметрами и возвращают корректные значения.

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


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

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

15   голосов , оценка 4.067 из 5

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

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

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