C语言综合案例:学生成绩管理系统

综合案例:学生成绩管理系统

需求:

1.存储最多50名学生的信息(不使用结构体)

2.每个学生包含

  • 学号(字符数组)
  • 姓名(字符数组)
  • 3门课程成绩(一维数组)

3.实现功能菜单

  • 添加学生信息
  • 显示所有学生信息
  • 计算学生平均分
  • 查找最高分科目
  • 退出系统

代码:

c 复制代码
#include <stdio.h>
#include <string.h>
// 常量定义
#define MAX_STU 50  // 定义学生数量
#define NAME_LEN 20 // 名字的最大长度
#define ID_LEN 8   // 学号的最大长度
#define COURSE_NUM 3 // 课程数量
// 全局数组实现数据存储
char stu_id[MAX_STU][ID_LEN];      
// 学号二维数组  
char stu_name[MAX_STU][NAME_LEN];  // 姓名二维数组
int scores[MAX_STU][COURSE_NUM];   // 成绩二维数组
int stu_count = 0;                 
// 当前实际学生数
/**
 * 输入校验成绩
 * course 课程名称
 */ 
int get_valid_score(const char* course) // const修饰的变量,值不能改变
{
    int score;
    while(1)
    {
        printf("请输入%s成绩(0~100):",course);
        if(scanf("%d",&score) == 1 && score >=0 && score <= 100) // 校验:1. 校验输入的数据的
            格式正确  2. 成绩范围:0 <= score <= 100
        {
            return score;// 成绩ok,就返回给调用着
        }
        // 输入有误
        while(getchar() != '\n'); // 清空输入缓冲区
        printf("成绩输入有误!\n");
    }
}
/**
 * 添加学生信息
 */ 
void add_student()
{
    // 判断:判断数组是否已经存满
    if(stu_count >= MAX_STU)
    {
        printf("存储已满!\n");
        return;// 函数返回,后续代码不再执行
    }
    printf("\n--- 添加第%d个学生 ---\n",stu_count + 1);
    // 输入学号
    printf("请输入学号:");
    scanf("%s",stu_id[stu_count]);
    // 输入姓名
    printf("请输入姓名:");
    getchar();
    scanf("%[^\n]",stu_name[stu_count]); // %[^\n] 匹配除了\n以外的输入
    // 输入各科成绩
    scores[stu_count][0] = get_valid_score("语文");
    scores[stu_count][1] = get_valid_score("数学");
    scores[stu_count][2] = get_valid_score("英语");
    stu_count++;
}
/**
 * 显示所有学生信息
 */ 
void show_all()
{
    if(stu_count == 0)
    {
        printf("暂无学生信息!\n");
        return;// 跳出函数,后续代码不执行
    }
    // 格式化输出信息
    printf("\n%-12s%-20s%-12s%-12s%-12s\n","学号","姓名","语文","数学","英语");
    for(int i = 0; i < stu_count; i++)
    {
        // 获取学号和姓名
        printf("%-12s%-20s",stu_id[i],stu_name[i]);
        for(int j = 0; j < COURSE_NUM; j++)
        {
            printf("%-12d",scores[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
/**
 * 计算平均分(带流程控制)
 */
void calc_average() {
    if(stu_count == 0) {
        printf("暂无数据!\n");
        return;
    }
    char target_id[ID_LEN];
    printf("请输入要查询的学号: ");
    scanf("%s", target_id);
    for(int i=0; i<stu_count; i++) {
        if(strcmp(stu_id[i], target_id) == 0) {// 校验控制台输入学号是否匹配到数组中已存在学号
            float sum = 0;
            for(int j=0; j<COURSE_NUM; j++) {
                sum += scores[i][j];
            }
            printf("平均分: %.2f\n", sum/COURSE_NUM);
            return;
        }
    }
    printf("未找到该学生!\n");
}
/**
 * 查找最高分科目(二维数组遍历)
 */
void find_max() {
    int max_score = -1;
    char max_course[20];
    char max_stu[NAME_LEN];
    for(int i=0; i<stu_count; i++) {// 遍历学生
        for(int j=0; j<COURSE_NUM; j++) {// 遍历每个学生的成绩
            if(scores[i][j] > max_score) {// 求最高成绩
                max_score = scores[i][j];
                // 最高成绩对应的姓名
                strcpy(max_stu, stu_name[i]);
                switch(j) {
                    case 0: strcpy(max_course, "语文"); break;
                    case 1: strcpy(max_course, "数学"); break;
                    case 2: strcpy(max_course, "英语"); break;
                }
            }
        }
    }
    if(max_score != -1) {
        printf("最高分记录: %s 的 %s 获得 %d 分\n", 
               max_stu, max_course, max_score);
    } else {
        printf("暂无数据!\n");
    }
}
int main(int argc,char *argv[])
{
    // 定义一个变量,用来接收用户的输入
    int choice;
    while(1)
    {
        // 设计头
        printf("\n=== 学生成绩管理系统 v1.0 ===\n");
        printf("1. 添加学生信息\n");
        printf("2. 显示所有学生信息\n");
        printf("3. 查看平均分\n");
        printf("4. 查找最高分\n");
        printf("5. 退出系统\n");
        printf("请选择操作:");
        // 过滤掉非数字
        int result = scanf("%d",&choice);
        if(result != 1)  // 该判断的作用,检测是否输入的是整数,输入的数据匹配scanf() == 1,不匹
            配 scanf() != 1
        {
            // 如果输入的不是数字,就执行这个判断
            // 清空输入缓冲区
            while(getchar() != '\n');  
            printf("输入有误!\n");
            continue;
        }
        // 过滤掉1~5以外的数字
        // 校验
        switch(choice)
        {
            case 1:// 添加学生信息
                add_student();
                break;
            case 2:// 显示所有学生信息
                show_all();
                break;
            case 3:// 查看平均分
                calc_average();
                break;
            case 4:// 查找最高分
                find_max();
                break;
            case 5:// 退出系统(结束这个函数)
                printf("系统已退出!\n");  
                return 0;// 跳出函数
            default:
                printf("无效的选项!\n");
        }
    }

    return 0;
}
相关推荐
kfepiza8 分钟前
Python的循环和条件判断 笔记250303
开发语言·笔记·python
川石课堂软件测试1 小时前
涨薪技术|持续集成Git使用详解
开发语言·javascript·git·python·功能测试·ci/cd·单元测试
Warren981 小时前
使用SLF4J + Logback进行日志记录:
java·开发语言·前端·javascript·笔记·intellij-idea·logback
窝窝和牛牛1 小时前
FastGPT 引申:基于 Python 版本实现 Java 版本 RRF
开发语言·开源
局外人_Jia1 小时前
【简单的C++围棋游戏开发示例】
开发语言·c++·c·visual studio
油泼辣子多加1 小时前
【华为OD机考】华为OD笔试真题解析(20)--投篮大赛
数据结构·算法·华为od
加油,旭杏1 小时前
C++方向的面经
开发语言·c++
修己xj1 小时前
算法系列之数据结构-Huffman树
算法
王有品2 小时前
python之爬虫入门实例
开发语言·爬虫·python
一水鉴天2 小时前
为AI聊天工具添加一个知识系统 之135 详细设计之76 通用编程语言 之6
开发语言·人工智能·架构