APCS 實作題 10503 第1題成績指標參考解法

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

此題在高中生程式解題系統的題號為: b964: 第 1 題 成績指標

筆者的解題作法有底下幾種:
方法一:
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;
}

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
#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