Организовать меню: Создание файла, Просмотр файла, Поиск, Выход - 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, что означает успешный конец работы программы.