目录
题目要求:
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、总体思路
根据题目要求,我们可以读出需要做的事情有:
定义一个结构体类型;
构建一个结构体数组用于存放多个学生信息;
构建一个help函数用于打印说明;
构建一个type函数用于输入学生信息;
构建一个list函数用于显示出学生信息;
构建一个average函数用于求学生的平均成绩;
构建一个sort函数用于按照平均成绩排序;
实现输入C清屏以及输入Q结束程序;
主函数内实现这些功能;
2、具体思路
我们通过代码注释讲解
代码
#include <stdio.h>
#include <stdlib.h>
#define N 32
void help()//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> 2023.6.1 By zl *\n");
printf("**************************************\n");
}
typedef struct student //定义结构体并且重定义为简化的名称,便于书写
{
int id;
float chinese;
float math;
float english;
float av;
} STU;
void type(int *p, STU *s) //构建函数实现输入功能,无返回值,参数为指向整型变量n的指针和指向结构体数组的指针,通过地址传递,形参可以修改实参
{
printf("请输入学生人数\n");
scanf("%d", p);
getchar();// 垃圾字符回收
printf("请输入%d名学生的三门课成绩:\n", *p);
printf("学号 语文 数学 英语\n");
for (int i = 1; i < *p + 1; i++) //循环遍历对结构体数组中的元素分别输入学生信息
{
s->id = i; //由于每次输入需要有学号提示,所以学号必须单独操作
printf("%d", s->id); //打印出学号,实现每次输入成绩前的学号输入
scanf(" %f %f %f", &(s->chinese), &(s->math), &(s->english)); //输入三科成绩,中间使用空格隔开
getchar(); //垃圾字符回收
s++; //每次循环S指针向后移动一位
}
for (int i = 0; i <= *p; i++) //将还未计算时的平均成绩赋值为0,防止出现随机值
s[i].av = 0;
}
void list(int *p, STU *s) //构建函数实现打印功能
{
if (*p == 0)
printf("成绩列表为空!请先使用命令T输入成绩\n"); //如果没有学生信息,进行提示
else
{
printf("学生成绩如下:\n");
printf("学号\t 语文\t 数学\t 英语\t 平均分\n");
for (int i = 0; i < *p; i++) //循环遍历打印
{
printf("%d\t", s->id);
printf("%.1f\t %.1f\t %.1f\t %.1f\n", s->chinese, s->math, s->english, s->av);
s++;
}
}
}
void average(int *p, STU *s) //构建函数用于求平均值
{
if (*p == 0)
printf("成绩列表为空!请先使用命令T输入成绩\n");
else
{
for (int i = 0; i < *p; i++)
{
s->av = (s->chinese + s->math + s->english) / 3; //计算公式
s++;
}
printf("平均分已计算,请使用命令L查看\n");
}
}
void sort(int *p, STU *s) //构建函数实现排序
{
if (*p == 0)
printf("成绩列表为空!请先使用命令T输入成绩\n");
else
{
for (int i = 0; i < *p - 1; i++)
{
for (int j = 0; j < *p - 1 - i; j++)
{
if (s[j].av < s[j + 1].av) //利用双重for循环和if条件判断实现从大到小排序
{
STU temp = s[j];
s[j] = s[j + 1];
s[j + 1] = temp;
}
}
}
printf("完成排序,请使用命令L查看\n");
}
}
void search(int *p, STU *s) //构建函数,实现可以通过搜索查看某学生信息
{
if (*p == 0)
printf("成绩列表为空!请先使用命令T输入成绩\n");
else
{
printf("请输入需要查询的学生学号:\n");
int a = 0;
scanf("%d", &a);
printf("学号\t 语文\t 数学\t 英语\t 平均分\n");
for (int i = 0; i < *p; i++)
{
if (s[i].id == a)
printf("%d\t %.1f\t %.1f\t %.1f\t %.1f\n", s[i].id, s[i].chinese, s[i].math, s[i].english, s[i].av);
}
}
}
int main(int argc, char const *argv[])
{
help(); //引入help函数,先打印一份说明
int n = 0; //表示一共有几个学生信息,初值为零
STU stu[N]; //构建结构体数组
char mingling; //构建字符变量,用于结束输入的命令
while (1) //死循环,实现连续操作
{
printf("请输入命令=");
scanf("%c", &mingling);
getchar();
switch (mingling) //switch语句实现针对不同的输入命令选择不同的功能
{
case 'T':
type(&n, stu); //输入T时调用type函数,进行学生信息输入
break;
case 'L':
list(&n, stu); //输入L时调用list函数,打印出学生信息
break;
case 'A':
average(&n, stu); //输入A时调用average函数,实现求平均成绩
break;
case 'P':
sort(&n, stu); //输入P时调用sort函数,实现排序
break;
case 'S':
search(&n, stu); //输入S时调用search函数,实现搜索功能
break;
case 'C':
system("clear"); //输入C时实现清屏功能
break;
case 'H':
help(); //输入H时调用help函数,显示帮助信息
break;
case 'Q':
return 0; //输入Q时结束程序
}
}
return 0;
}