目录
学生管理系统
项目要求
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时,就可以进行其他的成绩操作,但不能再执行录用成绩的操作。所以当用户输入的命令无法执行时,应当给出提示。
项目思路
一、功能概述
这是一个学生成绩管理系统,提供了以下功能:
- 成绩录入(命令
T
):允许用户输入学生人数和每个学生的三门课成绩。- 显示帮助菜单(命令
H
):展示可用的命令说明。- 计算学生平均分(命令
A
):计算每个学生的平均成绩。- 列出成绩表(命令
L
):显示所有学生的学号、三门课成绩和平均分。- 按平均成绩由高到低排序(命令
P
):对学生成绩进行排序。- 按学号查询学生成绩(命令
S
):根据输入的学号查找并显示学生的成绩。- 清屏(命令
C
):清除屏幕显示。- 退出系统(命令
Q
):退出程序。二、主要函数分析
打印帮助菜单,显示每个命令的功能说明。
Help
函数:
Type
函数:
- 提示用户输入学生人数。
- 然后逐个输入学生的学号和三门课成绩,并存储在
stu
结构体数组中。打印学生成绩表,包括学号、三门课成绩和平均分。
List
函数:计算每个学生的平均成绩,存储在
Average
函数:stu[i].ave
中。使用冒泡排序算法,根据学生的平均成绩对
Sort
函数:stu
结构体数组进行降序排序。
Search
函数:
- 提示用户输入要查询的学生学号。
- 如果学号在有效范围内,查找并打印该学生的成绩。
使用
Clear
函数:system("clear")
调用系统命令清屏。将标志变量
Exit
函数:t
设为 0,以退出程序循环。
分部编写:
用了两个全局变量:
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语言编写:学生管理系统