一位鹿人 2023-01-08 14:49 采纳率: 85.7%
浏览 40
已结题

编写的C语言成绩管理系统存在3个问题

经过多方帮助,目前已经基本实现了输入、输出、修改信息的功能。但还存在三个问题:
1.输入中文姓名和性别之后再输出,仍然出现乱码;
输出结果如下图所示:

img


2.当通过程序输入了一组学生信息并退出程序,再点击“运行”时,无法正常运行程序;
运行结果如下图:

img


3.在使用modify()函数修改学生信息时,如果试图修改GPA,则输入新的GPA并键入回车后,程序直接跳过判断环节。重新显示学生信息,GPA变成了0。
以上三个问题该如何解决?
代码如下:

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

int n = 0;
struct Student
{                    // 设置结构体变量,储存学生信息
    int id;          // 学号
    char name[10];   // 姓名
    char gender[10]; // 性别
    int age;         // 年龄
    int MathAna;     // 数学分析成绩
    int LiAlg;       // 高等代数成绩
    int Computer;    // 程序设计成绩
    int English;     // 大学英语成绩
    float GPA;       // 平均学分绩GPA
};
 
struct Student st[100];
int  read();
int  save();
void menu();   // 菜单
void input();  // 输入学生信息
void output(); // 输出学生信息
void modify();
 
int main()
{
    SetConsoleOutputCP(65001);
    int i;
    read();
 
    while (1)
    {
        menu();          // 调用菜单函数,显示菜单界面
        scanf("%d", &i); // 输入数字,进入不同功能
        switch (i)
        {
        case 0:
            return 0;
        case 1:
            input();
            break;
        case 2:
            modify();
            break;    
        case 8:
            output();
            break;
        default:
            break;
        }
    }
}

int read()
{
    FILE *fp;                         // 定义一个文件指针fp
    fp = fopen("students.txt", "a+"); // 以"a+" 方式打开students文本文件,可读写,文件不存在则创建文件。
    if (fp == NULL)
    {
        printf("读取文件错误!\n");
        return 0;
    }
    fread(&n, sizeof(int), 1, fp); // 读取总数
    for (int i = 0; i < n; i++)    // 读取n个数组元素
        fread(&st[i], sizeof(struct Student), 1, fp);
 
    fclose(fp); // 关闭文件
}
 
int save()
{
    FILE *fp;                        // 定义一个文件指针fp
    fp = fopen("students.txt", "w"); // 以"读取的" 方式打开students文本文件
    if (fp == NULL)
    {
        printf("写入文件错误!\n");
        return 0;
    }
    fwrite(&n, sizeof(int), 1, fp);            // 先写入总数
    fwrite(st, sizeof(struct Student), n, fp); // 写入n个数组元素
    fclose(fp);                                // 关闭文件
}

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 input() // 该程序用于实现输入学生信息
{
    int i = 0; // 学生人数初始化//
    char c;
    do
    {
        printf("请输入学生的个人信息:\n");
        printf("\n请输入第%d位学生的信息:\n", n + 1);
        printf("请输入学生的学号:");
        scanf("%d", &st[n].id);
        printf("请输入学生的姓名:");
        getchar();
        scanf("%s", st[n].name);
        printf("请输入学生的性别:");
        getchar();
        scanf("%s", st[n].gender);
        printf("请输入学生的年龄:");
        scanf("%d", &st[n].age);
        printf("请输入学生的数学分析成绩:");
        scanf("%d", &st[n].MathAna);
        printf("请输入学生的高等代数成绩:");
        scanf("%d", &st[n].LiAlg);
        printf("请输入学生的程序设计成绩:");
        scanf("%d", &st[n].Computer);
        printf("请输入学生的大学英语成绩:");
        scanf("%d", &st[n].English);
        printf("请输入学生的GPA:");
        scanf("%f", &st[n].GPA);
 
        n++;
        printf("\n\n\t\t\t\t是否继续输入(Y/N):");
        getchar(); // 提示是否继续,从键盘获得一个字符
        scanf("%c", &c);
    } while (c == 'y' || c == 'Y');
    save();
}
 
void output() // 该程序用于实现输出学生信息
{
    int i;
    char c;
    do
    {
        printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
        for (i = 0; i < n; i++)
        {
            printf(" %d ", st[i].id);
            printf("    %-s ", st[i].name);
            printf("     %-s ", st[i].gender);
            printf("     %d ", st[i].age);
            printf("\t%d ", st[i].MathAna);
            printf("\t\t%d ", st[i].LiAlg);
            printf("\t\t%d ", st[i].Computer);
            printf("\t\t%d ", st[i].English);
            printf("\t\t%.2f \n", st[i].GPA);
        }
        printf("\n\n\t\t\t\t是否继续其它操作(Y/N):"); // 提示是否继续
        scanf("%c", &c);
        c = getchar();
    } while (c == 'y' || c == 'Y');
}
 

void modify()   //该函数用于修改学生信息
{
    int i,tp,id1;
    char c;
    FILE * fp; //定义一个文件指针fp//
    lb:
    printf("\n按学号修改\n\n");
    printf("请输入要修改的学生学号\n");
    scanf("%d", &id1);
    for (i = 0; i < n; i++)
    {
        if (id1 == st[i].id)
        {
            printf("要修改的学生信息为:\n");
            printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
            printf(" %d ", st[i].id);
            printf("    %-s ", st[i].name);
            printf("     %-s ", st[i].gender);
            printf("     %d ", st[i].age);
            printf("\t%d ", st[i].MathAna);
            printf("\t\t%d ", st[i].LiAlg);
            printf("\t\t%d ", st[i].Computer);
            printf("\t\t%d ", st[i].English);
            printf("\t\t%.2f \n", st[i].GPA);
            do {
                printf("请选择要修改项:\n");
                printf("1学号\n2姓名\n3性别\n4年龄\n5数学分析成绩\n6高等代数成绩\n7程序设计成绩\n8大学英语成绩\n9GPA\n");
                scanf("%d", &tp);
                switch (tp)
                {
                case 1:
                    {
                        printf("请输入学号:\n");
                        scanf("%d", &st[i].id);
                        goto la;
                    }
                case 2:
                    {
                        printf("请输入姓名:\n");
                        scanf("%s", st[i].name);
                        goto la;
                    }
                case 3:
                    {
                        printf("请输入性别:\n");
                        scanf("%s", &st[i].gender);
                        goto la;
                    }
                case 4:
                    {
                        printf("请输入年龄:\n");
                        scanf("%d", &st[i].age);
                        goto la;
                    }
                case 5:
                    {
                        printf("请输入数学分析成绩:\n");
                        scanf("%d", &st[i].MathAna);
                        goto la;
                    }
                case 6:
                    {
                        printf("请输入高等代数成绩:\n");
                        scanf("%d", &st[i].LiAlg);
                        goto la;
                    }
                case 7:
                    {
                        printf("请输入程序设计成绩:\n");
                        scanf("%d", &st[i].Computer);
                        goto la;
                    }
                case 8:
                    {
                        printf("请输入大学英语成绩:\n");
                        scanf("%d",&st[i].English);
                        goto la;
                    }
                case 9:
                    {
                        printf("请输入GPA:\n");
                        scanf("%d",&st[i].GPA);
                        goto la;
                    }        
                }
            } 
            while ( tp < 10 );
               la: 
                printf("是否继续修改(y/n)\n"); //提示是否继续
                getchar();
                scanf("%c", &c);
            if (c == 'y' || c == 'Y') 
                goto lb;
        }
    }
    fp = fopen("students.txt", "w+"); //以"读写" 方式打开students文本文件
    for (i = 0; i < n; i++)
    fwrite( & st[i], sizeof(struct Student), 1, fp); //以 方式将其写入student文本文件
    fclose(fp); //关闭文件
}

  • 写回答

1条回答 默认 最新

  • 浪客 2023-01-08 15:11
    关注

    尽量避免使用goto,改了下modify,GPA输入用%f。
    一般不需要加 SetConsoleOutputCP(65001);
    保存用save函数,
    w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
    你的modify中没有写入n,导致第二次运行读取失败。

    
    void modify() // 该函数用于修改学生信息
    {
        int i, tp, id1;
        char c;
    
        while (1)
        {
            printf("\n按学号修改\n\n");
            printf("请输入要修改的学生学号\n");
            scanf("%d", &id1);
    
            for (i = 0; i < n; i++)
                if (id1 == st[i].id) // 找到学号后结束循环,i为该学生数组下标
                    break;
            if (i == n) // 没有该学号结束函数
            {
                printf("没有该学号学生\n");
                return;
            }
    
            printf("要修改的学生信息为:\n");
            printf("|#学号\t\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
            printf(" %d ", st[i].id);
            printf("    %-s ", st[i].name);
            printf("     %-s ", st[i].gender);
            printf("     %d ", st[i].age);
            printf("\t%d ", st[i].MathAna);
            printf("\t\t%d ", st[i].LiAlg);
            printf("\t\t%d ", st[i].Computer);
            printf("\t\t%d ", st[i].English);
            printf("\t\t%.2f \n", st[i].GPA);
            do
            {
                printf("请选择要修改项:\n");
                printf("1学号\n2姓名\n3性别\n4年龄\n5数学分析成绩\n6高等代数成绩\n7程序设计成绩\n8大学英语成绩\n9GPA\n");
                scanf("%d", &tp);
                if (tp == 1)
                {
                    printf("请输入学号:\n");
                    scanf("%d", &st[i].id);
                    break;
                }
                if (tp == 2)
                {
                    printf("请输入姓名:\n");
                    scanf("%s", st[i].name);
                    break;
                }
                if (tp == 3)
                {
                    printf("请输入性别:\n");
                    scanf("%s", &st[i].gender);
                    break;
                }
                if (tp == 4)
                {
                    printf("请输入年龄:\n");
                    scanf("%d", &st[i].age);
                    break;
                }
                if (tp == 5)
                {
                    printf("请输入数学分析成绩:\n");
                    scanf("%d", &st[i].MathAna);
                    break;
                }
                if (tp == 6)
                {
                    printf("请输入高等代数成绩:\n");
                    scanf("%d", &st[i].LiAlg);
                    break;
                }
                if (tp == 7)
                {
                    printf("请输入程序设计成绩:\n");
                    scanf("%d", &st[i].Computer);
                    break;
                }
                if (tp == 8)
                {
                    printf("请输入大学英语成绩:\n");
                    scanf("%d", &st[i].English);
                    break;
                }
                if (tp == 9)
                {
                    printf("请输入GPA:\n");
                    scanf("%f", &st[i].GPA); //
                    break;
                }
            } while (tp < 10);
    
            printf("是否继续修改(y/n)\n"); // 提示是否继续
            getchar();
            scanf("%c", &c);
            if (c != 'y' || c != 'Y')
                break;
        }
        save();
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?