C语言 单科成绩排序 使用结构体

题目描述

有一学生成绩表,包括学号、姓名、3门课程成绩。请按要求排序输出:若输入1,则按第1门课成绩降序输出成绩表,若输入为i(1<=i<=3),则按第i门课成绩降序输出成绩表。

输入

首先输入一个整数n(1<=n<=100),表示学生人数;

然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。

最后一行输入一个整数i,表示要求按第i门课成绩降序排序输出,若该门课成绩相同,则按学号升序。

输出

输出按第i门课降序排序的结果,格式见样例。

样例输入
3
541207010188 Zhangling 89 78 95
541207010189 Wangli 85 87 99
541207010190 Fangfang 85 68 76
1

样例输出
541207010188 Zhangling 89 78 95
541207010189 Wangli 85 87 99
541207010190 Fangfang 85 68 76

请注意这个要求“若该门课成绩相同,则按学号升序”。

代码如下:

#include<stdio.h>
#include<string.h>
#define NOLEN 12 //学号长度
#define NAMELEN 20 //姓名长度
#define SCORENUM 3 //课程数
#define CLASSSTUNUM 100 //班级人数
typedef struct stuinfo{
char num[NOLEN+1]; //学号,含'\0'
char name[NAMELEN+1];   //姓名,含'\0'
int score[SCORENUM];
}stuInfo;
typedef struct classinfo{
stuInfo stu[CLASSSTUNUM];
int classstunum;
}classInfo;



void sortStuScore(classInfo democlass,int index,int scoreSorted[CLASSSTUNUM]){
//最后一行输入一个整数i,表示要求按第i门课成绩降序排序输出,若该门课成绩相同,则按学号升序。
//请注意这个要求“若该门课成绩相同,则按学号升序”。
int i,j,p,temp,tempScore[CLASSSTUNUM][2];
for(p=0;p<CLASSSTUNUM;p++){
tempScore[p][0]=p;
tempScore[p][1]=democlass.stu[p].score[index-1];
}

for(i=0;i<democlass.classstunum;i++)
for(j=democlass.classstunum;j>i;j--)
if(tempScore[j][1]>tempScore[i][1] || (tempScore[j][1] == tempScore[i][1] && strcpy(democlass.stu[j].num,democlass.stu[i].num)<0)){
temp=tempScore[i][1];
tempScore[i][1]=tempScore[j][1];
tempScore[j][1]=temp;
temp=tempScore[i][0];
tempScore[i][0]=tempScore[j][0];
tempScore[j][0]=temp;
}

for(i=0;i<democlass.classstunum;i++)
scoreSorted[i]=tempScore[i][0];
}

void printStuScore(classInfo democlass,int scoreSorted[CLASSSTUNUM]){
int i;
i=0;
printf("score scoted:\n");
while(i<democlass.classstunum){
printf("%s %s %d %d %d\n",democlass.stu[scoreSorted[i]].num,democlass.stu[scoreSorted[i]].name,democlass.stu[scoreSorted[i]].score[0],democlass.stu[scoreSorted[i]].score[1],democlass.stu[scoreSorted[i]].score[2]);
i++;
}
}

void main(){
classInfo demoClass;
int i,scoreSorted[CLASSSTUNUM];
char temp[NAMELEN];
memset(temp,0,NAMELEN);
printf("please input the info by valid format:\n");
scanf("%d",&demoClass.classstunum);
if(demoClass.classstunum>0){
for(i=0;i<demoClass.classstunum;i++){
memset(demoClass.stu[i].num,0,CLASSSTUNUM);
memset(demoClass.stu[i].name,0,NAMELEN);
scanf("%s %s %d %d %d",&demoClass.stu[i].num,&demoClass.stu[i].name,&demoClass.stu[i].score[0],&demoClass.stu[i].score[1],&demoClass.stu[i].score[2]);
}
scanf("%d",&i);
if(i>0){
sortStuScore(demoClass,i,scoreSorted);
printStuScore(demoClass,scoreSorted);
}
}
}

测试数据:

3
541207010190 Fangfang 85 68 76
541207010189 Wangli 85 87 99

541207010188 Zhangling 89 78 95

1

输出结果:

score scoted:
541207010188 Zhangling 89 78 95
541207010189 Wangli 85 87 99
541207010190 Fangfang 85 68 76
请按任意键继续. . .

运行截图:

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-04-24
按指定的课程排序冒泡就好了,降序的话,就遍历做个判断,如果要排序的科目成绩高,就把这个结构体移到前面
第2个回答  2014-04-24
#include<stdio.h>
#include<string.h>
typedef struct{
int no[12];
char name[20];
int math;
int chn;
int eng;
} student;
void rank(student *p,int n,int j);

void main()
{
int count;//总共count个学生
int i;
int m;//第m科排序
student stu[100];
printf("请输入总共学生人数:");
scanf("%d",&count);

//输入部分
for(i=0;i<count;i++)
{
printf("第%d个学生:\n",i+1);
scanf("%s %s %d %d %d",&stu[i].no,&stu[i].name,&stu[i].math,&stu[i].chn,&stu[i].eng);
}
printf("请输入按第几门成绩降序排列:");
scanf("%d",&m);

//排序
rank(stu,count,m);

//输出
for(i=0;i<count;i++)
printf("%s %s %d %d %d\n",stu[i].no,stu[i].name,stu[i].math,stu[i].chn,stu[i].eng);
}

void rank(student *p,int n,int k)
{
student temp;
int i,j;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
//k为选择排序的那一科,这块写的不好
if(k==1)
{
if(p[i].math<p[j].math) //冒泡排名第k科
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
else if(p[i].math==p[j].math)//当第k科相同时候再来排名学号
{
if(*(p[i].no)>*(p[j].no))
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
}
else if(k==2)
{
if(p[i].chn<p[j].chn) //冒泡排名第k科
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
else if(p[i].chn==p[j].chn)//当第k科相同时候再来排名学号
{
if(*(p[i].no)>*(p[j].no))
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
}
else
{
if(p[i].eng<p[j].eng) //冒泡排名第k科
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
else if(p[i].eng==p[j].eng)//当第k科相同时候再来排名学号
{
if(*(p[i].no)>*(p[j].no))
{
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}
}
}
}

}
赶着睡觉。应该凑合能完成你的任务。。
第3个回答  推荐于2016-01-18
#include <stdio.h>


int main()
{
struct student
{
int stunum;
char stuname[20];
int stuscore1;
int stuscore2;
int stuscore3;
};

int i=0;
int j=0;
int range=0;
struct student students[100];
struct student temp;
int n=0;
printf("请输入学生总数:\n");
scanf("%d",&n);

for(i=0;i<n;i++)
{
scanf("%d %s %d %d %d",&students[i].stunum,students[i].stuname,&students[i].stuscore1,&students[i].stuscore2,&students[i].stuscore3);
}

scanf("%d",&range);
switch(range)
{
case 1:
{
for(i=0;i<n;i++)
{
for(j=0;j<n-1-i;j++)
{
if(students[j].stuscore1<students[j+1].stuscore1)
{
temp=students[j];
students[j]=students[j+1];
students[j+1]=temp;

}
if(students[j].stuscore1==students[j+1].stuscore1)
{
if(students[j].stunum>students[j+1].stunum)
{
temp=students[j];
students[j]=students[j+1];
students[j+1]=temp;
}


}
}
}
for(i=0;i<n;i++)
{
printf("%d %s %d %d %d\n",students[i].stunum,students[i].stuname,students[i].stuscore1,students[i].stuscore2,students[i].stuscore3);
}
break;
}
case 2:
{
for(i=0;i<n;i++)
{
for(j=0;j<n-1-i;j++)
{
if(students[j].stuscore2<students[j+1].stuscore2)
{
temp=students[j];
students[j]=students[j+1];
students[j+1]=temp;

}
if(students[j].stuscore2==students[j+1].stuscore2)
{
if(students[j].stunum>students[j+1].stunum)
{
temp=students[j];
students[j]=students[j+1];
students[j+1]=temp;
}


}
}
}
for(i=0;i<n;i++)
{
printf("%d %s %d %d %d\n",students[i].stunum,students[i].stuname,students[i].stuscore1,students[i].stuscore2,students[i].stuscore3);
}
break;
}
case 3:
{
for(i=0;i<n;i++)
{
for(j=0;j<n-1-i;j++)
{
if(students[j].stuscore3<students[j+1].stuscore3)
{
temp=students[j];
students[j]=students[j+1];
students[j+1]=temp;

}
if(students[j].stuscore3==students[j+1].stuscore3)
{
if(students[j].stunum>students[j+1].stunum)
{
temp=students[j];
students[j]=students[j+1];
students[j+1]=temp;
}


}
}
}
for(i=0;i<n;i++)
{
printf("%d %s %d %d %d\n",students[i].stunum,students[i].stuname,students[i].stuscore1,students[i].stuscore2,students[i].stuscore3);
}
break;
}
}
return 0;
}

本回答被提问者采纳
相似回答