Java programing Java programing

Java 程式設計上課教材

Java 程式設計上課教材 > 課程內容 > 期末考練習

期末考練習

上次更新日期 2018/12/29

期末考就是全部資料的彙整,從期中考過後,我們教的內容其實不多,就是多了陣列與字串字元的處理而已。 這些資料後來都用到期中考之前的邏輯判斷、迴圈、計算等等的任務,只是用單一陣列變數名稱來取代過去一大堆的變數名稱而已。 陣列可以加速我們的程式撰寫與執行,是相當好用而有趣的東西。請大家更加努力喔!因為這些概念性的東西, 未來在資料庫、網站建置、網頁程式語言、前端後端與全端工程師的角色上面,都用的到喔!

  • 期末考練習

期末考的練習題

務必記得:

  • 期末考雖然是 Open book 的考試,不過,並不會有網際網路可以使用
  • 也不能使用 FB 或 line 等通訊軟體。
  • 雖然可以使用手機或平板,不過,也只能用於查詢你曾經拍照過的照片或筆記
  • 可以攜帶任何書籍、筆記、或其他紙本資料
  • 你依舊可以翻閱自己在電腦裡面的程式碼來參考。

開始來練習吧!

  1. 崑山科大資傳系的學生學號大致上使用這樣的格式『 4070C001 ~ 4070C058 』, 共 8 碼,其中前 5 碼在同一個班級上是不會變動的。後 3 碼則依據學生數量而變。現在,假設全部的學生學號都是連續的, 因此,讓使用者輸入前面 5 碼,然後再輸入人數,就可以列出所有的學生學號了。請撰寫一隻名為 practice2_01 的程式, 其中學生的學號需要製作成類似陣列的模樣,例如 std[0] 學號為 4070C001 這樣的模樣,最終將學號全部列出。
    C:\Users\dic\java>java practice2_01
    我將幫你產生學生的學號組成陣列,預設的學生學號 4070C001 之類的格式
    你預計的開頭 6 碼英數是: (ex> 4070C0): 4070C0
    號碼到第幾號? (ex> 30): 20
    第 1位學生學號: 4070C001
    第 2位學生學號: 4070C002
    第 3位學生學號: 4070C003
    第 4位學生學號: 4070C004
    第 5位學生學號: 4070C005
    第 6位學生學號: 4070C006
    第 7位學生學號: 4070C007
    第 8位學生學號: 4070C008
    第 9位學生學號: 4070C009
    第 10位學生學號: 4070C010
    第 11位學生學號: 4070C011
    第 12位學生學號: 4070C012
    第 13位學生學號: 4070C013
    第 14位學生學號: 4070C014
    第 15位學生學號: 4070C015
    第 16位學生學號: 4070C016
    第 17位學生學號: 4070C017
    第 18位學生學號: 4070C018
    第 19位學生學號: 4070C019
    第 20位學生學號: 4070C020
    
  2. 承上題,現在,請將上面的同學依據亂數分成 6 組,每組同學的學號不能重複。 最後輸出 6 組學生學號。輸出學號時,請依據學號大小排序。(ps 你可以使用 2 維陣列,也可以使用 6 個 1 維陣列, 只要能達成結果即可)
    C:\Users\dic\java>java practice2_02
    我將幫你產生學生的學號組成陣列,預設的學生學號 4070C001 之類的格式
    你預計的開頭 6 碼英數是: (ex> 4070C0): 4070C0
    號碼到第幾號? (ex> 30): 22
    第 1組
      第 1 個學生學號: 4070C002
      第 2 個學生學號: 4070C006
      第 3 個學生學號: 4070C010
      第 4 個學生學號: 4070C016
    第 2組
      第 1 個學生學號: 4070C001
      第 2 個學生學號: 4070C003
      第 3 個學生學號: 4070C005
      第 4 個學生學號: 4070C014
    第 3組
      第 1 個學生學號: 4070C012
      第 2 個學生學號: 4070C013
      第 3 個學生學號: 4070C020
      第 4 個學生學號: 4070C021
    第 4組
      第 1 個學生學號: 4070C007
      第 2 個學生學號: 4070C009
      第 3 個學生學號: 4070C015
      第 4 個學生學號: 4070C018
    第 5組
      第 1 個學生學號: 4070C008
      第 2 個學生學號: 4070C011
      第 3 個學生學號: 4070C022
    第 6組
      第 1 個學生學號: 4070C004
      第 2 個學生學號: 4070C017
      第 3 個學生學號: 4070C019
    
  3. 某些情況下,我們必須要驗證學號是否為正確。崑山的學號格式大致如下:
    1. 一定要剛剛好是 8 個字元
    2. 開頭的兩個字元,一定要是『40』或者是『A0』
    3. 第 5 個字元一定要是大寫英文 (參考 ASCII 的編碼順序)
    4. 其他的 3, 4, 6, 7, 8 個字元則一定要是數字 (同樣參照 ASCII 編碼)
    假設你需要以底下的資料進行分析:
    String stdid[] = { "4040C2", "4312D022", "A302D233", "4030c044",
    	"4030Cc23", "a022C044", "4030D036", "A040C023" };
    
    請撰寫一隻名為 practice2_03 的程式來完成上述的功能。
    C:\Users\dic\java>java practice2_03
    這個學號: 4040C2 是錯誤的
    這個學號: 4312D022 是錯誤的
    這個學號: A302D233 是錯誤的
    這個學號: 4030c044 是錯誤的
    這個學號: 4030Cc23 是錯誤的
    這個學號: a022C044 是錯誤的
    這個學號: 4030D036 是正確的!!!!
    這個學號: A040C023 是正確的!!!!
    
  4. 某些時刻,我們需要產生一堆亂數,其中亂數還得要分為偶數與奇數。現在,請亂數產生 N 組 1~5000 之間的數值, 其中奇數放在 A 陣列,而偶數放在 B 陣列,將 A 與 B 排序後輸出,從小到大排序喔:
    C:\Users\dic\java>java practice2_04
    我將產生 N 組 1~5000 的亂數,其中奇數與偶數會放置在不同的陣列!
    你需要產生幾組? (ex> 20) 20
    開始列出 13 個奇數值:
    173
    441
    1515
    1833
    2073
    2667
    3115
    3201
    3587
    4017
    4731
    4761
    4895
    開始列出 7 個偶數值:
    1836
    1882
    2112
    3048
    3808
    3862
    4230
    
  5. 某些時刻,我們可能需要分析網路卡的相關資訊,一般來說,網路卡的相關資訊為:
    1. 是由 6 組各 2 個 16 進位 (0,1,2..9,a,b..f) 的字元所組成的
    2. 每一組字元中間以減號 (-) 隔開,結果例如:52-54-00-36-E3-96
    假設目前你有底下這些網路卡的資訊:
    String nicid[] = { "52-54-00-36-E3-96", "52-54-00-36-E396", "52-54-00-36-E3A96",
    	"52-54-00-36-E3-9G", "52-54-00-36-E3-96" };
    
    請撰寫一隻名為 practice2_05 的程式來完成這個任務:
    C:\Users\dic\java>java practice2_05
    這個卡號: 52-54-00-36-E3-96 格式是正確的!!!
    這個卡號: 52-54-00-36-E396 格式是錯誤的
    這個卡號: 52-54-00-36-E3A96 格式是錯誤的
    這個卡號: 52-54-00-36-E3-9G 格式是錯誤的
    這個卡號: 52-54-00-36-E3-96 格式是正確的!!!
    
  6. 某些時刻,你可能會需要讓使用者輸入 email 位址。但是,如何知道使用者輸入的 email 位址是正確的? 這就需要經過判斷了。一般來說,email 的判斷依據大概是:
    1. 針對 @ 來說,(1)需要有一個 @ 的存在; (2) @不能在第一個位置上; (3)不能有兩個 @ 的存在
    2. 針對 . 來說,(1)至少需要一個 . 的存在; (2) . 必須在 @ 之後出現。
    假設你需要檢查的 email 位址是這樣的:
    String emailadd[] = { "abcsss", "@abcsss", "abc.ss@ss", "abc@ss", 
    	"abc@ss.ee", "abc@abc@abc.org" };
    
    請撰寫一隻名為 practice2_06 的程式來完成這個任務:
    C:\Users\dic\java>java practice2_06
    這個 email 位址: abcsss 格式是錯誤的 (沒有@)
    這個 email 位址: @abcsss 格式是錯誤的 (@在第一個位置上)
    這個 email 位址: abc.ss@ss 格式是錯誤的 ( . 在 @ 之前)
    這個 email 位址: abc@ss 格式是錯誤的 (沒有 . )
    這個 email 位址: abc@ss.ee 格式是正確的!!!
    這個 email 位址: abc@abc@abc.org 格式是錯誤的 (有兩個@)
    
  7. 現在的密碼格式要求中,大多需要你填寫英文大寫、英文小寫、數字、特殊符號,上述四個字元至少都需要出現一次以上。 然後密碼字元長度也需要長於 10 個字元 (含) 以上。現在假設待檢查的密碼有底下這些:
    String pw[] = { "1234", "12345678AAe3", "ABCDaervldasp@", "aaaaf3213212323!12", "fffAAAA32322",
    	"an3@a4Rad21#" };
    
    請寫一隻名為 practice2_07 的程式來完成這個任務:
    C:\Users\dic\java>java practice2_07
    這個密碼: 1234 格式是錯誤的 (長度少於 10)
    這個密碼: 12345678AAe3 格式是錯誤的 (英數特殊符號未齊全)
    這個密碼: ABCDaervldasp@ 格式是錯誤的 (英數特殊符號未齊全)
    這個密碼: aaaaf3213212323!12 格式是錯誤的 (英數特殊符號未齊全)
    這個密碼: fffAAAA32322 格式是錯誤的 (英數特殊符號未齊全)
    這個密碼: an3@a4Rad21# 格式是正確的!!!
    
  8. 假設你需要處理一個連續輸入的 16 進位數值運算字串,因此你只能有 (1)16 進位的字元以及 (2)加號或減號 (+, -)。 請在提示字元之後,讓使用者輸入一個這樣的字串,然後你幫忙檢查是否輸入有錯誤。 請寫一隻名為 practice2_08 的程式來完成這個任務:
    C:\Users\dic\java>java practice2_08
    我會幫你檢查,你輸入的字串格式是否符合底下的要求:
    1)只可以是 16 進位的值與 2)加號或減號 (+-)
    
    請輸入你的字串 (輸入 0 就可以離開): abcd82084803
    這組字串是符合標準的 (16進位數值與+,-)
    
    請輸入你的字串 (輸入 0 就可以離開): ajoajvod
    這組字串是錯誤的
    
    請輸入你的字串 (輸入 0 就可以離開): 147934792795+1242-1242
    這組字串是符合標準的 (16進位數值與+,-)
    
    請輸入你的字串 (輸入 0 就可以離開): 1437ad+1374903b-134
    這組字串是符合標準的 (16進位數值與+,-)
    
    請輸入你的字串 (輸入 0 就可以離開): 0
    輸入 0 離開程式
    
  9. 某天,你想要設計一個遊戲,這個遊戲需要從原點產生 N 組怪物的三維座標 (x,y,z),而且這個座標需要符合:
    1. x, y, z 的座標均位於 -200 到 200 之間
    2. 座標距離原點的距離為 100 以內,距離的標準公式: Math.sqrt(x*x+y*y+z*z)
    3. 輸出時,需要按照 z 軸進行排序
    請撰寫一隻名為 practice2_09 的程式來完成這個任務:
    C:\Users\dic\java>java practice2_09
    你需要產生 N 組三維的怪物座標 (x, y, z)
    之後依據 z 軸進行排序輸出
    你需要的組數 (ex> 5): 10
    第   1組座標(x,y,z,距離):    39  -12  -70  81.0
    第   2組座標(x,y,z,距離):    65  -34  -45  86.1
    第   3組座標(x,y,z,距離):    19   53  -44  71.5
    第   4組座標(x,y,z,距離):    21   87  -41  98.4
    第   5組座標(x,y,z,距離):   -73   53  -38  97.9
    第   6組座標(x,y,z,距離):   -37   82  -20  92.2
    第   7組座標(x,y,z,距離):   -88   19  -13  91.0
    第   8組座標(x,y,z,距離):   -57  -68    6  88.9
    第   9組座標(x,y,z,距離):   -60  -66   28  93.5
    第  10組座標(x,y,z,距離):   -56  -58   34  87.5
    
  10. 假設你要開發一隻遊戲程式,這個遊戲程式的主角要移動時,是透過 asdf 這幾個按鈕來動作, 其中 a, s, d, f 分別是向左(a)、上(s)、下(d)、右(f) 的按鍵,且忽略大小寫。請讓使用者輸入動作 (a/s/d/f) 之後, 計算出主角的位置座標 (假設從原點開始),並且計算出,那回到原點需要按下哪些按鍵? 請撰寫一隻名為 practice2_10 的程式來完成這個任務:
    C:\Users\dic\java>java practice2_10
    請輸入 asdf 進行左(a)、上(s)、下(d)、右(f)的方向前進
    
    輸入你的行進路線(輸入 0 離開): dadadaddaadaff
    你的座標: X: -4, Y: -6
    回原點按鈕需要輸入: FFFFSSSSSS
    
    輸入你的行進路線(輸入 0 離開): fsfsfsfsfsasdf
    你的座標: X: 5, Y: 5
    回原點按鈕需要輸入: AAAAADDDDD
    
    輸入你的行進路線(輸入 0 離開): 0
    結束程式
    
  11. 某些時刻你需要輸入正確的日期格式來進行時間的判斷。台灣地區一般日期格式使用『 YYYY/MM/DD 』你需要判斷的是:
    1. 連結符號必須使用 / 這個符號
    2. 年份必須要是 2017 與 2018 年之間
    3. 月份必須要是 1~12 之間
    4. 日期必須要是 1~31 之間
    請撰寫一隻名為 practice2_11 的程式來完成這個任務:
    C:\Users\dic\java>java practice2_11
    請輸入最近兩年日期格式 (YYYY/MM/DD): 141/1341234/1
    日期格式錯誤!超過 10 個字元
    
    C:\Users\dic\java>java practice2_11
    請輸入最近兩年日期格式 (YYYY/MM/DD): 2019/10/31
    日期格式錯誤!年份不在 2017 與 2018 之間
    
    C:\Users\dic\java>java practice2_11
    請輸入最近兩年日期格式 (YYYY/MM/DD): 2018-10-32
    日期格式錯誤!分隔符號不是 / 喔!
    
    C:\Users\dic\java>java practice2_11
    請輸入最近兩年日期格式 (YYYY/MM/DD): 2018/10/33
    日期格式錯誤!日期不在 1 與 31 之間
    
    C:\Users\dic\java>java practice2_11
    請輸入最近兩年日期格式 (YYYY/MM/DD): 2018/12/20
    日期格式是正確的
    
  12. 某些時刻你必須要判斷 IPv4 的位址對不對!所謂的 IPv4 的位址格式大致是這樣的『 11.22.33.44 』用小數點 (.) 隔開四個數字,這四個數字必須要在 0~255 之間才可以。一般來說,你可以這樣判斷:
    1. 判斷字串內容僅能有數字 (0-9) 及小數點
    2. 只能有 3 個小數點,而且小數點兩邊必須都有數字 (小數點不能連接一起)
    3. 四個數值都必須要在 0~255 之間。
    請撰寫一隻名為 practice2_12 的程式來完成這個任務:
    C:\Users\dic\java>java practice2_12
    請輸入 IPv4 的 IP 位址,我來判斷你寫的對不對? ajo1234.123414.2134.
    這個 IP 位址: ajo1234.123414.2134. 的格式是錯誤的 (含有非數值的字元)
    
    C:\Users\dic\java>java practice2_12
    請輸入 IPv4 的 IP 位址,我來判斷你寫的對不對? .13.13.43.1
    這個 IP 位址: .13.13.43.1 的格式是錯誤的 (沒有小數點或小數點前沒資料)
    
    C:\Users\dic\java>java practice2_12
    請輸入 IPv4 的 IP 位址,我來判斷你寫的對不對? 12.3..1
    這個 IP 位址: 12.3..1 的格式是錯誤的 (只有 2 個小數點)
    
    C:\Users\dic\java>java practice2_12
    請輸入 IPv4 的 IP 位址,我來判斷你寫的對不對? 13.13.23..
    這個 IP 位址: 13.13.23.. 的格式是錯誤的 (超過 3 個小數點)
    
    C:\Users\dic\java>java practice2_12
    請輸入 IPv4 的 IP 位址,我來判斷你寫的對不對? 13.13.23.
    這個 IP 位址: 13.13.23. 的格式是錯誤的 (小數點是結尾)
    
    C:\Users\dic\java>java practice2_12
    請輸入 IPv4 的 IP 位址,我來判斷你寫的對不對? 1.2.3.4
    這個 IP 位址: 1.2.3.4 的格式是正確的!!!
    
  13. 有底下的手機資料
    品牌重量(g)長度(mm)寬度(mm)價格(NT)
    Apple iPhone XR (128g)1941517626100
    SONY Xperia XZ31931587320400
    Samsung Galaxy Note 9 (8GB/512GB)2011627633500
    ASUS ROG Phone (ZS600KL) 8GB/128GB2001597624200
    LG G7+ ThinQ1621537220500
    OPPO R171821587512500
    Nokia 8 Sirocco1721417318700
    你可以使用二維陣列,也能使用數個一維陣列進行資料的彙整。資料彙整完畢後, 輸入 1, 2, 3, 4 時,可以分別以重量, 長度, 寬度與價格排序,排序方法為從小排到大。 請撰寫一隻名為 practice2_13 的程式來完成這個任務:
    C:\Users\dic\java>java practice2_13
    
    輸入 1)重量 2)長度 3)寬度 4)價格 0)結束 進行排序: 1
                                   Name    Weight    Height     Width     Price
                           LG G7+ ThinQ       162       153        72     20500
                        Nokia 8 Sirocco       172       141        73     18700
                               OPPO R17       182       158        75     12500
                        SONY Xperia XZ3       193       158        73     20400
                 Apple iPhone XR (128g)       194       151        76     26100
     ASUS ROG Phone (ZS600KL) 8GB/128GB       200       159        76     24200
      Samsung Galaxy Note 9 (8GB/512GB)       201       162        76     33500
    
    輸入 1)重量 2)長度 3)寬度 4)價格 0)結束 進行排序: 2
                                   Name    Weight    Height     Width     Price
                        Nokia 8 Sirocco       172       141        73     18700
                 Apple iPhone XR (128g)       194       151        76     26100
                           LG G7+ ThinQ       162       153        72     20500
                               OPPO R17       182       158        75     12500
                        SONY Xperia XZ3       193       158        73     20400
     ASUS ROG Phone (ZS600KL) 8GB/128GB       200       159        76     24200
      Samsung Galaxy Note 9 (8GB/512GB)       201       162        76     33500
    
    輸入 1)重量 2)長度 3)寬度 4)價格 0)結束 進行排序: 3
                                   Name    Weight    Height     Width     Price
                           LG G7+ ThinQ       162       153        72     20500
                        Nokia 8 Sirocco       172       141        73     18700
                        SONY Xperia XZ3       193       158        73     20400
                               OPPO R17       182       158        75     12500
                 Apple iPhone XR (128g)       194       151        76     26100
     ASUS ROG Phone (ZS600KL) 8GB/128GB       200       159        76     24200
      Samsung Galaxy Note 9 (8GB/512GB)       201       162        76     33500
    
    輸入 1)重量 2)長度 3)寬度 4)價格 0)結束 進行排序: 4
                                   Name    Weight    Height     Width     Price
                               OPPO R17       182       158        75     12500
                        Nokia 8 Sirocco       172       141        73     18700
                        SONY Xperia XZ3       193       158        73     20400
                           LG G7+ ThinQ       162       153        72     20500
     ASUS ROG Phone (ZS600KL) 8GB/128GB       200       159        76     24200
                 Apple iPhone XR (128g)       194       151        76     26100
      Samsung Galaxy Note 9 (8GB/512GB)       201       162        76     33500
    
    輸入 1)重量 2)長度 3)寬度 4)價格 0)結束 進行排序: 0
    結束程式
    
  14. 設計一個 N 人玩的大富翁遊戲,其中 N 是 1~4 人,若超過 4 人就以 4 人為限。 地圖總共有 100 格,走到第 100 格的人就優勝,並結束遊戲。每個人輪流擲骰子,骰子只能擲出 1~6 號, 使用者就會依序走地圖。當走到 17, 23, 39, 43, 67, 76, 97 這幾個格子時,就會進入機會命運區, 走到這幾個的人可以得到額外的抽籤機會,抽籤各會有 -20~20 的機會,最多退回到起點 (第 1 格)。大致的玩法有點像這樣:
    1. 輸入要玩的人數
    2. 開始每個人輸入自己的代碼
    3. 開始由第一個人按下 Enter 來走地圖
    4. 根據地圖是否有機會命運的格子,來給予額外的抽籤機會
    5. 有任何一個人到達 100 格以上,就判定該使用者成功,並結束遊戲!
    請撰寫一隻名為 practice2_14 的程式來完成這個任務:
    C:\Users\dic\java>java practice2_14
    來玩大富翁!先決定你有多少人 (1~4)? 2
    先來設定好每位用戶的代碼:
    
    輸入第 1 位用戶的代號: Amanda
    
    輸入第 2 位用戶的代號: Melody
    
    目前: Amanda (0) Melody (0)
    Amanda 第 1 次擲骰子 (按下 [enter] 開始)
    Amanda 擲出 5 點骰子點數,目前走到第 5 格
    
    目前: Amanda (5) Melody (0)
    Melody 第 1 次擲骰子 (按下 [enter] 開始)
    Melody 擲出 4 點骰子點數,目前走到第 4 格
    ....
    
    目前: Amanda (38) Melody (42)
    Melody 第 12 次擲骰子 (按下 [enter] 開始)
    Melody 擲出 1 點骰子點數,目前走到第 43 格
    Melody 取得機會命運機會,請擲骰子決定下一步 (按下 [enter] 繼續)
    Melody 取得 20 命運點數,目前走到第 63 格
    
    目前: Amanda (38) Melody (63)
    Amanda 第 13 次擲骰子 (按下 [enter] 開始)
    Amanda 擲出 1 點骰子點數,目前走到第 39 格
    Amanda 取得機會命運機會,請擲骰子決定下一步 (按下 [enter] 繼續)
    Amanda 取得 -11 命運點數,目前走到第 28 格
    ....
    目前: Amanda (53) Melody (96)
    Melody 第 21 次擲骰子 (按下 [enter] 開始)
    Melody 擲出 5 點骰子點數,目前走到第 101 格
    耶!!終於走完大富翁遊戲了!
    
  15. 根據輸入的文字資料來處理個數的問題。請讓使用者輸入一串文字,然後抽出裡面的字元, 分別計算 (1)大寫英文 (2)小寫英文 (3)數字 的個數,然後依據這些個數,用 # 符號,繪製出長條圖。 請撰寫一隻名為 practice2_15 的程式來完成這個任務:
    C:\Users\dic\java>java practice2_15
    請輸入一串文字,我來處理各種文字的個數判斷
    ajofjoqawejo159314u9sdlf925u3ofo9mf93qur92fm9qwnv93t
    
    英文大寫:
    英文小寫: #################################
    數值數字: ###################