/*/*继续完成“学生成绩管理系统”的大作业,在上一期大作业的基础上,进一步扩充程序的功能,
并采用模块化程序设计思想,通过不同的函数实现菜单选择,完成下面菜单的功能。*/
/*要求:如果系统里没有数据,要有信息提示(例如程序一开始运行就调用排序,这时应该提示先选菜单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
*/
}