目錄表
國立屏東大學 資訊工程系 物件導向程式設計
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 項成績後,依照下列規則幫學生計算學期成績:
- Turnin 10%
- 隨堂測驗 10%
- 隨堂練習 5%
- 二次期中考各 25%
- 期末考 25%
依據上列規則計算出學期成績後,再依以下規則進行成績調整:
- 學期成績若大於等於 55 分者加 5 分,反之不予調;若加分後超過 100 分者,則以 100 分計。
- 任意一次期中考或期末考試作弊者,其成績登錄為 -1 ,其學期成績以 0 分計。
- 承上,期中考與期末考試的成績區間為 -1 ~ 100,若輸入內容超出範圍,請輸出「Input error!↵」。
- 除期中考與期末考試外,其餘成績區間皆為 0 ~ 100,若輸入內容超出範圍,請輸出「Input error!↵」。
最後,請依照調整後的學期成績區間輸出要顯示的相關評語:
- 調整後的學期成績介於 90(含)到 100(含),輸出「Outstanding!」
- 調整後的學期成績介於 80(含)到 90(不含),輸出「Excellent!」
- 調整後的學期成績介於 60(不含)到 80(不含),輸出「Fair enough.」
- 調整後的學期成績等於 60 ,輸出「That was a close one!」
- 調整後的學期成績低於 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]▴
- 本題如有使用浮點數的需求,請使用 double 作為相關變數的資料型態。
- 輸出資料若有浮點數時,一律四捨五入到小數點後第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]▴
- 本題如有使用浮點數的需求,請使用 double 做為相關變數的資料型態。
- 當輸出結果為浮點數時,請四捨五入到整數位。
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 度計算夏月電費時,我們可以把要計算的電費分成三段計算:
- 120 度以下部分(共 120 度): 該段電費為 $120 \times 1.78 = 213.6$ 元。
- 121~330 度部分(共 210 度): 該段電費為 $210 \times 2.55 = 535.5$ 元。
- 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]▴
- 本題如有使用浮點數的需求,請使用 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]▴
- 本題不考慮使用者輸入過大的 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]▴
- 本題如有使用浮點數的需求,請使用 double 做為相關變數的資料型態。
- 輸出的資料若有浮點數時,請無條件捨棄至小數點後第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]
- 本題不考慮使用者輸入過大的 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.↵」】
