# <font color="#D9FFFF">Java</font>
# <font color="#D9FFFF">基礎入門教學</font>
<!-- .slide: data-background="https://hackmd.io/_uploads/SkmX3ZWOT.jpg" -->
<!-- .slide: data-transition="zoom" -->
---
# 講義連結

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 
### intellij idea 
### Visual Studio Code 
<!-- .slide: data-background="#FFFCEC" -->
----
## 1.3 常見 Java online IDE
<!-- .slide: data-background="#FFFF93" -->
<!-- .slide: data-transition="slide" -->
----
### JDoodle 
https://www.onlinegdb.com/online_c++_compiler
### Online Java 
https://www.online-java.com/
### Replit 
https://replit.com/
<!-- .slide: data-background="#FFFCEC" -->
---
# 2. 安裝 Visual Studio Code
<!-- .slide: data-background="#FFE153" -->
<!-- .slide: data-transition="fade" -->
----
## 2.1 依據電腦作業系統
## 下載相應版本

[點我連官網](https://code.visualstudio.com/download)
----
## 2.2 下載 JDK
### Java Development Kit

[點我連官網](https://www.oracle.com/tw/java/technologies/downloads/#jdk23-windows)
----
### 2.3 安裝Java用套件
---
* Language Support for Java™ by Red Hat

* Debugger for Java

* Test Runner for Java

----
### 2.4 安裝介面套件
---
* Chinese

* Auto Rename Tag

* Bracket Pair Colorizer 2 (built-in to VS Code)

----
### 2.4 安裝其他套件
---
* Prettier

* IntelliCode

---
# 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>。

----
## 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>
----
| 程式碼 | 印出結果 |
| -------- | ------------ |
|  | |
----
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" -->
| 程式碼 | 印出結果 |
| -------- | ------------ |
|  | |
##### 根據需要讀入的資料型態使用對應的函式 `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){
例外發生時做什麼事;
}
```
| 程式碼 | 印出結果 |
| -------- | ------------ |
| |  |
##### <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 (發生的條件){
做什麼事;
}
```
| 程式碼 | 印出結果 |
| -------- | ------------ |
| |  |
##### <font color="#FFD306">要表達哪些程式碼屬於某層級之下,使用括號做區隔,括號內程式以 TAB 鍵縮排,增加程式可讀性。</font>
----
<!-- .slide: data-transition="zoom-in" -->
### `if-else 敘述`
```
# 語法
if (發生的條件){
做什麼事;
}else{
否則做什麼事;
}
```
| 程式碼 | 印出結果 |
| -------- | ------------ |
|  |  |
##### <font color="#FFD306">兩段程式依據條件分別執行,一定會有一段成立</font>
----
<!-- .slide: data-transition="zoom-in" -->
### `if-elif-else 敘述`
```
# 語法
if (發生的條件){
做什麼事;
}else if(發生的條件){
做什麼事;
}else{
否則做什麼事;
}
```
| 程式碼 | 印出結果 |
| -------- | ------------ |
|  |  |
----
<!-- .slide: data-transition="zoom-in" -->
### `巢狀 if 敘述`
###### <font color="#FFD306">用在判斷條件中安排更進一步的判斷條件</font>
```
# 語法
if (發生的條件){
if (細部的條件){
做什麼事;
}else{
否則做什麼事;
}
}else{
否則做什麼事;
}
```
----
| 程式碼 | 印出結果 |
| -------- | ------------ |
|  |  |
----
<!-- .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" -->
| 程式碼 | 印出結果 |
| -------- | ------------ |
|  |  |
----
## 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 字串列印
---
#### 設計說明:
##### 請撰寫一程式,由使用者輸入兩個字串,請將此兩個字串以一個半形空格相連方式輸出。

----
### Java 101 字串列印【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## Java 102 偶數相加
---
#### 設計說明:
##### 請撰寫程式,接收輸入的兩個數字,若兩個數字皆是整數且為偶數,輸出相加結果;若輸入的數字不符合要求,轉為數字0。

----
### Java 102 偶數相加【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## Java 103 計算圓面積
---
#### 設計說明:
##### 請撰寫程式,輸入圓形半徑後計算圓面積,四捨五入輸出至小數點後第四位;若輸入值非數字資料,請轉換為數字0。
圓面積公式為:圓周率(Pi)x 半徑平方

----
### Java 103 計算圓面積【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## Java 104 距離計算
---
#### 設計說明:
##### `請撰寫一程式,讓使用者輸入四個數字x1、y1、x2、y2,分別代表兩個點的座標(x1, y1)、(x2, y2)。使用Math.Sqrt方法計算兩點歐式距離,四捨五入輸出至小數點後第四位`。


----
### Java 104 距離計算【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## Java 105 字串索引
---
#### 設計說明:
###### `專案中已提供一段英文短文於常數dreams中`。
###### `請在main主程式中,讓使用者輸入單字,以輸入的單字在常數dreams英文短文中,尋找第一個位置及最後一個位置,再取出這兩個位置間的字串,將此三個值傳至print程式進行輸出。`
###### 若輸入不存在的單字,位置必須顯示為0,擷取字串為空值(無空格);若單字只出現一次,則擷取單字之後的所有文字。

----
### Java 105 字串索引【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## Java 106 最大及最小值
---
#### 設計說明:
##### `請撰寫程式,讓使用者輸入四個整數,以 Math 套件功能取得最大值及最小值,再傳至 print 方法,若輸入值為負數、帶有小數點的數字資料或非數字資料,請轉換為0。`

----
### Java 106 最大及最小值【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## Java 107 判斷及格分數
---
#### 設計說明:
##### 請撰寫程式,讓使用者輸入三個成績,計算平均分數,0至60分不及格,輸出【failed:x】;60分(含)以上~99分及格,輸出【pass:x】;如為滿分100分輸出【full mark:100】。
##### 若輸入值為負數、帶有小數點的數字資料或非數字資料,請轉換為0;若輸入大於100,請轉換為100後再計算。

----
### Java 107 判斷及格分數【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## Java 108 數學函數
---
#### 設計說明:
##### 請在撰寫一名為 f 的副程式,接收` main()` 傳遞的一個數字,計算數學函數` f(x) = 2*x^3 + 3*x - 1 `後將計算結果回傳至 `main()`,輸出至小數點後第四位。若輸入非數字資料,請輸出【error】。

----
### Java 108 數學函數【解答】
---

----
<!-- .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`。

----
### Java 109 字元處理【解答】
---

----
## Java 110 存錢筒
---
#### 設計說明:
##### 請撰寫程式,讓使用者輸入三個正整數,分別代表存錢筒中的一元、五元及十元的硬幣數量,計算存錢筒的總金額並輸出,金額需格式化輸出為三位一撇的千分號,顯示【x,xxx】。若輸入值為負數、帶有小數點的數字資料或非數字,請轉換為0。
```
import java.text.DecimalFormat;
// 格式化金額為三位一撇的千分號
DecimalFormat myDecimalFormat = new DecimalFormat("#,###");
String formatAmount = myDecimalFormat.format(totalAmount);
```

----
### Java 110 存錢筒【解答】
---

---
# 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 ( 起始值; 終止判斷式; 遞增(減)式){
做什麼事;
}
```
| 程式碼 | 印出結果 |
| -------- | ------------ |
| |  |
##### <font color="#FFD306">如果迴圈內程式只有一行,大括號 (` {} `) 可以省略不寫,但為了程式的可讀性,一般還是建議加上。</font>
----
<!-- .slide: data-transition="zoom-in" -->
### `巢狀 for-loop`
###### 用在迴圈裡面又包覆著其他的迴圈
```
# 語法
for ( 起始值; 終止判斷式; 遞增(減)式){
for ( 起始值; 終止判斷式; 遞增(減)式){
做什麼事;
}
}
```
| 程式碼 | 印出結果 |
| -------- | ------------ |
|  |  |
----
<!-- .slide: data-transition="zoom-in" -->
### `多變數 for-loop`
###### 用一個迴圈操作複數個變數
```
# 語法
for ( 起始值1, 起始值2; 終止判斷式; 遞增(減)式1, 遞增(減)式2){
做什麼事;
}
```
| 程式碼 | 印出結果 |
| -------- | ------------ |
| |  |
##### <font color="#FFD306">在程式不複雜的形況才建議此寫法,主要是以程式可讀性為重。</font>
----
<!-- .slide: data-transition="zoom-in" -->
### `省略起始值 for-loop`
###### 用於外部程式也會用到迴圈變數的情形
```
# 語法
for ( ; 終止判斷式; 遞增(減)式){
做什麼事;
}
```
| 程式碼 | 印出結果 |
| -------- | ------------ |
| |  |
##### <font color="#FFD306">可以省略終止判斷式或遞增(減)式,可達到類似while迴圈的效果,但還是要加上分號 (` ; `) 分開陳述區塊 </font>
----
<!-- .slide: data-transition="zoom-in" -->
### `while-loops`
```
# 語法
while(條件成立){
做什麼事;
}
```
| 程式碼 | 印出結果 |
| -------- | ------------ |
|  |  |
##### <font color="#FFD306">while 迴圈執行之前,都會先檢查條件判斷式成立才會執行,否則直接跳出迴圈。</font>
----
<!-- .slide: data-transition="zoom-in" -->
### `do-while-loops`
```
# 語法
do{
做什麼事;
}while(條件成立);
```
| 程式碼 | 印出結果 |
| -------- | ------------ |
|  |  |
##### <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 版本 )
| 程式碼 | 印出結果 |
| -------- | ------------ |
|  |  |
----
### 計算 1 加到 100 的和 ( while 版本 )
| 程式碼 | 印出結果 |
| -------- | ------------ |
|  | |
---
## 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。

----
### JAVA 語言 201 比較大小【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 202 判斷奇偶數
---
#### 設計說明:
##### 請撰寫程式,讓使用者輸入一個數字,判斷數字為奇數,輸出【x is an odd number.】;數字為偶數則輸出【x is an even number.】;若輸入文字,請輸出【error】。

----
### JAVA 語言 202 判斷奇偶數【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 203 分數等級
---
#### 設計說明:
##### 請撰寫程式,讓使用者輸入三個整數,分別判斷數值大小,若>=85且<=100,輸出【A】;若>=60 且<85,輸出【B】;若>=0且<60,輸出【C】。若輸入的整數>100,則不進行級距判斷(沒有任何輸出);若輸入文字或負數,請先轉換為0再判斷級距。

----
### JAVA 語言 203 分數等級【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 204 質數
---
#### 設計說明:
##### 請撰寫程式,讓使用者輸入兩個介於1至100之間的整數(包含1與100),輸出兩數間(包含兩數)的所有質數。若輸入文字、帶有小數點的數字資料、小於等於0或大於100以外的數字,請輸出【error】(1不為質數)。

----
### JAVA 語言 204 質數【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  | |
----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 205 最大公因數
---
#### 設計說明:
##### 請撰寫程式,讓使用者輸入兩個0至100之間的整數(包含0與100),輸出兩數的最大公因數,若輸入非上述情況的資料,請輸出【error】。

----
### JAVA 語言 205 最大公因數【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 206 關鍵字出現次數
---
#### 設計說明:
##### 請撰寫程式,讓使用者輸入一個字串,尋找並計算此字串於常數dreams短文中出現的次數,輸出次數。

----
### JAVA 語言 206 關鍵字出現次數【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 207 判斷ASCII碼
---
#### 設計說明:
##### 請撰寫程式,讓使用者輸入一個字串(不含文字),再分別輸出各個元素的ASCII碼,顯示如【ASCII code for 'Y' is 89】。

----
### JAVA 語言 207 判斷ASCII碼【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 208 計算階乘
---
#### 設計說明:
##### 請在main方法撰寫程式,輸入一個1-9的正整數,再以三角形的方式,依序輸出1到此數階乘計算結果,輸出的乘積欄位寬度為4個字元,需靠左對齊。若輸入文字或不在指定範圍的數字,請輸出【error】。

----
### JAVA 語言 208 計算階乘【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 209 判斷象限座標
---
##### 設計說明:
###### 請撰寫程式,讓使用者輸入x、y座標,輸入包含浮點數,並以字串輸出此座標及座標在哪一象限、在X軸、在Y軸或在原點(中間以一個半形空格分隔),若輸入文字,請輸出【error】。

----
### JAVA 語言 209 判斷象限座標【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 210 捕捉錯誤
---
##### 設計說明:
###### 由`main()`方法提供兩個變數,變數1為被除數,預設為25;變數2為除數,由使用者輸入一個大於0、小於等於25的數字。使用`try…catch`結構,在除數為0時,將整數除以零時所擲出的例外狀況輸出錯誤訊息;若除數輸入正確數字,輸出兩個參數相除的計算結果(相除計算方式採用整數除法)。

----
### JAVA 語言 210 捕捉錯誤【解答】
---

---
# 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]);
```
| 程式碼 | 印出結果 |
| -------- | ------------ |
|  |  |
##### <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]);
```
| 程式碼 | 結果 |
| -------- | ------------ |
|  |  |
----
<!-- .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>。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

----
<!-- .slide: data-transition="zoom-in" -->
| 程式碼 | 結果 |
| -------- | ------------ |
|  |  |
----
### 選擇排序法
---
##### 選擇排序(英語:Selection sort)是一種簡單直觀的排序演算法。它的工作原理如下。 首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到已排序序列的末尾。

----
<!-- .slide: data-transition="zoom-in" -->
| 程式碼 | 結果 |
| -------- | ------------ |
|  |  |
---
## 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;若輸入或輸出有小數點,請無條件捨去至整數`。

----
### JAVA 語言 301 建立陣列【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 302 文字陣列取出資料
---
#### 設計說明:
##### `請撰寫一程式,建立名稱為weeks的文字陣列,此文字陣列內容為"Mon", "Tus", "Wed", "Thr", "Fri", "Sat", "Sun"。讓使用者輸入一個 0-6 之間的整數n,輸出陣列中的第 n+1 個元素,若輸入有誤,請輸出【error】。`

----
#### JAVA 語言 302 文字陣列取出資料【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 303 陣列排序
---
#### 設計說明:
###### `專案中已提供一個名為 compute() 的方法,使用者於 main() 方法中輸入五個整數存入已宣告的 numbers 陣列,再將此陣列傳遞給 compute() 方法。在 compute() 方法中進行由小到大排序後,輸出排序結果。元素間及最後一個元素後以半形空格隔開,若輸入文字或非整數,請轉換為 0。`

----
#### JAVA 語言 303 陣列排序【`Arrays.sort()`-解答】
---

----
#### JAVA 語言 303 陣列排序【氣泡排序法-解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 304 移除陣列指定值
---
#### 設計說明:
##### `專案中已提供一個 scores 陣列,陣列中包含 20 個學生成績。請設計一程式,輸入一個欲移除成績,將所有與輸入值相同的成績從陣列中全數移除,並將剩餘的成績進行平均值計算,輸出格式如【80.12】,四捨五入至小數點第二位。若輸入文字、或輸入不存在於陣列的數字,請轉換為 0。`

----
#### JAVA 語言 304 移除陣列指定值【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 305 費氏數列
---
#### 設計說明:
##### `請撰寫一程式,建立含有前 50 個費氏數列的陣列,讓使用者輸入一個整數n,做為陣列的索引值,並輸出陣列中的第 n+1 個費氏數列,如輸入 n=4,輸出【5:3】,表示輸出第 5 個費式數列值為 3,中間以一個半形冒號分隔,若輸入文字或不存在的索引值,請輸出【error】。`
##### 提示:使用 `long` 型態。

----
#### JAVA 語言 305 費氏數列【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 306 矩陣相加
---
#### 設計說明:
###### `main() 方法中已宣告兩個二維陣列 a、b ,其中 b 陣列內容需由使用者輸入六個 1-100 之間的正整數,並且以半形空格隔開。將 a、b 陣列傳遞給程式中已定義的compute() 方法,在 compute() 方法中將二維陣列 a、b 加總,再傳遞給 print() 方法將其加總結果輸出,以陣列一維為一列輸出,共輸出兩列。每個數字固定為四位數且靠右對齊,若輸入有誤,請輸出【error】。`

----
#### JAVA 語言 306 矩陣相加【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 307 反轉陣列
---
#### 設計說明:
###### `專案中已提供一個名為 compute() 的方法,接收 main() 傳遞的一個陣列。 請在 main() 中宣告一個陣列,讓使用者輸入資料,直到輸入 999 結束,將輸入的資料存入此宣告的陣列,再將此陣列傳遞給 compute() 方法。在 compute() 方法中進行陣列反轉,輸出陣列反轉前反轉後的內容。`

----
#### JAVA 語言 307 反轉陣列【解答】
---

----
<!-- .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】。`

----
#### JAVA 語言 308 陣列搜尋【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 309 階乘遞迴計算
---
#### 設計說明:
###### `請在程式中撰寫一個 compute 的方法,接收 main() 傳遞的一個 1-20 之間的正整數。compute 方法計算該數的階乘計算結果並回傳至 main(),若輸入值不在 1-20 範圍內或輸入文字,請輸出【error】。`

----
#### JAVA 語言 309 階乘遞迴計算【遞迴版-解答】
---

----
#### JAVA 語言 309 階乘遞迴計算【迴圈版-解答】
---

----
<!-- .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

----
#### JAVA 語言 310 遞迴函數【遞迴版-解答】
---

---
# 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" -->
| 程式碼 | 結果 |
| -------- | ------------ |
|  |  |
----
<!-- .slide: data-transition="zoom-in" -->
#### `格式化輸出 DateTimeFormatter`
| 程式碼 | 結果 |
| -------- | ------------ |
|  |  |
----
<!-- .slide: data-transition="zoom-in" -->
#### `格式化解析 LocalDate.parse()`
| 程式碼 | 結果 |
| -------- | ------------ |
|  |  |
##### <font color="#FFD306">`LocalDate.parse() 預設只能解析 yyyy-MM-dd 格式,若格式不同,需使用 DateTimeFormatter`</font>
----
<!-- .slide: data-transition="zoom-in" -->
#### `計算日期差 ChronoUnit`
| 程式碼 | 結果 |
| -------- | ------------ |
|  |  |
----
## 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】。`

----
#### JAVA 語言 401 顯示輸入日期【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 402 計算時間差
---
#### 設計說明:
###### `請撰寫程式,讓使用者輸入兩個8位數的整數作為日期,計算二者相差的天數並輸出其絕對值,若輸入文字或無法轉換,請輸出【error】。`
###### `提示: 自定義宣告 LocalDate.of(year, month, day) 時若日期不合法,會拋出 Exception。`

----
#### JAVA 語言 402 計算時間差【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 403 會議時間
---
#### 設計說明:
###### `請撰寫程式,讓使用者輸入一個含有西元年、月、日、時、分的會議時間,判斷與專案中定義好的會議是否有重疊並將結果輸出,如會議時間重疊,顯示如【Has already reserved - yyyy/MM/dd HH:mm】(將被重疊的會議時間代入);如會議時間未重疊,顯示如【Reservation completed - yyyy/MM/dd HH:mm】(將新的會議時間代入)。`

----
#### JAVA 語言 403 會議時間【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 404 上週起迄日期
---
#### 設計說明:
###### `請撰寫程式,讓使用者輸入一個8位數的整數作為日期,計算並輸出此日期的上週起迄日,輸出格式如【xxxx/xx/xx-yyyy/yy/yy】(-及/皆為半形符號),以星期一為第一天,星期日為最後一天。若輸入的日期剛好是星期日,則此星期日為上週起迄日的最後一天。若輸入文字或無法轉換,請輸出【error】。`

----
#### JAVA 語言 404 上週起迄日期【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 405 星座
---
#### 設計說明:
###### `請撰寫程式,讓使用者輸入一個 8 位數的整數作為日期,輸出該日期所屬星座的英文名稱。若輸入文字或無法轉換,請輸出【error】。`


----
#### JAVA 語言 405 星座【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 406 亂數
---
#### 設計說明:
###### `請撰寫程式,輸入一個1-100的數值做為亂數種子,請檢查不可超出1-100的邊界,否則輸出【error】。取得10個不重複亂數並輸出,輸出格式如【10 20 33 90 88 19 35 87 91 45 】,數字間以半形空格隔開。`

----
#### JAVA 語言 406 亂數【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 407 隨機抽樣工作日
---
#### 設計說明:
###### `請撰寫程式,輸入一個2000-2018之間的數值,請檢查不可超出2000-2018的邊界。此數值做為西元年份及亂數種子,取得一個工作日日期並輸出,工作日定義是週一至週五,輸出格式如:【2018/09/21】。使用random.nextInt函式從1月1日和12月31日中隨機產生一個日期,若產生日期不爲工作日,則輸出下週一。`

----
#### JAVA 語言 407 隨機抽樣工作日【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 408 轉換工時數
---
#### 設計說明:
###### `請撰寫程式,讓使用者輸入工作總時數,輸入格式為時:分,時與分之間以一半形冒號隔開。一天工時為8小時,請依總工時計算,並輸出工作天數、小時、分鐘,如【2d:4h:0m】,中間以一個半形冒號分隔。若輸入文字或非法時間,請輸出【error】。`

----
#### JAVA 語言 408 轉換工時數【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 409 計算日期差距
---
#### 設計說明:
###### `請撰寫程式,讓使用者輸入兩個8位數的整數,第一個做為出生日期、第二個做為當天日期。計算此兩個日期之間的日期差距,輸出年齡如【6y:1m:23d】,分別將計算後的年、月、日代入。若輸入文字、無法轉換或出生日期大於當天日期等,請輸出【error】。`

----
#### JAVA 語言 409 計算日期差距【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 410 生日人數
---
#### 設計說明:
###### `請撰寫程式,讓使用者輸入月份n,其中專案中已定義名為birthday的陣列,代表多位員工的出生日期。請判斷n月有幾位員工生日,並輸出生日人數。若輸入文字或非法月份,請輸出【error】。`

----
#### JAVA 語言 410 生日人數【解答】
---

---
# 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));
```
| 程式碼 | 結果 |
| -------- | ------------ |
|  |  |
----
<!-- .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" -->
#### `逐行讀取所有檔案內容`
---

----
<!-- .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" -->
#### `添加檔案內容`
---

---
## 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】。`

----
#### JAVA 語言 501 讀取文字資料【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 502 寫入資料至文字檔
---
#### 設計說明:
###### `請撰寫程式,讓使用者輸入任意資料(單行),輸出使用者的輸入內容並寫入至write.txt檔案中,每一次皆覆蓋上一次的資料,若輸入空值,請輸出【error】,不進行資料寫入。請使用print()方法,從write.txt中讀出檔案內容並輸出【write:xxx】。`

----
#### JAVA 語言 502 寫入資料至文字檔【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 503 取得文字檔長度
---
#### 設計說明:
###### `請撰寫程式,讓使用者輸入一個正整數n(1≦n≦6),專案中已定義名為data的陣列,陣列中有六個元素,將前n個元素的內容寫入write.txt檔案中,每一個元素各自一列。若輸入文字或不在範圍內的數字,請輸出【error】。`

----
#### JAVA 語言 503 取得文字檔長度【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 504 文字檔資料新增
---
#### 設計說明:
###### `請撰寫程式,讓使用者輸入三個成績(成績之間,以一個半形空格分隔,且0≦成績≦100),將專案中名為new_student的陣列改成以半形逗號分隔的字串,結合同樣以半形逗號分隔的三個成績字串,以附加的方式寫入write.txt檔案中並輸出。若輸入文字、成績未在0~100之間,或輸入格式不合規定的資料,請輸出【error】。`

----
#### JAVA 語言 504 文字檔資料新增【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 505 成績搜尋
---
#### 設計說明:
###### `請撰寫程式,讀取read.txt檔案內容,內含13位學生的資料,每列資料以逗號隔開,後三個數字代表學生成績,讓使用者輸入總成績的條件,判斷並輸出檔案中符合條件有幾名學生、學生姓名及總成績,需分行顯示。可使用的比較運算子包括>、<、=、>=、<=,若輸入不合規定的資料,請輸出【error】。`

----
#### JAVA 語言 505 成績搜尋【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 506 刪除文字資料
---
#### 設計說明:
###### `專案目錄已提供read.txt,內含13位學生的資料,每列資料以半形逗號隔開,第一欄的數字代表編號。請撰寫程式,輸入如1-13的數字,再將該數字代表的資料予以刪除,其餘未刪除之資料寫入write.txt,並輸出如【Delete:1 Nancy】。若輸入文字或不在指定範圍的數字,請輸出【error】。`

----
#### JAVA 語言 506 刪除文字資料【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 507 尋找字串資料
---
#### 設計說明:
###### `專案目錄已提供re請撰寫程式,讀取read.txt檔案內容,讓使用者輸入一個英文單字,輸出此單字在read.txt中出現的次數。`

----
#### JAVA 語言 507 尋找字串資料【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 508 計算平均成績
---
#### 設計說明:
###### `請撰寫程式,讀取read.txt檔案內容,read.txt內含十位學生的資料,第二個欄位是身份證號,後三個欄位是成績。使用者先輸入一個正整數1~10,表示要計算前幾筆的平均成績,並依照男生女生分別計算。輸出筆數中所有男生及女生的平均成績,中間以一個半形逗號分隔,顯示如【boys:xx,girls:yy】。平均成績計算方式使用整數除法。`

----
#### JAVA 語言 508 計算平均成績【解答】
---

----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 509 尋找及排序資料
---
#### 設計說明:
###### `請撰寫程式,讀取read.txt檔案內容,內含22位學生的資料,第一個欄位代表序號,目前檔案中沒有按照序號排列。使用者輸入一個正整數n(n≧5),從read.txt檔案內容中,搜尋出序號1-n的學生資料,按序號由小而大寫入write.txt檔案中,檔案寫入完成後要關閉。若輸入文字或不在指定範圍的數字,請輸出【error】。若該數超出總筆數,則該數指定為總筆數。`

----
#### JAVA 語言 509 尋找及排序資料【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
----
<!-- .slide: data-transition="zoom-in" -->
## JAVA 語言 510 寫入至文字檔
---
#### 設計說明:
###### `請撰寫程式,讓使用者輸入一個正整數n(n≦7),專案已提供title及content兩個變數,分別代表一篇短文的標題及內容。content以英文句號「.」分段並分行,取出content前n段的內容寫入write.txt檔案中。輸入空值(長度為0的字串)或大於7的數字,表示寫入全部資料;若輸入文字或不在指定範圍的數字,請輸出【error】。`

----
#### JAVA 語言 510 寫入至文字檔【解答】
---

---
# 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" -->
### `物件導向程式設計`
---

----
<!-- .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)`
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
###### `由於 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)`
| 程式碼 | 結果 |
| -------- | ------------ |
|  |  |
###### `當不寫任何建構子時,`<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 |
| -------- | ------------ |
|  |  |
###### `如果寫了很多建構子提供多元的建構物件方式,建構子之間彼此可以用 this(.) 互相呼叫,讓已經寫好的程式可以被充分的再利用`
----
#### `繼承(Inheritance)`
| Main | 結果 |
| -------- | ------------ |
|  |  |
###### `利用 super(.) 可以呼叫父類別中定義好相應參數的建構子,很多時候父類別已經定義好的東西,子類別直接用就好,設計上比較好維護`
----
<!-- .slide: data-transition="zoom-in" -->
#### `多型-多載(Overload)`
| 程式碼 | 結果 |
| -------- | ------------ |
|  |  |
###### `同一個方法(Method)會依據它的`<font color="#FFD306">`參數值(輸入值)的「型態」、「數量」,甚至「順序」的不同,自動選擇對應的定義`</font>`,執行不同的敘述,輸出不同的結果。`
----
<!-- .slide: data-transition="zoom-in" -->
#### `多型-覆寫(Override)`
| 程式碼 | 結果 |
| -------- | ------------ |
|  |  |
###### `多型(Polymorphism)在物件導向程式設計的概念中,`<font color="#FFD306">`利用父類別提供的方法呼叫,讓子類別可以有自己特有的行為`</font>`。`
----
<!-- .slide: data-transition="zoom-in" -->
#### `抽象(Abstract)類別與方法`
| 上半 | 下半 | 結果 |
| -------- | -------- | -------- |
|  |  |  |
###### `利用`<font color="#FFD306">`關鍵字「abstract」在抽象父類別預先宣告抽象方法,但是把內部的實作的工作交給其他繼承類別來做`</font>`。可以說抽象類別就是用來「被繼承」的。`
----
<!-- .slide: data-transition="zoom-in" -->
#### `介面(Interface)`
| 上半 | 下半 | 結果 |
| -------- | -------- | -------- |
|  |  |  |
###### `一般在介面中不實作任何東西只提供框架,介面的方法都是抽像 (abstract) 且公開 (public) 的,如要用預設方法時須加上關鍵字「default」表示。利用`<font color="#FFD306">`關鍵字「implements」在子類別實作介面。`</font>
----
<!-- .slide: data-transition="zoom-in" -->
#### `介面(Interface)`
| 上半 | 下半 | 結果 |
| -------- | -------- | -------- |
|  |  |  |
###### <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)-存取權限類比較表`
---

----
#### `修飾詞(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)`
| 程式碼 | 結果 |
| -------- | ------------ |
|  |  |
###### `列舉是種`<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(清單)`
| 程式碼 | 結果 |
| -------- | ------------ |
|  |  |
###### `需注意新增元素及存取元素的方式與一般 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 汽車零件設計
---

----
#### JAVA 語言 601 汽車零件設計【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
----
<!-- .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 汽車外觀設計
---

----
#### JAVA 語言 602 汽車外觀設計【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
----
<!-- .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 員工薪資計算
---

----
#### JAVA 語言 603 員工薪資計算【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  | |
----
<!-- .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 薪資總計
---

----
#### JAVA 語言 604 薪資總計【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
----
<!-- .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"。`

----
#### JAVA 語言 605 員工資料介面【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
----
<!-- .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 銀行帳戶設計
---

----
#### JAVA 語言 606 銀行帳戶設計【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  | |
----
<!-- .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 銀行定期存款設計
---

----
#### JAVA 語言 607 銀行定期存款設計【解答】
| 上半 | 中段 | 下半 |
| -------- | -------- | -------- |
|  |  |  |
----
<!-- .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 航空包裏運費計算
---

----
#### JAVA 語言 608 航空包裏運費計算【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
----
<!-- .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 員工差假介面設計
---

----
#### JAVA 語言 609 員工差假介面設計【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
----
<!-- .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 電腦零件設計
---

----
#### JAVA 語言 610 電腦零件設計【解答】
| 上半 | 下半 |
| -------- | ------------ |
|  |  |
{"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}]"}