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

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

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

Сижу битый час, но чтобы я не изменял проблем либо больше, либо ничего не меняется... Большое спасибо всем, кто откликнется) Само задание: Описать структуру, содержащую поля: 1.Фамилия, имя. 2.Знак зодиака. 3.Дата рождения (массив из трёх чисел). Написать программу, выполняющую следующие действия: 1.Ввод с клавиатуры данных в массив, состоящий из 8 элементов типа ZNAK; записи должны быть упорядочены по датам рождения; 2. Вывод на экран информации о человеке, чья фамилия введена с клавиатуры. Всю эту структуру нужно вставить в файл и работать с ней. P.S. Ещё добавил возможность изменения выбранной структуры по фамилии, но что-то и она нормально работать не хочет...
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <clocale>
#include <stdlib.h>
int p; int kolichestvo=0;
using namespace std;
struct ZNAK {char NAME[20],ZNAK2[15]; unsigned BDAY[3];}BZNAK[8],T;
 
void input(FILE *); // создание нового файла
void print(FILE *); // просмотр файла (и сортировка по дате рождения)
void app(FILE *); // добавление в файл
void find(FILE *); // поиск по фамилии и, если необходимо, изменение выбранной структуры

main()
{
setlocale(LC_CTYPE,"Russian");
char c;
FILE *tf;
printf ("Выберете нужный вам режим:\n");
while (1)
{
 puts(" 1 – Новый файл");
 puts(" 2 – Просмотр файла");
 puts(" 3 – Добавление в файл");
 puts(" 4 – Поиск по фамилии и изменение");
 puts(" 0 - Выход");
 c=getch();
 switch(c)
 { case '1':input(tf);break;
  case '2':print(tf);break;
  case '3':app(tf);break;
  case '4':find(tf);break;
  case '0':return 0;
  default : puts(" Неверный режим");
 }
}
}

void input(FILE *tf)
{
     char ch, Number[15]; int k=0,i=0,j;
     tf=fopen("file1.dat","wb"); 
  printf("\n Ввод информации о людях:\n");
 do
 { 
  printf("\n Фамилия, имя человека: ");    gets(BZNAK[i].NAME);
  printf(" Знак зодиака: ");               gets(BZNAK[i].ZNAK2);
  
  printf("Знак зодиака: (YYYY MM DD)? ");
                                           for(j=0;j<3;j++)
                                           
                                           scanf("%u",&BZNAK[i].BDAY[j]);
                                           gets(Number); 
                                           k++;
                                                                                 
  fwrite(&BZNAK[i],sizeof(BZNAK[i]),i,tf);    
  i++;          
          
kolichestvo=i;
  printf("\n Закончить? y/n \n");
 
  printf("\n");
  printf("\n");
  
  ch=getch();
 }
while (ch != 'y');
 fclose(tf);
}

void print(FILE *tf)
{ int i,j,tg;
 tf=fopen("file1.dat","rb"); 
 i=1;
 for (i=0;i<kolichestvo;i++)
 fread(&BZNAK[i],sizeof(BZNAK[i]),i,tf);
 
 printf ("Записи, упорядоченные по дате рождения:\n");
 
for(i=0;i<kolichestvo;i++)
   for(j=0;j<kolichestvo-i-1;j++)
   
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])
 {
  T=BZNAK[j];
  BZNAK[j]=BZNAK[j+1];
  BZNAK[j+1]=T;
 }
  for(i=0;i<kolichestvo;i++)
  {fread(&BZNAK[i],sizeof(BZNAK[i]),1,tf);
       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]);

 }
getch();
 
}

void app(FILE *tf)
{
 char ch, Number[15]; int i=kolichestvo,j,k;
 tf=fopen("file1.dat","ab"); 
  printf("\n Ввод информации о людях:\n");
 do
 { 
  printf("\n Фамилия, имя человека: ");    gets(BZNAK[i].NAME);
  printf(" Знак зодиака: ");               gets(BZNAK[i].ZNAK2);
  
  printf("Дата рождения: (YYYY MM DD)? ");
                                           for(j=0;j<3;j++)
                                           
                                           scanf("%u",&BZNAK[i].BDAY[j]);
                                           gets(Number); 
                                           k++;
                                           
  fwrite(&BZNAK[i],sizeof(BZNAK[i]),1,tf);     
  i++;    
  kolichestvo=i;      
  printf("\n Закончить? y/n \n");
 
  printf("\n");
  printf("\n");
  ch=getch();
 }

while (ch != 'y');
 
 fclose(tf);
}

void find(FILE *tf)
{char c='n', tovR[10],Number[15];
 long int i=0,j,k=0,tz,yt;
 int z;
 tf=fopen("file1.dat","rb+"); 
 puts("Введите искомую фамилию: \n");
 gets(tovR);
 for (i=0;i<kolichestvo;i++)
 fread(&BZNAK[i],sizeof(BZNAK[i]),1,tf);
  
// while (!feof(tf))
 //{
    z=strlen(tovR);
    j=0;
     
    for(i=0;i<kolichestvo;i++)
 if(!strncmp(tovR, BZNAK[i].NAME, z)) 
   
    {
        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]);           
        j=1;
        yt=i;
    };
  if(j==0) printf("Нет такой личности!\n\n"); 
  printf ("\n");
           
  else
   {                  
   printf("\n Изменить выбранную структуру? y/n ");
   c=getch();
   }
   if (c=='y')
     {
       printf("\n Фамилия, имя человека: ");    gets(BZNAK[yt].NAME);       
       printf(" Знак зодиака: ");               gets(BZNAK[yt].ZNAK2);
       printf("Дата рождения: (YYYY MM DD)? ");
                                           for(j=0;j<3;j++)
                                        
                                           scanf("%u",&BZNAK[yt].BDAY[j]);
                                           gets(Number); 
                                          // k++;

    tz=sizeof(BZNAK[yt]);
       fseek(tf, -tz, 1); 
      fwrite(&BZNAK[yt],sizeof(BZNAK[yt]),1,tf);
     }
 //  }           
fread(&BZNAK[yt],sizeof(BZNAK[yt]),1,tf);

fclose(tf);
}
Есть лишние переменные. Просто не успел убрать

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

textual
Листинг программы
for(i=0;i<=yt;i++)   //yt - та позиция, на которой найдено совпадение по фамилии
  {
      tz=sizeof(BZNAK[i]);
      h=h+tz;
  }
    
   fseek(tf, h, SEEK_SET);
   fwrite(&BZNAK[yt],sizeof(BZNAK[yt]),1,tf);
   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
Похожие ответы