Объясните, пожалуйста, где и в чём ошибки? - 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);
Объяснение кода листинга программы
- Переменная
i
инициализируется как 0 и принимает значения от 0 доyt
. - Переменная
tz
используется для хранения размера (в байтах) массиваBZNAK[i]
. - Переменная
h
используется для хранения суммы размеров всех массивовBZNAK[i]
от 0 доyt
. - Переменная
tf
является файловым дескриптором, который, вероятно, ссылается на файл, в который записывается информация. - Вызов
fseek(tf, h, SEEK_SET)
используется для перемещения файлового указателя в начало блока данных, который будет записан в файл. - Вызов
fwrite(&BZNAK[yt], sizeof(BZNAK[yt]), 1, tf)
используется для записи данных из массиваBZNAK[yt]
в файл. - Вызов
fread(&BZNAK[yt], sizeof(BZNAK[yt]), 1, tf)
используется для чтения данных из файла обратно в массивBZNAK[yt]
. Ошибки в коде не указаны. Однако, убедитесь, что:- переменная
yt
корректно инициализирована и содержит действительное значение; - массив
BZNAK
инициализирован и содержит действительные данные; - файл
tf
корректно открыт и готов к записи/чтению; - вызовы функций
fseek
,fwrite
иfread
используются с правильными параметрами и возвращают корректные значения.
- переменная
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д