Организовать меню: Создание файла, Просмотр файла, Поиск, Выход - 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;
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы:
    • stdio.h содержит функции для ввода и вывода данных;
    • string.h содержит функции для работы со строками;
    • stdlib.h содержит функции для работы с памятью и некоторые другие функции.
  2. Определяются структуры данных:
    • fio_t содержит информацию о ФИО студента (фамилия, имя, отчество);
    • rank_t содержит информацию об оценке студента (предмет, оценка);
    • stud_t содержит информацию о студенте (ФИО, группа, оценки по 5-ти предметам).
  3. В функции new_rec происходит ввод информации о студенте:
    • Имя студента вводится с клавиатуры с помощью функции fgets.
  4. В функции input_gr происходит ввод информации о группе:
    • Вводится имя группы;
    • Вводится количество студентов в группе.
  5. В функции main происходит:
    • Ввод информации о группе с помощью функции input_gr;
    • Выделение памяти под массив структур stud_t;
    • Заполнение структур stud_t с помощью цикла for и функции new_rec;
    • Освобождение памяти с помощью функции free.
    • Возврат значения 0, что означает успешный конец работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.727 из 5
Похожие ответы