國立屏東大學 資訊工程系 物件導向程式設計
本次 Turnin 作業包含多個程式題,建議先為本次 turnin 要繳交的內容建立一個外層資料夾(例如:hw4),切換到該資料夾後再為每一題建立一個內層資料夾(每一題的資料夾名稱已寫於題目前方,例如第一題的資料夾名稱為「p1」,第二題的為「p2」,餘以此類推),進入到內層資料夾才依照題目要求進行編撰。
同學們可參考如下命令列操作:
<ssh 登入系計中後> [user@ws ~]$ mkdir hw4 # 在家目錄建立了一個名為「hw4」的資料夾 [user@ws ~]$ cd hw4 # 進入「hw4」資料夾 [user@ws hw4]$ mkdir p1 # 建立一個名為「p1」資料夾 [user@ws hw4]$ cd p1 # 切換到「p1」資料夾 [user@ws p1]$ joe sort.cpp # 使用 JOE 編輯器對檔名 sort.cpp 的檔案進行編輯
等到我們完成 p1 的撰寫後,請自行加以編譯與執行程式,確認正確無誤後回到外層資料夾使用 turnin▴cpp.hw4▴p1↵ 指令完成繳交第一題的整個資料夾:
[user@ws p1]$ cd .. # 回到上一層資料夾 [user@ws hw4]$ turnin cpp.hw4 p1 # 使用 turnin 指令提交 p1 的程式碼 Turning in: p1/sort.cpp -- ok All done. [user@ws hw4]$
當然,你也可以等到本次作業要求的所有題目都在 hw4 資料夾裡完成後,一次將所有在目前資料夾中的所有檔案都加以上傳。
假設你已經在 hw4 資料夾裡完成所有題目,同時確認檔案的繳交格式正確,並且每個題目的程式檔案皆成功編譯並確認執行結果正確後,我們可以使用以下指令將多餘的(不需要繳交的)檔案加以刪除後,一次將所有檔案繳交:
[user@ws hw4]$ ls # 檢視當前資料夾下有哪些內容 p1 p2 p3 p4 p5 [user@ws hw4]$ rm -f */a.out # 移除所有子資料夾中的 a.out 檔案 [user@ws hw4]$ turnin cpp.hw4 . # 使用 turnin 指令繳交該資料夾下的所有內容 Turning in: ./p3/score.cpp -- ok ./p1/sort.cpp -- ok ./p2/barchart.cpp -- ok ./p5/is_card_vaild.cpp -- ok ./p4/1A2B.cpp -- ok All done. [user@ws hw4]$
如果繳交後想要查看已繳交的檔案及相關資訊,可以輸入 turnin▴-ls▴cpp.hw4↵ 指令,例如:
.: total 20 drwxrwx---. 2 turninman turnin 4096 Mar 17 10:45 p1 drwxrwx---. 2 turninman turnin 4096 Mar 17 10:46 p2 drwxrwx---. 2 turninman turnin 4096 Mar 17 10:46 p3 drwxrwx---. 2 turninman turnin 4096 Mar 17 10:46 p4 drwxrwx---. 2 turninman turnin 4096 Mar 17 10:46 p5 ./p1: total 0 -rw-rw----. 1 turninman turnin 0 Mar 17 10:45 sort.cpp ./p2: total 0 -rw-rw----. 1 turninman turnin 0 Mar 17 10:46 barchart.cpp ./p3: total 0 -rw-rw----. 1 turninman turnin 0 Mar 17 10:46 score.cpp ./p4: total 0 -rw-rw----. 1 turninman turnin 0 Mar 17 10:46 1A2B.cpp ./p5: total 0 -rw-rw----. 1 turninman turnin 0 Mar 17 10:46 is_card_vaild.cpp
本文使用「▴」及「↵」代表「空白字元」與「Enter 換行字元」,並且將使用者輸入的部份使用灰階方式顯示。
另外,題目的執行結果中,如果出現「(」、「)」、「:」、「;」、「.」與「,」等符號,皆為英文半形!
本學期作業繳交需要為每一題建立一個資料夾(資料夾名稱為該題題目前方之代號,第一題為「p1」,第二題為「p2」,餘以此類推),繳交方式可參考上述內容,任何未依照正確繳交格式的檔案將以 0 分計。
請設計一個 C++ 語言的程式 sort.cpp,讓使用者輸入 10 個整數後,進行遞減(由大到小)排序加以輸出。此題的執行結果可參考如下:
[3:23▴user@ws▴p1]▴./a.out↵
Please▴input▴10▴numbers:▴6▴9▴5▴1▴10▴2▴7▴8▴4▴3↵
The▴numbers▴are▴sorted▴as▴follows:▴↵
10▴9▴8▴7▴6▴5▴4▴3▴2▴1↵
[3:23▴user@ws▴p1]▴./a.out↵
Please▴input▴10▴numbers:▴17▴3▴98▴99▴2▴0▴-1▴4▴221▴-10↵
The▴numbers▴are▴sorted▴as▴follows:▴↵
221▴99▴98▴17▴4▴3▴2▴0▴-1▴-10↵
[3:23▴user@ws▴p1]▴./a.out↵
Please▴input▴10▴numbers:▴9▴2▴1▴88▴2▴34▴2▴7▴11▴0↵
The▴numbers▴are▴sorted▴as▴follows:▴↵
88▴34▴11▴9▴7▴2▴2▴2▴1▴0↵
[3:23▴user@ws▴p1]▴
請設計一個 C++ 語言的程式 barchart.cpp,此程式讀入使用者輸入的 7 個介於 0(含)至 10(含)之間整數,並依據其值輸出直式長條圖。本題的執行結果可參考如下:
[3:23▴user@ws▴p2]▴./a.out↵
Please▴input▴7▴numbers:▴10▴6▴2▴5▴6▴8▴4↵
#▴.▴.▴.▴.▴.▴.↵
#▴.▴.▴.▴.▴.▴.↵
#▴.▴.▴.▴.▴#▴.↵
#▴.▴.▴.▴.▴#▴.↵
#▴#▴.▴.▴#▴#▴.↵
#▴#▴.▴#▴#▴#▴.↵
#▴#▴.▴#▴#▴#▴#↵
#▴#▴.▴#▴#▴#▴#↵
#▴#▴#▴#▴#▴#▴#↵
#▴#▴#▴#▴#▴#▴#↵
1▴2▴3▴4▴5▴6▴7↵
[3:23▴user@ws▴p2]▴./a.out↵
Please▴input▴7▴numbers:▴1▴2▴3▴4▴5▴6▴7↵
.▴.▴.▴.▴.▴.▴.↵
.▴.▴.▴.▴.▴.▴.↵
.▴.▴.▴.▴.▴.▴.↵
.▴.▴.▴.▴.▴.▴#↵
.▴.▴.▴.▴.▴#▴#↵
.▴.▴.▴.▴#▴#▴#↵
.▴.▴.▴#▴#▴#▴#↵
.▴.▴#▴#▴#▴#▴#↵
.▴#▴#▴#▴#▴#▴#↵
#▴#▴#▴#▴#▴#▴#↵
1▴2▴3▴4▴5▴6▴7↵
[3:23▴user@ws▴p2]▴
請注意,長條圖所輸出的每一個欄位應對齊。為便利同學起見,以上的執行結果以固定寬度字型再次顯示如下:
[3:23 user@ws p2] ./a.out Please input 7 numbers: 10 6 2 5 6 8 4 # . . . . . . # . . . . . . # . . . . # . # . . . . # . # # . . # # . # # . # # # . # # . # # # # # # . # # # # # # # # # # # # # # # # # # 1 2 3 4 5 6 7 [3:23 user@ws p2]
假設有一個班級只有 10 個學生,請幫助教設計一個 C++ 語言的程式 score.cpp,瞭解該班的成績狀況。
讓使用者輸入 10 筆學生的成績(皆為整數)後:
此題的執行結果可參考如下:
[3:23▴user@ws▴p3]▴./a.out↵
Input▴10▴scores:▴189▴175▴66▴48▴90▴100▴-73▴80▴-2▴0↵
Max▴Score:▴100↵
Min▴Score:▴0↵
Average:▴58.4↵
Average▴of▴the▴top▴6▴scores:▴89↵
[3:23▴user@ws▴p3]▴./a.out↵
Input▴10▴scores:▴10▴20▴30▴40▴90▴90▴90▴90▴100▴100↵
Max▴Score:▴100↵
Min▴Score:▴10↵
Average:▴66.0↵
Average▴of▴the▴top▴6▴scores:▴93↵
[3:23▴user@ws▴p3]▴
請設計一個 C++ 語言的程式 1A2B.cpp,讓使用者連續輸入 4 個數字,並在所輸入的數字沒有重複的前提下,與數字 1234 進行比較。若有數值與位置皆相同的數字則記為 A,數值正確但位置不正確的數字則記為 B,請將比較後的結果輸出。此題的執行結果可參考如下:
[3:23▴user@ws▴p4]▴./a.out↵
Please▴input▴a▴4-digits▴number:▴1234↵
Checking▴a▴Result:▴4A0B↵
[3:23▴user@ws▴p4]▴./a.out↵
Please▴input▴a▴4-digits▴number:▴4321↵
Checking▴a▴Result:▴0A4B↵
[3:23▴user@ws▴p4]▴./a.out↵
Please▴input▴a▴4-digits▴number:▴3800↵
Duplicated▴numbers!↵
[3:23▴user@ws▴p4]▴./a.out↵
Please▴input▴a▴4-digits▴number:▴1945↵
Checking▴a▴Result:▴1A1B↵
[3:23▴user@ws▴p4]▴
信用卡、簽帳金融卡等「塑膠貨幣」在我們的生活中扮演著重要的角色,當我們要進行線上刷卡的時候,通常需要輸入 16 位數的卡號(本題以 16 位數卡號為例,台灣以外之其他地區銀行所發行卡號可能為 15~19 位數):
線上的刷卡系統在使用者按下送出後,都會先驗證其卡號是否有效,我們以卡號「4013-7356-3380-0642」為例,進行如下的驗證步驟(此法稱為 Luhn 演算法):
我們先把每一個位數從左到右依序稱為「第 1 位(n1)」、「第 2 位(n2)」... 「第 16 位(n16)」,如下表:
| 4 | 0 | 1 | 3 | 7 | 3 | 5 | 6 | 3 | 3 | 8 | 0 | 0 | 6 | 4 | 2 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| n1 | n2 | n3 | n4 | n5 | n6 | n7 | n8 | n9 | n10 | n11 | n12 | n13 | n14 | n15 | n16 |
接下來除最後一位的校驗碼外,將所有的奇數位數(n1、n3、n5...,n15)乘上 2,其計算過程如下表:
| 原值 | 4 | 0 | 1 | 3 | 7 | 3 | 5 | 6 | 3 | 3 | 8 | 0 | 0 | 6 | 4 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 奇數位 * 2 | 8 | 2 | 14 | 10 | 6 | 16 | 0 | 8 | |||||||
| 結果 | 8 | 0 | 2 | 3 | 14 | 3 | 10 | 6 | 6 | 3 | 16 | 0 | 0 | 6 | 8 |
| 變數 | n1 | n2 | n3 | n4 | n5 | n6 | n7 | n8 | n9 | n10 | n11 | n12 | n13 | n14 | n15 |
在上述的計算結果裡,若有任何位數的數值大於等於 10 時,則將該值減去 9,計算過程如下表:
| 原值 | 8 | 0 | 2 | 3 | 14 | 3 | 10 | 6 | 6 | 3 | 16 | 0 | 0 | 6 | 8 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 雙位數值 | 14 | 10 | 16 | ||||||||||||
| 雙位數值減去 9 | 5 | 1 | 7 | ||||||||||||
| 結果 | 8 | 0 | 2 | 3 | 5 | 3 | 1 | 6 | 6 | 3 | 7 | 0 | 0 | 6 | 8 |
| 變數 | n1 | n2 | n3 | n4 | n5 | n6 | n7 | n8 | n9 | n10 | n11 | n12 | n13 | n14 | n15 |
再接下來,將包含校驗碼(此例為 2)在內的所有位數的值加總:
最後,如果得到的值能夠被 10 整除,則該卡號為有效號碼:
反之該卡號無效。
p.s. 依照 維基百科-支付卡號 的驗證方法,奇數位數(n1、n3、n5…,n15)乘上 2 前應將所有數字反方向排列:
| 反轉前 | 4 | 0 | 1 | 3 | 7 | 3 | 5 | 6 | 3 | 3 | 8 | 0 | 0 | 6 | 4 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 反轉後 | 4 | 6 | 0 | 0 | 8 | 3 | 3 | 6 | 5 | 3 | 7 | 3 | 1 | 0 | 4 |
| 變數 | n1 | n2 | n3 | n4 | n5 | n6 | n7 | n8 | n9 | n10 | n11 | n12 | n13 | n14 | n15 |
由於本題限定處理 16 位卡號,扣除最後一位校驗碼後剩餘 15 位。經評估,在此固定長度下,直接由左至右對奇數索引位進行兩倍運算,其結果與維基百科所述「反轉後運算」之數學結果等價,故為簡化程式邏輯,省略反轉步驟。
若該卡號經判定有效後,請接著判斷其發行者代碼:
請設計一個 C++ 語言的程式 is_card_vaild.cpp,讓使用者輸入 16 位數的卡號(使用者一定會輸入 16 位數),並根據上述方法進行針對卡號的驗證。若卡號經驗證判定為無效卡號,請輸出「Invalid▴Card!↵」;最後,若卡號被判定為有效卡號請依照下方執行結果的格式輸出卡號,以及其發行者名稱。
此題的執行結果可參考如下:
[3:23▴user@ws▴p5]▴./a.out↵
Please▴input▴your▴card▴number:▴4013735633800642↵
The▴card▴number▴[4013-7356-3380-0642]▴is▴valid,▴and▴its▴card▴issuer▴is▴Visa.↵
[3:23▴user@ws▴p5]▴./a.out↵
Please▴input▴your▴card▴number:▴5556394982015269↵
The▴card▴number▴[5556-3949-8201-5269]▴is▴valid,▴and▴its▴card▴issuer▴is▴Mastercard.↵
[3:23▴user@ws▴p5]▴./a.out↵
Please▴input▴your▴card▴number:▴3543488430004932↵
The▴card▴number▴[3543-4884-3000-4932]▴is▴valid,▴and▴its▴card▴issuer▴is▴JCB.↵
[3:23▴user@ws▴p5]▴./a.out↵
Please▴input▴your▴card▴number:▴6018539047509504↵
The▴card▴number▴[6018-5390-4750-9504]▴is▴valid,▴and▴its▴card▴issuer▴is▴none▴of▴Visa,▴Mastercard▴and▴JCB.↵
[3:23▴user@ws▴p5]▴./a.out↵
Please▴input▴your▴card▴number:▴4485798329585303↵
Invalid▴Card!↵
[3:23▴user@ws▴p5]▴