删除记录——del()函数当用户在功能菜单中选择数字4时,会调用del()函数进入删除记录模块,对学生学号进行判断,如果学号存在即可删除该生的所有信息,否则输出没有找到该生的记录。
void del(struct student stu[]) { int id, i; char ch; printf("删除学生的记录。\n"); printf("请输入学号:"); scanf("%d", &id); for (i = 0; i < n; i++) { if (id == stu[i].id) { getchar(); printf("找到该生的记录,如下所示:\n"); HH; //显示记录的标题 show(stu, i); //显示数组stu中的第i条记录 printf("是否删除?(Y/N)\n"); scanf("%c", &ch); if (ch == 'Y' || ch == 'y') { for (; i < n; i++) // 被删除记录后面的记录均前移一位 stu[i] = stu[i + 1]; n--; //记录总条数减1 printf("删除成功!"); } return; } } printf("没有找到该生的记录!\n"); }
查找记录——search()函数当用户在功能菜单中输入数字5时,会调用search()进入查找记录模块,在该模块中输入查找的学生姓名,如果该学生存在则输出该学生的全部信息,否则输出没有找到该生的记录。
void search(struct student stu[]) { char name[8]; int i; printf("查找学生的记录。\n"); printf("请输入学生的姓名:"); scanf("%s", &name); for (i = 0; i < n; i++) { if (strcmp(name, stu[i].name) == 0) { printf("找到该生的记录,如下所示:\n"); HH; //显示记录的标题 show(stu, i); //显示数组stu中的第i条记录 return; } } printf("没有找到该生的记录。\n"); }
排序——sort()函数当用户在功能菜单中输入数字6时,会调用sort()函数进入排序记录模块,该模块会输出所有学生的信息,并按总成绩由高到低进行排序。
void sort(struct student stu[]) { int i, j; struct student t; printf("按总成绩进行排序,"); for (i = 0; i < n - 1; i++) { for (j = i + 1; j < n; j++) { if (stu[i].sum < stu[j].sum) { t = stu[i]; stu[i] = stu[j]; stu[j] = t; } } } printf("排序结果如下:\n"); showAll(stu); //显示排序后的所有记录 }
案例实现
由于该系统需要定义6个函数,而且还涉及变量,代码较多,因此可以分文件实现该系统,将函数声明与定义在头文件student.h中实现,函数实现在student.c文件中完成,函数调用在main.c文件中执行。
定义student.h文件在student.h文件中定义项目需要的变量与函数声明。在定义变量时,因为学生信息包括学号、姓名和成绩等不同数据类型的属性,所以需要定义一个学生类型的结构体。在存储学生信息时,可选用数组、字符串指针,考虑到学生要根据总成绩来排序,为方便排序,我们选用数组来存储学生信息。
struct student { int id; // 学号 char name[8]; //姓名 int chinese; //计算机基础成绩 int math; //数据结构成绩 int sum; //总分 };
定义student.c文件在student.c文件中实现各个功能函数。
定义main.c文件在main.c文件中,定义保存学生信息的结构体数组,构建学生成绩管理系统主界面,使用while(1)循环控制是否退出系统,在while循环中使用switch语句判断用户所选择的功能,根据用户选择的功能调用相应的函数。