目录
【1】实现功能
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 ,调用Ave 子函数计算平均分,提示“平均分已计算,请通过命令 L 查看。” Ave子函数调用结束,返回。提示输入命令。
输入命令 L ,调用 List 子函数输出成绩表。List 子函数调用结束,返回。提示输入命令。
6)输入命令 P ,调用 Sort 子函数将各学生记录按平均分由高到低排序,提示“排序已完成,请通过命令 L 查看。” Sort子函数调用结束,返回。提示输入命令。
输入命令 L ,调用 List 子函数输出成绩表。List 子函数调用结束,返回。提示输入命令。
7)输入,命令 S ,调用Search 子函数查询学生成绩,提示“请输入要查询的学生学号:”
输入 2 回车找到 2 号学生的成绩并输出。Search 子函数调用结束,返回。提示输入命令。
8)输入命令 C 回车 执行清屏函数语句 system("clear");
执行 命令 C 之前
执行命令 C 之后,清除屏幕上的所有内容。提示输入命令。
9)输入命令 H 回车 调用 Help 子函数显示帮助菜单。Help 子函数调用结束,返回。提示输入命令。
10)输入命令 Q 回车 则退出系统。
注意:
1)输出数组元素时,要将学号单独处理,输出为整数(即保留0位小数)。同理,在计算成绩时也要将第1列的学号撇开,只计算第2列之后的。成绩保留1位小数。
2)学生人数n贯穿始终,通过n的值判断当前命令的子函数是否能够调用执行。例如:当n=0时,说明还没有录入成绩。而一旦输入命令T,也即调用Type子函数录入了成绩,则n的值就不再是0。当n!=0时,就可以进行其他的成绩操作,但不能再执行录用成绩的操作。所以当用户输入的命令无法执行时,应当给出提示。
【2】代码展示
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> //调用 system(”clear“)所需要的头文件
#define N 100
typedef struct student // 定义学生结构体数据类型
{
int id;
float Ch;
float mh;
float Eng;
float ave;
} Stu;
/*成绩录入*/
void Type(int *n, Stu *p)
{
while (1) // 此循环用于判断输入学生人数是否大于 0
{ // 若大于 0 则正常录入学生成绩
printf("请输入学生人数:"); // 若小于等于0 则输出error跳出
scanf("%d", n);
getchar();
if (*n > 0)
{
printf("\n请输入%d名学生的成绩:\n\n", *n);
printf("学号 语文 数学 英语\n");
for (int i = 0; i < *n; i++) // 该次循环用于录入学生成绩
{
printf("%d ", i + 1); // 提示语句
p->id = i + 1; // 给学号赋值
scanf("%f %f %f", &(p->Ch), &(p->mh), &(p->Eng));
getchar();
p++;
}
printf("成绩录入完成\n\n");
break; //当成绩录入完成后跳出 while 循环
}
else
{
printf("error\n\n");
}
}
}
/*列出成绩表*/
void List(int n, Stu *p)
{
printf("学生成绩如下:\n\n");
printf("学号 语文 数学 英语 平均分\n");
for (int i = 0; i < n; i++) // 该层循环用于输出学生成绩表
{
printf("%d %.1f %.1f %.1f %.1f\n", p->id, p->Ch, p->mh, p->Eng, p->ave);
p++;
}
printf("\n");
}
/*计算平均分*/
void Ave(int n, Stu *p)
{
for (int i = 0; i < n; i++) // 该层循环用于计算学生成绩平均分
{ // 注意不要把id也算进去
p->ave = (p->Ch + p->mh + p->Eng) / 3;
p++;
}
printf("平均分已计算,请通过命令 L 查看\n\n");
}
/*排序*/
void Sort(int n, Stu *p)
{
if (p->ave == 0) // 先判断此时平均分是否计算
{ // 若平均分为 0 ,则说明平均分未计算,提示无法排序
printf("平均分未计算,无法排序\n\n");
}
else
{
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - 1 - i; j++)
{
if (p[j].ave < p[j + 1].ave) //冒泡排序 (反向)
{
Stu t = p[j];
p[j] = p[j + 1];
p[j + 1] = t;
}
}
}
printf("排序已完成,请通过命令 L 查看\n\n");
}
}
/*查询学生成绩*/
void Serach(int n, Stu *p)
{
int a = 0;
printf("请输入要查询的学生学号:");
scanf("%d", &a);
while (p->id != a) //判断 p -> id 是否等于要查询的学号
{ //若不等于,则指针 p 加一,再次判断,直到找到要查询的学号
p++; //输出此时指针所指向的结构体数组内容,即该学生信息
}
printf("学号 语文 数学 英语 平均分\n");
printf("%d %.1f %.1f %.1f %.1f\n", p->id, p->Ch, p->mh, p->Eng, p->ave);
}
/*帮助*/
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.8.2 By 欢 *\n");
printf(" ******************************************\n");
}
int main()
{
Help();
char order[32]; //定义一个数组用来接受输入的命令字符串
Stu stu[N]; //定义一个学生结构体数组
int n = 0; //定义一个变量存放学生人数
int c = strlen(order); //定义一个变量存放输入命令字符串的长度
while (1) //该层循环用来判断输入的命令字符串长度是否大于 1
{ //若大于 1 则提示命令错误,重新输入
printf("请输入命令= ");
scanf(" %s", order);
if (strlen(order) > 1)
{
printf("\n命令输入有误,请重新输入\n\n");
continue;
}
printf("\n");
switch (order[0])
{
case 'T':
if (n == 0) //若学生人数为 0 ,说明还未录入信息,则调用Type子函数
Type(&n, stu);
else
printf("成绩已录入,请重新输入命令\n\n");
break;
case 'L':
if (n == 0) //若学生人数为 0 ,说明还未录入信息,输出以下提示语句
printf("成绩表为空!请先使用命令 T 录入学生成绩。\n\n");
else
List(n, stu); //学生人数不为 0 ,调用函数
break;
case 'A':
if (n == 0)
printf("成绩表为空!请先使用命令 T 录入学生成绩。\n\n");
else
Ave(n, stu);
break;
case 'P':
if (n == 0)
printf("成绩表为空!请先使用命令 T 录入学生成绩。\n\n");
else
Sort(n, stu);
break;
case 'S':
if (n == 0)
printf("成绩表为空!请先使用命令 T 录入学生成绩。\n\n");
else
Serach(n, stu);
break;
case 'C':
system("clear"); //引用 头文件 #include <unistd.h> 下的函数
break;
case 'H':
Help(n, stu);
break;
case 'Q':
return 0; //退出系统
default:
printf("命令输入有误,请重新输入\n\n");
break;
}
}
return 0;
}