# <font color="#D9FFFF">Java</font> # <font color="#D9FFFF">基礎入門教學</font> <!-- .slide: data-background="https://hackmd.io/_uploads/SkmX3ZWOT.jpg" --> <!-- .slide: data-transition="zoom" --> --- # 講義連結 ![250020152101](https://hackmd.io/_uploads/S1eYtdiw1g.png) https://hackmd.io/@wesleywu318/HyVqNuovkl --- # 1. Java 常見 # 開發環境 <!-- .slide: data-background="#FFE153" --> <!-- .slide: data-transition="fade" --> ---- ## 1.1 Java IDE 簡介 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- > IDE又叫做整合開發環境 > ( Integrated Development Environment ) --- > 在編輯程式碼時有許多的步驟,例如撰寫、編譯、除錯、執行......等過程,都是分開進行,但現在可以在同一個環境下開發,而使用的這些環境正是IDE。 ---- ## 1.2 常見 Java IDE <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- ### Eclipse ![0_LNOw5WaZ0uzvJwLG-removebg-preview](https://hackmd.io/_uploads/SyjTidswJl.png =20%x) ### intellij idea ![kisspng-intellij-idea-jetbrains-removebg-preview](https://hackmd.io/_uploads/Hkaq3usPkg.png =20%x) ### Visual Studio Code ![](https://hackmd.io/_uploads/SyDusSzdp.png =10%x) <!-- .slide: data-background="#FFFCEC" --> ---- ## 1.3 常見 Java online IDE <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- ### JDoodle ![image](https://hackmd.io/_uploads/Sybuadiw1e.png =7%x) https://www.onlinegdb.com/online_c++_compiler ### Online Java ![image](https://hackmd.io/_uploads/S1t10Oiw1e.png =20%x) https://www.online-java.com/ ### Replit ![image](https://hackmd.io/_uploads/BJ0e4M-O6.png =20%x) https://replit.com/ <!-- .slide: data-background="#FFFCEC" --> --- # 2. 安裝 Visual Studio Code <!-- .slide: data-background="#FFE153" --> <!-- .slide: data-transition="fade" --> ---- ## 2.1 依據電腦作業系統 ## 下載相應版本 ![image](https://hackmd.io/_uploads/r1RBMtsD1l.png =60%x) [點我連官網](https://code.visualstudio.com/download) ---- ## 2.2 下載 JDK ### Java Development Kit ![螢幕擷取畫面 2025-01-20 162356](https://hackmd.io/_uploads/SkYjdYiwye.png =80%x) [點我連官網](https://www.oracle.com/tw/java/technologies/downloads/#jdk23-windows) ---- ### 2.3 安裝Java用套件 --- * Language Support for Java™ by Red Hat ![image](https://hackmd.io/_uploads/HkqGaYiwye.png =40%x) * Debugger for Java ![image](https://hackmd.io/_uploads/SyU_TFsw1x.png =40%x) * Test Runner for Java ![image](https://hackmd.io/_uploads/HyHApYjDJl.png =40%x) ---- ### 2.4 安裝介面套件 --- * Chinese ![image](https://hackmd.io/_uploads/r1xd-9iPyx.png =40%x) * Auto Rename Tag ![image](https://hackmd.io/_uploads/HkFnAYovyl.png =40%x) * Bracket Pair Colorizer 2 (built-in to VS Code) ![image](https://hackmd.io/_uploads/HyAqy5jvkx.png =40%x) ---- ### 2.4 安裝其他套件 --- * Prettier ![image](https://hackmd.io/_uploads/SJZGb5jv1l.png =40%x) * IntelliCode ![image](https://hackmd.io/_uploads/ryn3Mqiw1x.png =40%x) --- # 3. Java 第1類: # 基本處理 <!-- .slide: data-background="#FFE153" --> <!-- .slide: data-transition="fade" --> ---- ## 3.1 Java 語言簡介 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- * Java 是一種廣泛使用的電腦程式設計語言,擁有<font color="#FFD306">跨平台、物件導向(Object Oriented Programming)、泛型程式設計的特性</font>,廣泛應用於企業級 Web 應用開發和行動應用開發。 * 物件導向的本質,其實就是一種<font color="#FFD306">管理程式碼的「管理方法」,程式碼就能透過函式與物件一層層被打包整理好</font>。 ![CPT-OOP-objects_and_classes_-_attmeth.svg](https://hackmd.io/_uploads/H1MuUqiDJe.png =30%x) ---- ## 3.2 Java 基本程式架構 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- ### `Java 基礎認識` ``` public class HelloJava{ public static void main(String[] args){ System.out.println("Hello Java"); } } ``` * 類別(Class),撰寫 Java 程式通常都是由定義「類別」開始,<font color="#FFD306">"`class`" 是 Java 用來定義類別的關鍵字</font>,範例中類別的名稱是 HelloJava,<font color="#FFD306">必須和程式的主檔名(HelloJava.java)相同</font>。 * 定義 main() 方法(Method),<font color="#FFD306">"`main()`" 是 Java 程式的「進入點」(Entry point)</font>,程式的執行是由進入點開始的。 ---- ## 3.3 Java 資料型態 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- <!-- .slide: data-transition="zoom-in" --> 1. 整數 * `byte` ( 位元組 ) <font color="#FFD306">占用 1 Byte ( `2^7-1 ~ -2^7` )</font> * `short` ( 短整數 ) <font color="#FFD306">占用 2 Byte ( `2^15-1 ~ -2^15` )</font> * `int` ( 整數 ) <font color="#FFD306">占用 4 Byte ( `2^31-1 ~ -2^31` )</font> * `long` ( 長整數 ) <font color="#FFD306">占用 8 Byte ( `2^63-1 ~ -2^63` )</font> ---- | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/ryWwKnswyx.png) | ![image](https://hackmd.io/_uploads/SJQ_t3oDJl.png)| ---- 2. 浮點數 * `float` ( 單精確浮點數 ) <font color="#FFD306">占用 4 Byte (約 6 位有效數字)</font> * `double` ( 倍精確浮點數 ) <font color="#FFD306">占用 8 Byte (約 15 位有效數字)</font> 3. 布林型態 * `bool` ( 布林值 ) * <font color="#FFD306">占用 1 Bits ( `0, 1` )</font> * <font color="#FFD306">`0 = false, 1 = ture`</font> --- ##### 如果儲存值超出變數儲存範圍的話稱之為「溢位」 (Overload),會造成程式不可預期的結果。 ---- 4. 字元型態 * `char` ( 字元 ) * <font color="#FFD306">占用 2 Byte ( `2^16-1 ~ 0` )</font> * <font color="#FFD306">`ex. 'A', '0'`</font> * <font color="#FFD306">`包含ASCII字符+多數Unicode字符`</font> 5. 字串型態 * `String` ( 字串 ) * <font color="#FFD306">最大字串長度為 2^31 - 1 個字元</font> --- #### 資料型態在記憶體中佔有的大小依編譯器而有所差異,可以用函式 `[DATATYPE].SIZE` 查詢大小 ---- #### 3.3.2 C 變數命名規則 <!-- .slide: data-transition="zoom-in" --> --- * 變數的名稱只能以英文字母(A-Z, a-z)、數字(0-9)及底線(_)和美元符號($)組成,不包含特殊符號及空白` * <font color="#FFD306">ex. `my@ID(X), my ID(X), my_ID(O), my$ID(O)`</font> * 英文字母大小寫有別(case-sensitive) * <font color="#FFD306">ex. `ABC 不等於 abc`</font> * 變數名稱不得以是數字開頭 * <font color="#FFD306">ex. `1ABC(X), ABC1(O)`</font> * 變數名稱不可以是保留字( reserved word ) * <font color="#FFD306">ex. `if(X), else(X), ifTure(O)`</font> ---- #### 3.3.3 推薦命名方式 【駝峰式命名】 <!-- .slide: data-transition="zoom-in" --> --- * 小駝峰式命名法(lower camel case) : * 第一個單字以小寫字母開始;第二個單字的首字母大寫 * <font color="#FFD306">ex. `firstName、lastName`</font> * 大駝峰式命名法(upper camel case) : * 每一個單字的首字母都採用大寫字母 * <font color="#FFD306">ex. `FirstName、LastName`</font> * 常數命名 : * 每一個單字都採用大寫字母 * <font color="#FFD306">ex. `PI、MAXNUMBER`</font> ==盡量讓每一個變數都有意義,增加程式的可讀性== ---- ## 3.4 運算式與運算子 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- #### Java 運算式 <!-- .slide: data-transition="zoom-in" --> * 最基礎的運算式通常由兩個運算元 ( 變數 / 數值 ) 與一個運算子所組成 * <font color="#FFD306">ex. `a + 3, x = 7`</font> * 運算子的種類 ( 有各自的優先順序 ) * 算術運算子 * 比較運算子 * 邏輯運算子 * 賦值運算子 * 位元運算子 * 位址運算子 * 可用括號來強制改變運算子的優先順序 * <font color="#FFD306">ex. `(a + 3) * 7`</font> ---- #### 3.4.1 算術運算子 <!-- .slide: data-transition="zoom-in" --> | 名稱 | 符號 | 例子 | | ---- | ---- | ---- | | + | 加號 |<font color="#FFD306"> `5 + 3 = 8` </font>| | - | 減號 |<font color="#FFD306"> `5 - 3 = 2` </font>| | * | 乘號 |<font color="#FFD306"> `5 * 3 = 15` </font>| | / | 除號 |<font color="#FF5809"> `5 / 3 = 1.6` </font>| | % | 餘號 |<font color="#FFD306"> `5 % 3 = 2` </font>| | ++ | 前綴/後綴遞增 |<font color="#FF5809"> `i++, ++i` </font>| | - - | 前綴/後綴遞減 |<font color="#FF5809"> `i--, --i` </font>| ---- #### 3.4.2 比較運算子 <!-- .slide: data-transition="zoom-in" --> 會依據運算式的結果回傳邏輯`True`或是`False` | 名稱 | 符號 | 例子 | | ---- | ---- | ---- | | > | 大於 |<font color="#FFD306"> `5 > 3 ( True )` </font>| | < | 小於 |<font color="#FFD306"> `5 < 3 ( False )` </font>| | == | 等於 |<font color="#FF5809"> `5 == 3 ( False )` </font>| | >= | 大於等於 |<font color="#FFD306"> `5 >= 3 ( True )` </font>| | <= | 小於等於 |<font color="#FFD306"> `5 <= 5 ( True )` </font>| | != | 不等於 |<font color="#FFD306"> `5 != 5 ( False )` </font>| ---- #### 3.4.3 邏輯運算子 <!-- .slide: data-transition="zoom-in" --> 會依據運算式的結果回傳邏輯`True`或是`False` | 名稱 | 符號 | 例子 | | ---- | ---- | ---- | | `&&` | 且 |<font color="#FFD306"> `1 && 0 ( False )` </font>| | `╎╎` | 或 |<font color="#FFD306"> `1 ╎╎ 0 ( True )` </font>| | `!` | 補數 |<font color="#FFD306"> `!0 ( True )` </font>| ---- #### 3.4.4 賦值運算子 <!-- .slide: data-transition="zoom-in" --> ###### 復合的賦值運算子是為了縮短運算式的長度 | 名稱 | 符號 | 例子 | | ---- | ---- | ---- | | = | 賦值 |<font color="#FFD306"> `x = 3` </font>| | += | 加號賦值 |<font color="#FFD306"> `x += 3 (x = x + 3)` </font>| | -= | 減號賦值 |<font color="#FFD306"> `x -= 3 (x = x - 3)` </font>| | *= | 乘號賦值 |<font color="#FFD306"> `x *= 3 (x = x * 3)` </font>| | /= | 除號賦值 |<font color="#FFD306"> `x /= 3 (x = x / 3)` </font>| | %= | 餘號賦值 |<font color="#FFD306"> `x %= 3 (x = x % 3)` </font>| | ? : | 三元運算子 |<font color="#FF5809"> `a == b ? 0 : 1` </font>| ---- #### 3.4.5 位元運算子 <!-- .slide: data-transition="zoom-in" --> ##### 位元運算子比較常被使用在加密相關的技術跟演算法中 | 名稱 | 符號 | 例子 | | ---- | ---- | ---- | | & | 位元且(and) |<font color="#FFD306"> `1010 & 1100 = 1010` </font>| | ╎ | 位元或(or) |<font color="#FFD306"> `1010 ╎ 1100 = 1110` </font>| | ^ | 互斥運算 |<font color="#FFD306"> `1010 ^ 1100 = 0110` </font>| | ~ | 補數運算 |<font color="#FFD306"> `~1010 = 0101` </font>| | << | 向左位移 |<font color="#FFD306"> `1 << 3 = 8` </font>| | >> | 向右位移 |<font color="#FFD306"> `8 >> 3 = 1` </font>| ---- ## 3.5 C 語言資料輸入輸出 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- ### 3.5.1 `IO` 函式: `Scanner` 與 `printf()` <!-- .slide: data-transition="zoom-in" --> | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/r14EZCow1g.png) |![image](https://hackmd.io/_uploads/S1OLZAoPJg.png) | ##### 根據需要讀入的資料型態使用對應的函式 `sc.next[DataTypes]();` ##### 讀入 `String` 時用 `sc.nextLine()` / `sc.next()` ---- ### 3.5.2 跳脫字元( `\` ) <!-- .slide: data-transition="zoom-in" --> | 常見轉義字元 | 呈現結果 | | ------------ | ------------------- | | `\\` | 印出反斜線 | | `\'` | 印出單引號 | | `\"` | 印出雙引號 | | `\n` | 換行字元 | | `\t` | TAB字元產生四格空白 | ---- ### 3.5.3 格式字元( `%` ) <!-- .slide: data-transition="zoom-in" --> | 常見轉義字元 | 呈現結果 | | ------------ | ------------------- | | `%%` | 印出百分比符號 | | `%d` | 以整數型態 ( 10進位 ) 解讀變數 | | `%f` | 以浮點數型態 ( float/double ) 解讀變數 | | `%c` | 以字元型態 ( char ) 解讀變數 | | `%s` | 以字串型態 ( char陣列 ) 解讀變數 | ---- ### 3.5.3 格式字元( `%` ) <!-- .slide: data-transition="zoom-in" --> | 常見轉義字元 | 呈現結果 | | ------------ | ------------------- | | `%d` | 以整數型態 ( 10進位 ) 解讀變數 | | `%x` | 以整數型態 ( 16進位 ) 解讀變數 | | `%o` | 以整數型態 ( 8進位 ) 解讀變數 | ---- ### 3.5.4 格式化輸出 <!-- .slide: data-transition="zoom-in" --> | 常見轉義字元 | 呈現結果 | | ------------ | ------------------- | | `%7d` | 以 7 格數輸出,並右邊靠齊 | | `%-7d` | 以 7 格數輸出,並左邊靠齊 | | `%5f` | 以 5 格數輸出,並輸出到小數第 6 位 ( 預設 ),並右邊靠齊 | | `%-5.2f` | 以 5 格數輸出,並輸出到小數第 2 位,並左邊靠齊 | ---- ## 3.6 Java 的例外處理 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- <!-- .slide: data-transition="zoom-in" --> ### `try-catch 敘述` ``` # 語法 try { 做什麼事; }catch (Exception e){ 例外發生時做什麼事; } ``` | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/SkwLOy2P1e.png =60%x)| ![image](https://hackmd.io/_uploads/SyovOJ2wye.png) | ##### <font color="#FFD306">例外處理能在錯誤發生時捕捉處理之後,嘗試回復程式正常執行流程而不會直接報錯。</font> ---- ## 3.7 Java 的選擇敘述 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- ## 3.7.1 選擇的意義 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- <!-- .slide: data-transition="zoom-in" --> #### 現實世界中總是<font color="#FFD306">充滿各種突發的狀況</font> ### 程式的條件判斷可以用來更為彈性地處理生活中所遇上的問題,讓程式的執行能夠<font color="#FFD306">因不同情況而做出相對應的決策</font>。 ---- <!-- .slide: data-transition="zoom-in" --> ### 例子 * <font color="#FFD306">`當室內 PM2.5 超過 35 μg/m³,自動開啟空氣清淨機淨化空氣。`</font> * <font color="#FFD306">`當汽車油箱油量低於 5L 時,將儀表板上的綠色警示燈轉為紅色警示燈。`</font> * <font color="#FFD306">`當地震規模大於 5.0 以上,且預估震度達 3 級以上時,對符合地區發布國家級警報。`</font> ---- ## 3.7.2 Java 的選擇敘述 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- <!-- .slide: data-transition="zoom-in" --> ### `if 敘述` ``` # 語法 if (發生的條件){ 做什麼事; } ``` | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/B1R_30iDye.png =100%x)| ![image](https://hackmd.io/_uploads/ryMa2RovJe.png =150%x) | ##### <font color="#FFD306">要表達哪些程式碼屬於某層級之下,使用括號做區隔,括號內程式以 TAB 鍵縮排,增加程式可讀性。</font> ---- <!-- .slide: data-transition="zoom-in" --> ### `if-else 敘述` ``` # 語法 if (發生的條件){ 做什麼事; }else{ 否則做什麼事; } ``` | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/Sk7wTAswyl.png) | ![image](https://hackmd.io/_uploads/Sy2FT0ov1l.png) | ##### <font color="#FFD306">兩段程式依據條件分別執行,一定會有一段成立</font> ---- <!-- .slide: data-transition="zoom-in" --> ### `if-elif-else 敘述` ``` # 語法 if (發生的條件){ 做什麼事; }else if(發生的條件){ 做什麼事; }else{ 否則做什麼事; } ``` | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/SyPkCCiDyx.png =70%x) | ![image](https://hackmd.io/_uploads/H1kZAAovye.png) | ---- <!-- .slide: data-transition="zoom-in" --> ### `巢狀 if 敘述` ###### <font color="#FFD306">用在判斷條件中安排更進一步的判斷條件</font> ``` # 語法 if (發生的條件){ if (細部的條件){ 做什麼事; }else{ 否則做什麼事; } }else{ 否則做什麼事; } ``` ---- | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/B1pB0RjvJg.png =100%x) | ![image](https://hackmd.io/_uploads/By-cR0jvyx.png) | ---- <!-- .slide: data-transition="zoom-in" --> ### `switch case 敘述` ###### <font color="#FFD306">用於有非常多可能性的形況 ( 不想寫一堆`if-else` )</font> ``` # 語法 switch(變數名稱或運算式){ case 符合數字或字元: 陳述句一; break; case 符合數字或字元: 陳述句二; break; default: 陳述三; break; } ``` ##### <font color="#FFD306">`switch case 只用於數字或字元的判斷,在 case 與 default 的陳述區塊最後一定要加上 break 跳出判斷式,否則會無條件往下執行直到遇到下個 break 。`</font> ---- <!-- .slide: data-transition="zoom-in" --> | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/Hktqk1nvJl.png =80%x) | ![image](https://hackmd.io/_uploads/BkJak1hDJe.png) | ---- ## 3.8 Java 數學函式 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- #### 3.8.1 數學函式 <!-- .slide: data-transition="zoom-in" --> 使用時須先輸入「`Math.`」再尋找要用的函式 | 名稱 | 符號 | 例子 | | ---- | ---- | ---- | | `pow(x,y)` | x 的 y 次方 |<font color="#FFD306"> `pow(5, 3) = 125` </font>| | `sqrt(x)` | 取平方根 |<font color="#FFD306"> `sqrt(36) = 6.0` </font>| | `fabs(x)` | 取絕對值 |<font color="#FFD306"> `fabs(-10) = 10` </font>| | `log10(x)` | 以10取對數 |<font color="#FFD306"> `log10(100) = 2` </font>| | `PI` | 回傳PI值 |<font color="#FFD306"> `PI = 3.14159...` </font>| ---- #### 3.8.1 數學函式 <!-- .slide: data-transition="zoom-in" --> 使用時須先輸入「`Math.`」再尋找要用的函式 | 名稱 | 符號 | 例子 | | ---- | ---- | ---- | | `floor(x)` | 取下高斯 |<font color="#FFD306"> `floor(3.7) = 3` </font>| | `ceil(x)` | 取上高斯 |<font color="#FFD306"> `ceil(3.7) = 4` </font>| | `sin(x)` | 取正弦 |<font color="#FFD306"> `sin(0) = 0` </font>| | `cos(x)` | 取餘弦 |<font color="#FFD306"> `cos(0) = 1` </font>| ---- ## 3.9 Java 字串/字元 函式 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- #### 3.9.1 `String` 函式 <!-- .slide: data-transition="zoom-in" --> | 方法 | 功能 | 回傳型態 | | ---- | ---- | ---- | | `str.length()` | 取得字串長度 |int| | `str.toLowerCase()` | 將字串的英文字母轉換為小寫 |String| | `str.toUpperCase()` | 將字串的英文字母轉換為大寫 |String| ---- #### 3.9.1 `String` 函式 <!-- .slide: data-transition="zoom-in" --> | 方法 | 功能 | 型態 | | ---- | ---- | ---- | | `str.indexOf(T, [fromIndex])` | 第一次搜尋到參數T的位置(開頭) |int| | `str.lastIndexOf(T, [fromIndex])` | 從尾回頭第一次搜尋到參數T的位置(開頭)|int| ##### <font color="#FFD306">`第二個參數為從fromIndex開始尋找/回頭尋找,沒有找到則回傳-1,T可為字元或字串。`</font> ---- #### 3.9.1 `String` 函式 <!-- .slide: data-transition="zoom-in" --> | 方法 | 功能 | 型態 | | ---- | ---- | ---- | | `Integer.parseInt(str)` | 將字串 str 轉換為 int |int| | `Double.parseDouble(str)` | 將字串 str 轉換為 double |double| ##### <font color="#FFD306">`若無法轉換 String 至指定型態,則會拋出 NumberFormatException 的錯誤`</font> ---- #### 3.9.1 `String` 函式 <!-- .slide: data-transition="zoom-in" --> | 方法 | 功能 | 回傳型態 | | ---- | ---- | ---- | | `String.valueof(int/double)` | 將int/double轉回字串 |string| | `str.charAt(index)` | 回傳str的指定index的字元 |char| ---- #### 3.9.1 `String` 函式 <!-- .slide: data-transition="zoom-in" --> | 方法 | 功能 | 回傳 | | ---- | ---- | ---- | | `str.substring(a,b)` | `生成從位置a開始到b(不包含)的子字串` | String| | `str.toCharArray()` | `將字串轉換為字元陣列` | 字元陣列 | ---- #### 3.9.1 `String` 函式 <!-- .slide: data-transition="zoom-in" --> | 方法 | 功能 | 回傳 | | ---- | ---- | ---- | | `str.matches("a╎bc")` | `字串中是否有出現指定字串(可多個)` | Boolean | ---- #### 3.9.1 `String` 函式 <!-- .slide: data-transition="zoom-in" --> | 方法 | 功能 | 回傳 | | ---- | ---- | ---- | | `str.split("")` | 將字串依照指定分隔符進行切割 | String[] | | `String.join("", str[])` | 將字串陣列依照指定分隔符進行合併 | String | > 常用分隔符 : " "(空白)、","(逗號)、"\\\s+"(多個空白) ---- #### 3.9.2 `Char` 函式 <!-- .slide: data-transition="zoom-in" --> * <font color="#FFD306">`Character.isDigit(ch)`</font> * ch 是否為數字字元 * <font color="#FFD306">`Character.isLetter(ch)`</font> * ch 是否為字母字元 * <font color="#FFD306">`Character.isLetterOrDigit(ch)`</font> * ch 是否為數字或字母字元 --- # 3-1 Java 第1類: # 基本處理 # 【練習題】 <!-- .slide: data-background="#FFE153" --> <!-- .slide: data-transition="fade" --> ---- <!-- .slide: data-transition="zoom-in" --> ## Java 101 字串列印 --- #### 設計說明: ##### 請撰寫一程式,由使用者輸入兩個字串,請將此兩個字串以一個半形空格相連方式輸出。 ![image](https://hackmd.io/_uploads/r1k6SAiwJl.png =65%x) ---- ### Java 101 字串列印【解答】 --- ![image](https://hackmd.io/_uploads/ryLjDAsvkl.png) ---- <!-- .slide: data-transition="zoom-in" --> ## Java 102 偶數相加 --- #### 設計說明: ##### 請撰寫程式,接收輸入的兩個數字,若兩個數字皆是整數且為偶數,輸出相加結果;若輸入的數字不符合要求,轉為數字0。 ![image](https://hackmd.io/_uploads/SJJiOCsPkg.png =65%x) ---- ### Java 102 偶數相加【解答】 --- ![image](https://hackmd.io/_uploads/rJg_Ey2w1l.png =70%x) ---- <!-- .slide: data-transition="zoom-in" --> ## Java 103 計算圓面積 --- #### 設計說明: ##### 請撰寫程式,輸入圓形半徑後計算圓面積,四捨五入輸出至小數點後第四位;若輸入值非數字資料,請轉換為數字0。 圓面積公式為:圓周率(Pi)x 半徑平方 ![image](https://hackmd.io/_uploads/SkBGBkhv1x.png =60%x) ---- ### Java 103 計算圓面積【解答】 --- ![image](https://hackmd.io/_uploads/HyTtt1nwJx.png =50%x) ---- <!-- .slide: data-transition="zoom-in" --> ## Java 104 距離計算 --- #### 設計說明: ##### `請撰寫一程式,讓使用者輸入四個數字x1、y1、x2、y2,分別代表兩個點的座標(x1, y1)、(x2, y2)。使用Math.Sqrt方法計算兩點歐式距離,四捨五入輸出至小數點後第四位`。 ![image](https://hackmd.io/_uploads/B1pf2J2v1l.png =30%x) ![image](https://hackmd.io/_uploads/rkOEhk3DJe.png =60%x) ---- ### Java 104 距離計算【解答】 --- ![image](https://hackmd.io/_uploads/HkEMT12w1g.png =80%x) ---- <!-- .slide: data-transition="zoom-in" --> ## Java 105 字串索引 --- #### 設計說明: ###### `專案中已提供一段英文短文於常數dreams中`。 ###### `請在main主程式中,讓使用者輸入單字,以輸入的單字在常數dreams英文短文中,尋找第一個位置及最後一個位置,再取出這兩個位置間的字串,將此三個值傳至print程式進行輸出。` ###### 若輸入不存在的單字,位置必須顯示為0,擷取字串為空值(無空格);若單字只出現一次,則擷取單字之後的所有文字。 ![image](https://hackmd.io/_uploads/HkVLAk2Dyg.png =70%x) ---- ### Java 105 字串索引【解答】 --- ![image](https://hackmd.io/_uploads/ry8ell2PJx.png =60%x) ---- <!-- .slide: data-transition="zoom-in" --> ## Java 106 最大及最小值 --- #### 設計說明: ##### `請撰寫程式,讓使用者輸入四個整數,以 Math 套件功能取得最大值及最小值,再傳至 print 方法,若輸入值為負數、帶有小數點的數字資料或非數字資料,請轉換為0。` ![image](https://hackmd.io/_uploads/SkLkYg2D1e.png =80%x) ---- ### Java 106 最大及最小值【解答】 --- ![image](https://hackmd.io/_uploads/SyJs6lnw1x.png =42%x) ---- <!-- .slide: data-transition="zoom-in" --> ## Java 107 判斷及格分數 --- #### 設計說明: ##### 請撰寫程式,讓使用者輸入三個成績,計算平均分數,0至60分不及格,輸出【failed:x】;60分(含)以上~99分及格,輸出【pass:x】;如為滿分100分輸出【full mark:100】。 ##### 若輸入值為負數、帶有小數點的數字資料或非數字資料,請轉換為0;若輸入大於100,請轉換為100後再計算。 ![image](https://hackmd.io/_uploads/H1ZWHzf_1e.png =70%x) ---- ### Java 107 判斷及格分數【解答】 --- ![image](https://hackmd.io/_uploads/SJvhIGGu1g.png =40%x) ---- <!-- .slide: data-transition="zoom-in" --> ## Java 108 數學函數 --- #### 設計說明: ##### 請在撰寫一名為 f 的副程式,接收` main()` 傳遞的一個數字,計算數學函數` f(x) = 2*x^3 + 3*x - 1 `後將計算結果回傳至 `main()`,輸出至小數點後第四位。若輸入非數字資料,請輸出【error】。 ![image](https://hackmd.io/_uploads/H1ZWHzf_1e.png =70%x) ---- ### Java 108 數學函數【解答】 --- ![image](https://hackmd.io/_uploads/HJLKOcmdyx.png =50%x) ---- <!-- .slide: data-transition="zoom-in" --> ## Java 109 字元處理 --- #### 設計說明: ##### 請撰寫程式,讓使用者輸入一個英、數字的字串。修改第一個及最後一個字元後輸出。若字串長度只有一個字元,則修改該字元後並輸出。 ##### 字元修改方式為: * `英文字:大小寫互換且往後移動一個字母,例如A改為b、B改為c、Z改為{、a改為B,b改為C,z改為[`。 * `數字0-9:往後移動一個字母,並循環,例如0改為1、1改為2、9改為0`。 ---- ## Java 109 字元處理 --- #### 設計說明: ##### 如輸入符號、文字等,導致第一個或最後一個字元無法處理者,顯示【error】。 ##### 提示:`0~9的ASCII值為48~57,A~Z的ASCII值為65~90,a~z的ASCII值為97~122`。 ![image](https://hackmd.io/_uploads/rJR8q5QO1x.png =50%x) ---- ### Java 109 字元處理【解答】 --- ![image](https://hackmd.io/_uploads/Bku3vi7Oyl.png =60%x) ---- ## Java 110 存錢筒 --- #### 設計說明: ##### 請撰寫程式,讓使用者輸入三個正整數,分別代表存錢筒中的一元、五元及十元的硬幣數量,計算存錢筒的總金額並輸出,金額需格式化輸出為三位一撇的千分號,顯示【x,xxx】。若輸入值為負數、帶有小數點的數字資料或非數字,請轉換為0。 ``` import java.text.DecimalFormat; // 格式化金額為三位一撇的千分號 DecimalFormat myDecimalFormat = new DecimalFormat("#,###"); String formatAmount = myDecimalFormat.format(totalAmount); ``` ![image](https://hackmd.io/_uploads/BkF-ss7_kg.png =40%x) ---- ### Java 110 存錢筒【解答】 --- ![image](https://hackmd.io/_uploads/ryNVoimuJe.png =45%x) --- # 4. JAVA 第2類: # 條件判斷式與迴圈 <!-- .slide: data-background="#FFE153" --> <!-- .slide: data-transition="fade" --> ---- ## 4.1 迴圈的意義 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- <!-- .slide: data-transition="zoom-in" --> #### 現實世界中總是<font color="#FFD306">充滿各種瑣碎的小事</font> ### 程式的迴圈可以幫助我們重複執行某些相同的步驟,在指定的某段敘述在條件符合的情況下一直重覆執行 ### <font color="#FFD306">能實現人工流程自動化的關鍵工具</font> ---- ## 4.2 JAVA 語言的迴圈敘述 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- <!-- .slide: data-transition="zoom-in" --> ### `for-loop` ``` # 語法 for ( 起始值; 終止判斷式; 遞增(減)式){ 做什麼事; } ``` | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/S17FCjXOyg.png)| ![image](https://hackmd.io/_uploads/rJfqCj7_kl.png) | ##### <font color="#FFD306">如果迴圈內程式只有一行,大括號 (` {} `) 可以省略不寫,但為了程式的可讀性,一般還是建議加上。</font> ---- <!-- .slide: data-transition="zoom-in" --> ### `巢狀 for-loop` ###### 用在迴圈裡面又包覆著其他的迴圈 ``` # 語法 for ( 起始值; 終止判斷式; 遞增(減)式){ for ( 起始值; 終止判斷式; 遞增(減)式){ 做什麼事; } } ``` | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/SyeMk3m_kl.png) | ![image](https://hackmd.io/_uploads/BJWXJ27uke.png) | ---- <!-- .slide: data-transition="zoom-in" --> ### `多變數 for-loop` ###### 用一個迴圈操作複數個變數 ``` # 語法 for ( 起始值1, 起始值2; 終止判斷式; 遞增(減)式1, 遞增(減)式2){ 做什麼事; } ``` | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/B1qK-27dye.png =70%x)| ![image](https://hackmd.io/_uploads/rytTZ3X_Jl.png) | ##### <font color="#FFD306">在程式不複雜的形況才建議此寫法,主要是以程式可讀性為重。</font> ---- <!-- .slide: data-transition="zoom-in" --> ### `省略起始值 for-loop` ###### 用於外部程式也會用到迴圈變數的情形 ``` # 語法 for ( ; 終止判斷式; 遞增(減)式){ 做什麼事; } ``` | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/By56QnQuye.png =55%x)| ![image](https://hackmd.io/_uploads/SJPgVnXuyl.png) | ##### <font color="#FFD306">可以省略終止判斷式或遞增(減)式,可達到類似while迴圈的效果,但還是要加上分號 (` ; `) 分開陳述區塊 </font> ---- <!-- .slide: data-transition="zoom-in" --> ### `while-loops` ``` # 語法 while(條件成立){ 做什麼事; } ``` | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/SyJ3ShXOJx.png =60%x) | ![image](https://hackmd.io/_uploads/Hk0GLnXOJl.png) | ##### <font color="#FFD306">while 迴圈執行之前,都會先檢查條件判斷式成立才會執行,否則直接跳出迴圈。</font> ---- <!-- .slide: data-transition="zoom-in" --> ### `do-while-loops` ``` # 語法 do{ 做什麼事; }while(條件成立); ``` | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/r1pnU3muyg.png) | ![image](https://hackmd.io/_uploads/HJuRI3mdyg.png) | ##### <font color="#FFD306">do while 迴圈又稱之後測式迴圈,它一定會先進去一次迴圈裡,再根據條件判斷要不要繼續執行。</font> ---- ## 4.3 for 與 while 的關係 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- ### 兩者在大部分情形都能相互代替使用,都能實現基本迴圈功能 --- * for * 多適用於<font color="#FFD306">「已知迴圈數」</font>的情況 * while * 多適用於<font color="#FFD306">「無法預知迴圈數」/ 「懶得算迴圈數」</font>的情況 ---- ## 計算 1 加到 100 的和 ( for 版本 ) | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/Sk2qd37_yg.png) | ![](https://hackmd.io/_uploads/HJcNvIc3n.png =125%x) | ---- ### 計算 1 加到 100 的和 ( while 版本 ) | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/r1fH0_nmdyl.png) |![](https://hackmd.io/_uploads/HJcNvIc3n.png =125%x) | --- ## 4-1 JAVA 語言 第2類: ## 條件判斷式與迴圈 ## 【練習題】 <!-- .slide: data-background="#FFE153" --> <!-- .slide: data-transition="fade" --> ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 201 比較大小 --- #### 設計說明: ##### 請撰寫程式,讓使用者輸入兩個數字a、b,判斷兩個數字的大小,並輸出結果為【a=b】或【a<b】、【a>b】(中間無空格)。若輸入文字,請轉換為0。 ![image](https://hackmd.io/_uploads/ryf4t2Qd1g.png =55%x) ---- ### JAVA 語言 201 比較大小【解答】 --- ![image](https://hackmd.io/_uploads/SJ0mR2md1g.png =55%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 202 判斷奇偶數 --- #### 設計說明: ##### 請撰寫程式,讓使用者輸入一個數字,判斷數字為奇數,輸出【x is an odd number.】;數字為偶數則輸出【x is an even number.】;若輸入文字,請輸出【error】。 ![image](https://hackmd.io/_uploads/BJkQyp7ukl.png =55%x) ---- ### JAVA 語言 202 判斷奇偶數【解答】 --- ![image](https://hackmd.io/_uploads/B1eelaXOkx.png =75%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 203 分數等級 --- #### 設計說明: ##### 請撰寫程式,讓使用者輸入三個整數,分別判斷數值大小,若>=85且<=100,輸出【A】;若>=60 且<85,輸出【B】;若>=0且<60,輸出【C】。若輸入的整數>100,則不進行級距判斷(沒有任何輸出);若輸入文字或負數,請先轉換為0再判斷級距。 ![image](https://hackmd.io/_uploads/S15Il6Xd1g.png =55%x) ---- ### JAVA 語言 203 分數等級【解答】 --- ![image](https://hackmd.io/_uploads/BJUu-a7uJx. =50%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 204 質數 --- #### 設計說明: ##### 請撰寫程式,讓使用者輸入兩個介於1至100之間的整數(包含1與100),輸出兩數間(包含兩數)的所有質數。若輸入文字、帶有小數點的數字資料、小於等於0或大於100以外的數字,請輸出【error】(1不為質數)。 ![image](https://hackmd.io/_uploads/ryFQz67Oyl.png =45%x) ---- ### JAVA 語言 204 質數【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/SJVVmpQdkl.png) |![image](https://hackmd.io/_uploads/SycHXpQOyl.png) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 205 最大公因數 --- #### 設計說明: ##### 請撰寫程式,讓使用者輸入兩個0至100之間的整數(包含0與100),輸出兩數的最大公因數,若輸入非上述情況的資料,請輸出【error】。 ![image](https://hackmd.io/_uploads/B1kLEaQdye.png =55%x) ---- ### JAVA 語言 205 最大公因數【解答】 --- ![image](https://hackmd.io/_uploads/r1Zc8a7Oyl.png =45%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 206 關鍵字出現次數 --- #### 設計說明: ##### 請撰寫程式,讓使用者輸入一個字串,尋找並計算此字串於常數dreams短文中出現的次數,輸出次數。 ![image](https://hackmd.io/_uploads/r1ej92sdyg.png =65%x) ---- ### JAVA 語言 206 關鍵字出現次數【解答】 --- ![image](https://hackmd.io/_uploads/S1gEo2jdye.png =75%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 207 判斷ASCII碼 --- #### 設計說明: ##### 請撰寫程式,讓使用者輸入一個字串(不含文字),再分別輸出各個元素的ASCII碼,顯示如【ASCII code for 'Y' is 89】。 ![image](https://hackmd.io/_uploads/Bkvjo3suJe.png =65%x) ---- ### JAVA 語言 207 判斷ASCII碼【解答】 --- ![image](https://hackmd.io/_uploads/HkNW1aj_yl.png =75%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 208 計算階乘 --- #### 設計說明: ##### 請在main方法撰寫程式,輸入一個1-9的正整數,再以三角形的方式,依序輸出1到此數階乘計算結果,輸出的乘積欄位寬度為4個字元,需靠左對齊。若輸入文字或不在指定範圍的數字,請輸出【error】。 ![image](https://hackmd.io/_uploads/HJJpkpjdJx.png =65%x) ---- ### JAVA 語言 208 計算階乘【解答】 --- ![image](https://hackmd.io/_uploads/BkIFZpou1l.png =75%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 209 判斷象限座標 --- ##### 設計說明: ###### 請撰寫程式,讓使用者輸入x、y座標,輸入包含浮點數,並以字串輸出此座標及座標在哪一象限、在X軸、在Y軸或在原點(中間以一個半形空格分隔),若輸入文字,請輸出【error】。 ![image](https://hackmd.io/_uploads/HJV-zaoOJg.png =40%x) ---- ### JAVA 語言 209 判斷象限座標【解答】 --- ![image](https://hackmd.io/_uploads/HJ0PwTjdJe.png =57%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 210 捕捉錯誤 --- ##### 設計說明: ###### 由`main()`方法提供兩個變數,變數1為被除數,預設為25;變數2為除數,由使用者輸入一個大於0、小於等於25的數字。使用`try…catch`結構,在除數為0時,將整數除以零時所擲出的例外狀況輸出錯誤訊息;若除數輸入正確數字,輸出兩個參數相除的計算結果(相除計算方式採用整數除法)。 ![image](https://hackmd.io/_uploads/SJp7RUhFyl.png =57%x) ---- ### JAVA 語言 210 捕捉錯誤【解答】 --- ![image](https://hackmd.io/_uploads/H1XkcToOkx.png =50%x) --- # 5. JAVA 第3類: # 陣列、集合與遞迴 <!-- .slide: data-background="#FFE153" --> <!-- .slide: data-transition="fade" --> ---- ## 5.1 JAVA 的陣列語法 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- <!-- .slide: data-transition="zoom-in" --> ### `陣列(Array)` ``` # 語法 int[] array = new int[3]; // 與物件一樣,需要透過關鍵字new創造實體 int[] array = { 1 , 10 , 100 }; // 或直接初始化時給值 # 存取元素 array[0] = 1; System.out.println(array[0]); ``` | 程式碼 | 印出結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/HyqDQirYkx.png =50%x) | ![image](https://hackmd.io/_uploads/H1F_7iSt1g.png =35%x) | ##### <font color="#FFD306">Java的陣列是一種由相同型態的資料組成的資料結構,透過索引值(`index`)來做資料的存取。</font> ---- <!-- .slide: data-transition="zoom-in" --> ### `多維陣列(Muti-dim Array)` ``` # 語法 int[][] matrix = new int[2][3]; int[][] matrix = { {1,2,3} , {5,6,7} }; # 存取元素 array[0][2] = 10; System.out.println(array[1][0]); ``` | 程式碼 | 結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/Hk3NUsHYyx.png =50%x) | ![image](https://hackmd.io/_uploads/BkdrUjrYJe.png ) | ---- <!-- .slide: data-transition="zoom-in" --> ### `Array 相關函式` | 方法 | 功能 | 回傳型態 | | ---- | ---- | ---- | | `arr.length()` | 取得陣列長度 |int| | `Arrays.toString(arr)` | 將陣列內容轉成字串,方便輸出 |String| ##### <font color="#FFD306">`「Arrays」開頭的函式需 import java.util.Arrays 才能使用`</font> ---- <!-- .slide: data-transition="zoom-in" --> ### `Array 相關函式` | 方法 | 功能 | 回傳型態 | | ---- | ---- | ---- | | `arr.clone` | 快速的複製一個一樣的陣列 |Array| | `Arrays.fill(arr, n)` | 將陣列內容用n值填滿 |void| | `Arrays.sort(arr)` | 用quick sort把陣列從小排到大 |void| ---- <!-- .slide: data-transition="zoom-in" --> ### `Array 相關函式` --- * <font color="#FFD306">`Arrays.binarySearch(arr, 77)`</font> * 搜尋陣列中目標key的索引值,找不到回傳小於0的整數 * 回傳int * <font color="#FFD306">`Arrays.equals(arr1, arr2)`</font> * 回傳兩陣列是否相等 * 回傳boolean ---- ## 8.2 簡易排序 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- ### 氣泡排序法 --- ##### 氣泡排序(英語:Bubble Sort)又稱為泡沫排序,是一種簡單的排序演算法。 ##### <font color="#FFD306">它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來</font>。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。 ![1_GUkhhrPDfgdvvwVFo-il1g](https://hackmd.io/_uploads/Bkp-hWRxC.gif =55%x) ---- <!-- .slide: data-transition="zoom-in" --> | 程式碼 | 結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/BkSZAsrKyl.png =90%x) | ![image](https://hackmd.io/_uploads/rJpfCsHtJg.png) | ---- ### 選擇排序法 --- ##### 選擇排序(英語:Selection sort)是一種簡單直觀的排序演算法。它的工作原理如下。 首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到已排序序列的末尾。 ![](https://hackmd.io/_uploads/HyFQGfCx0.gif =75%x) ---- <!-- .slide: data-transition="zoom-in" --> | 程式碼 | 結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/Skx30iSYkx.png =80%x) | ![image](https://hackmd.io/_uploads/rJpfCsHtJg.png) | --- ## 5-1 JAVA 語言 第3類: ## 陣列、集合與遞迴 ## 【練習題】 <!-- .slide: data-background="#FFE153" --> <!-- .slide: data-transition="fade" --> ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 301 建立陣列 --- #### 設計說明: ###### `請撰寫程式,讓使用者在 main() 中輸入五個數字存入已宣告的 numbers 陣列,再將此陣列傳遞給 compute() 方法。在 compute() 方法中,忽略所有 <= 50 的數字,只計算陣列內大於 50 的元素總和及平均值,並輸出大於 50 的元素總和及平均。若輸入文字,請轉換為 0;若輸入或輸出有小數點,請無條件捨去至整數`。 ![image](https://hackmd.io/_uploads/rJDeuTrF1e.png =60%x) ---- ### JAVA 語言 301 建立陣列【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/H12D_pHKJx.png) | ![image](https://hackmd.io/_uploads/HklKu6Htyx.png =70%x) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 302 文字陣列取出資料 --- #### 設計說明: ##### `請撰寫一程式,建立名稱為weeks的文字陣列,此文字陣列內容為"Mon", "Tus", "Wed", "Thr", "Fri", "Sat", "Sun"。讓使用者輸入一個 0-6 之間的整數n,輸出陣列中的第 n+1 個元素,若輸入有誤,請輸出【error】。` ![image](https://hackmd.io/_uploads/ryjjKTHt1g.png =55%x) ---- #### JAVA 語言 302 文字陣列取出資料【解答】 --- ![image](https://hackmd.io/_uploads/ryZWqTSFkx.png =70%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 303 陣列排序 --- #### 設計說明: ###### `專案中已提供一個名為 compute() 的方法,使用者於 main() 方法中輸入五個整數存入已宣告的 numbers 陣列,再將此陣列傳遞給 compute() 方法。在 compute() 方法中進行由小到大排序後,輸出排序結果。元素間及最後一個元素後以半形空格隔開,若輸入文字或非整數,請轉換為 0。` ![image](https://hackmd.io/_uploads/ryr_qarKJx.png =70%x) ---- #### JAVA 語言 303 陣列排序【`Arrays.sort()`-解答】 --- ![image](https://hackmd.io/_uploads/BJBliaBKkl.png =45%x) ---- #### JAVA 語言 303 陣列排序【氣泡排序法-解答】 --- ![image](https://hackmd.io/_uploads/HyXT2aSYyl.png =60%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 304 移除陣列指定值 --- #### 設計說明: ##### `專案中已提供一個 scores 陣列,陣列中包含 20 個學生成績。請設計一程式,輸入一個欲移除成績,將所有與輸入值相同的成績從陣列中全數移除,並將剩餘的成績進行平均值計算,輸出格式如【80.12】,四捨五入至小數點第二位。若輸入文字、或輸入不存在於陣列的數字,請轉換為 0。` ![image](https://hackmd.io/_uploads/B1wrTTrtJx.png =70%x) ---- #### JAVA 語言 304 移除陣列指定值【解答】 --- ![image](https://hackmd.io/_uploads/HJrBATrYJx.png =75%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 305 費氏數列 --- #### 設計說明: ##### `請撰寫一程式,建立含有前 50 個費氏數列的陣列,讓使用者輸入一個整數n,做為陣列的索引值,並輸出陣列中的第 n+1 個費氏數列,如輸入 n=4,輸出【5:3】,表示輸出第 5 個費式數列值為 3,中間以一個半形冒號分隔,若輸入文字或不存在的索引值,請輸出【error】。` ##### 提示:使用 `long` 型態。 ![image](https://hackmd.io/_uploads/ry3Jy0SF1l.png =70%x) ---- #### JAVA 語言 305 費氏數列【解答】 --- ![image](https://hackmd.io/_uploads/ry381CBKye.png =50%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 306 矩陣相加 --- #### 設計說明: ###### `main() 方法中已宣告兩個二維陣列 a、b ,其中 b 陣列內容需由使用者輸入六個 1-100 之間的正整數,並且以半形空格隔開。將 a、b 陣列傳遞給程式中已定義的compute() 方法,在 compute() 方法中將二維陣列 a、b 加總,再傳遞給 print() 方法將其加總結果輸出,以陣列一維為一列輸出,共輸出兩列。每個數字固定為四位數且靠右對齊,若輸入有誤,請輸出【error】。` ![image](https://hackmd.io/_uploads/Bk2IgCSYkl.png =65%x) ---- #### JAVA 語言 306 矩陣相加【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/ByROURrtyx.png) | ![image](https://hackmd.io/_uploads/rJe9LRBYkl.png) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 307 反轉陣列 --- #### 設計說明: ###### `專案中已提供一個名為 compute() 的方法,接收 main() 傳遞的一個陣列。 請在 main() 中宣告一個陣列,讓使用者輸入資料,直到輸入 999 結束,將輸入的資料存入此宣告的陣列,再將此陣列傳遞給 compute() 方法。在 compute() 方法中進行陣列反轉,輸出陣列反轉前反轉後的內容。` ![image](https://hackmd.io/_uploads/ry1Hv0rYyl.png =70%x) ---- #### JAVA 語言 307 反轉陣列【解答】 --- ![image](https://hackmd.io/_uploads/ByRDdASYkl.png =43%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 308 陣列搜尋 --- #### 設計說明: ###### `請撰寫程式,讓使用者輸入一個學生成績,輸出此成績在scores清單{ 100, 100, 95, 95, 92, 91, 90, 100, 88, 88, 87, 87, 90, 91, 85, 80, 81, 82, 82, 89 }出現的次數,若輸入文字,請輸出【error】。` ![image](https://hackmd.io/_uploads/BkJBYRrtkg.png =60%x) ---- #### JAVA 語言 308 陣列搜尋【解答】 --- ![image](https://hackmd.io/_uploads/ByM9t0BYye.png =55%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 309 階乘遞迴計算 --- #### 設計說明: ###### `請在程式中撰寫一個 compute 的方法,接收 main() 傳遞的一個 1-20 之間的正整數。compute 方法計算該數的階乘計算結果並回傳至 main(),若輸入值不在 1-20 範圍內或輸入文字,請輸出【error】。` ![image](https://hackmd.io/_uploads/ry99q0StJx.png =60%x) ---- #### JAVA 語言 309 階乘遞迴計算【遞迴版-解答】 --- ![image](https://hackmd.io/_uploads/SysVsRrF1e.png =50%x) ---- #### JAVA 語言 309 階乘遞迴計算【迴圈版-解答】 --- ![image](https://hackmd.io/_uploads/BkLpoAHtkg.png =43%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 310 遞迴函數 --- #### 設計說明: ###### `請在程式中撰寫一個 compute 的遞迴函數,接收 main() 傳遞的一個數值,compute 函數計算下列公式並回傳至 main()。若使用者輸入負整數,請取絕對值後傳入compute();若輸入0、帶有小數點的數字或文字,請輸出【error】。` * compute(1) = 2 * compute(n) = compute(n - 1) + 3 x n ![image](https://hackmd.io/_uploads/HyOI60Bt1l.png =60%x) ---- #### JAVA 語言 310 遞迴函數【遞迴版-解答】 --- ![image](https://hackmd.io/_uploads/ByZaACBKyg.png =40%x) --- # 6. JAVA 第4類: # 日期與亂數 <!-- .slide: data-background="#FFE153" --> <!-- .slide: data-transition="fade" --> ---- ## 5.1 JAVA 日期的應用 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- <!-- .slide: data-transition="zoom-in" --> ### `認識 LocalDate 類別(Class)` --- ``` import java.time.LocalDate; // 建立日期物件 LocalDate d = LocalDate.now(); // 取得今日 LocalDate d2 = LocalDate.of(2025, 2, 14); // 自定義一個日期 // 取得/比較日期資訊 d.toString() // today : 2025-02-14 (String) d.getYear() // year : 2025(年) (int) d.getMonthValue() // month : 2(月) (int) d.getDayOfMonth() // date : 14(日) (int) d.getDayOfYear() // date : 45(日) (31 + 14) (int) d.equals(d2) // true or false (Boolean) // (d == d2) (X) 即使日期相同還是不同物件 ``` ###### <font color="#FFD306">`LocalDate 用來取得日期資訊,能儲存【年、月、日】,LocalTime 用來取得時間資訊,能儲存【時、分、秒】,而 LocalDateTime 則同時能儲日期與時間。`</font> ---- <!-- .slide: data-transition="zoom-in" --> ### `認識 LocalDate 類別(Class)` --- ``` import java.time.LocalDate; LocalDate d = LocalDate.now(); // 取得今日 // 特殊回傳值 d.getMonth() // return Month class Object // ex. JANUARY, FEBRUARY d.getDayOfWeek() // return DayOfWeek class Object // ex. MONDAY, TUESDAY ``` ``` // Java 在字串相加時回傳值會自動轉換為字串 System.out.printf(" 月份: " + d.getMonth()); // 用回傳值類型接回傳值 DayOfWeek dayOfWeek = date.getDayOfWeek(); // 轉成字串/數值 String str = date.getDayOfWeek().toString(); // TUESDAY int dayValue = date.getDayOfWeek().getValue(); // 2 ``` ###### <font color="#FFD306">`使用特殊類型變數要先在開頭 import 進來`</font> ---- <!-- .slide: data-transition="zoom-in" --> | 程式碼 | 結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/rkmjzIntkx.png) | ![image](https://hackmd.io/_uploads/rJQymLnYkg.png) | ---- <!-- .slide: data-transition="zoom-in" --> #### `格式化輸出 DateTimeFormatter` | 程式碼 | 結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/rygSphIht1e.png) | ![image](https://hackmd.io/_uploads/SkWAn8nY1g.png) | ---- <!-- .slide: data-transition="zoom-in" --> #### `格式化解析 LocalDate.parse()` | 程式碼 | 結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/Sk_n8v2tJg.png) | ![image](https://hackmd.io/_uploads/BJi6Lw2t1x.png) | ##### <font color="#FFD306">`LocalDate.parse() 預設只能解析 yyyy-MM-dd 格式,若格式不同,需使用 DateTimeFormatter`</font> ---- <!-- .slide: data-transition="zoom-in" --> #### `計算日期差 ChronoUnit` | 程式碼 | 結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/B1nlXP3Y1g.png) | ![image](https://hackmd.io/_uploads/S13W7wnF1e.png) | ---- ## 5.2 JAVA 的亂數 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- <!-- .slide: data-transition="zoom-in" --> ### `Random 與 隨機種子` --- ``` import java.util.Random; Random rand = new Random([seed]); // 可設定亂數種子在[]中 int num = rand.nextInt(100); // 產生 0~99 之間的數字 int num2 = rand.nextInt(10) + 1; // 產生 1~10 之間的數字 boolean num3 = rand.nextBoolean(); // 產生 true or false double num4 = rand.nextDouble(); // 產生 0.0~1.0 之間浮點數 // 產生 1.0 ~ 100.0 之間浮點數 double num5 = rand.nextDouble() * 99 + 1; ``` ###### <font color="#FFD306">`如果設定相同亂數種子,可重現相同隨機序列。`</font> --- ## 6-1 JAVA 語言 第4類: ## 日期與亂數 ## 【練習題】 <!-- .slide: data-background="#FFE153" --> <!-- .slide: data-transition="fade" --> ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 401 顯示輸入日期 --- #### 設計說明: ###### `請撰寫一程式,讓使用者輸入一個 8 位數的整數,依序代表西元年、月、日,請轉換為以斜線隔開的日期格式並顯示「英文」星期幾(使用程式,不變更環境語系),日期與星期間以半形空格隔開,輸出轉換後的結果,若輸入文字或無法轉換,請輸出【error】。` ![image](https://hackmd.io/_uploads/H1QFNLstJe.png =60%x) ---- #### JAVA 語言 401 顯示輸入日期【解答】 --- ![image](https://hackmd.io/_uploads/ByRr6IhFkl.png =65%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 402 計算時間差 --- #### 設計說明: ###### `請撰寫程式,讓使用者輸入兩個8位數的整數作為日期,計算二者相差的天數並輸出其絕對值,若輸入文字或無法轉換,請輸出【error】。` ###### `提示: 自定義宣告 LocalDate.of(year, month, day) 時若日期不合法,會拋出 Exception。` ![image](https://hackmd.io/_uploads/ry0OAL2t1l.png =50%x) ---- #### JAVA 語言 402 計算時間差【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/rJbxNP3K1x.png) | ![image](https://hackmd.io/_uploads/HJP-EwhYJe.png) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 403 會議時間 --- #### 設計說明: ###### `請撰寫程式,讓使用者輸入一個含有西元年、月、日、時、分的會議時間,判斷與專案中定義好的會議是否有重疊並將結果輸出,如會議時間重疊,顯示如【Has already reserved - yyyy/MM/dd HH:mm】(將被重疊的會議時間代入);如會議時間未重疊,顯示如【Reservation completed - yyyy/MM/dd HH:mm】(將新的會議時間代入)。` ![image](https://hackmd.io/_uploads/Hy6t4v3tke.png =55%x) ---- #### JAVA 語言 403 會議時間【解答】 --- ![image](https://hackmd.io/_uploads/H1xP5w3tJg.png =60%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 404 上週起迄日期 --- #### 設計說明: ###### `請撰寫程式,讓使用者輸入一個8位數的整數作為日期,計算並輸出此日期的上週起迄日,輸出格式如【xxxx/xx/xx-yyyy/yy/yy】(-及/皆為半形符號),以星期一為第一天,星期日為最後一天。若輸入的日期剛好是星期日,則此星期日為上週起迄日的最後一天。若輸入文字或無法轉換,請輸出【error】。` ![image](https://hackmd.io/_uploads/rJ7bwOnFyg.png =55%x) ---- #### JAVA 語言 404 上週起迄日期【解答】 --- ![image](https://hackmd.io/_uploads/rJJzqO3Fkx.png =55%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 405 星座 --- #### 設計說明: ###### `請撰寫程式,讓使用者輸入一個 8 位數的整數作為日期,輸出該日期所屬星座的英文名稱。若輸入文字或無法轉換,請輸出【error】。` ![image](https://hackmd.io/_uploads/rJvAIKhFJe.png =40%x) ![image](https://hackmd.io/_uploads/HJgJvYnF1g.png =55%x) ---- #### JAVA 語言 405 星座【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/HJM1dFnYkx.png) | ![image](https://hackmd.io/_uploads/HkWxOYhYyl.png) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 406 亂數 --- #### 設計說明: ###### `請撰寫程式,輸入一個1-100的數值做為亂數種子,請檢查不可超出1-100的邊界,否則輸出【error】。取得10個不重複亂數並輸出,輸出格式如【10 20 33 90 88 19 35 87 91 45 】,數字間以半形空格隔開。` ![image](https://hackmd.io/_uploads/Bkzv_t2tyl.png =55%x) ---- #### JAVA 語言 406 亂數【解答】 --- ![image](https://hackmd.io/_uploads/HJFsYF2Kye.png =43%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 407 隨機抽樣工作日 --- #### 設計說明: ###### `請撰寫程式,輸入一個2000-2018之間的數值,請檢查不可超出2000-2018的邊界。此數值做為西元年份及亂數種子,取得一個工作日日期並輸出,工作日定義是週一至週五,輸出格式如:【2018/09/21】。使用random.nextInt函式從1月1日和12月31日中隨機產生一個日期,若產生日期不爲工作日,則輸出下週一。` ![image](https://hackmd.io/_uploads/r1HepY3Kye.png =55%x) ---- #### JAVA 語言 407 隨機抽樣工作日【解答】 --- ![image](https://hackmd.io/_uploads/H1F_pKnF1g.png =65%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 408 轉換工時數 --- #### 設計說明: ###### `請撰寫程式,讓使用者輸入工作總時數,輸入格式為時:分,時與分之間以一半形冒號隔開。一天工時為8小時,請依總工時計算,並輸出工作天數、小時、分鐘,如【2d:4h:0m】,中間以一個半形冒號分隔。若輸入文字或非法時間,請輸出【error】。` ![image](https://hackmd.io/_uploads/BJs85cnYJl.png =55%x) ---- #### JAVA 語言 408 轉換工時數【解答】 --- ![image](https://hackmd.io/_uploads/SJjMccntyx.png =70%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 409 計算日期差距 --- #### 設計說明: ###### `請撰寫程式,讓使用者輸入兩個8位數的整數,第一個做為出生日期、第二個做為當天日期。計算此兩個日期之間的日期差距,輸出年齡如【6y:1m:23d】,分別將計算後的年、月、日代入。若輸入文字、無法轉換或出生日期大於當天日期等,請輸出【error】。` ![image](https://hackmd.io/_uploads/r1bKgjhY1x.png =55%x) ---- #### JAVA 語言 409 計算日期差距【解答】 --- ![image](https://hackmd.io/_uploads/SkPJGs3Fke.png =70%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 410 生日人數 --- #### 設計說明: ###### `請撰寫程式,讓使用者輸入月份n,其中專案中已定義名為birthday的陣列,代表多位員工的出生日期。請判斷n月有幾位員工生日,並輸出生日人數。若輸入文字或非法月份,請輸出【error】。` ![image](https://hackmd.io/_uploads/HklW4j2Kyg.png =55%x) ---- #### JAVA 語言 410 生日人數【解答】 --- ![image](https://hackmd.io/_uploads/SJjKrihKyx.png =85%x) --- # 7. JAVA 第5類: # 檔案存取及資料流 <!-- .slide: data-background="#FFE153" --> <!-- .slide: data-transition="fade" --> ---- ## 7.1 JAVA 的讀檔寫檔 <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- <!-- .slide: data-transition="zoom-in" --> ### `File 物件` --- ``` import java.io.File; import java.io.*; // 匯入全部物件 // 若不設定路徑,則預設於專案所在路徑 File filename = new File([檔案路徑(str)],檔案名稱(str)); ``` | 程式碼 | 結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/Byzpft-cke.png =60%x) | ![image](https://hackmd.io/_uploads/Hy60GYZ5ke.png) | ---- <!-- .slide: data-transition="zoom-in" --> ### `讀檔(Read)` --- ``` import java.io.FileReader; import java.io.BufferedReader; // 嘗試開啟file所指向的檔案 (適合需先檢查檔案屬性時) File file = new File("read.txt"); FileReader fr = new FileReader(file); // 直接根據FileName(檔案路徑)嘗試開啟 (不需要額外檢查檔案時) FileReader fr = new FileReader("read.txt"); ``` ``` // fr.read() 一次只能讀取一個字元 // 用 br 包裝 fr,可支援 readLine() 逐行讀取,減少 I/O 次數 BufferedReader br = new BufferedReader(fr); String line = br.readLine(); // 讀取一整行 br.close(); ``` ##### <font color="#FFD306">`BufferedReader 在讀取完檔案後要記得用 br.close() 關閉讀取,避免記憶體洩漏。`</font> ---- <!-- .slide: data-transition="zoom-in" --> #### `逐行讀取所有檔案內容` --- ![image](https://hackmd.io/_uploads/r1YwlFWcye.png =70%x) ---- <!-- .slide: data-transition="zoom-in" --> ### `寫檔(Write)` --- ``` import java.io.FileWriter; import java.io.BufferedWriter; // 嘗試開啟file所指向的檔案 (適合需先檢查檔案屬性時) File file = new File("write.txt"); FileWriter fw = new FileWriter(file); // 第二個參數為是否開啟 附加(append)模式,預設為 false FileWriter fw = new FileWriter("write.txt", [false]); ``` ``` // 用 br 包裝 fr,因為 br 使用內部緩衝區,避免每次寫入都進行I/O操作 BufferedWriter bw = new BufferedReader(fw); bw.write("context ... ") // 寫入內容 (String) bw.newLine(); // 換行(跨平台使用) ``` ##### <font color="#FFD306">`BufferedWriter 在讀取完檔案後要記得用 bw.close() 關閉讀取,避免記憶體洩漏。`</font> ---- <!-- .slide: data-transition="zoom-in" --> #### `添加檔案內容` --- ![image](https://hackmd.io/_uploads/rJB6KK-9Jx.png =70%x) --- ## 7-1 JAVA 語言 第5類: ## 檔案存取及資料流 ## 【練習題】 <!-- .slide: data-background="#FFE153" --> <!-- .slide: data-transition="fade" --> ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 501 讀取文字資料 --- #### 設計說明: ###### `請撰寫程式,讀取read.txt檔案內容,讓使用者輸入一個正整數n(1≦n≦10),輸出read.txt中的第n筆資料,若輸入文字或不在指定範圍的數字,請輸出【error】。` ![image](https://hackmd.io/_uploads/Sy1IXK-91e.png =65%x) ---- #### JAVA 語言 501 讀取文字資料【解答】 --- ![image](https://hackmd.io/_uploads/SyslNtb9yx.png =45%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 502 寫入資料至文字檔 --- #### 設計說明: ###### `請撰寫程式,讓使用者輸入任意資料(單行),輸出使用者的輸入內容並寫入至write.txt檔案中,每一次皆覆蓋上一次的資料,若輸入空值,請輸出【error】,不進行資料寫入。請使用print()方法,從write.txt中讀出檔案內容並輸出【write:xxx】。` ![image](https://hackmd.io/_uploads/rkALVFbcJl.png =65%x) ---- #### JAVA 語言 502 寫入資料至文字檔【解答】 --- ![image](https://hackmd.io/_uploads/SyvWHFb5kx.png =50%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 503 取得文字檔長度 --- #### 設計說明: ###### `請撰寫程式,讓使用者輸入一個正整數n(1≦n≦6),專案中已定義名為data的陣列,陣列中有六個元素,將前n個元素的內容寫入write.txt檔案中,每一個元素各自一列。若輸入文字或不在範圍內的數字,請輸出【error】。` ![image](https://hackmd.io/_uploads/HJDB00-ckx.png =50%x) ---- #### JAVA 語言 503 取得文字檔長度【解答】 --- ![image](https://hackmd.io/_uploads/rJ0mk1G91e.png =60%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 504 文字檔資料新增 --- #### 設計說明: ###### `請撰寫程式,讓使用者輸入三個成績(成績之間,以一個半形空格分隔,且0≦成績≦100),將專案中名為new_student的陣列改成以半形逗號分隔的字串,結合同樣以半形逗號分隔的三個成績字串,以附加的方式寫入write.txt檔案中並輸出。若輸入文字、成績未在0~100之間,或輸入格式不合規定的資料,請輸出【error】。` ![image](https://hackmd.io/_uploads/B1r_y1z51g.png =45%x) ---- #### JAVA 語言 504 文字檔資料新增【解答】 --- ![image](https://hackmd.io/_uploads/ByunxJM9Je.png =60%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 505 成績搜尋 --- #### 設計說明: ###### `請撰寫程式,讀取read.txt檔案內容,內含13位學生的資料,每列資料以逗號隔開,後三個數字代表學生成績,讓使用者輸入總成績的條件,判斷並輸出檔案中符合條件有幾名學生、學生姓名及總成績,需分行顯示。可使用的比較運算子包括>、<、=、>=、<=,若輸入不合規定的資料,請輸出【error】。` ![image](https://hackmd.io/_uploads/SkunGyfcke.png =60%x) ---- #### JAVA 語言 505 成績搜尋【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/rk5hI1M9yg.png) | ![image](https://hackmd.io/_uploads/SkZRIkfqJg.png) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 506 刪除文字資料 --- #### 設計說明: ###### `專案目錄已提供read.txt,內含13位學生的資料,每列資料以半形逗號隔開,第一欄的數字代表編號。請撰寫程式,輸入如1-13的數字,再將該數字代表的資料予以刪除,其餘未刪除之資料寫入write.txt,並輸出如【Delete:1 Nancy】。若輸入文字或不在指定範圍的數字,請輸出【error】。` ![image](https://hackmd.io/_uploads/r1ZHDkz9yg.png =50%x) ---- #### JAVA 語言 506 刪除文字資料【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/SkEhvyzqyg.png) | ![image](https://hackmd.io/_uploads/Hkq6vJfcyx.png) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 507 尋找字串資料 --- #### 設計說明: ###### `專案目錄已提供re請撰寫程式,讀取read.txt檔案內容,讓使用者輸入一個英文單字,輸出此單字在read.txt中出現的次數。` ![image](https://hackmd.io/_uploads/B1DDuyM5ye.png =60%x) ---- #### JAVA 語言 507 尋找字串資料【解答】 --- ![image](https://hackmd.io/_uploads/S1d2_yz9kg.png =53%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 508 計算平均成績 --- #### 設計說明: ###### `請撰寫程式,讀取read.txt檔案內容,read.txt內含十位學生的資料,第二個欄位是身份證號,後三個欄位是成績。使用者先輸入一個正整數1~10,表示要計算前幾筆的平均成績,並依照男生女生分別計算。輸出筆數中所有男生及女生的平均成績,中間以一個半形逗號分隔,顯示如【boys:xx,girls:yy】。平均成績計算方式使用整數除法。` ![image](https://hackmd.io/_uploads/HybVFyGqye.png =55%x) ---- #### JAVA 語言 508 計算平均成績【解答】 --- ![image](https://hackmd.io/_uploads/SkghFyMq1x.png =48%x) ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 509 尋找及排序資料 --- #### 設計說明: ###### `請撰寫程式,讀取read.txt檔案內容,內含22位學生的資料,第一個欄位代表序號,目前檔案中沒有按照序號排列。使用者輸入一個正整數n(n≧5),從read.txt檔案內容中,搜尋出序號1-n的學生資料,按序號由小而大寫入write.txt檔案中,檔案寫入完成後要關閉。若輸入文字或不在指定範圍的數字,請輸出【error】。若該數超出總筆數,則該數指定為總筆數。` ![image](https://hackmd.io/_uploads/rkOQckM9Jl.png =65%x) ---- #### JAVA 語言 509 尋找及排序資料【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/ByKu5yzcJe.png) | ![image](https://hackmd.io/_uploads/B1RKcyf9yx.png) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 510 寫入至文字檔 --- #### 設計說明: ###### `請撰寫程式,讓使用者輸入一個正整數n(n≦7),專案已提供title及content兩個變數,分別代表一篇短文的標題及內容。content以英文句號「.」分段並分行,取出content前n段的內容寫入write.txt檔案中。輸入空值(長度為0的字串)或大於7的數字,表示寫入全部資料;若輸入文字或不在指定範圍的數字,請輸出【error】。` ![image](https://hackmd.io/_uploads/ryDRqkMckl.png =65%x) ---- #### JAVA 語言 510 寫入至文字檔【解答】 --- ![image](https://hackmd.io/_uploads/ryGx61z5kx.png =50%x) --- # 8. JAVA 第6類: # 物件導向程式設計 <!-- .slide: data-background="#FFE153" --> <!-- .slide: data-transition="fade" --> ---- ## 8.1 何謂物件導向? <!-- .slide: data-background="#FFFF93" --> <!-- .slide: data-transition="slide" --> ---- <!-- .slide: data-transition="zoom-in" --> ### `物件導向程式設計` --- ##### `物件導向程式設計是一種程式設計的範式(Paradigm),OOP 主要是藉由「物件」這種擬人、擬物化的方式,用我們比較容易想像的方式來組織、管理程式碼。` > 物件(Object) = 狀態(State) + 行為(Behavior) ##### <font color="#FFD306">`狀態,就是物件的「屬性(Attribute)」,而行為就是物件的「方法(Method)」,也就是寫在物件裡的函數。`</font> ---- <!-- .slide: data-transition="zoom-in" --> ### `物件導向程式設計` --- ![image](https://hackmd.io/_uploads/H1sU-U6cyg.png =80%x) ---- <!-- .slide: data-transition="zoom-in" --> #### `Java 的物件(Object)與類別(Class)` --- ``` class Dog { public String furColor; // 名詞 : 「毛色」(公有成員) private String breed; // 名詞 : 「品種」(私有成員) int age; // 名詞 : 「年齡」(公有成員) - 預設 public void bark() { // 動詞 : 「吠()」(行為/方法) System.out.println("Woof! Woof!"); } } ``` ``` void main() { Dog daHuang = new DogClass(); // 定義大黃是犬 daHuang.furColor = "Yellow"; System.out.println("大黃的毛色: " + daHuang.furColor); daHuang.bark(); } ``` ###### <font color="#FFD306">`為了保護資料成員不被任意的修改,通過在前面添加關鍵字公有與私有 ( public & private) 來控制訪問`。</font> ---- <!-- .slide: data-transition="zoom-in" --> #### `Java 物件的封裝(Encapsulation)` | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/rkK3ND651x.png =80%x) | ![image](https://hackmd.io/_uploads/r1L6Vwp5ke.png) | ###### `由於 private 屬性非常自閉,因此只好`<font color="#FFD306">`委託「getter() & setter()」這兩個 public 管家代勞,協助管理 private 屬性與外界的「溝通」`</font>。 ---- <!-- .slide: data-transition="zoom-in" --> ### `建構子(Constructor)` --- ###### `在物件被建立出來的同時,就把物件中的屬性資料設定進去,也就是讓物件在被創造出來的同時,搭配`<font color="#FFD306">` 關鍵字「this」`</font>`一併完成「初始化」的動作。` ``` class Student { String name; // 宣告字串型態的姓名 int studentId; // 宣告整數型態的學生證號 Student(String name, int studentId) { // 建構子 this.name = name; this.studentId = studentId; } } ``` ``` void main() { Student Alice = new Student(); // 法1. 資料量多時難以維護 Alice.studentID = "L25247845"; Alice.name = "Alice"; Student Bob = new Student(“L29627832”, "Bob"); // 法2 } ``` ---- <!-- .slide: data-transition="zoom-in" --> ### `建構子(Constructor)` | 程式碼 | 結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/SJU8NCzs1l.png =70%x) | ![image](https://hackmd.io/_uploads/rJZQvERMiyg.png) | ###### `當不寫任何建構子時,`<font color="#FFD306">`Java 會自動提供一個無參數的預設建構子`</font>`,或自動呼叫父類建構子(如果父類別有定義的話)。` ---- <!-- .slide: data-transition="zoom-in" --> ### `繼承(Inheritance)` --- ###### `繼承允許我們基於現有的類別(父類別)建立新的類別(子類別),`<font color="#FFD306">`使子類別自動擁有父類別的屬性和方法`</font>`,在 Java 中,使用`<font color="#FFD306">` 關鍵字「extends」`</font>`來表示繼承關係。` ###### `我們可以建立一個通用的父類別,定義`<font color="#FFD306">`共同的屬性和方法,然後讓子類別繼承這些特性並添加各自的特殊功能。`</font> ``` class Animal{ int height; int weight; void move(){ ... } void sleep() { ... } } class Dog extends Animal{ String furColor; void eat() { ... } void bark() { ... } } ``` ---- <!-- .slide: data-transition="zoom-in" --> #### `繼承(Inheritance)` | 父Class | 子Class | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/Hk7PIdT9Je.png) | ![image](https://hackmd.io/_uploads/rJeECuda91l.png) | ###### `如果寫了很多建構子提供多元的建構物件方式,建構子之間彼此可以用 this(.) 互相呼叫,讓已經寫好的程式可以被充分的再利用` ---- #### `繼承(Inheritance)` | Main | 結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/Bk7bwua9ke.png) | ![image](https://hackmd.io/_uploads/H1bVw_Tqke.png) | ###### `利用 super(.) 可以呼叫父類別中定義好相應參數的建構子,很多時候父類別已經定義好的東西,子類別直接用就好,設計上比較好維護` ---- <!-- .slide: data-transition="zoom-in" --> #### `多型-多載(Overload)` | 程式碼 | 結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/r1Z4a_69kx.png =60%x) | ![image](https://hackmd.io/_uploads/r1lBTupcyl.png) | ###### `同一個方法(Method)會依據它的`<font color="#FFD306">`參數值(輸入值)的「型態」、「數量」,甚至「順序」的不同,自動選擇對應的定義`</font>`,執行不同的敘述,輸出不同的結果。` ---- <!-- .slide: data-transition="zoom-in" --> #### `多型-覆寫(Override)` | 程式碼 | 結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/ByEhEtT9Je.png =60%x) | ![image](https://hackmd.io/_uploads/rJR0Zt6ckl.png) | ###### `多型(Polymorphism)在物件導向程式設計的概念中,`<font color="#FFD306">`利用父類別提供的方法呼叫,讓子類別可以有自己特有的行為`</font>`。` ---- <!-- .slide: data-transition="zoom-in" --> #### `抽象(Abstract)類別與方法` | 上半 | 下半 | 結果 | | -------- | -------- | -------- | | ![image](https://hackmd.io/_uploads/BJZD6Kpckl.png) | ![image](https://hackmd.io/_uploads/BJV_TtTqJx.png) | ![image](https://hackmd.io/_uploads/SkztTFTq1x.png) | ###### `利用`<font color="#FFD306">`關鍵字「abstract」在抽象父類別預先宣告抽象方法,但是把內部的實作的工作交給其他繼承類別來做`</font>`。可以說抽象類別就是用來「被繼承」的。` ---- <!-- .slide: data-transition="zoom-in" --> #### `介面(Interface)` | 上半 | 下半 | 結果 | | -------- | -------- | -------- | | ![image](https://hackmd.io/_uploads/ryZBf5pc1l.png) | ![image](https://hackmd.io/_uploads/B1JIGcaqkx.png) | ![image](https://hackmd.io/_uploads/SJHWHqac1x.png) | ###### `一般在介面中不實作任何東西只提供框架,介面的方法都是抽像 (abstract) 且公開 (public) 的,如要用預設方法時須加上關鍵字「default」表示。利用`<font color="#FFD306">`關鍵字「implements」在子類別實作介面。`</font> ---- <!-- .slide: data-transition="zoom-in" --> #### `介面(Interface)` | 上半 | 下半 | 結果 | | -------- | -------- | -------- | | ![image](https://hackmd.io/_uploads/rynClRzikx.png) | ![image](https://hackmd.io/_uploads/HkeMbRGs1g.png) | ![image](https://hackmd.io/_uploads/r1GmZAMiyx.png) | ###### <font color="#FFD306">`一個 class 可以繼承(extends)一個 class,並且實作(implements)多個 interface。`</font>`介面能提供脫離上下繼承關係的額外方法或行為。` ---- <!-- .slide: data-transition="zoom-in" --> #### `抽象類別 vs. 介面` --- | 差異點 | 抽象類別 | 介面 | | -------- | -------- | -------- | | 實例化 | 不能 | 不能 | | 建構子 | 可以有 | 不能 | | 繼承 | 單一繼承 | 多重繼承 | | 方法 | 定義原型/本體 | 只能原型 | | 子類別 | extends 關鍵字 | interface 關鍵字 | | 修飾詞 | 都可以 | 只能抽像且公開 | ---- <!-- .slide: data-transition="zoom-in" --> #### `修飾詞(Modifiers)-存取權限類` --- | 修飾詞 | 說明 | 可用位置 | | -------- | -------- | -------- | | public | 所有地方可見 | 類別、方法、變數、建構子 | | protected | 僅封裝內及子類別中可見 | 方法、變數、建構子 | | (無修飾詞) | 預設-僅封裝(package)內可見 | 類別、方法、變數、建構子 | | private | 僅在同一個類別內可存取 | 方法、變數、建構子 | ---- #### `修飾詞(Modifiers)-存取權限類比較表` --- ![image](https://hackmd.io/_uploads/SJl4BfO0Jg.png) ---- #### `修飾詞(Modifiers)-非存取權限類` --- * static【靜態】 * 程式載入記憶體的時候,跟著程式<font color="#FFD306">一起在記憶體中佔有空間(在編譯階段就確定)</font> * 修飾 method <font color="#FFD306">不需 new 一個新物件</font>就能使用(`工具類Math.PI、程式進入點main()`) * 修飾 var 表示同 calss 物件<font color="#FFD306">共用同一份 var </font> * final【最終的】 * 修飾 class 表示此 class 不可繼承 * 修飾 method 表示不可以 override * 修飾 var 表示此 var 是<font color="#FFD306">不可以修改的常數</font> ---- #### `修飾詞(Modifiers)-非存取權限類` --- * abstract【抽象】 * 不能實例化,<font color="#FFD306">需要被繼承</font> * synchronized【同步】 * 執行緒(threads)專用,同時只能被一個執行緒取用。 ###### ###### `大部分存取權限(只能一個且必須放前面)與非存取權限(可以多個)類飾詞可以搭配使用,除了`<font color="#FFD306">`本身用法自相矛盾之外`</font>`,比如: abstract + final (抽象要 override 但是 final 禁止 override)。` ---- <!-- .slide: data-transition="zoom-in" --> #### `列舉設計(Enumerations)` | 程式碼 | 結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/SyxB35aqyx.png =70%x) | ![image](https://hackmd.io/_uploads/ryOJ296qke.png) | ###### `列舉是種`<font color="#FFD306">`特殊的類別(Class),常用於紀錄固定不變的選項對應關係`</font>`,列舉實例必須最先定義,在最後一個列舉實例必須加上分號「;」。` ---- <!-- .slide: data-transition="zoom-in" --> #### `ArrayList(清單)` --- ``` import java.util.ArrayList; ArrayList<String> cars = new ArrayList<String>(); ArrayList<String> cars = new ArrayList<>(); // 右邊型別可省略 // 新增元素 cars.add("Volvo"); // 預設添加至尾端 ["Volvo"] cars.add(0, "BMW"); // 指定新增位置(index) ["BMW", "Volvo"] // 取得元素 cars.get(0); // Return: "BMW" ``` ``` // 修改元素 cars.set(0, "Mazda"); // ["Mazda", "Volvo"] // 刪除 cars.remove(Volvo"); // ["Mazda"] cars.clear(); // 清空整個List [ ] ``` ###### `是一個有浮動大小的 Array,創建一個 ArrayList 時,不需要為它設定大小。在創建後,你可以隨意更改它的大小。` ---- <!-- .slide: data-transition="zoom-in" --> #### `ArrayList(清單)` | 程式碼 | 結果 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/BySUYbORkx.png =55%x) | ![image](https://hackmd.io/_uploads/HkB9K-uRke.png) | ###### `需注意新增元素及存取元素的方式與一般 Array 不同` --- ## 8-1 JAVA 語言 第6類: ## 物件導向程式設計 ## 【練習題】 <!-- .slide: data-background="#FFE153" --> <!-- .slide: data-transition="fade" --> ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 601 汽車零件設計 --- #### 設計說明: ###### `(1) 請設計UnitCost(單位成本)類別中,包含一個整數欄位cost表示成本,並請建立getCost方法,以傳回成本。` ###### `(2) 請建立UnitCost類別的子類別Engine(引擎)類別。建構引擎時需要傳入引擎的cc數:y年份(以一個半形冒號分隔),cc數只有1800cc與2000cc兩種,前者成本定價為20000元,後者成本定價為25000元。` ###### `(3) 判斷y年份,大於2年並小於5年的引擎定價為成本的8折;大於等於5年並小於10年的引擎定價為成本的7折;大於等於10年以上的引擎定價為該成本的6折。` ###### `(4) 請完成程式main(),輸入引擎cc數:年份,輸出引擎成本。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 601 汽車零件設計 --- ![image](https://hackmd.io/_uploads/ryxR9HTq1x.png =85%x) ---- #### JAVA 語言 601 汽車零件設計【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/Hk-1bP65yg.png) | ![image](https://hackmd.io/_uploads/ByteZwp51x.png) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 602 汽車外觀設計 --- #### 設計說明: ###### `(1) 專案已內含名為Car的類別,內含cc屬性,請建立int型態的seats、color、doors屬性,其中color屬性請使用列舉,RED=1、BLUE=2、WHITE=3。` ###### `(2) 於main()中撰寫程式,讓使用者依序輸入以半形空格隔開的車子的cc數、座位數量、顏色及車門數量。` ###### `(3) 輸出格式為【新車各項屬性:{車子cc數}cc{座位數量}{顏色}{車門數量}】,輸出字串中無任何空格,如:【1500cc4RED4】,若輸入不在規定範圍的顏色,請輸出【error】。` ###### `提示:{名稱}用來表示該名稱的變數,如:{車子cc數}=1500。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 602 汽車外觀設計 --- ![image](https://hackmd.io/_uploads/BycB-Jmsyg.png =65%x) ---- #### JAVA 語言 602 汽車外觀設計【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/S1O9Zkmi1g.png) | ![image](https://hackmd.io/_uploads/H1IsZkmsye.png) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 603 員工薪資計算 --- #### 設計說明: ###### `(1) 專案已內含名為Clerk的抽象類別,類別內含name,rate及hours屬性,分別代表員工姓名、每小時標準工資及工作時數,以及包含salary方法,功能是計算薪資。` ###### `(2) 請繼承Clerk類別,建立兩個類別,名稱分別為PartTime及FullTime,代表兼職及全職員工。兼職員工的薪資計算公式是「每小時標準工資 * 工作時數」、全職員工的薪資計算公式是「8 × 每小時標準工資 + ((工作數 - 8) × 每小時標準工資 × 0.9)」。` ###### `(3) 請撰寫程式,讓使用者依序輸入以單一個半形空格隔開的員工資料,分別為員工性質、姓名、每小時標準工資及工作時數,輸入的第一個字母p代表兼職,f代表全職。姓名為不含空格的英文字串。標準工資及工作時數皆為大於等於0。若輸入不在指定範圍的資料,請輸出【error】。` ###### `(4) 輸出格式為【{員工性質} {員工姓名} {員工薪資}】,性質、姓名與工資中間各一個半形空格,如:【PartTime john 1200】。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 603 員工薪資計算 --- ![image](https://hackmd.io/_uploads/B17mz1Qjye.png =65%x) ---- #### JAVA 語言 603 員工薪資計算【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/H1Nk7Jms1g.png) |![image](https://hackmd.io/_uploads/Hy5lQ1mjJe.png =75%x) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 604 薪資總計 --- #### 設計說明: ###### `(1) 專案已內含名為Clerk的抽象類別,類別內含name,rate及hours等屬性,分別代表姓名,每小時標準工資及小時數,salary方法功能是計算薪資。` ###### `(2) 專案已繼承及實作Clerk類別,建立PartTime及FullTime,代表兼職及全職店員,兼職員工的薪資計算公式是「每小時標準工資 * 工作時數」;全職員工的薪資計算公式是「8 × 每小時標準工資 + ((工作時數 - 8) × 每小時標準工資 × 0.9)」。` ###### `(3) 請在Clerk抽象類別新增isManager屬性,型態為bool,表示是否為店長,若是店長則isManager屬性值為true。` ###### `(4) 請更改FullTime類別的salary方法,若是店長,基本薪資計算方式同全職員工,再將其計算的基本薪資乘以1.2倍,薪資計算公式是「(8 × 每小時標準工資+ ((工作時數 - 8) × 每小時標準工資 × 0.9)) × 1.2」。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 604 薪資總計 --- #### 設計說明: ###### `(5) 在主程式中建立程式,讀取專案提供的read.txt,共七位員工資料,三個欄位分別代表:全、兼職或店長(m為店長f為全職p為兼職)、姓名及工時數。再接收使用者輸入以單一個半形空格隔開的兩個數字,分別代表兼職及全職的每小時標準工資,逐一計算每人薪資(salary方法),再予以加總。` ###### `(6) 輸出格式為【PartTime:{兼職工資},FullTime:{全職工資},Salary:{薪資總計}】,將所計算的資料代入輸出字串,輸出字串中無任何空格,冒號及逗號皆為半形。如:【PartTime:150,FullTime:200,Salary:208872】。 ###### `(7) 若輸入不在指定範圍的資料,請輸出【error】。` ###### `提示:{名稱}用來表示該名稱的變數,如:{兼職工資}=200。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 604 薪資總計 --- ![image](https://hackmd.io/_uploads/Bye0nX17syl.png =65%x) ---- #### JAVA 語言 604 薪資總計【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/rJt1VkQskx.png) | ![image](https://hackmd.io/_uploads/HkLW4JQikg.png) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 605 員工資料介面 --- #### 設計說明: ###### `(1) 專案已內含名為Staff類別,類別內含name,logintime、logouttime及workdate、worktime等,分別代表姓名、登入時間、登出時間、工作日期、工作時間,另外尚有Ilogin及Ilogout兩個介面(interface),各內含一個方法,功能是執行登入及登出。` ###### `(2) 請建立名為Manager的新類別,繼承Staff類別。於此類別中實作Ilogin及Ilogout兩個介面,Manager類別的建構子傳入三個參數,分別代表姓名及工作日期、工作時間,設定至name及workdate、worktime。在login方法設定logintime為目前時間,在logout方法設定logouttime為目前時間。` ###### `(3) 在main()方法中撰寫程式,輸入姓名及工作日期、工作時間,中間以一個半形空格分隔。將所輸入的資料做為參數傳至Manager類別,再執行login方法,兩秒後執行logout方法,最後輸出如【john Login 2019/01/01 15:34:28,Logout 2019/01/01 15:34:30】。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 605 員工資料介面 --- #### 設計說明: ###### `(4) 若輸入不在指定範圍的資料,請輸出【error】。` ###### `提示:停頓兩秒的設計使用Thread.Sleep。日期時間格式:"yyyy/MM/dd HH:mm:ss"。` ![image](https://hackmd.io/_uploads/By3uEymoke.png =65%x) ---- #### JAVA 語言 605 員工資料介面【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/ByTcogUOlg.png) | ![image](https://hackmd.io/_uploads/r1P2ieIOll.png) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 606 銀行帳戶設計 --- #### 設計說明: ###### `(1) 專案已內含名為Account類別,類別內含name、rate及balance變數,分別代表戶名、利率(單位%)及餘額。` ###### `(2) 請在Account類別建立五個方法,分別是setRate、deposit、withdraw、getBalance、getFutureValue,功能分別是設定年利率、存款,提款、查詢餘額、餘額加計利息。` ###### `(3) 請撰寫程式,讀取read.txt檔案,內含jack的五筆存提款記錄,第三個欄位的d代表存款、w代表提款,以迴圈逐筆執行存提款動作。` ###### `(4) 使用者輸入一個1~5的正整數,代表年利率(單位%),依照目前jack的本金進行本利和計算,輸出一年後的本利和總計;若輸入不在指定範圍的資料,請輸出【error】。` ###### `(5) 本利和(年)計算公式:本金×(1 + 年利率)。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 606 銀行帳戶設計 --- ![image](https://hackmd.io/_uploads/BJDFSy7jke.png =65%x) ---- #### JAVA 語言 606 銀行帳戶設計【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/ryr18JQs1g.png =80%x) |![image](https://hackmd.io/_uploads/ryGb8ymjke.png =65%x) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 607 銀行定期存款設計 --- #### 設計說明: ###### `(1) 專案已內含名為Account類別,類別內含name、rate、balance、isCD,duration等變數,分別代表戶名,利率、餘額、是否定存、定存期間等。並已定義setRate、getBalance兩個方法。請完成deposit(存款)、withdraw(提款)、addInterest(增加利息)等三個方法。存款與提款均需傳入存提金額n後計算新的餘額。增加利息addInterest則是計算利息後增加至餘額。` ###### `提示:利率rate為整數,採單利計算。` ###### `公式:利息 = 現有餘額 * (利率/100)。` ###### `(2) 原始Account類別中現有一個建構子,傳入戶名。請應用多載的概念,增加另一個建構子,傳入戶名與定存期間。如果定存期間為1年,則該帳戶利率為2%;定存期間為2年,利率3%;3年則利率為5%。其餘期間不接受。` ###### `提示:定存帳戶之isCD為true。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 607 銀行定期存款設計 --- ###### `(3) main主程式中請完成以下功能:使用者輸入戶名(jack或lily)與定存期限(請以半形逗號相隔)如:jack,2或lily,0,中間以一個半形逗號分隔。` ###### `定存期限只有1-3年,若輸入為0表示非定存帳號;其餘輸入請顯示【error】。` ###### `依照輸入選擇不同建構子建立account物件。由read.txt中讀入每行資料,格式如下:戶名,數字,操作。(操作d表示存款deposit;w表示提款withdraw)。如果讀入資料與輸入之戶名相同,則進行對應方法呼叫,直到檔案結束。` ###### `檔案結束前請依照利率進行加上利息,最後輸出戶名、是否為定期利率(T:是/F:不是)以及本利和,中間以一個半形逗號分隔,輸出如【jack,F,1%,959.5】,如本利和輸出為整數則不輸出小數點。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 607 銀行定期存款設計 --- ![image](https://hackmd.io/_uploads/rkwfw1XiJx.png =65%x) ---- #### JAVA 語言 607 銀行定期存款設計【解答】 | 上半 | 中段 | 下半 | | -------- | -------- | -------- | | ![image](https://hackmd.io/_uploads/B1F9PJXsJg.png) | ![image](https://hackmd.io/_uploads/SJv3wJXsJe.png) | ![image](https://hackmd.io/_uploads/HJCpDkmiJl.png) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 608 航空包裏運費計算 --- #### 設計說明: ###### `(1) 專案已內含名為Bag類別,類別內含receiptdate,freight及unitcost變數,分別代表收件日期、運費與(每小時的)單位運費。` ###### `(2) 請建立Air類別繼承Bag類別,內含deliveryhours變數,表示運送包裏的時數,再建立計算運費的computeFreight方法,公式為「單位運費(unitcost)*運送時數(deliveryhours)」。` ###### `(3) 請於main()中撰寫程式,讀取read.txt檔案,內含五筆貨物運送記錄,每一筆紀錄的第一個欄位是收件日期(月/日),最後一個欄位是運送時數。` ###### `(4) 讓使用者輸入一個正整數,代表單位運費,請將此單位運費代入公式,計算這五筆的運費後加總輸出。若輸入文字或非正整數,請輸出【error】。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 608 航空包裏運費計算 --- ![image](https://hackmd.io/_uploads/HkhAOyQiJe.png =75%x) ---- #### JAVA 語言 608 航空包裏運費計算【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/HyL4YJmoJe.png) | ![image](https://hackmd.io/_uploads/rkbDt1moJe.png) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 609 員工差假介面設計 --- #### 設計說明: ###### `(1) 專案已內含名為Staff類別,類別內含name、leavehours,分別代表姓名及請假累計時數,Manager類別已繼承Staff類別,並提供部分程式。` ###### `(2) 請建立一新介面,名稱為ILeave,內含一個方法,名稱為takeLeave,傳入一個int型態的參數,代表請假時數。修改Manager類別實作ILeave,並完成takeLeave,將請假時數累計至leavehours。` ###### `(3) 建立一個名為Worker的類別,繼承Staff及實作ILeave介面,完成建構子與takeLeave方法。` ###### `提示:Worker不是leader,isleader不為true。` ###### `(4) 在main()方法中撰寫程式,輸入資料,代表時數下限,如輸入【2】,表示只統計大於等於2小時的請假時數。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 609 員工差假介面設計 --- #### 設計說明: ###### `(5) 讀取專案所附的read.txt,內含7位員工共計29筆請假記錄。` ###### `格式:姓名,身分(m:Manager, w:Worker),請假日期,請假時數。如:john,m,1/2,6。意義為john,身分Manager,在1月2日請假6小時。` ###### `(6) 由檔案中讀取資料並依照身分別建立對應物件,加入至相對的List,例如:mgers為Manager的List、wors為Worker的List。如果該筆記錄之請假時數小於步驟4輸入之請假時數下限,則無須加總,其餘依照姓名累加。` ###### `(7)分別輸出Manager及Worker的請假總時數,輸出格式如【Manager47hr/Worker75hr】。` ###### `(8) 若輸入不在指定範圍的資料,請輸出【error】。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 609 員工差假介面設計 --- ![image](https://hackmd.io/_uploads/HyuL9JQiyg.png =70%x) ---- #### JAVA 語言 609 員工差假介面設計【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/S1O2cyXi1x.png =70%x) | ![image](https://hackmd.io/_uploads/rkrMi1QiJg.png =75%x) | ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 610 電腦零件設計 --- #### 設計說明: ###### `(1) 專案內已有Part類別,請撰寫LCD類別繼承Part類別。內有一個整數欄位size(螢幕尺吋),請透過建構子依照傳入的尺吋設定成本,規則如下:10吋LCD的成本是1500元,15吋LCD的成本是2500元,17吋LCD的成本是3500元。` ###### `(2) 請撰寫CPU類別繼承Part類別。CPU有一數值欄位speed(運算速度),透過建構子依照傳入的速度數值設定成本,規則:速度1.66的成本是7000元,速度2.2的成本是8500元,速度2.4的成本是13000元。` ###### `(3) 請撰寫HD類別繼承Part類別。HD有一整數欄位vol(硬碟容量),透過建構子依照傳入的容量設定成本,規則:256G的成本是1800元,512G的成本是2500元。` ###### `(4) 請使用以上的零件,撰寫Notebook類別,該類別有三個屬性,分別是LCD, CPU, HD,在建構子傳入三個參數,分別代表LCD尺寸、CPU速度、HD大小。若未傳入,以10、1.66及256為預設值。需撰寫兩個建構子。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 610 電腦零件設計 --- #### 設計說明: ###### `(5) 在Notebook類別中,定義double型態的profit屬性,代表利潤比例,如其值為1.2,表示利潤為20%。此類別中再分別建立兩個方法,名稱分別為getCost及getPrice,前者功能為回傳總成本,後者為回傳總成本加利潤。` ###### `總成本計算公式:LCD + CPU + HD。` ###### `售價計算公式:(LCD + CPU + HD) × profit。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 610 電腦零件設計 --- #### 設計說明: ###### `(6) 在main()方法中撰寫程式,需輸入一組數字(數字間以一個半形空格分隔)。若輸入兩個數字(數字間以一個半形空格分隔),如【3 1.4】,表示建立三個筆電物件,採用預設的硬體配置,且利潤比為1.4,再計算總成本及售價後輸出,輸出格式如【NB:3,Cost:30900,Total:43260】,冒號及逗號皆為半形。` ###### `(7) 若輸入五個數字(數字間以一個半形空格分隔),如【2 1.2 10 1.66 256】表示建立兩台筆電物件,採用10吋LCD、速度1.66的CPU、256的硬碟,且利潤比為1.2,再計算總成本及售價後輸出,輸出格式如【NB:2,Cost:20600,Total:24720】,冒號及逗號皆為半形。` ###### `若輸入不在指定範圍的資料,請輸出【error】。` ---- <!-- .slide: data-transition="zoom-in" --> ## JAVA 語言 610 電腦零件設計 --- ![image](https://hackmd.io/_uploads/r1nNa17skg.png =75%x) ---- #### JAVA 語言 610 電腦零件設計【解答】 | 上半 | 下半 | | -------- | ------------ | | ![image](https://hackmd.io/_uploads/BkLFakQj1x.png =70%x) | ![image](https://hackmd.io/_uploads/HJj5a17iyl.png =90%x) |
{"title":"Java 基礎入門教學","slideOptions":"{\"theme\":\"black\",\"transition\":\"zoom-in\"}","description":"https___hackmd.io_@wesleywu318_BJ-oKZZd6https://hackmd.io/@wesleywu318/BJ-oKZZd6","contributors":"[{\"id\":\"12ab19f7-d4be-4d5a-9fa6-75e0776f77a0\",\"add\":92338,\"del\":23464,\"latestUpdatedAt\":null}]"}
    1645 views