1. 程式人生 > >結構體實現成績排序

結構體實現成績排序

題目要求

建立一個結構體,讀入並儲存 n 個學生的考試資訊,每個學生的資訊包括學號,姓名和考試分數。然後對學生的分數進行排序(由高到低),若分數相同則按學號排序(由小到大)。最後按照“學號 姓名 成績”的格式逐行列印成績表。

Sample Input
4

1 a 90

2 b 80

3 c 90

4 d 100

Sample Output
4 d 100

1 a 90

3 c 90

2 b 80

注意:
1、學號的範圍是1-- n 且 n < 100;

2、學生的姓名由一個字母字串表示(長度不大於10);

3、分數約定為0–100的整數;

4、儲存結構可自由選擇;

5、輸出的每一行最後都帶換行符。

這是結構體中比較基礎的一道題了,並且涉及到了結構體型別的排序問題。在用結構體排序之前,我們先複習一下選擇排序(當然啦,氣泡排序也是可以的,可以選擇一種自己喜歡的排序方式~):

選擇排序每次返回最大的數的下標,如果與起始元素的下標不同,就要進行交換,否則進行下一輪的比較。

所以main函式是這樣:


int main() {
	int length;
	int numbers[10]={0};
	
	scanf("%d",&length);
	
	get_numbers(numbers,length);
	
	sort_numbers(numbers,length);
	
	print_numbers(numbers,length);
	
	return 0;
}

(用函式來進行操作抽象真的很有必要!)

下面是演算法的核心sort_numbers:

void sort_numbers(int*numbers,int length) {
	int i;
	int index;
	
	for(i=0;i<length-1;i++) {
		index=get_index(numbers,i,length-1);
		
		if(index!=i) {
			swap(numbers,index,i);	//起始元素不是最大的時候才交換
		}
	}
	
	return;
}

尋找最大的下標:

int get_index(const int*numbers,int begin,int end) {
	int i;
	int index;
	
	index=begin;
	
	for(i=begin;i<=end;i++) {
		if(numbers[i]>numbers[index]) {
			index=i;
		}
	}
	
	return index;
}

剩下其他的函式就非常簡單了,就不貼在這裡了。

為什麼要先看排序演算法?struct型別不同於基本的資料型別,不能整體進行比較、加減等運算,所以這種時候就需要自己通過函式來重新定義struct型別的關係運算,但是其他的思路與排序演算法仍然是相同的!

所以,如果你嘗試過自己寫程式碼後,你會發現,這道題完全可以用我們剛才的排序稍加改變就可以了!不過是把尋找最大下標的函式中的numbers[i]>numbers[index]變成一個自己定義的關於兩個struct型別的比較關係即可!!

下面是完整的原始碼哦:

#include<stdio.h>
#include<stdlib.h>

typedef struct stu{
	int netid;
	char name[10];
	int grade;
}Stu;

void get_class(Stu*Class,int numofstu);

void sort_class(Stu*Class,int numofstu);
int get_index(const Stu*Class,int begin,int end);
int compare(Stu student1,Stu student2);
void swap(Stu*Class,int index,int i);

void print_class(const Stu*Class,int numofstu);

int main() {
	int numofstu;
	Stu* Class;
	
	scanf("%d",&numofstu);
	
	Class=(Stu*)malloc(sizeof(Stu)*numofstu);
	
	get_class(Class,numofstu);
	
	sort_class(Class,numofstu);
	
	print_class(Class,numofstu);
	
	free(Class);
	
	return 0;
}

void get_class(Stu*Class,int numofstu) {
	int i;
	
	for(i=0;i<numofstu;i++) {
		scanf("%d",&Class[i].netid);
		scanf("%s",Class[i].name);
		scanf("%d",&Class[i].grade);
	} 
	
	return;
}

void sort_class(Stu*Class,int numofstu) {
	int i;
	int index;
	
	for(i=0;i<numofstu-1;i++) {
		index=get_index(Class,i,numofstu-1);
		
		if(index!=i) {
			swap(Class,index,i);
		}
	}
	
	return;
}

int get_index(const Stu*Class,int begin,int end) {
	int index;
	int i;
	
	index=begin;
	
	for(i=begin;i<=end;i++) {
		if(compare(Class[i],Class[index])) {
			index=i;
		}
	}
	
	return index;
}

int compare(Stu student1,Stu student2) {
	int condition1,condition2,condition3;
	
	condition1=student1.grade>student2.grade;
	condition2=student1.grade==student2.grade;
	condition3=student1.netid<student2.netid;
	
	if(condition1) {
		return 1;
	}
	
	else if(condition2&&condition3) {
		return 1;
	}
	
	return 0;
}

void print_class(const Stu*Class,int numofstu) {
	int i;
	
	for(i=0;i<numofstu;i++) {
		printf("%d ",Class[i].netid);
		printf("%s ",Class[i].name);
		printf("%d\n",Class[i].grade);
	}
	
	return;
}

void swap(Stu*Class,int index,int i) {
	Stu temp;
	
	temp=Class[index];
	Class[index]=Class[i];
	Class[i]=temp;
	
	return;
}

(先寫一遍選擇排序後思路會清晰很多)