当前位置: 首页 > article >正文

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

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

需求

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

2.每个学生包含:

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

3.实现功能菜单:

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

代码

/*************************************************************************
  > File Name:    demo.c
  > Author:       张扣
  > Description:C语言综合案例:学生成绩管理系统
  > Created Time: 2025年02月27日 星期四 21时10分38秒
 ************************************************************************/

#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);
        //校验:1.校验输入的数据格式 2.校验成绩的范围是否正确
        if(scanf("%d",&score == 1 && score >= 0 && score <= 100))
        {
            return score;
        }

        //输入有误
        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);
        //该判断的作用,检测是否输入的是整数,输入的数据匹配scanf() == 1,不匹配scanf() != 1
        if(result != 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;
}


http://www.kler.cn/a/564637.html

相关文章:

  • 【FL0080】基于SSM和微信小程序的宠物寄养平台
  • Docker Desktop 社区版安装配置全流程指南(Windows平台)
  • 47.matlab 中filter design工具设计的滤波器如何在.m代码中调用
  • DeepSeek-R1:大语言模型推理能力强化的创新探索
  • C++ pybind11 安装
  • Spring Boot集成Spring Security之HTTP请求授权
  • Redis除了做缓存还有哪些应用场景
  • 宿舍管理系统小程序(论文源码调试讲解)
  • 【SeaTunnel】分布式数据集成平台SeaTunnel
  • 网站内容更新后百度排名下降怎么办?有效策略有哪些?
  • C#从入门到精通(35)—如何防止winform程序因为误操作被关闭
  • 打包rocketmq-dashboard报错问题记录
  • SoapUI 结合 Postman 测试 WebService 协议
  • 基于PyTorch实现的自适应注意力卷积网络(AACN)详解
  • Qt之3D绘制曲线:QtDataVisualization实时绘制散点图
  • pytest.ini、pytest运行参数以及使用markers标记测试用例
  • Linux mount命令
  • (十 二)趣学设计模式 之 享元模式!
  • java练习(45)
  • Android 开发使用 AI 提升效率