ZZULIOJ 1193: 單科成績排序(結構體專題)

題目描述

有一學生成績表,包括學號、姓名、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;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章