Объясните, пожалуйста, где и в чём ошибки? - 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
используются с правильными параметрами и возвращают корректные значения.
- переменная
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д