題目描述
有一學生成績表,包括學號、姓名、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
tips:
1 爲了提高代碼複用,可以使用函數指針
關於函數指針的使用,可以查看https://blog.csdn.net/qq_39112646/article/details/104233422
2 成績相同時,按學號排序,可以使用strcmp()
#include<stdio.h>
typedef struct xuesheng
{
char xuehao[13];
char name[20];
int a, b, c;
}Student;
void sort(Student *s,int num,int (*cmp)(Student s1,Student s2)){
Student temp;
for (int i = 0; i < num-1; i++)
{
for (int j = i+1; j < num; j ++)
{
if (cmp(s[i], s[j])>0){ //這必須>0 strcmp(串1,串2),若串1<串2 ,返回-1
temp = s[i]; //無序對調,返回1對調
s[i] = s[j];
s[j] = temp;
}
}
}
}
int cmp1(Student s1, Student s2){
if (s1.a!=s2.a)
{
if (s2.a>s1.a)
{
return 1;
}
else{
return 0;
}
}
else{
return strcmp(s1.xuehao,s2.xuehao);
}
}
int cmp2(Student s1, Student s2){
if (s1.b != s2.b)
{
if (s2.b>s1.b)
{
return 1;
}
else{
return 0;
}
}
else{
return strcmp(s1.xuehao, s2.xuehao);
}
}
int cmp3(Student s1, Student s2){
if (s1.c != s2.c)
{
if (s2.c>s1.c)
{
return 1;
}
else{
return 0;
}
}
else{
return strcmp(s1.xuehao, s2.xuehao);
}
}
int main(){
Student s[100], temp;
int num,op;
scanf("%d",&num);
for (int i = 0; i < num; i++)
{
scanf("%s %s %d %d %d",s[i].xuehao,s[i].name,&s[i].a,&s[i].b,&s[i].c);
}
scanf("%d",&op);
switch (op)
{
case 1:
sort(s,num,cmp1);
break;
case 2:
sort(s,num,cmp2);
break;
case 3:
sort(s,num,cmp3);
break;
default:
break;
}
for (int i = 0; i < num; i++)
{
printf("%s %s %d %d %d\n",s[i].xuehao,s[i].name,s[i].a,s[i].b,s[i].c);
}
return 0;
}