案例描述
案例要求模拟开发一个学生成绩管理系统,此系统具有以下功能:
添加学生信息,包括学号、姓名、语文成绩、数学成绩;
显示学生信息,将所有学生信息打印输出;
修改学生信息,可以根据姓名查找到学生,然后可以修改学生姓名、成绩项;
删除学生信息,根据学号查找到学生,将其信息删除;
查找学生信息,根据学生姓名,将其信息打印输出;
按学生总成绩进行从高到低排序。
这些功能之间的逻辑关系如下图所示:
学生成绩管理系统
案例分析
分析案例需求可知,该系统首先会向用户展现一个菜单选择界面,用户可以根据菜单界面的提示,选择不同的功能进入子界面,因此可以针对每一个功能定义一个函数,通过函数调用实现相应功能。由系统需求可知,该系统主要有6大功能,因此需要定义6个函数。
添加记录——add()函数当用户在功能菜单中选择数字1时,会调用add()函数进入添加记录模块,提示用户输入学生的学号、姓名、计算机基础成绩、数据结构成绩。当用户输入完毕后,会提示用户是否继续添加,Y表示继续,N表示返回。需要注意的是,在添加学号时不能重复,如果输入重复的学号就会提示此学号已存在。
void add(struct student stu[]) { int i, id = 0; //i作为循环变量,id用来保存新学号 char quit; //保存是否退出的选择 do { printf("学号:"); scanf("%d", &id); for (i = 0; i < n; i++) { if (id == stu[i].id) { printf("此学号存在!\n"); return; } } stu[i].id = id; printf("姓名:"); scanf("%s", &stu[i].name); printf("计算机基础成绩:"); scanf("%d", &stu[i].chinese); printf("数据结构成绩:"); scanf("%d", &stu[i].math); stu[i].sum = stu[i].chinese + stu[i].math; n++; //记录条数加1 printf("是否继续添加?(Y/N)"); scanf("\t%c", &quit); } while (quit != 'N'); }
显示记录——showAll()函数当用户在功能菜单中选择数字2时,会调用show()函数进入显示记录模块,并向控制台输出录入的所有学生的学号、姓名、数据结构成绩、计算机基础成绩和成绩总和。
void show(struct student stu[], int i) { printf("%-10d", stu[i].id); printf("%-10s", stu[i].name); printf("%-10d", stu[i].chinese); printf("%-10d", stu[i].math); printf("%-10d\n", stu[i].sum); }
修改记录——modify()函数当用户在功能菜单中选择数字3时,会调用modify()函数进入修改记录模块,输入要修改的学生姓名,当用户输入了已录入的学生姓名后,如果学生信息存在即可修改除学号以外的其他信息,否则输出没有找到该生的记录。
void modify(struct student stu[]) { char name[8], ch; int i; printf("修改学生的记录。\n"); printf("请输入学生的姓名:"); scanf("%s", &name); for (i = 0; i < n; i++) { if (strcmp(name, stu[i].name) == 0) { getchar(); printf("找到该生的记录,如下所示:\n"); HH; //显示记录的标题 show(stu, i); printf("是否修改?(Y/N)\n"); scanf("%c", &ch); if (ch == 'Y' || ch == 'y') { getchar(); printf("姓名:"); scanf("%s", &stu[i].name); printf("计算机基础成绩:"); scanf("%d", &stu[i].chinese); printf("数据结构成绩:"); scanf("%d", &stu[i].math); stu[i].sum = stu[i].chinese + stu[i].math; printf("修改完毕。\n"); } return; } } printf("没有找到该生的记录。\n"); }