课设:学生作业完成情况管理
【题目描述】
请设计一个学生作业完成情况管理系统。
假设某门课程一学期要完成10次作业,每次老师要进行批改,给出分数后还要进行登记。学期期末要根据每次作业的成绩计算出最终的平时成绩(满分100)。
该系统应该具有下列功能:
(1) 通过键盘输入某位学生某次作业的分数;
(2) 给定学号,显示某位学生作业完成情况;
(3) 给定某个班级的班号,显示该班所有学生的作业完成情况;
(4) 给定某位学生的学号,修改该学生的作业完成信息;
(5) 给定某位学生的学号,删除该学生的信息;
(6) 提供一些统计各类信息的功能或排序功能。
【题目要求】
(1) 按照分析、设计、编码、调试和测试的软件开发过程完成这个应用程序;
(2) 作业登记信息应该包含:学号、姓名、10次作业的完成情况;
(3) 为各项操作功能设计一个菜单。应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。
【输入要求】
应用程序运行后,在屏幕上显示一个菜单(菜单显示外观见前面的图示)。用户可以根据需求,选定相应的操作项目。进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。
【输出要求】
(1) 应用程序运行后,要在屏幕上显示一个菜单;
(2) 要求用户输入数据时,要给出清晰、明确的提示信息,包括输入的数据内容、格式及结束方式等。
【提示】
设计一个结构体类型和一维数组类型,用来保存作业登记信息。
代码:
#include<stdio.h>
#include<string.h>
struct Class
{
struct Student
{
char Name[10];
char Num[18];
int grade[10];
}student[100],student0;
}class[10];
void initialize()
{
for(int i=0;i<10;i++)
{
for(int j=0;j<100;j++)
{
class[i].student0.Name[0]='\0';
class[i].student0.Num[0]='\0';
class[i].student[j].Name[0]='\0';
class[i].student[j].Num[0]='\0';
for(int k=0;k<10;k++)
{
class[i].student0.grade[k]=0;
class[i].student[j].grade[k]=0;
}
}
}
}
void print_main()
{
printf("\n 请选择需要的服务:\n");
printf(" A.分数操作 B.查阅操作\n");
printf(" C.信息操作 D.统计操作\n");
printf(" 注意:输入“0”将结束程序!\n 输入“help”将打开帮助指南!\n\n");
}
void help_main()
{
printf("帮助指南\n");
printf("A.分数操作\n");
printf("通过姓名或学号增加某同学的某些平时成绩。\n");
printf("B.查阅操作\n");
printf("通过学号或班级序号查询某同学的一些成绩或某班的成绩。\n");
printf("C.信息操作\n");
printf("通过学号或姓名来增加或删除信息。\n");
printf("D.统计操作\n");
printf("通过一些操作来实现排序、找最大值、找最小值、求平均值、求通过率这些统计功能。\n");
}
void sc_input(int*a)
{
}
int inquire_main(char a[],int *x,int *y)
{
for(int i=0;i<10;i++)
{
for(int j=0;j<100;j++)
{
if(strcmp(class[i].student[j].Num,a)==0||strcmp(class[i].student[j].Name,a)==0){
*x=i,*y=j;
return 1;
}
}
}
return 0;
}
int inquire_grade(int class1,int student1,int num0)
{
if(class[class1].student[student1].grade[num0])return 1;
else return 0;
}
int inquire_name(int class1,int *student1,char a[])
{
for(int j=0;j<100;j++)
{
if(strcmp(class[class1].student[j].Num,a)==0||strcmp(class[class1].student[j].Name,a)==0){
*student1=j;
return 1;
}
}
return 0;
}
int inquire_class(int *class1)
{
while(1){
int i;
while (1) {
printf("请输入班级:");
scanf("%d", class1);
if (*class1 > 0 && *class1 < 11)break;
else printf("数据不合理,请重新输入!\n");
}
for(i=0;i<100;i++)
{
if(class[(*class1)-1].student[i].Name[0]!='\0')break;
}
if(i!=100)break;
else {
printf("%d班没有数据!无法查阅!\n",*class1);
printf("是否重新输入?\nA.重新输入 B.不重新输入\n");
while(1)
{
char d[100];
printf("请输入:");
scanf("%s",d);
if((d[0]=='A'||d[0]=='a')&&(strlen(d)==1))break;
else if((d[0]=='B'||d[0]=='b')&&(strlen(d)==1))return 0;
else printf("数据不合理,请重新输入!\n");
}
}
}
return 1;
}
int input_1(int *class1,int *student1)
{
char b[20];
while(1){
printf("请输入班级序号或学生学号:");
scanf("%s",b);
int c=strlen(b);
if(c==1){
if(b[0]>'0'&&b[0]<='9'){
*class1=b[0]-'0',*student1=0;
return 0;}
else if(b[0]=='0')return 1;
else printf("数据不合理,请重新输入!\n");
}
else if(c==2){
if(b[0]=='1'&&b[1]=='0'){
*class1=10,*student1=0;
return 0;
}
else printf("数据不合理,请重新输入!\n");
}
else {
if(inquire_main(b,class1,student1))return -1;
else printf("该学号不存在!请重新输入!\n");
}
}
}
void input_2(int *class1,int *student1)
{
char c[20];
while(1){
printf("请输入学生姓名或学生学号:");
scanf("%s",c);
if(!inquire_main(c,class1,student1))printf("该学号或姓名不存在!请重新输入!\n");
else break;
}
}
void input_choose(int *a,int *b,int *c)
{
while(1){
printf("请选择输入成绩方式:\n");
printf("A.单次输入 B.区间输入\n");
printf("请输入:");
char a1[100];
scanf("%s",a1);
if((a1[0]=='A'||a1[0]=='a')&&(strlen(a1)==1)){
int a2;
while(1){
printf("请输入次数:");
scanf("%d",&a2);
if(a2<11&&a2>0)break;
else printf("数据不合理,请重新输入!\n");
}
*a=a2,*b=0,*c=0;
break;
}
else if((a1[0]=='B'||a1[0]=='b')&&(strlen(a1)==1)){
int a2,a3,x=0,y=0;
while(1){
if(!x&&!y){
printf("请输入起始次数和终止次数(用空格隔开):");
scanf("%d %d",&a2,&a3);
}
if(x&&!y){
printf("请重新输入终止次数:");
scanf("%d",&a3);
}
if(!x&&y){
printf("请重新输入起始次数:");
scanf("%d",&a2);
}
if(a2<11&&a2>0)x=1;
if(a3<11&&a3>0)y=1;
if(a2>a3)x=0,y=0;
if(x&&y)break;
printf("存在数据不合理,请重新输入!\n");
}
*a=0,*b=a2,*c=a3;
break;
}
else printf("数据不合理,请重新输入!\n");
}
}
int input_main_choose()
{
printf("是否需要多组输入?\nA.不需要 B.需要\n");
char a[100];
while(1)
{
printf("请输入:");
scanf("%s",a);
if((a[0]=='A'||a[0]=='a')&&(strlen(a)==1)){printf("注意:输入单个“0”将退出该操作!\n");
return 0;}
else if((a[0]=='B'||a[0]=='b')&&(strlen(a)==1)){printf("注意:输入单个“0”将停止多组输入!\n");
return 1;}
else printf("数据不合理,请重新输入!\n");
}
}
void input_main_grade(int class1,int student1,int c,int *b)
{
char a[100];
if(inquire_grade(class1,student1,c-1)){
printf("第%d次成绩已存在,是否覆盖?\nA.覆盖 B.不覆盖 C.显示成绩\n",c);
while(1){
printf("请输入:");
scanf("%s",a);
if((a[0]=='A'||a[0]=='a')&&(strlen(a)==1)){*b=1;
break;}
else if((a[0]=='B'||a[0]=='b')&&(strlen(a)==1))break;
else if((a[0]=='C'||a[0]=='c')&&(strlen(a)==1))printf("第%d次原成绩为:%d。\n请选择是否覆盖?\nA.覆盖 B.不覆盖\n",c,class[class1].student[student1].grade[c-1]);
else printf("数据不合理,请重新输入!\n");
}
}
else *b=1;
}
void input_main()
{
printf("分数操作:\n");
int y=0;
y=input_main_choose();
while(1)
{
int x,class1,student1,num1,num2,num3;
x=input_1(&class1,&student1);
if(x==1)break;
if(x!=-1)input_2(&class1,&student1);
input_choose(&num1,&num2,&num3);
if(!num1){
for(int i=num2;i<=num3;i++)
{
int b=0;
long long a1;
input_main_grade(class1,student1,i,&b);
if(!b)continue;
printf("请输入第%d次成绩:",i);
scanf("%lld",&a1);
if(a1<=100&&a1>=0)class[class1].student[student1].grade[i-1]=a1;
else {
printf("成绩不合理!请重新输入!\n");
i--;
}
}
}
else {
int b=0;
long long a1;
input_main_grade(class1,student1,num1,&b);
if(b){
while(1){
printf("请输入第%d次成绩:",num1);
scanf("%lld",&a1);
if(a1<=100&&a1>=0){class[class1].student[student1].grade[num1-1]=a1;
break;}
else printf("成绩不合理!请重新输入!\n");
}
}
}
printf("成功!\n");
if(y==0)break;
}
}
int information_input()
{
while(1)
{
int class0,n=0,m,x;
while(1){
printf("请输入班级序号:");
scanf("%d",&class0);
if(class0>0&&class0<10)break;
else printf("数据不合理!请重新输入!\n");
}
for(int i=0;i<100;i++)
{
if(class[class0-1].student[i].Name[0]=='\0'){
n=1;
char a[20];
printf("请输入学生姓名:");
scanf("%s",a);
if(!inquire_name(class0-1,&m,a)){
strcpy(class[class0-1].student[i].Name,a);
}
else {
inquire_name(class0-1,&m,a);
printf("该班已存在同名,其信息为:\n");
printf("姓名:%s 学号:%s\n",a,class[class0-1].student[m].Num);
printf("是否新增?\nA.是 B.否\n");
char b[100];
while(1)
{
printf("请输入:");
scanf("%s",b);
if((b[0]=='A'||b[0]=='a')&&(strlen(b)==1))break;
else if((b[0]=='B'||b[0]=='b')&&(strlen(b)==1)){printf("新增失败!\n");
return 0;
}
else printf("数据不合理,请重新输入!\n");
}
}
while(1){
char c[20];
x=class0-1;
printf("请输入学生学号:");
scanf("%s",c);
int s=strlen(c),s0=0;
for(int i=0;i<s;i++)
{
if(c[i]>='0'&&c[i]<='9')s0=0;
else {
s0=1;
break;
}
}
if(s0){printf("学号数据不合理,请重新输入!\n");
continue;}
if(!inquire_main(c,&x,&m)){
strcpy(class[class0-1].student[i].Num,c);
break;
}
else printf("该学号已存在!请重新输入!\n");
}
break;
}
}
if(!n)printf("%d班已经满了!\n",class0);
else break;
}
printf("新增成功!\n");
return 1;
}
void information_remove()
{
int x,y;
char a[18];
while(1){
printf("请输入需要删除的学生的学号:");
scanf("%s",a);
if(inquire_main(a,&x,&y))break;
else printf("该学号不存在!请重新输入!\n");
}
class[x].student[y]=class[x].student0;
printf("成功!\n");
}
void information_main()
{
printf("信息操作:\n");
printf("请选择操作:\nA.增加信息 B.删除信息\n");
char a[100];
while(1){
printf("请输入:");
scanf("%s",a);
if((a[0]=='A'||a[0]=='a')&&(strlen(a)==1)){information_input();
break;}
else if((a[0]=='B'||a[0]=='b')&&(strlen(a)==1)){information_remove();
break;}
else printf("数据不合理,请重新输入!\n");
}
}
int consult_choose()
{
printf("请选择需要的操作:\nA.查阅单人部分成绩 B.查阅单人成绩 C.查阅单班成绩\n");
char a[100];
while(1)
{
printf("请输入:");
scanf("%s",a);
if((a[0]=='A'||a[0]=='a')&&(strlen(a)==1))return 1;
else if((a[0]=='B'||a[0]=='b')&&(strlen(a)==1))return 2;
else if((a[0]=='C'||a[0]=='c')&&(strlen(a)==1))return 3;
else printf("数据不合理,请重新输入!\n");
}
return 0;
}
void consult_1_choose(int *a,int *b,int *c)
{
printf("请选择查询范围:\nA.单次查询 B.区间查询\n");
int x=0;
char d[100];
while(1)
{
printf("请输入:");
scanf("%s",d);
if((d[0]=='A'||d[0]=='a')&&(strlen(d)==1)){x=1;
break;}
else if((d[0]=='B'||d[0]=='b')&&(strlen(d)==1)){x=2;
break;}
else printf("数据不合理,请重新输入!\n");
}
if(x==1){
int a2;
while(1){
printf("请输入次数:");
scanf("%d",&a2);
if(a2<11&&a2>0)break;
else printf("数据不合理,请重新输入!\n");
}
*a=a2,*b=0,*c=0;
}
else {
int a2,a3,x=0,y=0;
while(1){
if(!x&&!y){
printf("请输入起始次数和终止次数(用空格隔开):");
scanf("%d %d",&a2,&a3);
}
if(x&&!y){
printf("请重新输入终止次数:");
scanf("%d",&a3);
}
if(!x&&y){
printf("请重新输入起始次数:");
scanf("%d",&a2);
}
if(a2<11&&a2>0)x=1;
if(a3<11&&a3>0)y=1;
if(a2>a3)x=0,y=0;
if(x&&y)break;
printf("存在数据不合理,请重新输入!\n");
}
*a=0,*b=a2,*c=a3;
}
}
int consult_1()
{
int class1,student1,x=-1,y,z;
if(!inquire_class(&class1))return 0;
while(1){
printf("请输入学生姓名或学号:");
char a[20];
scanf("%s",a);
if(inquire_name(class1-1,&student1,a))break;
else printf("该姓名或学号在该班不存在,请重新输入!\n");
}
consult_1_choose(&x,&y,&z);
if(x!=0&&y==0)printf("%s的第%d次成绩是%d。\n",class[class1-1].student[student1].Name,x,class[class1-1].student[student1].grade[x-1]);
else {
printf("%s的第%d次到第%d次成绩是:",class[class1-1].student[student1].Name,y,z);
for(int i=y;i<=z;i++)
{
printf("%d ",class[class1-1].student[student1].grade[i-1]);
}
}
printf("\n");
return 0;
}
int consult_2()
{
int class1,student1;
if(!inquire_class(&class1))return 0;
while(1){
printf("请输入学生姓名或学号:");
char a[20];
scanf("%s",a);
if(inquire_name(class1-1,&student1,a))break;
else printf("该姓名或学号在该班不存在,请重新输入!\n");
}
printf("%s的成绩是:",class[class1-1].student[student1].Name);
for(int i=0;i<10;i++)
{
printf("%d ",class[class1-1].student[student1].grade[i]);
}
printf("\n");
return 0;
}
int consult_3()
{
int class1;
if(!inquire_class(&class1))return 0;
printf("%d班的成绩为:\n",class1);
printf("姓名 学号 成绩\n");
for(int i=0;i<100;i++)
{
if(class[class1-1].student[i].Name[0]=='\0')continue;
printf("%s",class[class1-1].student[i].Name);
for(int j=0;j<14-strlen(class[class1-1].student[i].Name)&&j<14;j++)
{
printf(" ");
}
printf("%s",class[class1-1].student[i].Num);
for(int j=0;j<14-strlen(class[class1-1].student[i].Num)&&j<14;j++)
{
printf(" ");
}
for(int j=0;j<10;j++)
{
printf("%d ",class[class1-1].student[i].grade[j]);
}
printf("\n");
}
return 0;
}
void consult_main()
{
printf("查阅操作:\n");
int a=consult_choose();
if(a==1)consult_1();
if(a==2)consult_2();
if(a==3)consult_3();
}
void statistics_average_class_choose(double (*p)[2])
{
printf("请选择查询班级的方式:A.单班查询 B.区间查询\n");
char b[100];
while(1)
{
printf("请输入:");
scanf("%s",b);
if((b[0]=='A'||b[0]=='a')&&(strlen(b)==1)){
int a2;
while(1){
printf("请输入班级序号:");
scanf("%d",&a2);
if(a2<11&&a2>0)break;
else printf("数据不合理,请重新输入!\n");
}
printf("%d班的平均值是%.2lf。\n",a2,*(*(p+(a2-1))+1));
break;}
else if((b[0]=='B'||b[0]=='b')&&(strlen(b)==1)){
int a2,a3,x=0,y=0;
while(1){
if(!x&&!y){
printf("请输入起始次数和终止次数(用空格隔开):");
scanf("%d %d",&a2,&a3);
}
if(x&&!y){
printf("请重新输入终止次数:");
scanf("%d",&a3);
}
if(!x&&y){
printf("请重新输入起始次数:");
scanf("%d",&a2);
}
if(a2<11&&a2>0)x=1;
if(a3<11&&a3>0)y=1;
if(a2>a3)x=0,y=0;
if(x&&y)break;
printf("存在数据不合理,请重新输入!\n");
}
for(int i=a2;i<=a3;i++)
{
printf("%d班的平均值是%.2lf。\n",i,*(*(p+(i-1))+1));
}
break;}
else printf("\n数据不合理,请重新输入!\n");
}
}
void statistics_average_class_main(int a,double (*p)[2])
{
for(int i=0;i<10;i++)
{
int b=0,n=0;
for(int j=0;j<100;j++)
{
if(class[i].student[j].Name[0]=='\0')continue;
else n++;
for(int k=0;k<10;k++)
{
b+=class[i].student[j].grade[k];
}
}
if(n!=0)*(*(p+i)+0)=(double)(i+1),*(*(p+i)+1)=b/(double)n;
else *(*(p+i)+0)=(double)(i+1),*(*(p+i)+1)=0.0;
}
if(a==1)statistics_average_class_choose(p);
}
int statistics_average_personage_choose_1(int class1,double (*p)[2])
{
int student1,a=class1,b=0;
char c[20];
while(1){
printf("请输入学生姓名或学生学号:");
scanf("%s",c);
if(strlen(c)==1)
{
if(c[0]=='0')return 0;
}
b=inquire_main(c,&a,&student1);
if(!b)printf("该学号或姓名不存在!请重新输入!\n");
else {
if(a!=class1){printf("该学号或姓名存在,但不是%d班的!\n",class1+1);
a=class1;}
else break;
}
}
printf("%s的平均值是%.2lf。\n",class[class1].student[student1].Name,*(*(p+student1)+1));
return 1;
}
void statistics_average_personage_choose(int class1,double (*p)[2])
{
printf("是否需要多组输入?\nA.不需要 B.需要\n");
char a[100];
while(1)
{
printf("请输入:");
scanf("%s",a);
if((a[0]=='A'||a[0]=='a')&&(strlen(a)==1)){
statistics_average_personage_choose_1(class1,p);
break;
}
else if((a[0]=='B'||a[0]=='b')&&(strlen(a)==1)){
while(1)
{
int n=1;
n=statistics_average_personage_choose_1(class1,p);
if(!n)break;
}
break;
}
else printf("\n数据不合理,请重新输入!\n");
}
}
void statistics_average_personage_main(int a,int class1,double (*p)[2])
{
for(int i=0;i<100;i++)
{
double b=0;
if(class[class1-1].student[i].Name[0]=='\0')continue;
else {
for(int j=0;j<10;j++)
{
b+=class[class1-1].student[i].grade[j];
}
*(*(p+i)+0)=(double)(i),*(*(p+i)+1)=b/10.0;
}
}
if(a==1)statistics_average_personage_choose(class1-1,p);
}
void statistics_average_main()
{
double a[10][2],c[100][2];
printf("请选择需要求平均值的对象:\nA.班级 B.个人\n");
char b[100];
while(1)
{
printf("请输入:");
scanf("%s",b);
if((b[0]=='A'||b[0]=='a')&&(strlen(b)==1)){statistics_average_class_main(1,a);
break;}
else if((b[0]=='B'||b[0]=='b')&&(strlen(b)==1)){
int d;
while(1){
printf("请输入需要求平均值的班级:");
scanf("%d",&d);
if(d>0&&d<11)break;
else printf("数据不合理,请重新输入!");
}
statistics_average_personage_main(1,d,c);
break;}
else printf("\n数据不合理,请重新输入!\n");
}
}
void statistics_sort_class()
{
printf("注意:成绩将以每班平均分数进行排序!\n");
double a[10][2],c=0;
printf("请选择排序结果形式:\nA.升序 B.降序\n");
char b[100];
while(1)
{
printf("请输入:");
scanf("%s",b);
if((b[0]=='A'||b[0]=='a')&&(strlen(b)==1)){c=1;
break;}
else if((b[0]=='B'||b[0]=='b')&&(strlen(b)==1))break;
else printf("\n数据不合理,请重新输入!\n");
}
statistics_average_class_main(0,a);
for(int i=0;i<9;i++)
{
int k=i;
for(int j=i+1;j<10;j++)
{
if(c){if(a[j][1]<a[k][1])k=j;}
else {if(a[j][1]>a[k][1])k=j;}
}
double t=a[k][1];
a[k][1]=a[i][1],a[i][1]=t;
t=a[k][0],a[k][0]=a[i][0],a[i][0]=t;
}
printf("班级 平均分\n");
for(int i=0;i<10;i++)
{
printf("%.0lf",a[i][0]);
for(int j=0;j<(a[i][0]==10?4:5);j++)
{
printf(" ");
}
printf("%.2lf\n",a[i][1]);
}
}
void statistics_sort_personage()
{
int d,c=0;
double a[100][2];
for(int i=0;i<100;i++)a[i][0]=i;
while(1){
printf("请输入需要排序的班级:");
scanf("%d",&d);
if(d>0&&d<11)break;
else printf("数据不合理,请重新输入!");
}
statistics_average_personage_main(0,d,a);
printf("注意:成绩将以个人平均分数进行排序!\n");
printf("请选择排序结果形式:\nA.升序 B.降序\n");
char b[100];
while(1)
{
printf("请输入:");
scanf("%s",b);
if((b[0]=='A'||b[0]=='a')&&(strlen(b)==1)){c=1;
break;}
else if((b[0]=='B'||b[0]=='b')&&(strlen(b)==1))break;
else printf("数据不合理,请重新输入!\n");
}
for(int i=0;i<99;i++)
{
int k=i;
for(int j=i+1;j<100;j++)
{
if(c){if(a[j][1]<a[k][1])k=j;}
else {if(a[j][1]>a[k][1])k=j;}
}
double t=a[k][1];
a[k][1]=a[i][1],a[i][1]=t;
t=a[k][0],a[k][0]=a[i][0],a[i][0]=t;
}
printf("姓名 学号 平均值\n");
for(int i=0;i<100;i++)
{
if(class[d-1].student[(int)(a[i][0])].Name[0]=='\0')continue;
printf("%s",class[d-1].student[(int)(a[i][0])].Name);
for(int j=0;j<14-strlen(class[d-1].student[(int)(a[i][0])].Name)&&j<14;j++)
{
printf(" ");
}
printf("%s",class[d-1].student[(int)(a[i][0])].Num);
for(int j=0;j<14-strlen(class[d-1].student[(int)(a[i][0])].Num)&&j<14;j++)
{
printf(" ");
}
printf("%.2lf\n",a[i][1]);
}
}
void statistics_sort_main()
{
printf("请选择排序对象:\nA.班级 B.个人\n");
char b[100];
while(1)
{
printf("请输入:");
scanf("%s",b);
if((b[0]=='A'||b[0]=='a')&&(strlen(b)==1)){statistics_sort_class();
break;}
else if((b[0]=='B'||b[0]=='b')&&(strlen(b)==1)){statistics_sort_personage();
break;}
else printf("\n数据不合理,请重新输入!\n");
}
}
void statistics_max_min_class(int a)
{
if(a)printf("注意:成绩最大值将以每班平均分数进行判断!\n");
else printf("注意:成绩最小值将以每班平均分数进行判断!\n");
double b[10][2];
double d;
statistics_average_class_main(0,b);
d=b[0][1];
if(a)for(int i=1;i<10;i++)
{
if(b[i][1]==0)continue;
if(d<b[i][1])d=b[i][1];
}
else {for(int i=1;i<10;i++)
{
if(b[i][1]==0)continue;
if(d>b[i][1])d=b[i][1];
}
}
if(a)printf("最大值是%.2lf。\n",d);
else printf("最小值是%.2lf。\n",d);
}
int statistics_max_min_personage(int a)
{
if(a)printf("注意:成绩最大值将以每个学生的平均分数进行判断!\n");
else printf("注意:成绩最小值将以每个学生的平均分数进行判断!\n");
double b[100][2];
double d;
int class1;
if(!inquire_class(&class1))return 0;
statistics_average_personage_main(0,class1,b);
d=b[0][1];
if(a)for(int i=1;i<100;i++)
{
if(class[class1-1].student[i].Name[0]=='\0')continue;
if(d<b[i][1])d=b[i][1];
}
else {for(int i=1;i<100;i++)
{
if(class[class1-1].student[i].Name[0]=='\0')continue;
if(d>b[i][1])d=b[i][1];
}
}
if(a)printf("最大值是%.2lf。\n",d);
else printf("最小值是%.2lf。\n",d);
return 1;
}
void statistics_max_min_main(int a)
{
if(a)printf("请选择求最大值的对象:\n");
else printf("请选择求最小值的对象:\n");
printf("A.班级 B.个人\n");
char b[100];
while(1)
{
printf("请输入:");
scanf("%s",b);
if((b[0]=='A'||b[0]=='a')&&(strlen(b)==1)){if(a)statistics_max_min_class(1);
else statistics_max_min_class(0);
break;}
else if((b[0]=='B'||b[0]=='b')&&(strlen(b)==1)){if(a)statistics_max_min_personage(1);
else statistics_max_min_personage(0);
break;}
else printf("数据不合理,请重新输入!\n");
}
}
int statistics_pass_main()
{
int a=0,class1,c=0;
double b[100][2],e;
if(!inquire_class(&class1))return 0;
statistics_average_personage_main(0,class1,b);
for(int i=0;i<100;i++)
{
if(b[i][1]>=60)a++;
if(class[class1-1].student[i].Name[0]!='\0')c++;
}
if(c!=0)e=(a/(double)c)*100;
else e=0;
printf("%d的通过率为%.2lf%%。",class1,e);
return 1;
}
void statistics_main()
{
printf("统计操作:\n");
printf("请选择统计功能:\nA.排序 B.最大值 C.最少值 D.平均值 E.通过率\n");
char b[100];
while(1)
{
printf("请输入:");
scanf("%s",b);
if((b[0]=='A'||b[0]=='a')&&(strlen(b)==1)){statistics_sort_main();
break;}
else if((b[0]=='B'||b[0]=='b')&&(strlen(b)==1)){statistics_max_min_main(1);
break;}
else if((b[0]=='C'||b[0]=='c')&&(strlen(b)==1)){statistics_max_min_main(0);
break;}
else if((b[0]=='D'||b[0]=='d')&&(strlen(b)==1)){statistics_average_main();
break;}
else if((b[0]=='E'||b[0]=='e')&&(strlen(b)==1)){statistics_pass_main();
break;}
else printf("\n数据不合理,请重新输入!\n");
}
}
int main()
{
printf("##########学生作业完成情况管理系统##########\n");
void initialize();
char a[10];
while(1){
print_main();
while(1){
printf("请输入:");
scanf("%s",a);
if(!((strlen(a)==4)||(strlen(a)==1))){printf("数据不合理,请重新输入!\n");
continue;
}
if(strlen(a)==1){
if(a[0]=='A'||a[0]=='a'){input_main();
break;}
else if(a[0]=='B'||a[0]=='b'){consult_main();
break;}
else if(a[0]=='C'||a[0]=='c'){information_main();
break;}
else if(a[0]=='D'||a[0]=='d'){statistics_main();
break;}
else if(a[0]=='0')return 0;
else printf("数据不合理,请重新输入!\n");
}
else {
strlwr(a);
if(strcmp(a,"help")==0){help_main();
break;}
else printf("数据不合理,请重新输入!\n");
}
}
}
return 0;
}
存在的问题与漏洞:
1 .在输入数字的地方一旦输入非数字字符将导致程序崩溃。
2.在输入分数时,一旦输入的数据大于2^63-1时,将导致程序出现尚且不清楚的问题。
3.对于输入的学号与已存在的姓名相同时,将导致该学号被判断学号是否存在函数误判而
4.对于在检测选择输入是否合理时,重复使用类似代码导致冗余。