学生管理系统
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时,就可以进行其他的成绩操作,但不能再执行录用成绩的操作。所以当用户输入的命令无法执行时,应当给出提示。
要求:1.用结构体数组 2.分文件写 3. 用make编译
如要实现分文件&&make,请自行编写Makefile文件,并且封装函数
#include<stdio.h>
#include<string.h>
typedef struct {
int id;
float chinese;
float math;
float english;
float average;
} student;
void ui();
void Type(student *p);
void Average(student *p);
void List(student *stu);
void Sort(student *p);
void Search(student *p);
unsigned int sum =0;//该系统的总数
int main() {
char func;
student stu[10] = {0};
student *p = stu;
ui();
while(1) {
printf("请输入命令 = ");
scanf("%c",&func);
switch(func) {
case 'T':
Type(p);
break;
case 'L':
List(p);
break;
case 'A':
Average(p);
break;
case 'P':
Sort(p);
break;
case 'S':
Search(p);
break;
case 'C':
//system("clear");
break;
case 'H':
ui();
break;
case 'Q':
return 0;
break;
default:
printf("其他功能暂未开发!敬请期待!\n");
}
getchar();
}
return 0;
}
void ui() {
puts("*******************************************");
puts("* 学生管理系统--帮助菜单 *");
puts("*******************************************");
puts("* H = 显示帮助菜单 *");
puts("* T = 成绩录入 *");
puts("* A = 计算学生平均分 *");
puts("* L = 列出成绩表 *");
puts("* P = 按平均成绩由高到低排序 *");
puts("* S = 按学号查询学生成绩 *");
puts("* C = 清屏 *");
puts("* Q = 退出系统 *");
puts("*******************************************");
puts("* Copyringht <C> 2022.04.09 By 屈会聪 *");
puts("*******************************************");
}
void Type(student *p) {
int num;
printf("请输入学生人数:\n");
scanf("%d",&num);
printf("学号\t语文\t数学\t英语\n");
for(int i = sum; i < sum+num; i++) {
printf(" %-7d ",i+1);
p[i].id = i+1;
scanf("%f\t%f\t%f",&(p+i)->chinese,&(p+i)->math,&(p+i)->english);
}
sum += num;
}
void Average(student *p) {
if(sum == 0) {
printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
} else {
for(int i = 0; i <= sum; i++) {
(p+i)->average=((p+i)->chinese+(p+i)->math+(p+i)->english)/3;
}
printf("平均分已计算。请使用命令L查看。\n");
}
}
void List(student *stu) {
if(sum == 0) {
printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
} else {
printf("学生成绩如下:\n");
printf("学号\t语文\t\t数学\t\t英语\t\t平均分\n");
for(int i = 0; i <= sum; i++) {
if(stu[i].id==0) {
} else {
printf("%-5d\t%.1f\t\t%.1f\t\t%.1f\t\t%.1f\n",stu[i].id,stu[i].chinese,stu[i].math,stu[i].english,stu[i].average);
}
}
}
}
void Sort(student *p) {
if(sum == 0) {
printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
} else {
int i,j;
student tmp;
for(i = 0; i<sum-1; i++) {
for(j=0; j<sum-1-i; j++) {
if((p+j)->average < (p+j+1)->average) {
tmp = *(p+j);
*(p+j) = *(p+j+1);
*(p+j+1) = tmp;
}
}
}
printf("完成排序。请使用命令L查看。\n");
}
}
void Search(student *p) {
if(sum == 0) {
printf("成绩表为空!请先使用命令 T 录入学生成绩。\n");
} else {
int n;
printf("输入要查询的学生学号:");
scanf("%d",&n);
for(int i =0; i<sum; i++) {
if((p+i)->id == n) {
printf("学号\t语文\t\t数学\t\t英语\t\t平均分\n");
printf("%-5d\t%.1f\t\t%.1f\t\t%.1f\t\t%.1f\n",(p+i)->id,(p+i)->chinese,(p+i)->math,(p+i)->english,(p+i)->average);
}
}
}
}