成績排序【九度教程第二題】

題目描述:

有N個學生的數據,將學生數據按成績高低排序,如果成績相同則按姓名字符的字母序排序,如果姓名的字母序也相同則按照學生的年齡排序,並輸出N個學生排序後的信息。

輸入:

測試數據有多組,每組輸入第一行有一個整數N(N<=1000),接下來的N行包括N個學生的數據。每個學生的數據包括姓名(長度不超過100的字符串)、年齡(整形數)、成績(小於等於100的正數)。

輸出:

將學生信息按成績進行排序,成績相同的則按姓名的字母序進行排序。然後輸出學生信息,按照如下格式:姓名 年齡 成績

樣例輸入:

3
abc 20 99
bcd 19 97
bed 20 97

樣例輸出:

bcd 19 97
bed 20 97
abc 20 99

提示:學生姓名的字母序區分字母的大小寫,如A要比a的字母序靠前(因爲A的ASC碼比a的ASC碼要小)。
來源:2000年清華大學計算機研究生機試真題

注意事項:

  1. 控制檯輸入如何處理?
  2. 輸入的一行數據以什麼數據結構存在?(如何解析一行的三個不同部分?)
  3. 行間排序規則的定義?如何實現多行的排序?

回答一下:

  1. scanf("%d",&n)!=EOF能夠控制多組數據的輸入(以crtl+Z結束) scanf("%s%d%d")一下子輸入多個字段
  2. 輸入的一行數據以結構體形式存放,這樣就不用以字符串形式輸入,再去解析出三個不同字段了,然後就可以用 scanf("%s%d%d")輸入該行數據了(以空格隔開,scanf自動解析)
  3. 寫一個新函數來定義,返回bool值。新函數按照題目給的規則:先比較成績,再用strcmp比較名字,再比較年齡。
  4. 實現多行的排序直接使用C++庫內函數sort函數,其中sort的參數分別爲待排序數組的起始地址、結束地址、排序方法(可以是自定義的,但是必須爲bool值)

代碼

#include<stdio.h>
#include<string.h>
#include<algorithm> // 用c++內置函數 sort 
using namespace std;
struct info{
	char name[100];
	int age;
	int grade;
}; //如何定義結構體數組!! 

bool comp(info a, info b){// 判斷a是否比b小 
	if(a.grade!=b.grade)
		return a.grade<b.grade; 
	if(strcmp(a.name,b.name)!=0)	
		return strcmp(a.name,b.name)<0; // a>b 爲正整數 
	else return a.age<b.age; 
}

int main()
{
	struct info buf[1000];
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=0;i<n;i++){
			scanf("%s%d%d",buf[i].name,&buf[i].age,&buf[i].grade);
		} 
		sort(buf,buf+n,comp); // 數組起始、結束位置、排序方式(可自定義 
		for(int j=0;j<n;j++){
			printf("%s %d %d\n",buf[j].name,buf[j].age,buf[j].grade);
		}
	}
		
	return 0;
} 

代碼中要注意的有

  1. 結構體數組的定義方法引用方法
  2. using namespace std以及還是可以用printf來打印的
  3. scanf("%s%d%d",buf[i].name,&buf[i].age,&buf[i].grade);中字符串數組名即爲字符串地址,不需要&符號。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章