单科成绩排序(结构体专题)
有一学生成绩表,包括学号、姓名、3门课程成绩。请按要求排序输出:若输入1,则按第1门课成绩降序输出成绩表,若输入为i(1<=i<=3),则按第i门课成绩降序输出成绩表。
Input
首先输入一个整数n(1<=n<=100),表示学生人数;
然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。
最后一行输入一个整数i,表示要求按第i门课成绩降序排序输出,若该门课成绩相同,则按学号升序。
Output
输出按第i门课降序排序的结果,格式见样例。
Sample Input
3
541207010188 Zhangling 89 78 95
541207010189 Wangli 85 87 99
541207010190 Fangfang 85 68 76
1
Sample Output
541207010188 Zhangling 89 78 95
541207010189 Wangli 85 87 99
541207010190 Fangfang 85 68 76
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct tagstudent
{
///12位的学号已经超过int类型的最大值,因此用char 数组存储
char num[16];
///姓名不超过20个字符,12个字符肯定不够
char name[24];
int scores[3];
}STUDENT,*LPSTUDENT;
void swap(LPSTUDENT a,LPSTUDENT b)
{
STUDENT _a;
memcpy(&_a,a,sizeof(STUDENT));
memcpy(a,b,sizeof(STUDENT));
memcpy(b,&_a,sizeof(STUDENT));
}
int cmp(char * a,char * b)
{
return strcmp(a,b) >= 0 ? 1 : 0;
}
int main()
{
int n,i,j;
unsigned int f;
LPSTUDENT student;
scanf("%d",&n);
///我的编译器不支持动态数组,只能动态分配内存
///不要把结构体和变量同名 struct student student
student = (LPSTUDENT)malloc(n * sizeof(STUDENT));
for(i=0;i<n;i++)
{
scanf("%s %s %d %d %d",
student[i].num,
student[i].name,
&(student[i].scores[0]),
&(student[i].scores[1]),
&(student[i].scores[2]));
}
scanf("%u",&f);
f = (f+2) % 3;
///排序是按某科成绩给所有学生排序
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
///成绩按降序排列,大数放前面
if(student[i].scores[f] < student[j].scores[f])
{
swap(student+i,student+j);
}
///成绩相等的按学号升序来排
else if(student[i].scores[f]==student[j].scores[f] && cmp(student[i].num,student[j].num))
{
swap(student+i,student+j);
}
}
}
for(j=0;j<n;j++)
{
printf("%s %s ",student[j].num,student[j].name);
for(i=0;i<3;i++)
printf("%d ",student[j].scores[i]);
printf("\n");
}
free(student);
return 0;
}