一位鹿人 2023-01-07 17:27 采纳率: 72%
浏览 43
已结题

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

在编写input函数读入学生信息时,循环输入出现问题,程序自动跳过判断步骤,直接进入下一个循环,不知道怎么解决。代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#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 count();
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):");
}


void count()
{
    struct Student stu1;
    FILE * fp; //定义一个文件指针fp
    fp = fopen("students.txt", "at+"); //以"追加"方式打开students文本文件
    if (fp == NULL) //判断文件是否为空
        printf("Cannot open file!");
    int n = 0; //初始化
    while (1)
    {
        if (feof(fp)) //检测文件是否结束
        break;
        fread( & stu1, sizeof(struct Student), 1, fp); //读取文件
        n++; //读取文件数
    }
    n--; //关闭文件数
    fclose(fp); //关闭文件
}


void input()
{
    int n = 0;
    int i = 0; //学生人数初始化//
    char c;
    FILE * fp; //定义一个文件指针fp//
    count(); //实时检测总数n//
    fp = fopen("students.txt", "at+"); //以"追加"方式打开students文本文件
    do
    {
        printf("请输入学生的个人信息:\n");
        printf("\n请输入第%d位学生的信息:\n", n + 1);
        printf("请输入学生的学号:");
        scanf("%d", &st[i].id);
        printf("请输入学生的姓名:");
        scanf("%s", st[i].name);
        printf("请输入学生的性别:");
        scanf("%s",st[i].gender);
        printf("请输入学生的年龄:");
        scanf("%d",&st[i].age);
        printf("请输入学生的数学分析成绩:");
        scanf("%d", &st[i].MathAna);
        printf("请输入学生的高等代数成绩:");
        scanf("%d", &st[i].LiAlg);
        printf("请输入学生的程序设计成绩:");
        scanf("%d",&st[i].Computer);
        printf("请输入学生的大学英语成绩:");
        scanf("%d", &st[i].English);
        printf("请输入学生的GPA:");
        scanf("%.2lf",&st[i].GPA);
        
        fwrite( & st[i], sizeof(struct Student), 1, fp); //以方式将其写入students文本文件
        i++;
        n++;
        printf("\n\n\t\t\t\t是否继续输入(Y/N):");
        getchar(); //提示是否继续,从键盘获得一个字符
        scanf("%c", &c);
    }
    while ( c == 'y' || c == 'Y');
    fclose(fp);
}

运行结果如下图:

img

  • 写回答

1条回答 默认 最新

  • Huazie 全栈领域优质创作者 2023-01-07 17:51
    关注
    • 前面的 字符串输入,还是要 getchar() 接收一下换行,不然接收的数据都乱套了

      img

    • 这里输入double类型也要改下:

    img

    • 另外,你这里 n 如果输入非 0 的数,一直是成立的,比如你输入1,即使你后面输入了 no,也会再次执行一下;你应该 n 重新要再输入一下值

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

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

悬赏问题

  • ¥30 YOLO检测微调结果p为1
  • ¥20 求快手直播间榜单匿名采集ID用户名简单能学会的
  • ¥15 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题