2024.12.25~2024.12.31学习总结

课设:学生作业完成情况管理
【题目描述】
请设计一个学生作业完成情况管理系统。
假设某门课程一学期要完成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.对于在检测选择输入是否合理时,重复使用类似代码导致冗余。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值