反正只是解題,下面四個變數就寫在全域吧,以後遇到這種問題的話,希望你已經學過struct跟malloc
學生數量:
int count;
設計三個陣列來分別存 學生名字、學生成績、學生的編號(我們要自己紀錄的),這三個陣列裡面,同樣位置的資料會綁在一起:
char stud_name[30][51]; // 最多30個學生,不超過50個字長度的名字
int stud_score[30]; // 學生分數
int stud_order[30]; // 用來記錄最後輸出的時候學生的順序
// (Remi第一個出現,雖然分數第二名,還是要第一個輸出他)
會用到的函數:
void Swap(int id0, int id1); // 同時交換 stud_name與stud_score 的 第id0跟id1 元素
void Sort(); // 只看分數來排序,然後用 swap 來改順序,這裡就用 bubble sort吧,把分數低的往後移 (分數最高就會是在stud_*[0])
void PrintAnswer(); //
void main();
以範例輸入來說,最後會變成
stud_name = ["Maria", "Remi", "Yan"]
stud_score = [20, 14, 2]
stud_order = [2, 0, 1]
而我們要做的是,從stud_order來判斷,先輸出誰;
第一個要輸出 0 的學生(代表這個學生是當初的輸入的第一個),而在 stud_order[1] 找到 0,所以知道 stud_name[1] 是第 2 名 (index為1)
void Swap(int id0, int id1)
void Sort();
int end_id;
int curr_id;
for (end_id = count; end_id >= 1; end_id--) {
// keep on swappin
for (curr_id = 1; curr_id < end_id; curr_id++) {
if (stud_score[curr_id - 1] < stud_score[curr_id])
swap(curr_id - 1, curr_id);
}
}
void PrintAnswer();
int target_order = 0;
int pointer = 0;
int i;
for (i = 0; i < count; i++) {
for (pointer = 0; pointer < count; pointer++) {
if (stud_order[pointer] == target_order) {
printf("%s rank is %d\n", stud_name[pointer], pointer+1);
break;
}
}
target_order++;
}
void main();