c - 使用结构、指针和文本的学生数据库可避免出错
问题描述
所以基本上我试图在 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");
}
}
谢谢!