Java programing Java programing

Java 程式設計上課教材

Java 程式設計上課教材 > 課程內容 > 第 5 堂課 - 邏輯運算與選擇初探

第 5 堂課 - 邏輯運算與選擇初探

上次更新日期 2018/08/09

前一章我們談到了一些運算子,尤其是在布林值的設計上,以及一些基本的選擇功能。這一章我們會來加強一下這些基礎。 當然啦,某些多重選擇就得要了解與熟悉一下。另外,學工程或設計都一樣,我們需要有『流程圖』的概念, 這一章節我們也來嘗試畫一下流程圖吧!

  • 5.0: 英打練習與上週作業執行
  • 5.1: 複習邏輯運算
  • 5.2: 基礎流程控制圖示 - Draw.io
  • 5.3: 再探 if 指令
  • 5.4: 課堂練習
  • 5.5: 參考資料
  • 5.6: 課後練習

5.0: 英打練習與上週作業執行

資訊科技的技術,如果不是老闆,生產力人員 (就是你我) 通常不會只使用手持式裝置,至少會使用到各式鍵盤。因此,打字就非常重要, 好的打字速度帶你上天堂,差的打字速度讓你呆成糖 (蟲的台語,慢吞吞之意)!關於打字練習的重要注意事項請參考第 0 堂課的說明, 同時,請花 10 分鐘完成第 0 堂課的英文打字練習。完成之後,請打開你的 notepad++ 軟體,輸入底下的字串喔!

import java.util.Scanner;↵
public class one2two {↵
	public static void main (String args[]) {↵
		Scanner input = new Scanner ( System.in );↵
		System.out.print ("請輸入 a b c (ex> 1 2 0): ");↵
		double a = input.nextDouble();↵
		double x1 = 0, x2 = 0;↵
		String vbmesg = "";↵
		if ( check > 0 ) {↵
			vbmesg = "有兩個解答, 分別是: " + x1 + " 以及 " + x2;↵
		} else if ( check == 0 ) {↵
			vbmesg = "有一個解答, 她就是: " + x1;↵
		} else {↵
			vbmesg = "沒有解答耶~";↵
		}↵
		System.out.println ( vbmesg );↵
	}↵
}↵

你不需要複製貼上,這單純是要讓你的打字速度變快!所以不要太緊張!練習就對了!沒練習完畢?沒關係,有空繼續練習即可!

  • 上週作業的執行

請從 class.vbird.tw 上面下載你上週的作業 java 文字檔,然後先行編譯成功後,等待老師過來查閱是否編譯成功與執行成功! 若執行成功,在你的作業成績會打 v !

5.1: 複習邏輯運算

將前一章的資料稍微複習一下,因為選擇就是使用 if 這個指令,既然要來了解這個指令,就得要從它的條件判斷講起! 既然是條件判斷,自然就是得要有邏輯運算囉!回想一下前一章的資料:

  • 邏輯運算就是答案為『對的』或『錯的』運算

對的或錯的 (true or false) 的推算,就是邏輯運算的基本概念!而基本的邏輯運算用在數值型態的推算,當然就是大於、小於、等於這些運算子! 因此,你得要知道運算子是啥!好佳在,上一節課講過了,你得要注意到的是:

  • N1 > N2
  • N1 >= N2
  • N1 < N2
  • N1 <= N2
  • N1 == N2
  • N1 != N2

這些邏輯運算的結果只會告訴你『對的』或『錯的』,而不是回報給你一些數值哩!例如正常的四則運算回答你的是 7*7 = 49 這樣的數據, 邏輯判斷則是 ( 7 < 8 ) 會回答『對的 (true) 』這樣而已喔!至於答對或答錯之後要做什麼?這就是選擇的任務了!

  • 多重條件、多重邏輯運算判斷

前一章節我們也曾經談過 ASCII 數值對應文字圖形的題型,我們想要知道英文大寫,則數值只能輸入在 65 到 90 之間,超過就不是 26 個英文大寫的範圍內了。那麼你的數值就得要同時符合大於等於 65 及小於等於 90 這兩個條件,這就是多重邏輯運算! 要達成這個功能,假設你的變數為 i 時,就得要寫成:

  • ( i >= 65 && i <=90 )

這就是多重條件判斷式!基本的多重條件判斷就是底下這兩個囉!

  • (case1) && (case2) :兩者同時成立,亦即 and 的意思
  • (case1) || (case2) :一個成立即可,亦即 or 的意思
  • 反向選擇的條件

有些時候我們需要的是『做錯的事情才是正確的選擇』...什麼鬼?例如,我今天正確的選擇是,不要去上班!所以,不要去,就是對的!這樣的意思。 不要去當然是 false 啊~但是我就是不要去 (才選擇),此時,可以使用 !(case) 的方式來處理。

將 unit04_3_3.java 另存新檔為 unit05_1_1.java,之前我們在第四章為了理解 (N1 == N2) 的技巧,所以使用了 ( on_off == true ) 的語法,事實上, true 的判斷可以直接透過 (on_off) 即可!另外,如果是 (on_off==false) 的話, 也能夠直接透過 ( ! on_off ) 來處理即可!這是布林值變數的特性!
  • 將 (on_off==true) 與 (on_off==false) 進行改寫,讓改寫後的布林值,不需要含有等號!
  • 編譯並執行需要成功才可以!
  • 防呆測試

人有的時候還是會呆的!所以才需要防呆!以第四堂課的最後一個判斷標準體重的情況來說,一般台灣成年人要高於 200 公分,或低於 100 公分是有點難的! 因此,如果友人給妳輸入 300 公分高,或者是 10 公分高 (又不是拇指姑娘....),這時你就要跟她講,臭小子!亂填寫!對吧~ 此時,你需要的是 ( weight < 100 || weight > 200) 這樣的組合判斷!

將 unit04_weight.java 另存新檔為 unit05_1_2.java,在最後增加一個判斷式,如果使用者輸入的資料高於 200 或低於 100 時, 顯示的訊息就變成『不要故意耍白痴』類似這樣的文字喔!
  • 增加一個名為類似 mymesg 之類的字串,將所需要輸出的訊息帶入其中。
  • 增加一個多重選擇 (if) ,身高高於 200 或低於 100 任何一個成立,就顯示錯誤。
  • 將 mymesg 顯示到彈出式視窗裡面!

這個就是初步防呆~可以預防使用者亂填一些錯誤的數值!

5.2: 基礎流程控制圖示 - Draw.io

你一定有聽過所謂的流程圖,這玩意兒是什麼呢?簡單的說,他就是將你需要進行選擇時,通過不同的選擇進入不同的路途, 對於程式設計就會比較方便了!有沒有相關的情境呢?有的,當你要去盥洗室時,在門口就得要判定你是男生還是女生吧 (當然還有多元廁所), 根據你自己的定義,選擇入口,就會有不同的廁所來使用~類似這樣的情境囉!同樣是有箭頭的啦!

  • 第一個手繪流程圖

回頭參考一下 unit05_1_1.java 這個程式碼,當使用者選擇啟動或關閉電源,螢幕就單純顯示啟動或關閉的訊息。 如果要繪製成流程圖來理解程式碼的運作行為,你可以快速的使用手繪的方式來處理,如下圖所示:

手繪流程圖

根據上面的手繪圖示,你會知道事實上程式的差異在菱形的方塊上,可以選擇是與否 (對的或錯的, true or false),然後就會有不同的訊息設定, 最終都是透過同一個輸出界面,只是訊息內容不一樣而已。這樣也很容易設計你的程式碼哩!

  • 圖形與代表意義

仔細看到上面的手繪圖示,為什麼不是每個項目都使用『方塊』就好,竟然會有不同的圖示!怎麼回事呢?事實上,不同的動作會有不一樣的圖示! 例如菱形是判斷選擇,方塊是程序處理等等。基本的圖形定義如下圖所示:

圖示與意義

目前我們所學到的程式碼當中,用最多的當然就是菱形、方塊與輸出而已,未來如果有其他的功能,再將其他的圖示帶入流程圖繪製當中即可。 好了,可以用手繪的~但是,像鳥哥的字這麼醜怎麼辦?當然可以用軟體來繪製啊~那麼有啥軟體可以使用呢?有的!在 Windows 上面可以購買強力的 Visio 軟體, 該軟體非常好用了!不過,我們想要講一個免費的自由軟體,稱為 Dia 的軟體來實驗看看:

  • Dia 軟體初體驗

一般繪製流程圖,你可能會有聽過 visio 這套軟體,該軟體是微軟所開發,確實很不錯用。不過,如果你不想要花錢,而且只是單純的繪製流程圖而已, 那麼推薦你可以使用單機版的 Dia 這套軟體即可。這套軟體不需要購買就能夠使用,因為他是自由軟體,所以也有 GNU 的 GPL 授權保護!相當棒不是嘛! 他的官網在底下的連結,你可以自己點選自己安裝該軟體即可。

鳥哥下載的是 0.97.2 版本,直接下載並安裝即可。比較可惜的是,安裝過程只有簡體中文版本,不過安裝完畢後,倒是可以顯示正常的繁體中文~ 還 OK !安裝完畢並且順利啟動之後,會出現如下的圖示:

Dia 的使用

如上,按下基本圖形的三角形之後,會有其他的可以選擇的圖樣來應用。假設我們需要的是流程圖,按下三角形,選擇流程圖即可。 現在,讓我們來繪製上面手繪流程圖的那張圖表~首先,選擇類似橢圓形的圖案,按一下左鍵,然後到右邊的圖面上面拉動,就能夠產生橢圓形, 之後立刻可以在該圖案上面寫字。讓我們填寫『開始』兩個字即可,如下所示:

Dia 的使用

你可以依據上圖的畫面依序挑選各個元件來處理。比較重要的是,如果需要輸入中文,他對中文的支援度怪怪的~你可以在輸入法 (箭頭 5 號) 的地方, 直接選擇『沒有』那個項目,就能夠輸入中文!我覺得這實在是很奇怪的一項設定...不管了!接下來,請依據相同的情況,設計好其他的圖示! 最終圖示會像底下這樣:

Dia 的使用

完成上述的圖示之後,接下來,你可以參考下圖,直接使用左側的連結樣板,直接在兩個圖框之間拉動,就能夠將兩者的圖示連結在一起! 最終的結果就如下所示囉:

Dia 的使用

完成之後,除非未來你還要修改這個檔案,否則還不用儲存哩!只要處理『檔案』-->『匯出』,然後如下圖的樣式,選擇正確的資料即可匯出囉:

Dia 的使用

最終匯出的結果就會有點像底下的圖示囉:

Dia 的使用
  • 全網頁功能: Draw.io

如果你覺得 dia 有點麻煩,用起來還不是這麼順手的話,那麼可以考慮使用全網頁設計的流程圖繪製網站,連結在底下:

點選上面的連結之後,會出現類似如下的圖示:

Draw.io 的使用

點選上圖中右下角的 Language 圖示或文字,就能夠出現挑選語系的結果,請選擇繁體中文,之後重新載入畫面一次,就會有中文的畫面產生! 中文畫面的示意圖如下所示:

Draw.io 的使用

如上圖所示,請點選『裝置』的畫面,因為我們的資料預計儲存到本機,除非你要連結到 google drive,否則用這個裝置即可!按下之後會出現如下畫面:

Draw.io 的使用

從來沒用過,所以直接點選上圖的『新增圖表』即可,按下新增圖表之後,就會出現如下的畫面,等待你選擇所需要的繪製功能。

Draw.io 的使用

我們先嘗試繪製流程圖,因此,請點選左側『流程圖』,然後點選右側的任何一個畫面均可,之後就會進入到開始編輯的畫面中, 編輯畫面如下所示:

Draw.io 的使用

事實上 draw.io 提供了不少的樣本圖示給我們使用,我們選擇左側的畫面到『流程圖』的欄位上,就會看到許多流程圖的樣板圖示, 按下樣板圖示的圖之後,用拖曳的方式就能夠拖曳到右邊空白的畫布上,然後點選兩下圖示,就能夠輸入文字!相當的方便! 另外,畫面上方的工具列當中,有個連結圖樣,按下他,就能夠選擇直線或連結線來連結兩個圖示,同時在線上面點選兩下,也能夠輸入文字, 如下圖所示,菱形出現的兩個線段,就能夠填寫『是』與『否』的字樣了!

Draw.io 的使用

完成了上述的功能之後,再來則是需要進行檔案儲存的任務。這個 draw.io 還挺有趣的,除了可以直接存取各個裝置上面的資料,還能夠使用簡單的『下載』, 直接將圖示下載到本機上而已~請點選左上角『檔案』,然後選擇『匯出為』,選擇你需要的類型,這邊我們先用 JPEG 的類型來儲存! 如下所示:

Draw.io 的使用

之後會彈出一個視窗,讓你選擇所需要的設定,這邊鳥哥也是使用預設值,只是多了『陰影』的設定,看看結果會不會比較美麗些!

Draw.io 的使用

最終如下直接選擇『下載』即可,就能夠直接儲存不同的檔名囉!

Draw.io 的使用

最終使用 draw.io 繪製的成果如下所示:

Draw.io 的使用

鳥哥個人認為使用 chrome 瀏覽器搭配 draw.io 要比 Dia 還要更簡單、方便、直覺,而且 draw.io 可以透過瀏覽器即可運作, 尤其是 chrome 瀏覽器的支援度挺不賴,可以嘗試看看喔!

5.3: 再探 if 指令

我們在前一章有稍微探討過 if 的用法,這個用法就是簡單的邏輯判斷,也是我們在日常生活裡面經常會在大腦裡面判斷的『選擇』項目。 當然,選擇會有條件,沒有條件就不會是選擇。那條件當然有成立與不成立的結果 (真與假、正確與錯誤、對與錯、true and false), 一般來說,最簡單的 if 如下所示,只有條件成立才進行選擇,否則就不做任何事情。

  • 單一選擇: 條件成立才進行,不成立就略過

簡單的說,圖示有點像底下這樣:

if 條件判斷

再來複習一下基本語法!

if ( true ) {
	procedure...;
}

也就是說,我們使用小括號將條件判斷的功能寫在裡面,然後以區塊 {} 來放入當條件成立 (true) 時,所需要進行的任務。 不過,如果任務太簡單了,只有一條程式碼呢?此時我們可以取消區塊 {} ,直接將程式碼寫出來即可喔!有點像這樣:

if ( true )
	procedure;

你也可以將上述的兩行寫成一行,不過,通常還是建議縮排比較清楚。舉例來說,當你考試完畢取得分數後,老師可能需要跟你講, 你的分數代表什麼意思~基本上就是:

  • 分數 <=20 :你死定了!
  • 20 < 分數 <= 50 :有補考的可能性
  • 50 < 分數 <= 60 :作業有交可能有機會過關
  • 60 < 分數 <= 80 :不要太開心,這是正常分數而已
  • 80 < 分數 :了不起!負責!

因為上述 5 個判斷式我們都只給一個訊息內容 (vbmesg) 而已,最終再透過 System.out.println 秀出來而已!那該如何處理?

  1. 分析問題:讓使用者輸入一個數值,簡單的使用 Scanner 較方便,然後取得該數值後,給予五個判斷式來判斷成績區間,並給予訊息即可。 因為每個判斷式均只有一個程式碼,所以不需要使用區塊 {} 囉!較為簡便。
  2. 解決步驟:要注意,上面的條件判斷是有陷阱的~應該要使用 ( i > 20 && i <= 50 ) 這樣的設定才對!不要被誤導了喔!
    1. 還是需要匯入 java.util.Scanner 這個套件
    2. 宣告類別名稱為 unit05_3_1 (就是檔名)
    3. 開啟方法為 main 的程式
    4. 建立 Scanner 物件,名稱設定為 input 好了,同時透過 nextInt() 取得整數成績
    5. 連續 5 個 if 的選擇判斷,只有一個程式碼,設定好 vbmesg 即可,所以不要使用 { } (本題的特別要求)
    6. 透過 System.out.println 輸出你的成績代表的結果
    7. 關閉 main
    8. 關閉類別
  3. 程式設計:
    if ( res <= 20 )
    	vbmesg = "你死定了!";
    if ( res <= 50 && res > 20 )
    	vbmesg = "有補考的可能性";
    ....
    
  4. 編譯、執行與測試:
    C:\Users\dic\java>java unit05_3_1
    請輸入你的成績: 55↵
    你的成績代表的意思是: 作業有交可能有機會過關
    
    C:\Users\dic\java>java unit05_3_1
    請輸入你的成績: 70↵
    你的成績代表的意思是: 不要太開心,這是正常分數而已
    

我們過去在使用單一條件成立的情況下,即使只有一個程式碼,還是使用區塊 { } 來函蓋,那是比較正統的作法。這個 unit05_3_1.java 則是比較簡易的作法! 大家知道有這個情況即可~事實上還是能使用 { } 啦!

  • 雙向選擇: 是與否都會有行動

就像我們要處理事情總有兩個選擇的意思~基本語法之前也稍微用過,就是如下所示:

if ( true ) {
	procedure...;
} else {
	procedure...;
}

那個 else 可以翻譯做『要不然』的意思,因此中文就變成:

如果 ( 這個條件成立 ) 我就
	procedure...;
要不然的話 我就
	procedure...;
結束這次如果

這樣就容易理解了吧?現在,讓我們來處理一個九九乘法的練習!因為要使用『亂數』來隨機產生一個數值,好讓小朋友可以自己去處理乘法。 但是又怕出現 1 這種簡單的數字,因此我們會嘗試,當找到的數值為 1 的時候,就會變成 2 這樣!至於亂數的產生方式有很多種, 我們先用底下這種方式:

int nu1 = (int)System.currentTimeMillis() % 10 ;
int nu2 = (int)System.currentTimeMillis() / 7 % 10 ;

那個『 System.currentTimeMillis() 』函數會列出從 1970 年 1 月 1 日累積到目前的微秒秒數,是相當小的數值!因為這個數值為目前的時間, 因此會一直變化,所以就能夠作為亂數的來源!另外,由於擔心電腦速度太快,會不容易產生不同的數值,因此,透過第 2 行,來產生一個不同的數字這樣。 此外,還得要判別 nu1 與 nu2 有沒有等於 1 或 0 呢,如果有的話,就得要變成 2 才行!

  1. 分析問題:先讓系統自己透過時間函數產生兩個亂數,且該數值若小於等於 2 的時候,就帶入 2 這樣的整數, 最終讓使用者計算結果,並回報使用者計算的結果是否是正確的!正確就回答『你好棒』,錯誤就回答『神經病!這樣都算錯!』
  2. 解決步驟:
    1. 先匯入 java.util.Scanner 套件
    2. 宣告類別名稱為 unit05_3_2 (就是檔名)
    3. 透過上述的方法找到兩個亂數
    4. 使用兩個選擇 (if) 分別去判斷兩個數值,若小於等於 2 就給予 2 這樣的數值。
    5. 產生 Scanner 物件,名稱設定為 input
    6. 提示使用者輸入乘法的結果為何?並由 nextInt() 取得使用者輸入的結果
    7. 使用 if 判斷使用者輸入的結果是否為正確,若正確就給予正確的回答,錯誤就罵他!
    8. 關閉 main
    9. 關閉類別
  3. 程式設計:其實最後一個 if 判別式比較重要!需要測試一下是否計算正確呢!
    String vbmesg = "";
    if ( nu1 * nu2 == res ) {
    	vbmesg = "你好棒";
    } else {
    	vbmesg = "神經病!這樣都算錯!";
    }
    
  4. 編譯、執行與測試:
    C:\Users\dic\java>java unit05_3_2
    計算你的九九乘法能力:
    4 x 9 = 36↵
    你好棒
    

當你反覆執行上述的指令,就會發現數值會一直變化啊!另外,我們能不能透過 draw.io 將上述的流程先繪製成為流程圖之後,再來處理程式碼的撰寫呢? 可以的!如果依據上一小節的說明,基本上流程圖的繪製結果會有點像底下這樣喔:

流程圖

基本上,在流程圖的方塊中,應該將最重要的程式碼、判斷式等資料加入在其中,這樣未來再依此流程圖反覆造車時,就很容易清楚的找到程式碼的流程與撰寫方式, 會加速你的邏輯判斷依據喔!

  • 多重選擇:巢狀選擇 (if ... else if ...)

某些時刻我們會發現到不是只有一個選擇,而是有多個選擇的機會。舉例來說,程式可能會問你, 你是要計算圓的面積?三角形的面積?還是矩形的面積等等。因為有兩個以上的選擇囉,不是僅有兩個是與否而已。 這個時候要怎麼辦呢?可以使用多個 if 來處理即可啦!基本語法有點像這樣:

if ( 條件一 ) {
	procedure A;
} else if ( 條件二 ) {
	procedure B;
} else if ( 條件三 ) {
	procedure C;
} else {
	procedure D;
}

以上述的程式來說,就一整個判斷式裡面就有四種可能的選擇之意。現在,就以剛剛說的,讓使用者輸入 1~3 這三個數值, 如果輸入 1 則選擇圓形面積,2 就是三角形面積,3 就是矩形面積。如果不是這三個,那就開始罵使用者這樣...

  1. 分析問題:必須要讓使用者知道只可以選擇 1, 2, 3 ,不過因為使用者是用 keyin 的方式輸入,所以需要防呆啊!

  2. 解決步驟:先讓使用者輸入數值,然後開始判斷如果是我們需要的 1, 2, 3 就開始讓使用者輸入相關的圖形數據, 如果不是我們預期的 1, 2, 3 的話,就直接用 System.out.println 去罵人好了
    1. 還是需要讓使用者輸入資料,所以依舊需要匯入 java.util.Scanner;
    2. 宣告類別名稱為 unit05_3_3 (就是檔名)
    3. 開啟方法為 main 的程式
    4. 利用 Scanner 建立名為 input 的物件,並讓使用者輸入 1, 2, 3 等整數值
    5. 透過 input.nextInt() 取得使用者取得的整數值,設定變數名為 select 好了。
    6. 設定 double 型態變數有 area, radius, xline, yline 並且都給予初始值為 0 好了。
    7. 設定字串類型的 vbmesg 訊息內容為空的
    8. 開始 if 的判別式:
      • 如果 select 為 1 時,讓使用者輸入圓形的半徑,並且計算 area 面積,並開始輸出結果
      • 如果 select 為 2 時,讓使用者輸入三角形的底長與高,並計算 area 面積,並設定 vbmesg 訊息
      • 如果 select 為 3 時,讓使用者輸入矩形的底長與高,並計算 area 面積,並設定 vbmesg 訊息
      • 如果以上皆非,就顯示錯誤訊息告知使用者。
    9. 透過 System.out.println 輸出剛剛建立的訊息資料即可
    10. 關閉 main
    11. 關閉類別
  3. 程式設計:其實很簡單!重點在於處理出 vbmesg 的內容而已
    String vbmesg = "";
    double area = 0, radius = 0, xline = 0, yline = 0;
    if ( select == 1 ) {
    	System.out.print ( "請輸入圓形的半徑: " );
    	radius = input.nextDouble();
    	area = 3.14159 * radius * radius;
    	vbmesg = "您選擇圓型,輸入的半徑為 " + radius + " ,所以面積是: " + area;
    } else if ( select == 2 ) {
    	System.out.print ( "請輸入三角形的底長: " );
    	xline = input.nextDouble();
    	System.out.print ( "請輸入三角形的高: " );
    	yline = input.nextDouble();
    	area = xline * yline * 0.5;
    	vbmesg = "您選擇三角形,輸入的底為 " + xline + " ,輸入的高為 " + yline + " ,所以面積是: " + area;
    ....
    System.out.println ( vbmesg );
    
  4. 編譯、執行與測試:執行測試會有底下的執行情況:
    C:\Users\dic\java>java unit05_3_3
    請輸入 1.圓形、2.三角形、3.矩形,我將幫你計算面積喔: 1↵
    請輸入圓形的半徑: 10.3↵
    您選擇圓型,輸入的半徑為 10.3 ,所以面積是: 333.29128310000004
    
    C:\Users\dic\java>java unit05_3_3
    請輸入 1.圓形、2.三角形、3.矩形,我將幫你計算面積喔: 2↵
    請輸入三角形的底長: 10↵
    請輸入三角形的高: 11.5↵
    您選擇三角形,輸入的底為 10.0 ,輸入的高為 11.5 ,所以面積是: 57.5
    
    C:\Users\dic\java>java unit05_3_3
    請輸入 1.圓形、2.三角形、3.矩形,我將幫你計算面積喔: 3↵
    請輸入矩形的底長: 4↵
    請輸入矩形的高: 5↵
    您選擇矩形,輸入的底為 4.0 ,輸入的高為 5.0 ,所以面積是: 20.0
    
    C:\Users\dic\java>java unit05_3_3
    請輸入 1.圓形、2.三角形、3.矩形,我將幫你計算面積喔: 0↵
    喂, 喂, 不要亂選!臭小子!不理你了
    

根據你的選項可以有不同的撰寫方式囉!

在 unit05_3_1.java 的程式設計中,我們使用了 5 個判斷式來處理成績的判斷問題,這是個比較糟糕的解決方案。 如果將 unit05_3_1.java 另存新檔成為 unit05_3_1_new.java ,然後以多重選擇的方式來進行處理,主要程式碼的部份會變成如下的樣式:
if ( res <= 20 )
	vbmesg = "你死定了!";
else if ( res <= 50 )
	vbmesg = "有補考的可能性";
else if ( res <= 60 )
	vbmesg = "作業有交可能有機會過關";
else if ( res <= 80 )
	vbmesg = "不要太開心,這是正常分數而已";
else if ( res > 80 )
	vbmesg = "了不起!負責!";
請設計好你的 unit05_3_1_new 來執行看看有沒有問題!另外,以 draw.io 繪製一下這兩個方法的差異~
  • 直覺判定結果

很多時候我們只是需要進行數值代換而已,例如我要找出最大值,假設最大值變數名稱為 max 而兩個數值分別是 a 與 b 的話, 那找出最大值最簡單的方式是這樣:

if ( a > b ) { 
	max = a ;
} else { 
	max = b ;
}

但是這麼簡單的一個變數疊加功能,似乎不必寫到 5 行程式碼吧!有沒有簡化的方式呢?有的,可以使用如下的語法來處理:

(條件判斷)?運算式A:運算式B;
當條件判斷成功時,運作 A 部份,失敗則運作 B 部份

如果要判斷 max 與 a, b 值,那麼可以使用如下的方式來處理:

max = (a>b)?a:b;

也就是 a > b 成立時, max 會是 a ,否則 max 就是 b 的意思~這樣就抓出最大值了!現在讓使用者輸入三個數值, 然後你幫忙抓出最大最小值囉!

  1. 分析問題:讓使用者輸入三個數值之後,進行找出最大值的行為其實不難,只要透過上述的作法來找到最大值並且予以替換即可。
  2. 解決步驟:
    1. 因為要使用者輸入資料,所以需要匯入 java.util.Scanner 套件
    2. 宣告類別名稱為 unit05_3_4 (就是檔名)
    3. 開啟方法為 main 的程式
    4. 建立名為 input 的 Scanner 物件,並透過 input.nextDouble() 取得三個數值
    5. 使用 max = (a>b)?a:b; 的語法找出最大值
    6. 透過 System.out.println 輸出最大值
    7. 關閉 main
    8. 關閉類別
  3. 程式設計:最主要的程式碼其實只有兩行:
    max = (a1>a2)?a1:a2;
    max = (max>a3)?max:a3;
    
  4. 編譯、執行與測試:
    C:\Users\dic\java>java unit05_3_4
    使用者可以輸入三個數值,然後我幫你找出最大的那個!
    請輸入三個數值,用空格隔開即可: 134 53419 141234↵
    這三個數值最大的是: 141234.0
    

因為我們還沒有使用到迴圈與陣列,所以這裡只能少部份的判斷出最大、最小值而已,未來就可以透過所謂的泡沫排序法, 依序找到一串數列的大小排序囉!

5.4: 課堂練習

程式這東西就是要多練習!所以,大家來練一練底下的題目吧!

  • 讓程式判斷使用者輸入的最大、最小與平均值

其實是 unit05_3_4.java 的變形,上述題目僅有找出最大值 (max),這裡需要最小 (min) 與平均 (ave) 的數值而已。 平均很容易計算啊!加總後除以 3 即可,最小值與最大值透過同樣的情況處理即可喔!當程式執行之後,會出現如下的類似畫面:

C:\Users\dic\java>java unit05_4_1
使用者可以輸入三個數值,然後我幫你找出最大/最小/平均值
請輸入三個數值,用空格隔開即可: 1332 1343 1532↵
這三個數值最大的是: 1532.0
這三個數值最小的是: 1332.0
這三個數值的平均是: 1402.3333333333333
  • X, Y 座標象限判斷

我們未來在繪製動畫圖形或者網頁圖形的時候,都會用到座標系統。而 XY 座標系統有所謂的原點 (0, 0) 以及在座標軸上面的點, 當然還有所謂的四大象限 (1, 2, 3, 4),如下所示。

XY 座標軸

開發一隻程式,要求使用者輸入兩個值 ( x, y ),然後你的程式將根據使用者的輸入,去判斷是否為 (1)原點 (2)X座標軸 (3)Y座標軸 (4)第幾象限? 因為同時牽涉到 X 與 Y 軸座標,所以你得要使用 && 來設計喔!最終程式執行會有點像這樣:

C:\Users\dic\java>java unit05_4_2
請您輸入座標軸的 X 與 Y 座標點,我來查詢該點在第幾象限
請輸入 X 與 Y (ex> 15 10): 13 0↵
這個座標點 (13.0, 0.0) 位於: 這個點在 X 軸上

C:\Users\dic\java>java unit05_4_2
請您輸入座標軸的 X 與 Y 座標點,我來查詢該點在第幾象限
請輸入 X 與 Y (ex> 15 10): 3 3↵
這個座標點 (3.0, 3.0) 位於: 這個點在第 1 象限

C:\Users\dic\java>java unit05_4_2
請您輸入座標軸的 X 與 Y 座標點,我來查詢該點在第幾象限
請輸入 X 與 Y (ex> 15 10): 3 -3↵
這個座標點 (3.0, -3.0) 位於: 這個點在第 4 象限
  • 計算一元二次方程式的求解公式

國、高中都會教到一元二次方程式,就是類似『 ax2 + bx + c = 0 』,其中 a, b, c 都是已知數, x 則是未知數, 在此情況下,如何求到 x 的解?!這就是重點。一般來說,我們忽略推導公式的話,都會得到底下的解:

一元二次方程式的解

小的時候我們都知道,根號裡面理論上不能是負值,如果是負值,就會變成虛根,小時候哪知道啥是虛根...咦!現在也不知道~ 沒關係~反正,我們知道 b2-4ac 不能是負值就對了!那如果是 0 呢?就會變成一個解~如果是大於 0 ,就是會是兩個解。 例如 x2 + 2x + 1 = 0 ,帶入公式就會得到 b2-4ac = 22 - 4*1*1 = 0,因此得到 x = -b/(2a) = -2/2 = -1 這樣!

那如果是『 x2 + 2x + 0 = 0 』時,那麼 b2-4ac = 22 - 4*1*0 = 4,所以解得到 x = (-b ± (b2-4ac)0.5)/(2a) = (-2 ± (4)0.5)/2 = (-2 ± 2)/2 = 0 or -2 這樣的解法。

現在,請讓使用者輸入 a, b, c 三個數值,然後你的程式將會 (1)判斷是否有解,若無解則顯示無解若有解則 (2)判斷是一個還是兩個解,如果是一個,就寫出該解答 (3)如果是兩個解,就請輸出兩個解答!最終執行的結果會有點像這樣:

C:\Users\dic\java>java unit05_4_3
我會幫忙解 ax^2 + bx + c = 0 ,請依序輸入 a, b, c 這三個數值:
請輸入 a b c (ex> 1 2 0): 1 2 0↵
有兩個解答, 分別是: -2.0 以及 0.0

C:\Users\dic\java>java unit05_4_3
我會幫忙解 ax^2 + bx + c = 0 ,請依序輸入 a, b, c 這三個數值:
請輸入 a b c (ex> 1 2 0): 30 1 2↵
沒有解答耶~

C:\Users\dic\java>java unit05_4_3
我會幫忙解 ax^2 + bx + c = 0 ,請依序輸入 a, b, c 這三個數值:
請輸入 a b c (ex> 1 2 0): 1 30 2↵
有兩個解答, 分別是: -29.93318452306808 以及 -0.06681547693192158

C:\Users\dic\java>java unit05_4_3
我會幫忙解 ax^2 + bx + c = 0 ,請依序輸入 a, b, c 這三個數值:
請輸入 a b c (ex> 1 2 0): 1 2 1↵
有一個解答, 她就是: -1.0

5.5: 參考資料

5.6: 課後練習

先查閱 1.3 小節的介紹,了解雲端系統的登入、繳交資料檔名等等的設計,然後再繼續底下的習題。 最終要上傳的檔案有:

  • unit05-4070CXXX-你的名字.docx
  • unit05_bmi.java (純文字檔)
  • unit05_planet.java (純文字檔)
  1. 完成上課的習題內容回答:
    1. 條件判斷『 if ( on_off == true ) 』可以簡化為什麼樣式?寫下語法
    2. 有個程式碼如下,請簡化該程式碼
      if ( myres == false ) {
      	System.out.println ("this is error message");
      } else {
      	System.out.println ("this is all write message");
      }
      
    3. 請以 draw.io 繪製 unit05_3_3.java 的流程圖分析:
  2. 根據 BMI 以及 unit04_4_2.java 的說明,讓使用者輸入身高後,主動計算出 BMI,並且告知使用者他是標準、太輕還是太重喔! 當使用『 java unit05_bmi 』時,會出現如下的結果:
    計算 BMI 計算 BMI 計算 BMI
    計算 BMI 計算 BMI 計算 BMI
  3. 根據維基百科所載,地球、火星、木星的半徑大約是: 6373km, 3390km, 69911km,我們知道球體的體積的算法為: ( 4/3 * π * R3 ),寫一隻程式,當使用者輸入 1, 2, 3 時,分別顯示地球、火星、木星的半徑與體積! 執行『 java unit05_planet 』時,會有點像底下的模樣:
    C:\Users\dic\java>java unit05_planet
    你想知道的星球特性: 1. 地球, 2. 火星, 3. 木星
    輸入 1, 2, 3 (ex> 1): 1↵
    你想看地球: 半徑: 6373.0, 體積為: 8.131698376925961E11
    
    C:\Users\dic\java>java unit05_planet
    你想知道的星球特性: 1. 地球, 2. 火星, 3. 木星
    輸入 1, 2, 3 (ex> 1): 2↵
    你想看火星: 半徑: 3390.0, 體積為: 1.2239075122820999E11
    
    C:\Users\dic\java>java unit05_planet
    你想知道的星球特性: 1. 地球, 2. 火星, 3. 木星
    輸入 1, 2, 3 (ex> 1): 3↵
    你想看木星: 半徑: 69911.0, 體積為: 1.0734604513404982E15
    
    C:\Users\dic\java>java unit05_planet
    你想知道的星球特性: 1. 地球, 2. 火星, 3. 木星
    輸入 1, 2, 3 (ex> 1): 4↵
    看屁啦!