综合案例:学生成绩管理系统
需求:
1.存储最多50名学生的信息(不使用结构体)
2.每个学生包含
- 学号(字符数组)
- 姓名(字符数组)
- 3门课程成绩(一维数组)
3.实现功能菜单
- 添加学生信息
- 显示所有学生信息
- 计算学生平均分
- 查找最高分科目
- 退出系统
代码:
#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;
}