要求:
1)系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令。
2)开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提示“成绩表为空!请先使用命令 T 录入学生成绩。”
同理,当输入其他的成绩处理命令时也作相应的处理。
3)输入命令 T,调用Type子函数录入成绩。
界面提示输入学生人数
输入3 ¿ 提示输入3名学生的3门课成绩,列出成绩单的表头“学号 语文 数学 英语”,提示学号:1
输入1号学生的3门课成绩,用空格间隔,回车结束。提示学号:2
输入2号学生的3门课成绩,用空格间隔,回车结束。提示学号:3
输入3号学生的3门课成绩,用空格间隔,回车结束。Type子函数调用结束,返回。提示输入命令。
4)输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
5)输入命令 A ,调用Average子函数计算平均分,提示“平均分已计算。请使用命令L查看。” Average子函数调用结束,返回。提示输入命令。
输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
6)输入命令 P ,调用Sort子函数将各学生记录按平均分由高到低排序,提示“完成排序。请使用命令L查看。” Sort子函数调用结束,返回。提示输入命令。
输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
7)输入命令 S ,调用Search子函数查询学生成绩,提示“输入要查询的学生学号”。
输入2 ¿ 找到2号学生的成绩并输出。Search子函数调用结束,返回。提示输入命令。
8)输入命令C ¿ 执行清屏函数语句system("clear");
清除屏幕的所有内容。提示输入命令。
9)输入命令H ¿ 调用Help子函数显示帮助菜单。Help子函数调用结束,返回。提示输入命令。
10)输入命令Q 则退出系统。
注意:
1)输出数组元素时,要将学号单独处理,输出为整数(即保留0位小数)。同理,在计算成绩时也要将第1列的学号撇开,只计算第2列之后的。成绩保留1位小数。
2)学生人数n贯穿始终,通过n的值判断当前命令的子函数是否能够调用执行。例如:当n=0时,说明还没有录入成绩。而一旦输入命令T,也即调用Type子函数录入了成绩,则n的值就不再是0。当n!=0时,就可以进行其他的成绩操作,但不能再执行录用成绩的操作。所以当用户输入的命令无法执行时,应当给出提示。
思路:
总的来看,这个系统有几个功能组成,运行系统显示的那个页面可以看做目录,也可以跟功能之一的Help看做同一个,其他还有录入,罗列,求平均值,排序,查找,清空,终止共八个功能。每一个功能可以看做一个子函数,主函数作为一个主干,或者看做一个目录来连接这八大功能。因此,可以把这个学生管理系统看作一个主干加八大功能分支,外加运用一个结构体。下面依次编写。
分部编写:
先写出头文件+子函数函数,本人习惯子函数写在主函数后,先罗列子函数是编译格式
#include <stdio.h>
#include <stdlib.h>
void Help(); //目录也是帮助功能
void Type(); //录入成绩功能
void List(); //罗列功能;
void Average(); //求平均值功能
void Sort(); //排序
void Search(); //查找
void Exit(); //退出
void Clear(); //清空
用了两个全局变量:
int n = 0; //n为学生人数
int t = 1; //将t看做系统开关,运行默认为1,开关打开,实现退出功能时将t置零
0,退出系统;
结构体:
struct student
{
int id; //id为学号
float score[3]; //成绩,用于储存语数英三门
float ave; // 平均值
} stu[50]; //50为开辟了50个空间,足够用就可,开辟多少随意
主函数:起到目录功能
int main(int argc, char const *argv[])
{
Help(); //先调用Help()函数,运行系统时显示
while (t) //t为全局变量,起到开关作用
{
char num;
printf("请输入命令=");
scanf(" %c", &num); //scanf()内加了两个空格,消除垃圾字符
switch (num) //判断指令
{
case 'T':
if (n == 0)
Type(); //n为0时,正常输入
else //n不为0时,说明成绩已录入,不能继续添加
{
printf("成绩已录入,无法继续添加,请重新输入命令\n");
}
break;
case 'H':
Help();
break;
case 'A':
if (n == 0) //n为0,说明没有录成绩,没法求平均值
{
printf("成绩为空!请先使用命令T录入学生成绩\n");
}
else
Average();
break;
case 'L':
if (n == 0) //n为0,说明没有录成绩,没法罗列成绩
{
printf("成绩为空!请先使用命令T录入学生成绩\n");
}
else
List();
break;
case 'P':
if (n == 0) //n为0,说明没有录成绩,没法排序
{
printf("成绩为空!请先使用命令T录入学生成绩\n");
}
else
Sort();
break;
case 'S':
if (n == 0) //n为0,说明没有录成绩,没法查找
{
printf("成绩为空!请先使用命令T录入学生成绩\n");
}
else
Search();
break;
case 'C':
Clear();
break;
case 'Q':
Exit();
break;
default: //输入为其他指令,报错
printf("输入错误,请重新输入:\n");
}
}
return 0;
}
Help()子函数:帮助列表
void Help()
{
printf(" ************************************************** \n");
printf(" * 学生成绩管理系统————帮助菜单 * \n");
printf(" ************************************************** \n");
printf("\n");
printf(" * H = 显示帮助菜单 * \n");
printf(" * T = 成绩录入 * \n");
printf(" * A = 计算学生平均分 * \n");
printf(" * L = 列出成绩表 * \n");
printf(" * P = 按平均成绩由高到低排序 * \n");
printf(" * S = 按学号查询学生成绩 * \n");
printf(" * C = 清屏 * \n");
printf(" * Q = 退出系统 * \n");
printf("\n");
printf(" ************************************************** \n");
printf(" * Copyright <C> 2024.08.12 By SMJ * \n");
printf(" ************************************************** \n");
printf("\n\n");
}
Type()录入功能:
void Type()
{
printf("请输入学生人数:");
scanf("%d", &n);
printf("请输入%d名学生的三门课成绩:\n", n);
printf("学号 语文 数学 外语\n");
for (int i = 0; i < n; i++)
{
printf("%d", i + 1);
stu[i].id = i + 1; //统一格式,方便后面遍历输出
scanf("%f%f%f", &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
}
}
List()罗列成绩功能:
void List()
{
printf("学生成绩如下:\n");
printf("学号 语文 数学 外语 平均分\n");
for (int i = 0; i < n; i++)
{
printf("%d %.2f %.2f %.2f %.2f\n", stu[i].id, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);
}
}
Average()求平均值功能
void Average()
{
for (int i = 0; i < n; i++)
{
stu[i].ave = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3;
}
printf("平均分已计算。请使用命令L查看。\n");
}
Sort()排序功能
void Sort()
{
struct student str[50]; //用来存储第三杯水的作用
if (stu[0].ave == 0) //判断是否计算平均值
{
printf("无法排序,请先使用命令A计算平均分\n");
}
else
{
for (int i = 0; i < n - 1; i++) //冒泡排序
{
for (int j = 0; j < n - 1 - i; j++)
{
if (stu[j].ave < stu[j + 1].ave)
{
str[j] = stu[j]; //三杯水交换
stu[j] = stu[j + 1];
stu[j + 1] = str[j];
}
}
}
printf("已完成排序,请使用命令L查看\n");
}
}
Search()查找功能
void Search()
{
int num;
printf("请输入要查询的学生学号:");
scanf("%d", &num);
if (num > n || num <= 0) //严瑾化
{
printf("超出学号范围,请使用命令S重新查询\n");
}
else
{
printf("学号 语文 数学 外语 平均分\n");
for (int i = 0; i < n; i++)
{
if (stu[i].id == num)
{
printf("%d %.2f %.2f %.2f %.2f\n", stu[i].id, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);
}
}
}
}
Clear()清空功能
void Clear()
{
system("clear"); //调用system函数清空
}
Exit()退出功能
void Exit()
{
t = 0; //全局变量置零,关闭循环,结束系统
printf("Press any key to continue\n");
}
总代码:
#include <stdio.h>
#include <stdlib.h>
void Help();
void Type();
void List();
void Average();
void Sort();
void Search();
void Exit();
void Clear();
int n = 0;
int t = 1;
struct student
{
int id;
float score[3];
float ave;
} stu[50];
int main(int argc, char const *argv[])
{
Help();
while (t)
{
char num;
printf("请输入命令=");
scanf(" %c", &num);
switch (num)
{
case 'T':
if (n == 0)
Type();
else
{
printf("成绩已录入,无法继续添加,请重新输入命令\n");
}
break;
case 'H':
Help();
break;
case 'A':
if (n == 0)
{
printf("成绩为空!请先使用命令T录入学生成绩\n");
}
else
Average();
break;
case 'L':
if (n == 0)
{
printf("成绩为空!请先使用命令T录入学生成绩\n");
}
else
List();
break;
case 'P':
if (n == 0)
{
printf("成绩为空!请先使用命令T录入学生成绩\n");
}
else
Sort();
break;
case 'S':
if (n == 0)
{
printf("成绩为空!请先使用命令T录入学生成绩\n");
}
else
Search();
break;
case 'C':
Clear();
break;
case 'Q':
Exit();
break;
default:
printf("输入错误,请重新输入:\n");
}
}
return 0;
}
void Help()
{
printf(" ************************************************** \n");
printf(" * 学生成绩管理系统————帮助菜单 * \n");
printf(" ************************************************** \n");
printf("\n");
printf(" * H = 显示帮助菜单 * \n");
printf(" * T = 成绩录入 * \n");
printf(" * A = 计算学生平均分 * \n");
printf(" * L = 列出成绩表 * \n");
printf(" * P = 按平均成绩由高到低排序 * \n");
printf(" * S = 按学号查询学生成绩 * \n");
printf(" * C = 清屏 * \n");
printf(" * Q = 退出系统 * \n");
printf("\n");
printf(" ************************************************** \n");
printf(" * Copyright <C> 2024.08.12 By SMJ * \n");
printf(" ************************************************** \n");
printf("\n\n");
}
void Type()
{
printf("请输入学生人数:");
scanf("%d", &n);
printf("请输入%d名学生的三门课成绩:\n", n);
printf("学号 语文 数学 外语\n");
for (int i = 0; i < n; i++)
{
printf("%d", i + 1);
stu[i].id = i + 1;
scanf("%f%f%f", &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
}
}
void List()
{
printf("学生成绩如下:\n");
printf("学号 语文 数学 外语 平均分\n");
for (int i = 0; i < n; i++)
{
printf("%d %.2f %.2f %.2f %.2f\n", stu[i].id, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);
}
}
void Average()
{
for (int i = 0; i < n; i++)
{
stu[i].ave = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2]) / 3;
}
printf("平均分已计算。请使用命令L查看。\n");
}
void Sort()
{
struct student str[50];
if (stu[0].ave == 0)
{
printf("无法排序,请先使用命令A计算平均分\n");
}
else
{
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - 1 - i; j++)
{
if (stu[j].ave < stu[j + 1].ave)
{
str[j] = stu[j];
stu[j] = stu[j + 1];
stu[j + 1] = str[j];
}
}
}
printf("已完成排序,请使用命令L查看\n");
}
}
void Search()
{
int num;
printf("请输入要查询的学生学号:");
scanf("%d", &num);
if (num > n || num <= 0)
{
printf("超出学号范围,请使用命令S重新查询\n");
}
else
{
printf("学号 语文 数学 外语 平均分\n");
for (int i = 0; i < n; i++)
{
if (stu[i].id == num)
{
printf("%d %.2f %.2f %.2f %.2f\n", stu[i].id, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].ave);
}
}
}
}
void Clear()
{
system("clear");
}
void Exit()
{
t = 0;
printf("Press any key to continue\n");
}
视频讲解及效果展示:
C语言编写:学生管理系统