发布时间:2025-12-11 03:21:51 浏览次数:10
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时,就可以进行其他的成绩操作,但不能再执行录用成绩的操作。所以当用户输入的命令无法执行时,应当给出提示。
#include<stdio.h>#include<stdlib.h>//#include"hs.h"structstudent{intid;floatyw;floatsx;floatwy;floatpj;};voidhelp(void);inttype(structstudent*p);voidlist(structstudent*p,intn);voidaverage(structstudent*p,intn);voidsearch(structstudent*p);voidsort(structstudent*p,intn);intmain(intargc,constchar*argv[]){charch;structstudentstu[32];intn=0;while(1){printf("请输入命令=");//getchar();scanf("%c",&ch);putchar(10);if(ch=='T'){n=type(stu);}elseif(ch=='L'){if(n==0){printf("成绩表为空!请先使用T录入成绩!\n");putchar(10);}elselist(stu,n);}elseif(ch=='A'){if(n==0){printf("成绩表为空!请先使用T录入成绩!\n");putchar(10);}else{average(stu,n);printf("平均分已计算,请使用命令L查看!\n");putchar(10);}}elseif(ch=='H')help();elseif(ch=='C')system("clear");elseif(ch=='S'){if(n==0){printf("成绩表为空!请先使用T录入成绩!\n");putchar(10);}else{search(stu);putchar(10);}}elseif(ch=='P'){if(n==0){printf("成绩表为空!请先使用T录入成绩!\n");putchar(10);}else{sort(stu,n);putchar(10);}}elseif(ch=='Q'){printf("Pressanykeytocontinue!\n");return-1;}getchar();}return0;}inttype(structstudent*p){intn=0;printf("请输入学生人数:");scanf("%d",&n);printf("请输入学生三门课的成绩:\n");printf("学号语文数学外语\n");for(inti=0;i<n;i++){printf("%d",i+1);structstudentstu[i];scanf("%f%f%f",&(p+i)->yw,&(p+i)->sx,&(p+i)->wy);}returnn;}voidlist(structstudent*p,intn){printf("学生成绩如下:\n");printf("学号语文数学外语平均分\n");for(inti=0;i<n;i++){printf("%d",i+1);printf("%.1f%.1f%.1f%.1f",p->yw,p->sx,p->wy,p->pj);p++;putchar(10);}}voidaverage(structstudent*p,intn){for(inti=0;i<n;i++){(p->pj)=((p->yw)+(p->sx)+(p->wy))/3;p++;}}voidhelp(void){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)2022.3.15Byliq*\n");printf("**********************************\n");}voidsearch(structstudent*p){ints=0;printf("请输入要查询的学生号:");scanf("%d",&s);printf("学号语文数学外语平均分\n");printf("%d%.1f%.1f%.1f%.1f",s,(p+s-1)->yw,(p+s-1)->sx,(p+s-1)->wy,(p+s-1)->pj);putchar(10);}voidsort(structstudent*p,intn){structstudenttemp;inti,j;for(i=0;i<n;i++){for(j=0;j<n-i-1;j++){if(p[j].pj<p[j+1].pj){temp=p[j];p[j]=p[j+1];p[j+1]=temp;}}}printf("排序完成,请使用命令L查看!\n");}注意
如需要分文件编写。
只需要将上述代码的函数部分拿出来,新建两个个文件:fun.c、fun.h。其中fun.c文件用来存放上述代码的结构体声明以及函数部分(加上相应的头文件)。fun.h用来存放结构体声明以及函数声明(加上相应的头文件)。
在主函数中要加上对应的头文件:#include “fun.h”(双引号,不是<>)。
编译的时候需要将主函数以及新建的fun.c文件一起编译,运行还是同之前一样,用./a.out运行即可。
具体如下图所示:
1.新建两个文件(同名,不同后缀),编译并运行(需要多文件同时编译)。
2.hs.c存放结构体声明及对应的函数(这里面的函数还可以拆分成其他的文件,这里我就不拆分了)。
#include<stdio.h>#include<stdlib.h>structstudent{intid;floatyw;floatsx;floatwy;floatpj;};inttype(structstudent*p){intn=0;printf("请输入学生人数:");scanf("%d",&n);putchar(10);printf("请输入学生三门课的成绩:\n");putchar(10);printf("学号语文数学外语\n");for(inti=0;i<n;i++){printf("%d",i+1);structstudentstu[i];scanf("%f%f%f",&(p+i)->yw,&(p+i)->sx,&(p+i)->wy);}putchar(10);returnn;}voidlist(structstudent*p,intn){printf("学生成绩如下:\n");printf("学号语文数学外语平均分\n");for(inti=0;i<n;i++){printf("%d",i+1);printf("%.1f%.1f%.1f%.1f",p->yw,p->sx,p->wy,p->pj);p++;putchar(10);}putchar(10);}voidaverage(structstudent*p,intn){for(inti=0;i<n;i++){(p->pj)=((p->yw)+(p->sx)+(p->wy))/3;p++;}}voidhelp(void){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)2022.3.15Byliq*\n");printf("**********************************\n");}voidsearch(structstudent*p){ints=0;printf("请输入要查询的学生号:");scanf("%d",&s);putchar(10);printf("学号语文数学外语平均分\n");printf("%d%.1f%.1f%.1f%.1f",s,(p+s-1)->yw,(p+s-1)->sx,(p+s-1)->wy,(p+s-1)->pj);putchar(10);}voidsort(structstudent*p,intn){structstudenttemp;inti,j;for(i=0;i<n;i++){for(j=0;j<n-i-1;j++){if(p[j].pj<p[j+1].pj){temp=p[j];p[j]=p[j+1];p[j+1]=temp;}}}printf("排序完成,请使用命令L查看!\n");}3.hs.h存放结构体声明以及hs.c里面函数对应的函数声明。
#include<stdio.h>#include<stdlib.h>structstudent{intid;floatyw;floatsx;floatwy;floatpj;};inttype(structstudent*p);voidlist(structstudent*p,intn);voidaverage(structstudent*p,intn);voidhelp(void);voidsearch(structstudent*p);voidsort(structstudent*p,intn);4.main函数
#include<stdio.h>#include<stdlib.h>#include"hs.h"intmain(intargc,constchar*argv[]){charch;structstudentstu[32];intn=0;while(1){printf("请输入命令=");scanf("%c",&ch);putchar(10);if(ch=='T'){n=type(stu);}elseif(ch=='L'){if(n==0){printf("成绩表为空!请先使用T录入成绩!\n");putchar(10);}elselist(stu,n);}elseif(ch=='A'){if(n==0){printf("成绩表为空!请先使用T录入成绩!\n");putchar(10);}else{average(stu,n);printf("平均分已计算,请使用命令L查看!\n");putchar(10);}}elseif(ch=='H')help();elseif(ch=='C')system("clear");elseif(ch=='S'){if(n==0){printf("成绩表为空!请先使用T录入成绩!\n");putchar(10);}else{search(stu);putchar(10);}}elseif(ch=='P'){if(n==0){printf("成绩表为空!请先使用T录入成绩!\n");putchar(10);}else{sort(stu,n);putchar(10);}}elseif(ch=='Q'){printf("Pressanykeytocontinue!\n");return-1;}getchar();}return0;}