---
# System prepended metadata

title: 程式設計

---

# **善良的小明**

**Content**
---

善良的小明是個心靈脆弱的高中生，他設計了一個程式來安慰考試不如預期的自己和同學。
輸入多位學生的成績，計算每位學生的總分、平均、等第與排名，並印出成績表和鼓勵語。

**輸入格式**
---

1. 第一行輸入一個整數n，代表學生人數（不超過100）。

2. 接下來n行，每行輸入5個整數，代表該學生的國文、英文、數學、自然、社會成績。

**輸入格式範例**
---

| 輸入學生人數          | 1   |
| --------------------- | --- |

輸入第一位學生的分數
| 國文 | 86  |
| ---- | --- |
|   英文   |  92 |
|  數學    |  57 |
|  自然    |  81 |
| 社會 | 65



**輸出格式範例**
---
		英文	數學	自然	社會	總分	平均	等第	排名
1	86	92	57	81	65	381	76.2	乙	3

給第 1 號同學的鼓勵語：有穩定的表現，再多努力一點會更好！

 **程式內容+註解**
```c++=

#include <iostream> // 引入輸入輸出功能
using namespace std;

int main()
{
    const int sub = 5;  // 固定有 5 科：數學、國文、英文、自然、社會
    int st;             // 儲存學生人數
    float sum;          // 暫存每位學生的總分

    // ▶ 使用者輸入學生人數
    cout << "輸入學生人數: ";
    cin >> st;

    // ▶ 宣告 2D 陣列來存每位學生的分數資料
    // 每位學生有 sub 科成績 + 總分 + 平均 + 排名 = sub + 3 欄
    float score[st][sub + 3];

    // ▶ 建立科目名稱陣列，照指定順序：國文→英文→數學→自然→社會
    string subjects[sub] = {"國文", "英文", "數學", "自然", "社會"};

    // ▶ 依序輸入每位學生的各科分數
    for (int i = 0; i < st; i++) {
        cout << "輸入第 " << i + 1 << " 位學生的分數：" << endl;
        for (int j = 0; j < sub; j++) {
            // 顯示提示，要求輸入各科成績
            cout << subjects[j] << ": ";
            cin >> score[i][j];  // 儲存輸入成績到對應位置
        }
    }

    // ▶ 計算每位學生的總分與平均
    for (int i = 0; i < st; i++) {
        sum = 0;  // 每次計算前先將總和歸零
        for (int j = 0; j < sub; j++) {
            sum += score[i][j];  // 將所有科目成績加總
        }
        score[i][sub] = sum;           // 將總分存到第 sub 欄
        score[i][sub + 1] = sum / sub; // 將平均存到第 sub+1 欄
    }

    // ▶ 計算學生排名：成績高者排名靠前
    for (int i = 0; i < st; i++) {
        int rank = 1;  // 預設每位學生初始排名為 1（最高）
        for (int j = 0; j < st; j++) {
            // 比較平均分，若有其他學生平均更高，則排名後移
            if (score[j][sub + 1] > score[i][sub + 1]) {
                rank++;
            }
        }
        score[i][sub + 2] = rank;  // 將排名存到第 sub+2 欄
    }

    // ▶ 輸出成績標題列
    cout << "\n座號\t";
    for (int i = 0; i < sub; i++) {
        cout << subjects[i] << "\t";  // 輸出科目名稱
    }
    cout << "總分\t平均\t等第\t排名" << endl;

    // ▶ 輸出每位學生的所有資料（成績、總分、平均、等第、排名）
    for (int i = 0; i < st; i++) {
        cout << i + 1 << "\t";  // 座號從 1 開始

        // 輸出各科成績、總分與平均（sub + 2 個欄位）
        for (int j = 0; j < sub + 2; j++) {
            cout << score[i][j] << "\t";
        }

        // ▶ 判斷等第（根據平均分數）
 for (int i = 0; i < st; i++) {
        sum = 0;  // 每次計算前先將總和歸零
        for (int j = 0; j < sub; j++) {
            sum += score[i][j];  // 將所有科目成績加總
        }
        score[i][sub] = sum;           // 將總分存到第 sub 欄
        score[i][sub + 1] = sum / sub; // 將平均存到第 sub+1 欄
    }

    // ▶ 計算學生排名：成績高者排名靠前
    for (int i = 0; i < st; i++) {
        int rank = 1;  // 預設每位學生初始排名為 1（最高）
        for (int j = 0; j < st; j++) {
            // 比較平均分，若有其他學生平均更高，則排名後移
            if (score[j][sub + 1] > score[i][sub + 1]) {
                rank++;
            }
        }
        score[i][sub + 2] = rank;  // 將排名存到第 sub+2 欄
    }

    // ▶ 輸出成績標題列
    cout << "\n座號\t";
    for (int i = 0; i < sub; i++) {
        cout << subjects[i] << "\t";  // 輸出科目名稱
    }
    cout << "總分\t平均\t等第\t排名" << endl;

    // ▶ 輸出每位學生的所有資料（成績、總分、平均、等第、排名）
    for (int i = 0; i < st; i++) {
        cout << i + 1 << "\t";  // 座號從 1 開始

        // 輸出各科成績、總分與平均（sub + 2 個欄位）
        for (int j = 0; j < sub + 2; j++) {
            cout << score[i][j] << "\t";
        }

        // ▶ 判斷等第（根據平均分數）
        float avg = score[i][sub + 1];
        if (avg >= 90)
            cout << "優";
        else if (avg >= 80)
            cout << "甲";
        else if (avg >= 70)
            cout << "乙";
        else if (avg >= 60)
            cout << "丙";
        else
            cout << "丁";

        // ▶ 輸出排名
        cout << "\t" << (int)score[i][sub + 2] << endl;
     }

        // ▶ 給每位學生鼓勵語（依平均成績分類）
        cout << endl;
        for (int i = 0; i < st; i++) {
        float avg = score[i][sub + 1];  // 取得平均分數
        cout << "給第 " << i + 1 << " 號同學的鼓勵語：";

        // 根據平均給出不同的鼓勵文字
        if (avg >= 90)
            cout << "表現非常優秀，繼續保持喔！" << endl;
        else if (avg >= 80)
            cout << "不錯喔！你已經很接近優等了，加油！" << endl;
        else if (avg >= 70)
            cout << "有穩定的表現，再多努力一點會更好！" << endl;
        else if (avg >= 60)
            cout << "不要氣餒，穩扎穩打，一定能進步！" << endl;
        else
            cout << "每個人都有自己的節奏，別放棄，加油！" << endl;
    }

    return 0;  // 程式結束
} }
   
```
**執行結果**
---
[https://onlinegdb.com/0yirwCfgi]
    
**心得**
---   
**03 林安妮**
這次作業從開始著手，到最後的交出報告，確實可以說是『歷經千辛萬苦』。先是拼盡全力無法戰勝HackMD中沒辦法對齊的程式，我對不起Ms.吳在「溝通與表達」課程對我的教導，深感慚愧。接著是製作報告時我的電腦悲慘的當機+死機好幾次，最後才成功交出報告，是高中生涯中令我記憶數一數二深刻的一次作業。很有趣的一次設計程式經驗，不希望會有下一次。抱歉了Shola老師，請相信我是真心喜歡您的課。
    
**04施妤蓁**
學會不只是寫程式，還要反覆測試、比對輸出才能保證程式正確。
    
**11黃苡晴**
輸入數字等動作繁瑣，要確保真的都有打對，才不會前功盡棄。希望小明藉由這個系統提升自己的成績。 
    
**12 楊喻軫**
這次的作業讓我學到原來要真的會寫程式不是一天兩天能做的事情，這作業讓我更了解程式的運作也讓我發現原來幾個字母跟數字可以做出那麼豐富的東西。

**分工**
---

**03 林安妮**
程式設計與改編 報告
    
**04施妤蓁**
報告
    
**11黃苡晴**
報告
    
**12 楊喻軫**
報告


