使用者工具

網站工具


cpp:2026spring:hw3

國立屏東大學 資訊工程系 物件導向程式設計

Turnin 作業 3

  • Turnin Code: cpp.hw3
  • Due Date: 3/16 Monday 23:59:00 (midnight) Hard Deadline

繳交方式說明

本次 Turnin 作業包含多個程式題,建議先為本次 turnin 要繳交的內容建立一個外層資料夾(例如:hw3),切換到該資料夾後再為每一題建立一個內層資料夾(每一題的資料夾名稱已寫於題目前方,例如第一題的資料夾名稱為「p1」,第二題的為「p2」,餘以此類推),進入到內層資料夾才依照題目要求進行編撰。

同學們可參考如下命令列操作:

<ssh 登入系計中後> 
[user@ws ~]$ mkdir hw3       # 在家目錄建立了一個名為「hw3」的資料夾
[user@ws ~]$ cd hw3          # 進入「hw3」資料夾
[user@ws hw3]$ mkdir p1      # 建立一個名為「p1」資料夾
[user@ws hw3]$ cd p1         # 切換到「p1」資料夾
[user@ws p1]$ joe grade.cpp  # 使用 JOE 編輯器對檔名 grade.cpp 的檔案進行編輯

等到我們完成 p1 的撰寫後,請自行加以編譯與執行程式,確認正確無誤後回到外層資料夾使用 turnin▴cpp.hw3▴p1↵ 指令完成繳交第一題的整個資料夾

[user@ws p1]$ cd ..              # 回到上一層資料夾
[user@ws hw3]$ turnin cpp.hw3 p1 # 使用 turnin 指令提交 p1 的程式碼
Turning in:
 p1/grade.cpp -- ok
All done.
[user@ws hw3]$ 

當然,你也可以等到本次作業要求的所有題目都在 hw3 資料夾裡完成後,一次將所有在目前資料夾中的所有檔案都加以上傳。

假設你已經在 hw3 資料夾裡完成所有題目,同時確認檔案的繳交格式正確,並且每個題目的程式檔案皆成功編譯並確認執行結果正確後,我們可以使用以下指令將多餘的(不需要繳交的)檔案加以刪除後,一次將所有檔案繳交:

[user@ws hw3]$ ls                # 檢視當前資料夾下有哪些內容
p1  p10  p2  p3  p4  p5  p6  p7  p8  p9
[user@ws hw3]$ rm -f */a.out     # 移除所有子資料夾中的 a.out 檔案
[user@ws hw3]$ turnin cpp.hw3 .  # 使用 turnin 指令繳交該資料夾下的所有內容
Turning in:
 ./p6/sum.cpp -- ok
 ./p9/perfect_number.cpp -- ok
 ./p3/event_describer.cpp -- ok
 ./p1/grade.cpp -- ok
 ./p10/rabbits.cpp -- ok
 ./p2/pass_or_not.cpp -- ok
 ./p7/divisible.cpp -- ok
 ./p8/average.cpp -- ok
 ./p5/electricity_bill.cpp -- ok
 ./p4/phone_bill.cpp -- ok
All done.
[user@ws hw3]$ 

如果繳交後想要查看已繳交的檔案及相關資訊,可以輸入 turnin▴-ls▴cpp.hw3↵ 指令,例如:

.:
total 40
drwxrwx---. 2 turninman turnin 4096 Mar  9 22:23 p1
drwxrwx---. 2 turninman turnin 4096 Mar  9 22:24 p10
drwxrwx---. 2 turninman turnin 4096 Mar  9 22:24 p2
drwxrwx---. 2 turninman turnin 4096 Mar  9 22:24 p3
drwxrwx---. 2 turninman turnin 4096 Mar  9 22:24 p4
drwxrwx---. 2 turninman turnin 4096 Mar  9 22:24 p5
drwxrwx---. 2 turninman turnin 4096 Mar  9 22:24 p6
drwxrwx---. 2 turninman turnin 4096 Mar  9 22:24 p7
drwxrwx---. 2 turninman turnin 4096 Mar  9 22:24 p8
drwxrwx---. 2 turninman turnin 4096 Mar  9 22:24 p9
 
./p1:
total 0
-rw-rw----. 1 turninman turnin 0 Mar  9 22:23 grade.cpp
 
./p10:
total 0
-rw-rw----. 1 turninman turnin 0 Mar  9 22:24 rabbits.cpp
 
./p2:
total 0
-rw-rw----. 1 turninman turnin 0 Mar  9 22:24 pass_or_not.cpp
 
./p3:
total 0
-rw-rw----. 1 turninman turnin 0 Mar  9 22:24 event_describer.cpp
 
./p4:
total 0
-rw-rw----. 1 turninman turnin 0 Mar  9 22:24 phone_bill.cpp
 
./p5:
total 0
-rw-rw----. 1 turninman turnin 0 Mar  9 22:24 electricity_bill.cpp
 
./p6:
total 0
-rw-rw----. 1 turninman turnin 0 Mar  9 22:24 sum.cpp
 
./p7:
total 0
-rw-rw----. 1 turninman turnin 0 Mar  9 22:24 divisible.cpp
 
./p8:
total 0
-rw-rw----. 1 turninman turnin 0 Mar  9 22:24 average.cpp
 
./p9:
total 0
-rw-rw----. 1 turninman turnin 0 Mar  9 22:24 perfect_number.cpp

本文使用「▴」及「↵」代表「空白字元」與「Enter 換行字元」,並且將使用者輸入的部份使用灰階方式顯示。 另外,題目的執行結果中,如果出現「(」、「)」、「:」、「;」、「.」與「,」等符號,皆為英文半形!

本學期作業繳交需要為每一題建立一個資料夾(資料夾名稱為該題題目前方之代號,第一題為「p1」,第二題為「p2」,餘以此類推),繳交方式可參考上述內容,任何未依照正確繳交格式的檔案將以 0 分計。


p1 依照成績輸出其等第

請設計一個 C++ 語言的程式 grade.cpp,讓使用者輸入成績,並依據所輸入的成績換算為對應的成績等第後輸出(若使用者輸入的分數超出 0~100 的範圍,則輸出「這啥啊↵」錯誤提示使用者輸入了錯誤的內容)。成績與等第之對應可參考如下:

  • A:90~100 分
  • B:80~89 分
  • C:70~79 分
  • D:60~69 分
  • F:0~59 分

本題執行結果可參考如下:

[3:23▴user@ws▴p1]▴./a.out↵
請輸入分數:▴100↵
A↵
[3:23▴user@ws▴p1]▴./a.out↵
請輸入分數:▴82↵
B↵
[3:23▴user@ws▴p1]▴./a.out↵
請輸入分數:▴59↵
F↵
[3:23▴user@ws▴p1]▴./a.out↵
請輸入分數:▴102↵
這啥啊↵
[3:23▴user@ws▴p1]▴

p2 及格了嗎

物件導向程式設計課程的助教,在每個學期末要做的事情裡肯定包含有處理學期成績這件事,但是助教想要寫一個程式讓學生輸入自己的成績後,計算並輸出其學期成績以及相關評語。請幫忙助教設計一個 C++ 程式 pass_or_not.cpp,讓使用者輸入「Turnin 平均」、「隨堂測驗(close-book exam)」、「隨堂練習(open-book exam)」以及二次期中考與一次期末考試共 6 項成績後,依照下列規則幫學生計算學期成績:

  1. Turnin 10%
  2. 隨堂測驗 10%
  3. 隨堂練習 5%
  4. 二次期中考各 25%
  5. 期末考 25%

依據上列規則計算出學期成績後,再依以下規則進行成績調整:

  1. 學期成績若大於等於 55 分者加 5 分,反之不予調;若加分後超過 100 分者,則以 100 分計。
  2. 任意一次期中考或期末考試作弊者,其成績登錄為 -1 ,其學期成績以 0 分計。
  3. 承上,期中考與期末考試的成績區間為 -1 ~ 100,若輸入內容超出範圍,請輸出「Input error!↵」。
  4. 除期中考與期末考試外,其餘成績區間皆為 0 ~ 100,若輸入內容超出範圍,請輸出「Input error!↵」。

最後,請依照調整後的學期成績區間輸出要顯示的相關評語:

  1. 調整後的學期成績介於 90(含)到 100(含),輸出「Outstanding!」
  2. 調整後的學期成績介於 80(含)到 90(不含),輸出「Excellent!」
  3. 調整後的學期成績介於 60(不含)到 80(不含),輸出「Fair enough.」
  4. 調整後的學期成績等於 60 ,輸出「That was a close one!」
  5. 調整後的學期成績低於 60(不含) ,輸出「Oops! See you next year(short by $x$ points)」,其中的 $x$ 代表距離及格所差的分數。

本題的執行結果可參考如下:

[3:23▴user@ws▴p2]▴./a.out↵
Please▴input▴your▴scores(turnin,▴close-book▴exam,▴open-book▴exam,▴midterm▴1,▴midterm▴2▴and▴final▴exam):▴↵
100▴100▴100▴100▴100▴100↵
Your▴term▴score▴is▴100.▴Outstanding!↵
[3:23▴user@ws▴p2]▴./a.out↵
Please▴input▴your▴scores(turnin,▴close-book▴exam,▴open-book▴exam,▴midterm▴1,▴midterm▴2▴and▴final▴exam):▴↵
92▴73▴91▴73▴80▴67↵
Your▴term▴score▴is▴81.05.▴Excellent!↵
[3:23▴user@ws▴p2]▴./a.out↵
Please▴input▴your▴scores(turnin,▴close-book▴exam,▴open-book▴exam,▴midterm▴1,▴midterm▴2▴and▴final▴exam):▴↵
72▴50▴91▴45▴62▴66↵
Your▴term▴score▴is▴65.▴Fair▴enough.↵
[3:23▴user@ws▴p2]▴./a.out↵
Please▴input▴your▴scores(turnin,▴close-book▴exam,▴open-book▴exam,▴midterm▴1,▴midterm▴2▴and▴final▴exam):▴↵
72▴50▴91▴48▴42▴63↵
Your▴term▴score▴is▴60.▴That▴was▴a▴close▴one!↵
[3:23▴user@ws▴p2]▴./a.out↵
Please▴input▴your▴scores(turnin,▴close-book▴exam,▴open-book▴exam,▴midterm▴1,▴midterm▴2▴and▴final▴exam):▴↵
72▴50▴60▴45▴62▴50↵
Your▴term▴score▴is▴54.45.▴Oops!▴See▴you▴next▴year(short▴by▴5.55▴points)↵
[3:23▴user@ws▴p2]▴./a.out↵
Please▴input▴your▴scores(turnin,▴close-book▴exam,▴open-book▴exam,▴midterm▴1,▴midterm▴2▴and▴final▴exam):▴↵
105▴50▴91▴45▴62▴-1↵
Input▴error!↵
[3:23▴user@ws▴p2]▴./a.out↵
Please▴input▴your▴scores(turnin,▴close-book▴exam,▴open-book▴exam,▴midterm▴1,▴midterm▴2▴and▴final▴exam):▴↵
-1▴50▴60▴45▴62▴50↵
Input▴error!↵
[3:23▴user@ws▴p2]▴./a.out↵
Please▴input▴your▴scores(turnin,▴close-book▴exam,▴open-book▴exam,▴midterm▴1,▴midterm▴2▴and▴final▴exam):▴↵
-1▴50▴60▴45▴62▴505↵
Input▴error!↵
[3:23▴user@ws▴p2]▴

  1. 本題如有使用浮點數的需求,請使用 double 作為相關變數的資料型態。
  2. 輸出資料若有浮點數時,一律四捨五入到小數點後第2位

p3 事件敘述器

請設計一個 C++ 語言的程式 event_describer.cpp,讓使用者輸入「何時」、「在何處」、與「做什麼」三個選擇。接著由程式輸出一個簡短敘述。具體來說,我們首先必須輸入一個代表時間的字元,分別敘述如下:

  • M:表示早上
  • A:表示下午
  • E:表示晚上

另外,我們還要輸入一個代表地點的字元,其中

  • S:表示學校
  • R:表示餐廳
  • G:表示花園

最後再輸入一個代表地點的字元,其中

  • R:表示看書
  • S:表示睡覺
  • P:表示寫程式

請取得使用者的輸入後(大小寫都視為正確),產生一段簡單的故事描述。但輸入超出上述範圍的字元時,必須顯示其錯誤。

本題的執行結果可參考如下:

[3:23▴user@ws▴p3]▴./a.out↵
mrP↵
阿財早上在餐廳寫程式↵
[3:23▴user@ws▴p3]▴./a.out↵
aPs↵
阿財下午在錯誤的地方睡覺↵
[3:23▴user@ws▴p3]▴./a.out↵
APp↵
阿財下午在錯誤的地方寫程式↵
[3:23▴user@ws▴p3]▴./a.out↵
EAR↵
阿財晚上在錯誤的地方看書↵
[3:23▴user@ws▴p3]▴./a.out↵
abc↵
阿財下午在錯誤的地方做錯誤的事↵
[3:23▴user@ws▴p3]▴./a.out↵
qrr↵
阿財在錯誤的時間在餐廳看書↵
[3:23▴user@ws▴p3]▴./a.out↵
xyz↵
阿財在錯誤的時間與錯誤的地方做錯誤的事↵
[3:23▴user@ws▴p3]▴

p4 遠船電信公司

優秀的遠船電信推出了三個不允許使用 2000 port 的行動上網方案:

  • 方案 1:月租費 499 元,每個月不限流量(吃到撐方案)。
  • 方案 2:0 月租費,每月費用以實際流量計算,每 MB 0.52 元 。
  • 方案 3:月租費 299 元,包含每個月免費 4GB 流量。超過的部分,每 MB 另外加收 0.25 元。

請設計一個 C++ 語言的程式 phone_bill.cpp,計算上網費用。使用者必須輸入其所使用的方案,並輸入該月份的流量(以 MB 為單位,且每1024 MB = 1 GB),計算該月的費用後加以輸出。

本題的執行結果可參考如下:

[3:23▴user@ws▴p4]▴./a.out↵
1↵
7663800↵
499↵
[3:23▴user@ws▴p4]▴./a.out↵
2↵
362423↵
188460↵
[3:23▴user@ws▴p4]▴./a.out↵
3↵
8192↵
1323↵
[3:23▴user@ws▴p4]▴./a.out↵
12↵
1357↵
Error!↵
[3:23▴user@ws▴p4]▴

  1. 本題如有使用浮點數的需求,請使用 double 做為相關變數的資料型態。
  2. 當輸出結果為浮點數時,請四捨五入到整數位

p5 計算電費

台灣的電價採用的是累進費率的計算方式,使用者所使用的電愈多其價格愈高,請參考以下住宅用之電價表:

每月用電度數分段 夏月 非夏月
120 度以下部分 每度 1.78 1.78
121~330 度部分 每度 2.55 2.26
331~500 度部分 每度 3.80 3.13
501~700 度部分 每度 5.14 4.24
701~1000 度部分 每度 6.44 5.27
1001 度以上部分 每度 8.86 7.03

舉例來說,若使用者的用電度數為 380 度計算夏月電費時,我們可以把要計算的電費分成三段計算:

  1. 120 度以下部分(共 120 度): 該段電費為 $120 \times 1.78 = 213.6$ 元。
  2. 121~330 度部分(共 210 度): 該段電費為 $210 \times 2.55 = 535.5$ 元。
  3. 331~500 度部分(此例僅佔 50 度): 該段電費為 $50 \times 3.80 = 190.0$ 元。

最後,我們將上述分開計算的電費加總後,即為應繳電費金額 $213.6 + 535.5 + 190 = 939.1$。

請設計一個 C++ 語言程式 electricity_bill.cpp,使用者將輸入一個大於 0 的用電度數,請分別計算其夏月與非夏月的電費,並輸出到小數點後第二位

本題的執行結果可參考如下:

[3:23▴user@ws▴p5]▴./a.out↵
Please▴input▴the▴electricity▴usage:▴380↵
summer▴month▴bill:▴939.10↵
non-summer▴month▴bill:▴844.70↵
[3:23▴user@ws▴p5]▴./a.out↵
Please▴input▴the▴electricity▴usage:▴777↵
summer▴month▴bill:▴2918.98↵
non-summer▴month▴bill:▴2474.09↵
[3:23▴user@ws▴p5]▴./a.out↵
Please▴input▴the▴electricity▴usage:▴1080↵
summer▴month▴bill:▴5063.90↵
non-summer▴month▴bill:▴4211.70↵
[3:23▴user@ws▴p5]▴./a.out↵
Please▴input▴the▴electricity▴usage:▴0↵
Error!↵
[3:23▴user@ws▴p5]▴

  1. 本題如有使用浮點數的需求,請使用 double 做為相關變數的資料型態。

p6 計算從1到N的相加數值

請設計一個 C++ 語言的程式 sum.cpp,讓使用者輸入一個正整數 n 後,計算並輸出 $1 + 2 + ... + n$ 的數值。此題的執行結果可參考如下:

[3:23▴user@ws▴p6]▴./a.out↵
n=?▴10↵
1+2+...+9+10=55.↵
[3:23▴user@ws▴p6]▴./a.out↵
n=?▴23↵
1+2+...+22+23=276.↵
[3:23▴user@ws▴p6]▴./a.out↵
n=?▴4↵
1+2+3+4=10.↵
[3:23▴user@ws▴p6]▴./a.out↵
n=?▴3↵
1+2+3=6.↵
[3:23▴user@ws▴p6]▴./a.out↵
n=?▴0↵
Error!!!↵
[3:23▴user@ws▴p6]▴./a.out↵
n=?▴-1↵
Error!!!↵
[3:23▴user@ws▴p6]▴./a.out↵
n=?▴1↵
1=1.↵
[3:23▴user@ws▴p6]▴./a.out↵
n=?▴2↵
1+2=3.↵
[3:23▴user@ws▴p6]▴

  1. 本題不考慮使用者輸入過大的 n 所造成的整數溢位問題。

p7 在1~100中找出可以被a與b整除的數字

請設計一個 C++ 語言的程式 divisible.cpp,讓使用者輸入兩個整數 a 與 b,找出所有介於1(含)至100(含)間同時可以被a與b整除的數字。此題的執行結果可參考如下:

[3:23▴user@ws▴p7]▴./a.out↵
Please▴input▴two▴numbers(a▴b):▴15▴20↵
Numbers▴divisible▴by▴15▴and▴20▴are▴as▴follows:▴60.↵
[3:23▴user@ws▴p7]▴./a.out↵
Please▴input▴two▴numbers(a▴b):▴3▴8↵
Numbers▴divisible▴by▴3▴and▴8▴are▴as▴follows:▴24,▴48,▴72▴and▴96.↵
[3:23▴user@ws▴p7]▴./a.out↵
Please▴input▴two▴numbers(a▴b):▴11▴12↵
None.↵
[3:23▴user@ws▴p7]▴

p8 計算並輸出平均成績

請撰寫一個 C++ 程式 average.cpp,讓使用者輸入多筆成績,直到輸入的成績為 "-1" 時結束,並輸出平均成績。要注意的是,使用者所輸入的成績必須介於 0 到 100 的範圍,超出範圍則顯示錯誤。程式執行結果請參考如下:

[3:23▴user@ws▴p8]▴./a.out↵
Number▴#1:▴100↵
Number▴#2:▴150↵
Wrong▴Input!▴Number▴#2:▴-120↵
Wrong▴Input!▴Number▴#2:▴0↵
Number▴#3:▴0↵
Number▴#4:▴-1↵
Average▴=▴33.3↵
[3:23▴user@ws▴p8]▴./a.out↵
Number▴#1:▴60↵
Number▴#2:▴70↵
Number▴#3:▴100↵
Number▴#4:▴80↵
Number▴#5:▴-1↵
Average▴=▴77.5↵
[3:23▴user@ws▴p8]▴./a.out↵
Number▴#1:▴81↵
Number▴#2:▴82↵
Number▴#3:▴83↵
Number▴#4:▴84↵
Number▴#5:▴85↵
Number▴#6:▴-1↵
Average▴=▴83↵
[3:23▴user@ws▴p8]▴

  1. 本題如有使用浮點數的需求,請使用 double 做為相關變數的資料型態。
  2. 輸出的資料若有浮點數時,請無條件捨棄至小數點後第1位。

p9 找出完美數

若一個整數所有真因數(意即除了本身以外的其它因數)的和等於其本身的數值,則稱為完美數(Perfect Number)。例如 6 的真因數有 1、2與 3,又 $1+2+3=6$ 因此 6 是一個完美數。

請設計一個 C++ 語言程式 perfect_number.cpp,讓使用者輸入一個大於 0 的整數 N(若使用者輸入範圍外的數值,請印出錯誤訊息),找出小於等於 N 的數字中所有的完美數後加以輸出。此題的執行結果可參考如下:

[3:23▴user@ws▴p9]▴./a.out↵
Please▴input▴a▴number:▴5↵
Perfect▴number▴was▴not▴found!↵
[3:23▴user@ws▴p9]▴./a.out↵
Please▴input▴a▴number:▴6↵
6▴is▴a▴perfect▴number.↵
[3:23▴user@ws▴p9]▴./a.out↵
Please▴input▴a▴number:▴1000↵
6,▴28▴and▴496▴are▴perfect▴numbers.↵
[3:23▴user@ws▴p9]▴./a.out↵
Please▴input▴a▴number:▴10000↵
6,▴28,▴496▴and▴8128▴are▴perfect▴numbers.↵
[3:23▴user@ws▴p9]▴./a.out↵
Please▴input▴a▴number:▴0↵
Error↵
[3:23▴user@ws▴p9]

  1. 本題不考慮使用者輸入過大的 n 所造成的整數溢位問題。

p10 兔子生存

費伯納西曾對提出以下的兔子問題:

  • 每一對兔子有「新生」、「成長中」以及「已成長」等三種狀態
  • 剛誕生的兔子為「新生」狀態,一個月後成為「成長中」狀態
  • 「成長中」的兔子還需要再一個月才能成為「已成長」的狀態
  • 每對「已成長」的兔子都具有生育能力,每個月固定會生一對兔子
  • 假設農場在第一個月有一對「新生」的兔子
  • 所有兔子永不死去

請設計一個 C++ 語言的程式 rabbits.cpp,讓使用者輸入月份,計算並輸出該月份兔子的總對數(若使用者輸入小於等於 0 的月份,則請輸出錯誤)。

依據上述的規則,列出前10個月兔子的對數如下:

月份 新生兔子對數 成長中兔子對數 已成長兔子對數 總對數
1 1 0 0 1
2 0 1 0 1
3 1 0 1 2
4 1 1 1 3
5 2 1 2 5
6 3 2 3 8
7 5 3 5 13
8 8 5 8 21
9 13 8 13 34
10 21 13 21 55

[3:23▴user@ws▴p10]▴./a.out↵
Month:▴5↵
There▴are▴5▴pairs▴of▴rabbits.↵
[3:23▴user@ws▴p10]▴./a.out↵
Month:▴10↵
There▴are▴55▴pairs▴of▴rabbits.↵
[3:23▴user@ws▴p10]▴./a.out↵
Month:▴0↵
Error!↵
[3:23▴user@ws▴p10]▴

【若輸入為 1 時,應輸出為單數的 is :「There▴is▴1▴pair▴of▴rabbits.↵」,本題輸亦可輸出為 are 「There▴are▴1▴pairs▴of▴rabbits.↵」】

cpp/2026spring/hw3.txt · 上一次變更: 2026/03/13 01:26 由 dengyi

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki