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; }
复制