結構體實現成績排序
阿新 • • 發佈:2018-12-25
題目要求
建立一個結構體,讀入並儲存 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;
}
(先寫一遍選擇排序後思路會清晰很多)