You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言GPA计算器开发求助:多学生数据存储及程序异常问题

C语言GPA计算器开发问题解决方案

需求概述

管理员模式

  • 录入学生信息(姓名、固定格式Student ID,如KPKL12345)
  • 录入学生课程信息(course code、学分、成绩、学期)
  • 生成学生学期GPA分数
  • 生成学生CGPA分数
  • 查看学生GPA分数
  • 查看学生CGPA分数

学生模式

  • 通过Student ID登录
  • 查看个人GPA和CGPA分数

现有代码的即时问题修复

当前代码选择管理员模式后直接终止,核心原因有两个:

  1. scanf("%d", &mode)读取整数后,输入缓冲区残留换行符\n,后续scanf("%c", &studentID)会直接读取该换行符,导致程序提前结束。
  2. 读取字符串应使用%s格式符,%c仅能读取单个字符,无法完整读取Student ID。

修复后的代码:

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

int main() {
    char studentID[10], studentName[20], courseCode[8], grade[2];
    int mode, creditHR;

    printf(" ========================================\n");
    printf("             GPA Calculator\n");
    printf(" ========================================\n");
    printf("          Please select a mode\n");
    printf("       --------------------------\n");
    printf("       1. Administrator Mode\n"); 
    printf("       2. Student Mode\n");
    printf("       3. Exit\n\n");
    printf("  >");
    scanf("%d", &mode);
    // 清除输入缓冲区的换行符
    getchar();

    if (mode == 1) {
        printf("Please enter a student ID > ");
        // 使用%s读取完整字符串,注意数组长度需容纳输入+结束符
        scanf("%s", studentID);
        printf("You entered student ID: %s\n", studentID);

    } else if (mode == 2) {
        printf("Please enter your student ID to login > ");
        scanf("%s", studentID);
        // 后续可添加ID验证逻辑

    } else if (mode ==3) {
        printf("Thank you for using the GPA Calculator.\n");
    } else {
        printf("Invalid Mode, please try again.\n");
    }
    return 0;
}

多学生信息存储方案

要批量存储并管理学生信息,需采用结构体+动态数组的组合设计:

1. 定义核心结构体

// 单门课程信息结构体
typedef struct {
    char courseCode[8];
    int creditHours;
    char grade[2];
    int semester; // 用整数表示学期,如1、2、3
} Course;

// 单学生完整信息结构体
typedef struct {
    char studentID[10];
    char studentName[20];
    Course *courses; // 动态数组存储该学生所有课程
    int courseCount; // 当前已录入的课程数量
    float *semesterGPAs; // 存储各学期GPA
    int semesterCount; // 已记录的学期数
    float cgpa; // 累计GPA
} Student;

2. 存储学生集合

使用动态数组实现灵活的学生数量扩展:

Student *students = NULL;
int studentCount = 0;
int maxStudents = 0;

// 添加新学生时的扩容逻辑
void addNewStudent() {
    if (studentCount >= maxStudents) {
        maxStudents += 10; // 每次扩容10个学生名额
        students = realloc(students, maxStudents * sizeof(Student));
        if (!students) {
            printf("Memory allocation failed!\n");
            exit(1);
        }
    }
    // 初始化新学生的动态数组字段
    students[studentCount].courses = NULL;
    students[studentCount].courseCount = 0;
    students[studentCount].semesterGPAs = NULL;
    students[studentCount].semesterCount = 0;
    students[studentCount].cgpa = 0.0;
    studentCount++;
}

后续开发推进步骤

1. 完善管理员模式功能

  • 学生录入校验:添加Student ID格式检查(如是否以KPKL开头,后接5位数字),同时校验ID是否重复
  • 课程录入逻辑:为指定学生添加课程,同时实现等级转分数逻辑(如A=4.0、B=3.0等)
  • GPA计算:按学期分组课程,用(学分×分数总和) ÷ 总学分计算学期GPA并存储
  • CGPA计算:累计所有课程的加权分数总和,除以总学分得到CGPA并更新字段
  • 信息查询:通过Student ID遍历学生数组,匹配后展示对应学期GPA和CGPA

2. 完善学生模式功能

  • 登录验证:遍历学生数组,检查输入的Student ID是否存在
  • 信息展示:验证通过后,输出该学生的所有学期GPA和CGPA

3. 可选:数据持久化

若需关闭程序后保留数据,可将学生信息写入本地文件(如students.dat),程序启动时通过fread加载数据,退出时用fwrite保存更新。

内容的提问来源于stack exchange,提问作者Dominic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 08:03:29