Skip to main content

10-4 Class 練習題

練習一:電影票券(Ticket

情境說明

你正在設計一套電影院售票系統。每張票券記錄了電影名稱、座位號碼、票價,以及是否已被使用。票券一旦使用就不能再次入場;票價不能設為負數。


規格列表

成員變數(皆為 private

變數名稱 型態 說明
movieName string 電影名稱
seatNumber int 座位號碼
price int 票價(元)
used bool 是否已使用

建構子

建構子 初始值
Ticket() movieName="未命名"seatNumber=0price=0used=false
Ticket(string movieName, int seatNumber, int price) 依參數設定,used=false

兩個建構子的參數名稱與成員變數相同,需使用 this-> 或初始化列表。

Getter(皆加 const

函式 回傳型態 說明
getMovieName() string 回傳電影名稱
getSeatNumber() int 回傳座位號碼
getPrice() int 回傳票價
isUsed() bool 回傳是否已使用

Setter(含驗證)

函式 驗證規則
setPrice(int price) price < 0 時印出 "票價不能為負數!" 並放棄修改

其他成員函式

函式 回傳 說明
use() bool 若已使用,印出 "此票券已使用過!" 並回傳 false;否則將 used 設為 true,印出入場訊息並回傳 true
print() const void 印出票券所有資訊(格式見預期輸出)

main()

int main() {
    Ticket t1("星際大戰", 12, 280);
    Ticket t2;

    t1.print();
    t2.print();

    t1.use();
    t1.use();           // 重複使用

    t1.setPrice(-100);  // 非法
    t1.setPrice(250);   // 合法

    cout << t1.getMovieName() << " 目前票價:" << t1.getPrice() << " 元" << endl;

    t1.print();
}

預期輸出

[票券] 星際大戰 | 座位 12 | 票價 280 元 | 狀態:未使用 [票券] 未命名 | 座位 0 | 票價 0 元 | 狀態:未使用 入場成功!電影:星際大戰,座位:12 此票券已使用過! 票價不能為負數! 星際大戰 目前票價:250 元 [票券] 星際大戰 | 座位 12 | 票價 250 元 | 狀態:已使用

練習二:水壺(Pitcher

情境說明

你設計一個登山水壺管理程式。每個水壺有名稱、最大容量和目前水量。注水時若超過容量會溢出;倒水時若水量不足則失敗;容量不能設得比目前水量還小。


規格列表

成員變數(皆為 private

變數名稱 型態 說明
name string 水壺名稱
capacity int 最大容量(ml)
current int 目前水量(ml)

建構子

建構子 初始值
Pitcher() name="水壺"capacity=1000current=0
Pitcher(string name, int capacity) 依參數設定,current=0

Getter(皆加 const

函式 回傳型態 說明
getName() string 回傳水壺名稱
getCapacity() int 回傳最大容量
getCurrent() int 回傳目前水量

Setter(含驗證)

函式 驗證規則
setCapacity(int capacity) ≤ 0 印出 "容量必須大於 0!";新容量 < current 印出 "新容量小於目前水量,無法設定!"

其他成員函式

函式 回傳 說明
fill(int amount) void 注水;若超出容量則補滿並印出溢出量,否則正常注水
pour(int amount) bool 倒水;水量不足回傳 false 並印出提示,否則正常倒出回傳 true
status() const void 印出水壺狀態,含百分比(格式見預期輸出)

main()

int main() {
    Pitcher p1("運動水壺", 750);
    Pitcher p2;

    p1.status();
    p2.status();

    p1.fill(500);
    p1.fill(400);       // 會溢出

    p1.pour(200);
    p1.pour(600);       // 水量不足

    p1.setCapacity(-1); // 非法
    p1.setCapacity(100);// 非法(小於目前水量 550)

    cout << p1.getName() << " 容量:" << p1.getCapacity() << " ml" << endl;

    p1.status();
}

預期輸出

[運動水壺] 0 / 750 ml(0%) [水壺] 0 / 1000 ml(0%) 運動水壺 注入 500 ml。 運動水壺 已裝滿,多餘 150 ml 溢出。 運動水壺 倒出 200 ml。 運動水壺 水量不足,無法倒出 600 ml! 容量必須大於 0! 新容量小於目前水量,無法設定! 運動水壺 容量:750 ml [運動水壺] 550 / 750 ml(73%)

練習三:遊戲計分板(ScoreBoard

情境說明

你正在設計一款小遊戲的計分系統。計分板記錄玩家名稱、歷史最高分、當前分數和剩餘生命數。每次得分若超過歷史最高分則更新紀錄;失去所有生命時宣告遊戲結束;重新開始時分數歸零但最高分保留。


規格列表

成員變數(皆為 private

變數名稱 型態 說明
playerName string 玩家名稱
highScore int 歷史最高分
currentScore int 當前分數
lives int 剩餘生命數

建構子

建構子 初始值
ScoreBoard() playerName="玩家"highScore=0currentScore=0lives=3
ScoreBoard(string playerName, int lives) 依參數設定,highScore=0currentScore=0

Getter(皆加 const

函式 回傳型態 說明
getPlayerName() string 回傳玩家名稱
getHighScore() int 回傳歷史最高分
getCurrentScore() int 回傳當前分數
getLives() int 回傳剩餘生命數

Setter(含驗證)

函式 驗證規則
setPlayerName(string playerName) 名稱為空字串時印出 "玩家名稱不能為空!" 並放棄修改

其他成員函式

函式 回傳 說明
addScore(int points) void 加分(≤0 印出提示拒絕);若 currentScore > highScore 則更新並印出新紀錄訊息
loseLife() bool 扣一條命;lives=0 時印出遊戲結束訊息並回傳 false,否則回傳 true
reset() void currentScore 歸零、lives 回復 3,highScore 保留,印出提示
print() const void 印出所有資訊(格式見預期輸出)

main()

int main() {
    ScoreBoard sb("小明", 3);
    ScoreBoard sb2;

    sb.print();
    sb2.print();

    sb.addScore(100);
    sb.addScore(250);
    sb.addScore(50);

    sb.loseLife();
    sb.loseLife();
    sb.loseLife();      // 第三條命,遊戲結束

    sb.setPlayerName(""); // 非法
    sb.setPlayerName("小明Pro");

    sb.reset();
    sb.print();

    sb.addScore(500);   // 超越舊最高分
    sb.print();
}

預期輸出

== 小明 == 當前:0 | 最高:0 | 命:3 == 玩家 == 當前:0 | 最高:0 | 命:3 新紀錄!最高分更新為 100 小明 得 100 分,目前:100 新紀錄!最高分更新為 350 小明 得 250 分,目前:350 新紀錄!最高分更新為 400 小明 得 50 分,目前:400 小明 失去一條命,剩餘:2 小明 失去一條命,剩餘:1 小明 失去一條命,剩餘:0 遊戲結束!小明 最終得分:400 玩家名稱不能為空! 小明Pro 重新開始,最高分保留:400 == 小明Pro == 當前:0 | 最高:400 | 命:3 新紀錄!最高分更新為 500 小明Pro 得 500 分,目前:500 == 小明Pro == 當前:500 | 最高:500 | 命:3