修改修改,应付应付作业应该没问题,本人能力有限,见谅。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ST 7/*学生*/
#define CR 5/*课程*/
int choice;
int input_choice()
{
int choice;
printf("按“1”录入信息;\n");
printf("按“2”统计不及格人数并打印名单;\n");
printf("按“3”统计在平均分以上的人数并打印名单;\n");
printf("按“4”统计各分数段学生人数及所占百分比;\n");
printf("按“5”按总分排名(由高到低);\n");
printf("按“6”以下为输入某个学号,输出对应的排名和分数\n");
printf("请输入操作:");
scanf("%d",&choice);
return choice;
}
int main()
{
Zero_Step:
choice=input_choice();
switch (choice)
{
case 1:
goto First_Step;
break;
case 2:
goto Second_Step;
break;
case 3:
goto Third_Step;
break;
case 4:
goto Fourth_Step;
break;
case 5:
goto Fifth_Step;
break;
case 6:
goto Sixth_Step;
break;
default:
break;
}
int course_student[CR][ST];/*定义一个二维数组来存储每门课的学生成绩*/
char student_name[ST][10];/*存储学生姓名*/
char student_number[ST][10];/*存储学生学号*/
char course_name[CR][10];/*存储课程名称*/
int count1=0,count2=0,count3=0;/*定义三个计数器*/
int x,y;/*用于形象且简便地表示二维数组的行、列*/
int sum=0;/*累加器*/
double course_average[CR];/*存储每门课程平均分*/
char failed_in_exam[ST+1][10];/*用于存储不及格学生名单*/
char lower_the_average[ST+1][10];/*用于存储低于平均分的学生名单*/
int grade_stage[6]={0};/*用于统计各分数段学生人数*/
int mark;/*用于将百分制转成十分制*/
float rate;/*各分数段比例*/
int sum_grade[ST]={0};/*用于存储每个学生总分*/
int temp1,temp3;/*用于交换的中间变量*/
char temp2[ST][10];/*用于交换学生名字的中间变量*/
char temp4[ST][10];/*用于交换学号的中间变量*/
char temp5[ST][10];/*用于暂存学生学号*/
char flag='Y';
/*以下为信息录入过程*/
First_Step:
printf("请输入课程名称:\n");
for(x=0;x<CR;x++)
{
scanf("%s",&course_name[x]);
}
printf("请输入学生姓名及学号:\n");
for(x=0;x<ST;x++)
{
scanf("%s%s",&student_name[x],&student_number[x]);
}
/*以下为录入每门课程学生成绩*/
for(x=0;x<CR;x++)
{
printf("请输入%s的成绩:\n",course_name[x]);
for(y=0;y<ST;y++)
{
printf("%s:",student_name[y]);
scanf("%d",&course_student[x][y]);
}
}
goto Zero_Step;
/*以下为统计不及格人数并打印名单*/
Second_Step:
for(x=0;x<CR;x++)
{
for(y=0;y<ST;y++)
{
if(course_student[x][y]<60)
{
count1++;
strcpy(failed_in_exam[count1],student_name[y]);
}
}
if(count1>0)
{
printf("%s不及格的有:",course_name[x]);
for(count2=1;count2<=count1;count2++)
{
printf("%s",failed_in_exam[count2]);
}
}
else
{
printf("%s全体上岸",course_name[x]);
}
count1=0;
printf("\n");
}
goto Zero_Step;
/*以下为计算每门课程平均分*/
Third_Step:
for(x=0;x<CR;x++)
{
for(y=0;y<ST;y++)
{
sum=sum+course_student[x][y];
}
course_average[x]=sum/(double)ST;
sum=0;
}
/*以下为统计在平均分以上的人数并打印名单*/
for(x=0;x<CR;x++)
{
for(y=0;y<ST;y++)
{
if(course_student[x][y]<course_average[x])
{
count1++;
strcpy(lower_the_average[count1],student_name[y]);
}
}
if(count1>0)
{
printf("%s低于平均分的有:",course_name[x]);
for(count2=1;count2<=count1;count2++)
{
printf("%s",lower_the_average[count2]);
}
}
else
{
printf("全体学生成绩一样,有作弊嫌疑。");
}
count1=0;
printf("\n");
}
goto Zero_Step;
/*统计各分数段学生人数及所占百分比*/
Fourth_Step:
for(x=0;x<6;x++)
{
grade_stage[x]=0;
}
for(x=0;x<CR;x++)
{
for(y=0;y<ST;y++)
{
mark=course_student[x][y]/10;
switch(mark)
{
case 10:
grade_stage[0]++;
break;
case 9:
grade_stage[1]++;
break;
case 8:
grade_stage[2]++;
break;
case 7:
grade_stage[3]++;
break;
case 6:
grade_stage[4]++;
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
grade_stage[5]++;
break;
default:
break;
}
}
count2=110;
for(count1=0;count1<6;count1++)
{
if(count1<5)
{
printf("%s分数段在%d~%d的有%d人,",course_name[x],count2-20,count2-10,grade_stage[count1]);
rate=grade_stage[count1]/(float)ST;
printf("所占比例为:%f\n",rate);
count2=count2-10;
}
else
{
printf("不及格的人数有%d人,",grade_stage[count1]);
rate=grade_stage[count1]/(float)ST;
printf("所占比例为:%f\n",rate);
}
}
for(count1=0;count1<6;count1++)
{
grade_stage[count1]=0;
}
}
goto Zero_Step;
/*以下为计算每个同学总分*/
Fifth_Step:
for(x=0;x<ST;x++)
{
sum_grade[x]=0;
}
for(x=0;x<ST;x++)
{
for (y=0;y<CR;y++)
{
sum_grade[x]=sum_grade[x]+course_student[y][x];/*列不变,行变*/
}
}
/*以下为按总分排名(由高到低)*/
for(count1=0;count1<ST;count1++)
{
count3=count1;
for(count2=count1+1;count2<ST;count2++)
{
if(sum_grade[count2]>sum_grade[count3])
{
count3=count2;
}
}
if(count1!=count3)
{
/*总成绩交换*/
temp1=sum_grade[count1];
sum_grade[count1]=sum_grade[count3];
sum_grade[count3]=temp1;
/*单科成绩交换*/
for(x=0;x<CR;x++)
{
temp3=course_student[x][count1];
course_student[x][count1]=course_student[x][count3];
course_student[x][count3]=temp3;
}
/*姓名交换*/
strcpy(temp2[count1],student_name[count1]);
strcpy(student_name[count1],student_name[count3]);
strcpy(student_name[count3],temp2[count1]);
/*学号交换*/
strcpy(temp4[count1],student_number[count1]);
strcpy(student_number[count1],student_number[count3]);
strcpy(student_number[count3],temp4[count1]);
}
}
for (count1=0; count1 < ST; count1++)
{
printf("%s\t %s 第%2d名 %3d分 ",student_name[count1],student_number[count1],count1+1,sum_grade[count1]);/*此处本想通过%4s控制字符长度以达到对齐效果,经检验对中文无对齐效果*/
for(x=0;x<CR;x++)
{
printf("%s %3d分 ",course_name[x],course_student[x][count1]);
}
printf("\n");
}
goto Zero_Step;
/*以下为输入某个学号,输出对应的排名和分数*/
Sixth_Step:
count1=0;
do
{
printf("请输入要查询的学号:");
scanf("%s",&temp5[count1]);
for(count2=0;count2<ST;count2++)
{
if(strcmp(student_number[count2],temp5[count1])==0)
{
printf("%s 第%d名 %d分 ",student_name[count2],count2+1,sum_grade[count2]);
for(x=0;x<CR;x++)
{
printf("%s %3d分 ",course_name[x],course_student[x][count2]);
}
printf("\n");
}
}
count1++;
printf("你是否要继续查询成绩,是则输入Y/y,否则按其他键退出:");
scanf(" %c",&flag);
}while (flag=='Y' || flag=='y');
system("pause");
return 0;
}