此題在高中生程式解題系統的題號為: b964: 第 1 題 成績指標。
筆者的解題作法有底下幾種:
方法一:
1. 用一個變數 fCnt 用來記錄不及格的成績有幾筆。
2. 將分數陣列 score[] 由小排到大。
3. 此時 score[fCnt] 為最低及格分數; score[fCnt - 1] 為最高不及格分數。
C 程式碼:
C++ 程式碼:
Python 程式碼:
方法二:
1. 將成績數值分成兩個陣列,及格 pass 與不及格 fail。
2. 將 及格 pass 與不及格 fail 陣列由小排到大。
3. 此時 pass[0] 為最低及格分數;fail[fail.size() - 1] 為最高不及格分數。
C 程式碼:
分法三:
1. 將所有成績數值排序。
2. 找出最低及格分數的位置fPos。
3. 此時 score[fPos] 為最低及格分數; score[fPos + 1] 為最高不及格分數。
C++ 程式碼:
1. 用一個變數 fCnt 用來記錄不及格的成績有幾筆。
2. 將分數陣列 score[] 由小排到大。
3. 此時 score[fCnt] 為最低及格分數; score[fCnt - 1] 為最高不及格分數。
C 程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include <stdio.h> #include <stdlib.h> int cmp(const void * a, const void * b) { return ( *(int*)a - *(int*)b ); } int main(void) { int n, fCnt, score[20]; while (scanf("%d",&n) != EOF ) { fCnt = 0; for(int i = 0; i < n; i++) { scanf("%d", &score[i]); if(score[i] < 60) fCnt++; } qsort(score, n, sizeof(int), cmp); printf("%d",score[0]); for(int i = 1; i < n; i++) { printf(" %d",score[i]); } printf("\n"); if(fCnt > 0) printf("%d\n", score[fCnt - 1]); else printf("best case\n"); if(fCnt != n) printf("%d\n", score[fCnt]); else printf("worst case\n"); } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include <iostream> #include <algorithm> using namespace std; int main(void) { int n, fCnt, score[20]; while (cin >> n) { fCnt = 0; for(int i = 0; i < n; i++) { cin >> score[i]; if(score[i] < 60) fCnt++; // 計算有幾個人不及格 } sort(score, score + n); // 將分數由小到大做排序 cout << score[0]; for(int i = 1; i < n; i++) { cout <<" " << score[i]; } cout << endl; if(fCnt > 0) cout << score[fCnt - 1] << endl; // 最低及格分數 else cout << "best case\n"; if(fCnt != n) cout << score[fCnt] << endl; // 最高不及格分數 else cout << "worst case\n"; } return 0; } |
Python 程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | while True: try: score = input() score = input() score = list(map(int, score.split())) score.sort() # 計算有幾個人不及格 fCnt = 0 for a in score: if a < 60: fCnt += 1 print(score[0], end="") for i in range(1, len(score)): print("", score[i], end="") print() if fCnt != 0: print(score[fCnt - 1]) else: print("best case") if fCnt == len(score): print("worst case") else: print(score[fCnt]) except EOFError: break |
方法二:
1. 將成績數值分成兩個陣列,及格 pass 與不及格 fail。
2. 將 及格 pass 與不及格 fail 陣列由小排到大。
3. 此時 pass[0] 為最低及格分數;fail[fail.size() - 1] 為最高不及格分數。
C 程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #include <stdio.h> #include <stdlib.h> int cmp(const void * a, const void * b) { return ( *(int*)a - *(int*)b ); } int main(void) { int n, pass[20], pCnt, fail[20], fCnt; while (scanf("%d",&n) != EOF ) { fCnt = 0; // 不及格人數為零 pCnt = 0; // 及格人數為零 for(int i = 0; i < n; i++) { int score; scanf("%d", &score); if(score < 60) { fail[fCnt] = score; // 將分數儲存在不及格 fail 陣列 fCnt++; // 不及格人數增加一 } else { pass[pCnt] = score; // 將分數儲存在及格 pass 陣列 pCnt++; // 及格人數增加一 } } // 將及格與不及格陣列由小到大做排序排序 qsort(pass, pCnt, sizeof(int), cmp); qsort(fail, fCnt, sizeof(int), cmp); // 若不及格人數大於零 if(fCnt > 0) { printf("%d", fail[0]); for(int i = 1; i < fCnt; i++) printf(" %d", fail[i]); for(int i = 0; i < pCnt; i++) printf(" %d", pass[i]); } else // 全部都及格 { printf("%d", pass[0]); for(int i = 1; i < pCnt; i++) printf(" %d", pass[i]); } printf("\n"); if(fCnt == 0) printf("best case\n"); else printf("%d\n", fail[fCnt - 1]); if(pCnt == 0) printf("worst case\n"); else printf("%d\n", pass[0]); } return 0; } |
C++ 程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <iostream> #include <algorithm> #include <vector> using namespace std; int main(void) { int n, s; while (cin >> n) { vector<int> fail, pass, r; for(int i = 0; i < n; i++) { cin >> s; if(s >= 60) pass.push_back(s); else fail.push_back(s); } sort(fail.begin(), fail.end()); sort(pass.begin(), pass.end()); r.insert(r.end(), fail.begin(), fail.end()); r.insert(r.end(), pass.begin(), pass.end()); cout << r[0]; for(int i = 1; i < r.size(); i++) cout << " " << r[i]; cout << endl; if(fail.size() > 0) cout << fail[fail.size() - 1] << endl; else cout << "best case" << endl; if(pass.size() > 0) cout << pass[0] << endl; else cout << "worst case" << endl; } return 0; } |
1. 將所有成績數值排序。
2. 找出最低及格分數的位置fPos。
3. 此時 score[fPos] 為最低及格分數; score[fPos + 1] 為最高不及格分數。
C++ 程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <iostream> #include <algorithm> using namespace std; int main(void) { int n, fPos, score[20]; while (cin >> n) { for(int i = 0; i < n; i++) cin >> score[i]; sort(score, score + n); // 將分數由小到大做排序 fPos = -1; // 找出最低及格分數的位置 for(int i = 0; i < n; i++) if(score[i] < 60) fPos++; cout << score[0]; for(int i = 1; i < n; i++) { cout <<" " << score[i]; } cout << endl; if(fPos != -1) cout << score[fPos] << endl; // 最低及格分數 else cout << "best case\n"; if(fPos != n - 1) cout << score[fPos+1] << endl; // 最高不及格分數 else cout << "worst case\n"; } return 0; } |
Python 程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | while True: try: score = input() score = input() score = list(map(int, score.split())) score.sort() # 找出最低及格分數的位置 fPos = -1 for a in score: if a < 60: fPos += 1 print(score[0], end="") for i in range(1, len(score)): print("", score[i], end="") print() if fPos != -1: print(score[fPos]) else: print("best case") if fPos == len(score) - 1: print("worst case") else: print(score[fPos + 1]) except EOFError: break |
方法四:
將資料由小到大做排序,此時會有三種情況:
1. 最小值有及格。 ==> 代表全部都及格 best case
2. 最大值不及格。 ==> 代表全部都不及格 worst case
3. 有及格與不及格。 ==> 找出最低及格分數的位置
C++ 程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include <iostream> #include <algorithm> using namespace std; int main(void) { int n, score[20]; while (cin >> n) { for(int i = 0; i < n; i++) cin >> score[i]; sort(score, score + n); // 將分數由小到大做排序 cout << score[0]; for(int i = 1; i < n; i++) { cout << " " << score[i]; } cout << endl; // 最小值有及格 if(score[0] >= 60) { cout << "best case\n"; cout << score[0] << endl; } else if(score[n-1] < 60) // 最大值不及格 { cout << score[n-1] << endl; cout << "worst case\n"; } else { // 找出最低及格分數的位置 for(int i = 0; i < n; i++) { if(score[i] >= 60) { cout << score[i-1] << endl; cout << score[i] << endl; break; } } } } return 0; } |
Python 程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | while True: try: n = int(input()) score = input() score = list(map(int, score.split())) score.sort() print(score[0], end="") for i in range(1, n): print("", score[i], end="") print() # 最小值有及格 if score[0] >= 60: print('best case') print(score[0]) # 最大值不及格 elif score[n-1] < 60: print(score[n-1]) print('worst case') else: # 找出最低及格分數的位置 for i in range(n): if score[i] >= 60: print(score[i-1]) print(score[i]) break except EOFError: break |