编写一个学生信息管理系统,实现学生成绩的录入,输出,计算平均分,排序,查询功能,
同时在如果在还没有录入成绩的时候进行输出,查询等操作,会提示成绩表为空,让我们先录入成绩。
最后可以进行清屏与退出。
首先,构建结构体来存放学生信息。
结构体成员变量包括学生的学号,语数外成绩以及平均成绩。
//定义结构体
struct student
{
int id;
float c;
float m;
float e;
float a;
}su[100];
1)系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令。
//菜单
void Help()
{
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("* Copyright <C> 2024.03.23 By 申屠武 *\n");
printf("***********************************************\n");
}
2)输入命令 T,调用Type子函数录入成绩。
先给一句提示,确定输入的学生信息数量,然后根据输入的数量进行循环,依次输入学生信息
每输入完一位学生的信息,结构体数组下标+1,然后继续输入下一个。
//成绩录入
int Type(struct student* p)
{
int n;
printf("请输入学生人数:\n");
scanf("%d", &n);
printf("请输入%d个学生3门课的成绩\n", n);
printf("学号\t语文\t数学\t英语\n");
for (int i = 0; i < n; i++)
{
printf(" %d ", i + 1);
scanf("%f\t%f\t%f", &su[i].c, &su[i].m, &su[i].e);
su[i].id = 1 + i;
}
return n;
}
代码效果为
界面提示输入学生人数
输入3 提示输入3名学生的3门课成绩,列出成绩单的表头“学号 语文 数学 英语”,提示学号:1
输入1号学生的3门课成绩,用空格间隔,回车结束。提示学号:2
输入3号学生的3门课成绩,用空格间隔,回车结束。Type子函数调用结束,返回。提示输入命令。
3)输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
//列出成绩表
void List(struct student* p, int n)
{
printf("学生成绩如下\n");
printf("学号\t语文\t数学\t英语\t平均分\n");
for (int i = 0; i < n; i++)
{
printf("%d\t%.1f\t%.1f\t%.1f\t%.1f\n", su[i].id, su[i].c, su[i].m, su[i].e, su[i].a);
}
4)输入命令 A ,调用Average子函数计算平均分,提示“平均分已计算。请使用命令L查看。” Average子函数调用结束,返回。提示输入命令。
//求平均值
void Average(struct student* p, int n)
{
for (int i = 0; i < n; i++)
{
su[i].a = (su[i].c + su[i].m + su[i].e) / 3;
}
printf("平均成绩已计算请使用命令 L 查看\n");
}
输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
5)输入命令 P ,调用Sort子函数将各学生记录按平均分由高到低排序,提示“完成排序。请使用命令L查看。” Sort子函数调用结束,返回。提示输入命令。
// 排序
void Sort(struct student* p, int n)
{
struct student t;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (su[j].a < su[j+1].a)
{
t = p[j];
p[j] = p[j + 1];
p[j + 1] = t;
}
}
}
printf("完成排序,请使用命令L查看\n");
}
输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
6)输入命令 S , 利用Search函数查找学生成绩,Search子函数调用结束,输出学生成绩成绩,返回。
//查找
void Search(struct student* p, int n)
{
int u = 0;
printf("请输入要查询的学号\n");
scanf("%d", &u);
printf("学号\t语文\t数学\t英语\t平均分\n");
for (int i = 0; i < n; i++)
{
if (su[i].id == u)
{
printf("%d\t%.1f\t%.1f\t%.1f\t%.1f", su[i].id, su[i].c, su[i].m, su[i].e, su[i].a);
}
}
printf("\n");
}
7) 主函数 中,进行功能的选择
int main(int argc, char const* argv[])
{
Help();
int n = 0;
char z;
while (1)
{
printf("请输入命令= ");
scanf("%c",&z);
if (z == 'T')
{
n = Type(su);
}
else if (z == 'A')
{
if (n == 0)
printf("成绩列表为空!请先使用命令T录入学生系统\n");
else
Average(su, n);
}
else if (z == 'L')
{
if (n == 0)
printf("成绩列表为空!请先使用命令T录入学生系统\n");
else
List(su, n);
}
else if (z == 'P')
{
if (n == 0)
printf("成绩列表为空!请先使用命令T录入学生系统\n");
else
Sort(su, n);
}
else if (z == 'S')
{
if (n == 0)
printf("成绩列表为空!请先使用命令T录入学生系统\n");
else
Search(su, n);
}
else if (z == 'C')
{
system("clear");
}
else if (z == 'H')
{
Help();
}
else if (z == 'Q')
{
break;
}
else if (z != 'H' && z != 'A' && z != 'S' && z != 'L' && z != 'C' && z != 'T' && z != 'P')
{
printf("请重新输入:\n");
}
getchar();
}
return 0;
开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提示“成绩表为空!请先使用命令 T 录入学生成绩。”
同理,当输入其他的成绩处理命令时也作相应的处理。
完整代码如下
#include <stdio.h>
#include <stdlib.h>
//定义结构体
struct student
{
int id;
float c;
float m;
float e;
float a;
}su[100];
//菜单
void Help()
{
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("* Copyright <C> 2024.03.23 By 申屠武 *\n");
printf("***********************************************\n");
}
//成绩录入
int Type(struct student* p)
{
int n;
printf("请输入学生人数:\n");
scanf("%d", &n);
printf("请输入%d个学生3门课的成绩\n", n);
printf("学号\t语文\t数学\t英语\n");
for (int i = 0; i < n; i++)
{
printf(" %d ", i + 1);
scanf("%f\t%f\t%f", &su[i].c, &su[i].m, &su[i].e);
su[i].id = 1 + i;
}
return n;
}
//求平均值
void Average(struct student* p, int n)
{
for (int i = 0; i < n; i++)
{
su[i].a = (su[i].c + su[i].m + su[i].e) / 3;
}
printf("平均成绩已计算请使用命令 L 查看\n");
}
//列出成绩表
void List(struct student* p, int n)
{
printf("学生成绩如下\n");
printf("学号\t语文\t数学\t英语\t平均分\n");
for (int i = 0; i < n; i++)
{
printf("%d\t%.1f\t%.1f\t%.1f\t%.1f\n", su[i].id, su[i].c, su[i].m, su[i].e, su[i].a);
}
}
// 排序
void Sort(struct student* p, int n)
{
struct student t;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (su[j].a < su[j+1].a)
{
t = p[j];
p[j] = p[j + 1];
p[j + 1] = t;
}
}
}
printf("完成排序,请使用命令L查看\n");
}
//查找
void Search(struct student* p, int n)
{
int u = 0;
printf("请输入要查询的学号\n");
scanf("%d", &u);
printf("学号\t语文\t数学\t英语\t平均分\n");
for (int i = 0; i < n; i++)
{
if (su[i].id == u)
{
printf("%d\t%.1f\t%.1f\t%.1f\t%.1f", su[i].id, su[i].c, su[i].m, su[i].e, su[i].a);
}
}
printf("\n");
}
int main(int argc, char const* argv[])
{
Help();
int n = 0;
char z;
while (1)
{
printf("请输入命令= ");
scanf("%c",&z);
if (z == 'T')
{
n = Type(su);
}
else if (z == 'A')
{
if (n == 0)
printf("成绩列表为空!请先使用命令T录入学生系统\n");
else
Average(su, n);
}
else if (z == 'L')
{
if (n == 0)
printf("成绩列表为空!请先使用命令T录入学生系统\n");
else
List(su, n);
}
else if (z == 'P')
{
if (n == 0)
printf("成绩列表为空!请先使用命令T录入学生系统\n");
else
Sort(su, n);
}
else if (z == 'S')
{
if (n == 0)
printf("成绩列表为空!请先使用命令T录入学生系统\n");
else
Search(su, n);
}
else if (z == 'C')
{
system("clear");
}
else if (z == 'H')
{
Help();
}
else if (z == 'Q')
{
break;
}
else if (z != 'H' && z != 'A' && z != 'S' && z != 'L' && z != 'C' && z != 'T' && z != 'P')
{
printf("请重新输入:\n");
}
getchar();
}
return 0;
}