Организовать меню: Создание файла, Просмотр файла, Поиск, Выход - C (СИ)
Формулировка задачи:
часть задания задание
Организовать меню: Создание файла, Просмотр файла, Поиск, Выход. В файле содержатся структуры со сведениями о результатах сессии группы: ФИО студента и 5 оценок по 5-ти предметам
получается все, кроме связи между предметом и оценкой. пробовал в одной структуре, пробовал в разных, при указании t2.theme[i] , программа вылетает, при t2.theme выводит все предметы разом меняю в 54 строке
#include <stdio.h> #include <math.h> #include <conio.h> #include <string.h> #include <stdlib.h> void input2 (FILE *); void input1 (FILE *); void print (FILE *); void app (FILE *); void find (FILE *); struct zachet { char name[10]; char groupe[10]; int mark[5]; } t1; struct theme { char theme[15]; }t2; void input1(FILE *tf) { char ch; int q; tf=fopen("file1.txt","w+"); system ("cls"); printf("\n write data \n "); for (int i=0;i<5;i++) { printf("\n write %d theme \n ",i+1); scanf("%s",&t2.theme); fwrite(&t2,sizeof(t2),1,tf); } fclose(tf); } void input2 (FILE *tf) { char ch; int q; tf=fopen("file1.txt","rb+"); system ("cls"); printf("\n write data \n "); do { printf("\n Student's name \n"); scanf("%s",&t1.name); printf("\n Write groupe \n"); scanf("%s",&t1.groupe); printf("\n Write 5 marks \n"); fread(&t2,sizeof(t2),1,tf); for (int i=0;i<5;) { printf("\n %s -- mark--",t2.theme[i] ); scanf("%d",&q); if ((q<6)&(q>0)) { t1.mark[i]=q; i++; } else printf("\n error \n"); } fwrite(&t1,sizeof(t1),1,tf); fread(&t2,sizeof(t2),1,tf); printf("\n Exit? y/n"); ch=getch(); } while (ch != 'y'); fclose(tf); } void print (FILE *tf) { int i; system ("cls"); tf=fopen("file1.txt","rb"); i=1; fread(&t1,sizeof(t1),1,tf); while(!feof(tf)) { printf("\n %d Name -- %s groupe -- %s \n",i,t1.name, t1.groupe); for (int i1=0;i1<5;i1++) { printf("%s -- %d mark---%d ",t2.theme, i1+1,t1.mark[i1]); } fread(&t1,sizeof(t1),1,tf); printf("\n"); i++; } getch(); } void app(FILE *tf) { char ch; int q; tf=fopen ("file1.txt","ab"); system("cls"); printf("\n write data \n "); do { printf("\n Student's name\n"); scanf("%s",&t1.name); printf("\n Write groupe \n"); scanf("%s",&t1.groupe); printf("\n Write 5 marks\n"); for (int i=0;i<5;) { printf("\n%s -- %d mark--",t2.theme, i+1); scanf("%d",&q); if ((q<6)&(q>0)) { t1.mark[i]=q; i++; } else printf("\n error \n"); } fwrite(&t1,sizeof(t1),1,tf); printf("\n Exit? y/n"); ch=getch(); } while (ch != 'y'); fclose(tf); } void find (FILE *tf) { char c, zach[10]; long int i; tf=fopen("file1.txt","rb+"); system("cls"); puts("Student's name"); gets(zach); fread(&t1,sizeof(t1),1,tf); while (!feof(tf)) { if (strcmp(t1.name, zach)==0) { printf("\n Name -- %s groupe -- %s ",t1.name, t1.groupe); for (int i=0;i<5;i++) { printf("%s -- mark -- %d",t2.theme[i],t1.mark[i]); } printf("Edit? y/n"); c=getch(); if (c=='y') { printf("\n Student's name"); scanf("%s",&t1.name); printf("\n Write groupe of the test book"); scanf("%s",&t1.groupe); printf("\n Write 5 marks"); for (int i=0;i<5;i++) { scanf("%d",&t1.mark[i]); } fwrite(&t1,sizeof(t1),1,tf); } } fread(&t1, sizeof(t1),1,tf); } fclose(tf); } main () { char c,ch; FILE *tf; while (1) { system("cls"); puts("1 - new file"); puts("2 - view file"); puts("3 - add in the file"); puts("4 - find losers and rewrite"); puts("0 - exit"); c=getch(); switch(c) { case '1':input1(tf);input2(tf);break; case '2':print(tf);break; case '3':app(tf);break; case '4':find(tf);break; case '0':return (0); default:puts("error, try again"); } getch(); } return (0); }
Решение задачи: «Организовать меню: Создание файла, Просмотр файла, Поиск, Выход»
textual
Листинг программы
#include <stdio.h> #include <string.h> #include <stdlib.h> // В файле содержатся структуры со сведениями о результатах сессии группы: // ФИО студента и 5 оценок по 5-ти предметам typedef struct { char fam[30]; char name[20]; char otch[30]; } fio_t; typedef struct { char name[20]; int rank; } rank_t; #define M 5 typedef struct { char group[20]; fio_t s; rank_t r[M]; } stud_t; void new_rec(stud_t *s){ printf("Vvedite imya: "); fgets(s->s.name, 30, stdin); // и т.д. // for(int i=0; i<N;++i){ // scanf("%30s", studs[i].s.fam); // scanf("%20s", studs[i].s.name); // scanf("%30s", studs[i].s.otch); // for (int j=0; j<M;++i){ // scanf("%20s", studs[i].r[j].name); // scanf("%d", &studs[i].r[j].rank); // } // } } void input_gr(char *gr, int *num){ printf ("Vvedite nazv groupy: "); fgets(gr, 20, stdin); // if(gr[strlen(gr)-1]=='\n')gr[strlen(gr)-1]='\0'; //удаляем перевод строки printf ("Vvedite kol-v o studentov v grupe: "); scanf("%d", num); } #define N 3 // таким образом можно писать инфу об одной группе в один файл int main(){ int num=0; // число студентов в группе char gr_name[20]; //имя группы stud_t *st; input_gr(gr_name, &num); st=(stud_t*)malloc(num*sizeof(stud_t)); for(int i=0; i<num;++i){ strcpy(st->group, gr_name); new_rec(&st[i]); } free (st); return 0; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы:
- stdio.h содержит функции для ввода и вывода данных;
- string.h содержит функции для работы со строками;
- stdlib.h содержит функции для работы с памятью и некоторые другие функции.
- Определяются структуры данных:
- fio_t содержит информацию о ФИО студента (фамилия, имя, отчество);
- rank_t содержит информацию об оценке студента (предмет, оценка);
- stud_t содержит информацию о студенте (ФИО, группа, оценки по 5-ти предметам).
- В функции new_rec происходит ввод информации о студенте:
- Имя студента вводится с клавиатуры с помощью функции fgets.
- В функции input_gr происходит ввод информации о группе:
- Вводится имя группы;
- Вводится количество студентов в группе.
- В функции main происходит:
- Ввод информации о группе с помощью функции input_gr;
- Выделение памяти под массив структур stud_t;
- Заполнение структур stud_t с помощью цикла for и функции new_rec;
- Освобождение памяти с помощью функции free.
- Возврат значения 0, что означает успешный конец работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д