一位鹿人 2023-01-07 16:46 采纳率: 85.7%
浏览 26
已结题

编写C语言成绩管理系统时遇到一个问题

编写C语言成绩管理系统时遇到一个问题,输入函数在运行时自动循环,而且写入的内容无法存入文件。代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LENGTH sizeof(struct Student)
#define FORM "%-11d%-5s%-5s%-5d%-12d%-12d%-12d%-12d%-12.2lf\n"  
#define DATA st[i].id,st[i].name,st[i].gender,st[i].age,st[i].MathAna,st[i].LiAlg,st[i].Computer,st[i].English,st[i].GPA 


struct Student{       //设置结构体变量,储存学生信息
   int id;            //学号
   char name[10];     //姓名
   char gender[10];   //性别
   int age;           //年龄
   int MathAna;       //数学分析成绩
   int LiAlg;         //高等代数成绩
   int Computer;      //程序设计成绩
   int English;       //大学英语成绩
   double GPA;        //平均学分绩GPA
};

struct Student st[100];
void menu();          //菜单
void input();         //输入学生信息


int main()
{
    int n;
    menu();           //调用菜单函数,显示菜单界面
    scanf("%d",&n);   //输入数字,进入不同功能
    while(n)
    {
        switch(n){
        case 1: input(); break;
        default: break;
        }

    }
}


void menu()   //该函数用于实现菜单界面
{
    printf("\n\n\n\n");
     printf("\t\t|***************学生信息管理系统***************|\n");
     printf("\t\t|\t\t\t\t\t       |\n");
     printf("\t\t|\t\t 1.输入学生信息\t               |\n");
     printf("\t\t|\t\t 2.修改学生信息\t               |\n");
     printf("\t\t|\t\t 3.查询学生信息\t               |\n");
     printf("\t\t|\t\t 4.按GPA排序\t               |\n");
     printf("\t\t|\t\t 5.按性别统计\t               |\n");
     printf("\t\t|\t\t 6.按年龄统计\t               |\n");
     printf("\t\t|\t\t 7.显示挂科学生信息\t       |\n");
     printf("\t\t|\t\t 8.显示所有学生信息\t       |\n");
     printf("\t\t|\t\t 9.删除学生信息\t               |\n");
     printf("\t\t|\t\t 0.退出系统\t\t       |\n");
     printf("\t\t|\t\t\t\t\t       |\n");
     printf("\t\t|**********************************************|\n\n");
     printf("请您选择操作(0-9):");
}


float GPA(int n)  //该函数用于计算每门课的GPA
{ 
    if(n>=90&&n<=100) return 4.0;
    if(n>=86&&n<=89) return 3.7;
    if(n>=83&&n<=85) return 3.3;
    if(n>=80&&n<=82) return 3.0;
    if(n>=76&&n<=79) return 2.7;
    if(n>=73&&n<=75) return 2.3;
    if(n>=70&&n<=72) return 2.0;
    if(n>=66&&n<=69) return 1.7;
    if(n>=63&&n<=65) return 1.3;
    if(n>=60&&n<=62) return 1.0;
}


void input()    //该函数用于输入学生信息
{
    int i,m=0;
    char ch;
    FILE *fp;
    if((fp=fopen("student information.txt","a+"))==NULL)  //检查文件是否存在
    {
        printf("文件不存在!\n");
        return;
    }
    while(!feof(fp))  //计算文件中的学生信息条数
    {
        if(fread(&st[m],LENGTH,1,fp)==1)
           m++;
    }
    fclose(fp);
    if(m==0)    //若文件存在但没有信息,提示无记录
    {
        printf("文件中无记录\n");
    }
    if((fp=fopen("student information.txt","ab+"))==NULL)
    {
        printf("文件不存在!\n");
        return;
    }

        printf("请输入学生信息: \n");   //判断是否输入学生信息
        printf("学号:");
        scanf("%d",&st[m].id);
        for(i=0;i<m;i++)               //检查要输入的学生信息是否已存在
            if(st[i].id==st[m].id)
            {
                printf("该学生信息已录入,按任意键继续!");
                getchar();
                fclose(fp);
                return;
            }
        printf("姓名:");              //输入学生信息
        scanf("%s",st[m].name);
        printf("性别:");
        scanf("%s",st[m].gender);
        printf("年龄:");
        scanf("%d",&st[m].age);
        printf("数学分析:");
        scanf("%d",&st[m].MathAna);
        printf("高等代数:");
        scanf("%d",&st[m].LiAlg);
        printf("程序设计:");
        scanf("%d",&st[m].Computer);
        printf("大学英语:");
        scanf("%d",&st[m].English);
        printf("GPA: ");
        scanf("%.2lf",&st[m].GPA);
    fprintf(fp,"%d,%s,%s,%d,%d,%d,%d,%d,%.2lf",st[m].id,st[m].name,st[m].gender,st[m].age,st[m].MathAna,st[m].LiAlg,st[m].Computer,st[m].English,st[m].GPA);
    m++;
}

  • 写回答

1条回答 默认 最新

  • Huazie 全栈领域优质创作者 2023-01-07 17:37
    关注
    • scanf 输入%s ,即字符串时,要注意 上一次输入的换行,在之前用 getchar()接收一下
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月15日
  • 已采纳回答 1月7日
  • 创建了问题 1月7日

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题