首页 > 解决方案 > 使用结构、指针和文本的学生数据库可避免出错

问题描述

所以基本上我试图在 C 中构建一个程序,它将使用指针和结构将数据保存在文本文件中。包括代码中的删除、查找、注册和显示功能。在使用指针和正确保存数据时遇到此代码问题。我希望你们能帮我解决这个问题:))变量是葡萄牙语和一些文字,所以我很抱歉

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>



#define MAX 20

struct dados { // estrutura para os dados dos alunos
    char nome[MAX];
    char turma[MAX];
    float nota1, nota2, nota3, media;
    char estado[MAX];
    struct dados *p, *px;
};
typedef struct dados INFO;

INFO *inicio=NULL;
INFO *seg;


float mcalc(float a, float b, float c)
{
    float med;

    med=(a+b+c)/3;

    med= floorf(med * 100) / 100;
    med= roundf(med * 100) / 100;
    med= ceilf(med * 100) / 100;

    return med;
}

void menu()
{ // menu
    
    int opc;
    
    printf("\n                           ----------------------------------------");
    printf("\n                          |          ** Menu de acesso **          |");
    printf("\n                          |                                        |");
    printf("\n                          |           [1] - Registar               |");
    printf("\n                          |           [2] - Listar                 |");
    printf("\n                          |           [0] - Sair                   |");
    printf("\n                          |           [0] - Sair                   |");
    printf("\n                          |                                        |");
    printf("\n                           ----------------------------------------");
    printf("\n");
    printf("\n");   
}

void registar(INFO *p, INFO *px) 
{
    FILE *fp;
    fp = fopen("INFO", "a");
    fflush(stdin);
    printf("(-)                         Digite o nome do alun(o/a). (-)\n");-
    printf("\n                          > ");
    gets(p->nome);
    
    fflush(stdin);
    system("cls");
    printf("(-)                         Digite a turma do alun(o/a). (-)\n");
    printf("\n                          > ");
    gets(p->turma);
    
    fflush(stdin);
    system("cls");
    printf("(-)                         Digite a 1ª nota do alun(o/a). (-)\n");
    printf("\n                          > ");
    scanf("%f", &p->nota1);
    
    fflush(stdin);
    system("cls");
    printf("(-)                         Digite a 2ª nota do alun(o/a). (-)\n");
    printf("\n                          > ");
    scanf("%f", &p->nota2);
    
    fflush(stdin);
    system("cls");;
    printf("(-)                         Digite a 3ª nota do alun(o/a). (-)\n");
    printf("\n                          > ");
    scanf("%f", &p->nota3);
    
    p->px=NULL;
    if(inicio==NULL)
    {
        inicio=p;
    }
    else
    {
        seg=inicio;
        while(seg->px!=NULL)
        {
            seg=seg->px;
        }
        seg->px=p;
    }
    
    system("cls");
    printf("\n(-)                           Aluno registado com sucesso! (-)");
    printf("\n(-)                           Pressione qualquer tecla para regressar ao menu principal. (-)");
    getchar();
    main();
}


void listar(INFO *p, INFO *px)
{
    FILE *fp1;
    fp1 = fopen("DADOS", "r");
    while (fread(&INFO, sizeof(INFO), 1, fp1))
        printf("\n                          (-) Nome: %s      (-)", p->nome);
        printf("\n                          (-) Turma: %s     (-)", p->turma);
        printf("\n                          (-) 1º Nota: %.2f (-)", p->nota1);
        printf("\n                          (-) 2º Nota: %.2f (-)", p->nota2);
        printf("\n                          (-) 3º Nota: %.2f (-)", p->nota3);
        p->media=mcalc(p->nota1, p->nota2, p->nota3);       
        printf("\n                          (-) Media: %.2f   (-)", p->media);
        if (p->media < 10) 
        {
            strcpy(p->estado,"Reprovado");
        }
        else 
        {
            strcpy(p->estado,"Aprovado");
        }
        printf("\n                          (-) Estado: %s    (-)", p->estado);


        getchar();
    fclose(fp1);
}

void find(INFO *p, INFO *px)
{
    FILE *fp2;
    char r[MAX], s[MAX], n[MAX];
    printf("\n                          (-) Introduza o nome do aluno que pretende encontrar:");
    printf("\n                          > ");
    gets(n);
    if(strcmp(n, p->nome)==0)
    {
        fp2 = fopen("DADOS", "r");
        while (fread(&INFO, sizeof(INFO), 1, fp2))
        {
            s = p->nome;
            if (s == r)
            {
                printf("\n                          (-) Nome: %s      (-)", p->nome);
                printf("\n                          (-) Turma: %s     (-)", p->turma);
                printf("\n                          (-) 1º Nota: %.2f (-)", p->nota1);
                printf("\n                          (-) 2º Nota: %.2f (-)", p->nota2);
                printf("\n                          (-) 3º Nota: %.2f (-)", p->nota3);
                p->media=mcalc(p->nota1, p->nota2, p->nota3);       
                printf("\n                          (-) Media: %.2f   (-)", p->media);
                if (p->media < 10) 
                {
                    strcpy(p->estado,"Reprovado");
                }
                else 
                {
                    strcpy(p->estado,"Aprovado");
                }
                printf("\n                          (-) Estado: %s    (-)", p->estado);
            }
        }
        fclose(fp2);    
    }
    else
    {
        printf("\n                          (-) O aluno não foi encontrado, voltando para o menu principal (-)");
    }
}

void deleteI(INFO *p, INFO *px)
{
    FILE *fpo;
    FILE *fpt;
    char r[MAX], s[MAX];
    printf("\n                          (-) Introduza o nome do aluno que pretende encontrar:");
    printf("\n                          > ");   
    scanf("%s", &r);
    
    if (strcmp(r, p->nome) =! 0)
    {
        printf("\n                          (-) O aluno não foi encontrado, voltando para o menu principal (-)");
    }
    
    else
    {
        fpo = fopen("DADOS", "r");
        fpt = fopen("temp", "w");
        while (fread(&INFO, sizeof(INFO), 1, fpo))
        {
            s = p->nome;
            if (s != r)
                fwrite(&INFO, sizeof(INFO), 1, fpt);
        }
        
        fclose(fpo);
        fclose(fpt);
        fpo = fopen("DADOS", "w");
        fpt = fopen("temp", "r");
        while (fread(&INFO, sizeof(INFO), 1, fpt))
            fwrite(&INFO, sizeof(INFO), 1, fpo);
        printf("\n                          (-) O aluno foi encontrado apagado do sistema, voltando para o menu principal (-)");
        fclose(fpo);
        fclose(fpt);
    }
}



void main(INFO *p, INFO *px)
{
    int opc; // declaração de variavel para ler a escolha do utiliziador
    
    menu(); //chamada do menu

    printf("                            (-) Introduza a opcao (-)");
    printf("\n                          > ");
    scanf("%d", &opc); // leitura da escolha do utilizador
    
    switch(opc)
    {
        case 1:
            registar(p, px); // chamada da função de registro
            break;
            
        case 2:
            listar(p, px); // chamada da função de listagem
            break;
        
        case 3:
            deleteI(p, px);
            break;
        
        case 4:
            find(p, px);    
        
        default:
            system("exit");
    }
}

谢谢!

标签: cpointersstruct

解决方案


推荐阅读