编辑代码

/*/*继续完成“学生成绩管理系统”的大作业,在上一期大作业的基础上,进一步扩充程序的功能,
并采用模块化程序设计思想,通过不同的函数实现菜单选择,完成下面菜单的功能。*/
/*要求:如果系统里没有数据,要有信息提示(例如程序一开始运行就调用排序,这时应该提示先选菜单1,
输入数据。(提示:利用学生总数变量判断)
  如果学生总人数和课程数是按局部变量处理的,则输入数据模块处理完信息录入后,要返回学生总人数,
学生总数和课程总数要作为函数参数。也可以把学生总人数和课程数考虑为全局变量处理,
这样这两个变量就不用作为函数的形参出现了。循环变量i, j等不可以设为全局变量。可以考虑增加新学生数据的处理。
  为了减少程序的复杂性,课程信息采取一次性输入,后期不修改,故建议课程名处理放在菜单循环的外部;
但如果增加课程名另外考虑。原则上不考虑修改课程名的功能。(自己可以发挥)*//*/**/

#include<stdio.h>
#include<math.h>
#include<string.h> 

int flag;
int i,j,t,k;
int n,m;
#define N 10		//renshu
#define M 3  	//科目数 &学号位数上限 
char name[N][10];
char num[N][20];
float score[N][M];//为避免繁琐输入,本题假设有4人 ,3门课 

void shuru(char name[N][10],char num[N][20],float score[N][M]);
void chaxun(char name[N][10],char num[N][20],float score[N][M]);
void paixu(char name[N][10],char num[N][20],float score[N][M]);
void shanchu(char name[N][10],char num[N][20],float score[N][M],int n);
void xianshi(char name[N][10],char num[N][20],float score[N][M],int n);
//void tuichu();

int main()
	{	
	int choice;
	while(1)
	{
     printf("**********菜单栏***********\n");
	printf("**********1. 输入**********\n");
	printf("**********2. 查询**********\n");
	printf("**********3. 排序**********\n");
	printf("**********4. 删除**********\n");
	printf("**********5. 显示**********\n");
	printf("**********0. 退出**********\n");
	p:printf("输入菜单号:");
	scanf("%d",&choice);
	getchar();
	switch(choice)
	{ 
	case 1: shuru(name,num,score);
	break ;
	case 2: chaxun(name,num,score);
	break ;
	case 3: paixu(name,num,score);
	break ;
	case 4: shanchu(name,num,score,n);
	break ;
	case 5: xianshi(name,num,score,n);
	break ;
	case 0: break ;
	default: printf("菜单号选择错误,请重新输入!\n\a");goto p;
	}/* switch 语句结束 */
	if (choice == '0') break ; /* 跳出循环 */
	}/*while 结束 */
	}/* main */
	
void shuru(char name[N][10],char num[N][20],float score[N][M])
{	//int n,m;
	if(flag!=1)
	{
		printf("请输入有几个人:");
		scanf("%d",&n) ;
		printf("请输入课程总数:");
		scanf("%d",&m);
		for(  i=0;i<n;i++)
		{
		printf("请输入第%d人的姓名、学号,依次输入各科成绩\n",i+1);
		scanf("%s %s",&name[i],&num[i]);	
			for( j=0;j<m;j++)
			{
				scanf("%f",&score[i][j]);
			}		
		}
		flag=1;
	}
	else
	{
		printf("将在之前的基础上增加信息,新增加的人应与之前数据有相同的科目数\n");
		printf("增加几个人:");
		scanf("%d",&k) ;
		for( i=n;i<n+k;i++)
		{
		printf("请输入第%d人的姓名、学号,依次输入各科成绩\n",i+1);
		scanf("%s %s",&name[i],&num[i]);	
			for( j=0;j<m;j++)
			{
				scanf("%f",&score[i][j]);
			}		
		}
		n=n+k;	
	}
}

void chaxun(char name[N][10],char num[N][20],float score[N][M])
{	
	char temp[1];int f;
	if(flag!=1) {printf("没有数据,请先输入数据!\n\a");}
	else
	{
	printf("请输入你想要查询目标的学号或姓名\n");
	scanf("%s",temp);
	for(i=0;i<N;i++)
	{ 
		if(strcmp(temp,name[i])==0||strcmp(temp,num[i])==0)
		{
			printf("姓名\t学号\t科目一\t科目二\t科目三\n");
			printf("%s\t%s\t",name[i],num[i]);
			for( j=0;j<M;j++)
			{
				printf("%-5.2f\t",score[i][j]);
			}
			printf("\n");f=0;
		}
	}
	if(f!=0) puts("此人不存在!\n");	//查询过后会中断 	
	}	
}

void paixu(char name[N][10],char num[N][20],float score[N][M])
{
	char p;
	float sum[n];
	char temp[1];
	printf("请选择升序排序方式:\n");
	printf("6.学号;7.总分;");
	pt:scanf("%d",&p);
	switch(p)
	case 6:{for( i=0;i<N-1;i++)
		{
		if(num[i]<num[i+1])
			{	
				for( j=i;j<N;j++)
				{
				temp[0]=num[i][j];
				num[i][j]=num[i+1][j];
				num[i+1][j]=temp[0];
				temp[0]=name[i][j];
				name[i][j]=name[i+1][j];
				name[i+1][j]=temp[0];
				temp[0]=score[i][j];
				score[i][j]=score[i+1][j];
				score[i+i][j]=temp[0];		
				}
			}
		}	
		xianshi(name,num,score,n);}
	break;
	case 7 :{for(i=0;i<n;i++)
			{
				for(j=0;j<M;j++)
				{
					sum[i]+=score[i][j];
				}	
			}
			for( i=0;i<N;i++)
			{
				if(sum[i]<sum[i+1])
					for(j=0;j<M;j++)
					{
					temp[0]=num[i][j];
					num[i][j]=num[i+1][j];
					num[i+1][j]=temp[0];
					temp[0]=name[i][j];
					name[i][j]=name[i+1][j];
					name[i+1][j]=temp[0];
					temp[0]=score[i][j];
					score[i][j]=score[i+1][j];
					score[i+i][j]=temp[0];
					}
			}
			xianshi(name,num,score,n);}	
	break;
	default:printf("输入错误,请重新选择\a\n");goto pt;
}


void shanchu(char name[N][10],char num[N][20],float score[N][M],int n)
{	
	if(flag!=1) {printf("没有数据,请先输入数据!\n\a");}
	else
	{
	char temp1 [1];int f=1,j;
	printf("请选择删除的人姓名:\n");
	scanf("%s",&temp1[0]);
	for(i=0;i<n;i++)
	{
		if(strcmp(temp1,name[i])==0)
		{	printf("此人存在,即将删除\n");
			for(j=i;j<n;j++)
			{
				for(t=0;t<M;t++)
				{	
					name[j][t]=name[j+1][t];
					num[j][t]=num[j+1][t];	
				}
				for(t=0;t<M;t++)
					{
						score[j][t]=score[j+1][t];
					}
			}
			n--;f=0;//修改全局变量n。没有改变之前的数组长度 ,但可以影响显示、输入等程序,可以在形式上达到删除的效果 
			//printf("%d",n);
		if(f!=0) puts("此人不存在!\a\n");
		else{
		printf("删除成功!\n\a");
		xianshi(name,num,score,n);
		}//不完善 			
	}	
		}	
	}
	
}


void xianshi(char name[N][10],char num[N][20],float score[N][M],int n)
{	if(flag!=1) {printf("没有数据,请先输入数据!\n\a");}
	else
	{	//printf("%d",n);
		printf("姓名\t学号\t科目一\t科目二\t科目三\n");
		for( i=0;i<n;i++) 
		{
		printf("%s\t%s\t",name[i],num[i]);
		for( j=0;j<M;j++)
		{
			printf("%-5.2f\t",score[i][j]);
		}
		printf("\n");
		}
	}	
}



/*猜测数据 
1 4 3
jj      45      4.00    8.00    9.00
gh      56      56.00   9.00    3.00
fg      86      6.00    45.00    38.00
nm      78      42.00   78.00    8.00
*/


}