第 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) 的方式來處理。
- 將 (on_off==true) 與 (on_off==false) 進行改寫,讓改寫後的布林值,不需要含有等號!
- 編譯並執行需要成功才可以!
- 防呆測試
人有的時候還是會呆的!所以才需要防呆!以第四堂課的最後一個判斷標準體重的情況來說,一般台灣成年人要高於 200 公分,或低於 100 公分是有點難的! 因此,如果友人給妳輸入 300 公分高,或者是 10 公分高 (又不是拇指姑娘....),這時你就要跟她講,臭小子!亂填寫!對吧~ 此時,你需要的是 ( weight < 100 || weight > 200) 這樣的組合判斷!
- 增加一個名為類似 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 !安裝完畢並且順利啟動之後,會出現如下的圖示:
如上,按下基本圖形的三角形之後,會有其他的可以選擇的圖樣來應用。假設我們需要的是流程圖,按下三角形,選擇流程圖即可。 現在,讓我們來繪製上面手繪流程圖的那張圖表~首先,選擇類似橢圓形的圖案,按一下左鍵,然後到右邊的圖面上面拉動,就能夠產生橢圓形, 之後立刻可以在該圖案上面寫字。讓我們填寫『開始』兩個字即可,如下所示:
你可以依據上圖的畫面依序挑選各個元件來處理。比較重要的是,如果需要輸入中文,他對中文的支援度怪怪的~你可以在輸入法 (箭頭 5 號) 的地方, 直接選擇『沒有』那個項目,就能夠輸入中文!我覺得這實在是很奇怪的一項設定...不管了!接下來,請依據相同的情況,設計好其他的圖示! 最終圖示會像底下這樣:
完成上述的圖示之後,接下來,你可以參考下圖,直接使用左側的連結樣板,直接在兩個圖框之間拉動,就能夠將兩者的圖示連結在一起! 最終的結果就如下所示囉:
完成之後,除非未來你還要修改這個檔案,否則還不用儲存哩!只要處理『檔案』-->『匯出』,然後如下圖的樣式,選擇正確的資料即可匯出囉:
最終匯出的結果就會有點像底下的圖示囉:
- 全網頁功能: Draw.io
如果你覺得 dia 有點麻煩,用起來還不是這麼順手的話,那麼可以考慮使用全網頁設計的流程圖繪製網站,連結在底下:
點選上面的連結之後,會出現類似如下的圖示:
點選上圖中右下角的 Language 圖示或文字,就能夠出現挑選語系的結果,請選擇繁體中文,之後重新載入畫面一次,就會有中文的畫面產生! 中文畫面的示意圖如下所示:
如上圖所示,請點選『裝置』的畫面,因為我們的資料預計儲存到本機,除非你要連結到 google drive,否則用這個裝置即可!按下之後會出現如下畫面:
從來沒用過,所以直接點選上圖的『新增圖表』即可,按下新增圖表之後,就會出現如下的畫面,等待你選擇所需要的繪製功能。
我們先嘗試繪製流程圖,因此,請點選左側『流程圖』,然後點選右側的任何一個畫面均可,之後就會進入到開始編輯的畫面中, 編輯畫面如下所示:
事實上 draw.io 提供了不少的樣本圖示給我們使用,我們選擇左側的畫面到『流程圖』的欄位上,就會看到許多流程圖的樣板圖示, 按下樣板圖示的圖之後,用拖曳的方式就能夠拖曳到右邊空白的畫布上,然後點選兩下圖示,就能夠輸入文字!相當的方便! 另外,畫面上方的工具列當中,有個連結圖樣,按下他,就能夠選擇直線或連結線來連結兩個圖示,同時在線上面點選兩下,也能夠輸入文字, 如下圖所示,菱形出現的兩個線段,就能夠填寫『是』與『否』的字樣了!
完成了上述的功能之後,再來則是需要進行檔案儲存的任務。這個 draw.io 還挺有趣的,除了可以直接存取各個裝置上面的資料,還能夠使用簡單的『下載』, 直接將圖示下載到本機上而已~請點選左上角『檔案』,然後選擇『匯出為』,選擇你需要的類型,這邊我們先用 JPEG 的類型來儲存! 如下所示:
之後會彈出一個視窗,讓你選擇所需要的設定,這邊鳥哥也是使用預設值,只是多了『陰影』的設定,看看結果會不會比較美麗些!
最終如下直接選擇『下載』即可,就能夠直接儲存不同的檔名囉!
最終使用 draw.io 繪製的成果如下所示:
鳥哥個人認為使用 chrome 瀏覽器搭配 draw.io 要比 Dia 還要更簡單、方便、直覺,而且 draw.io 可以透過瀏覽器即可運作, 尤其是 chrome 瀏覽器的支援度挺不賴,可以嘗試看看喔!
5.3: 再探 if 指令
我們在前一章有稍微探討過 if 的用法,這個用法就是簡單的邏輯判斷,也是我們在日常生活裡面經常會在大腦裡面判斷的『選擇』項目。 當然,選擇會有條件,沒有條件就不會是選擇。那條件當然有成立與不成立的結果 (真與假、正確與錯誤、對與錯、true and false), 一般來說,最簡單的 if 如下所示,只有條件成立才進行選擇,否則就不做任何事情。
- 單一選擇: 條件成立才進行,不成立就略過
簡單的說,圖示有點像底下這樣:
再來複習一下基本語法!
if ( true ) { procedure...; }
也就是說,我們使用小括號將條件判斷的功能寫在裡面,然後以區塊 {} 來放入當條件成立 (true) 時,所需要進行的任務。 不過,如果任務太簡單了,只有一條程式碼呢?此時我們可以取消區塊 {} ,直接將程式碼寫出來即可喔!有點像這樣:
if ( true ) procedure;
你也可以將上述的兩行寫成一行,不過,通常還是建議縮排比較清楚。舉例來說,當你考試完畢取得分數後,老師可能需要跟你講, 你的分數代表什麼意思~基本上就是:
- 分數 <=20 :你死定了!
- 20 < 分數 <= 50 :有補考的可能性
- 50 < 分數 <= 60 :作業有交可能有機會過關
- 60 < 分數 <= 80 :不要太開心,這是正常分數而已
- 80 < 分數 :了不起!負責!
因為上述 5 個判斷式我們都只給一個訊息內容 (vbmesg) 而已,最終再透過 System.out.println 秀出來而已!那該如何處理?
- 分析問題:讓使用者輸入一個數值,簡單的使用 Scanner 較方便,然後取得該數值後,給予五個判斷式來判斷成績區間,並給予訊息即可。 因為每個判斷式均只有一個程式碼,所以不需要使用區塊 {} 囉!較為簡便。
- 解決步驟:要注意,上面的條件判斷是有陷阱的~應該要使用 ( i > 20 && i <= 50 ) 這樣的設定才對!不要被誤導了喔!
- 還是需要匯入 java.util.Scanner 這個套件
- 宣告類別名稱為 unit05_3_1 (就是檔名)
- 開啟方法為 main 的程式
- 建立 Scanner 物件,名稱設定為 input 好了,同時透過 nextInt() 取得整數成績
- 連續 5 個 if 的選擇判斷,只有一個程式碼,設定好 vbmesg 即可,所以不要使用 { } (本題的特別要求)
- 透過 System.out.println 輸出你的成績代表的結果
- 關閉 main
- 關閉類別
- 程式設計:
if ( res <= 20 ) vbmesg = "你死定了!"; if ( res <= 50 && res > 20 ) vbmesg = "有補考的可能性"; ....
- 編譯、執行與測試:
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 才行!
- 分析問題:先讓系統自己透過時間函數產生兩個亂數,且該數值若小於等於 2 的時候,就帶入 2 這樣的整數, 最終讓使用者計算結果,並回報使用者計算的結果是否是正確的!正確就回答『你好棒』,錯誤就回答『神經病!這樣都算錯!』
- 解決步驟:
- 先匯入 java.util.Scanner 套件
- 宣告類別名稱為 unit05_3_2 (就是檔名)
- 透過上述的方法找到兩個亂數
- 使用兩個選擇 (if) 分別去判斷兩個數值,若小於等於 2 就給予 2 這樣的數值。
- 產生 Scanner 物件,名稱設定為 input
- 提示使用者輸入乘法的結果為何?並由 nextInt() 取得使用者輸入的結果
- 使用 if 判斷使用者輸入的結果是否為正確,若正確就給予正確的回答,錯誤就罵他!
- 關閉 main
- 關閉類別
- 程式設計:其實最後一個 if 判別式比較重要!需要測試一下是否計算正確呢!
String vbmesg = ""; if ( nu1 * nu2 == res ) { vbmesg = "你好棒"; } else { vbmesg = "神經病!這樣都算錯!"; }
- 編譯、執行與測試:
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, 2, 3 ,不過因為使用者是用 keyin 的方式輸入,所以需要防呆啊!
- 解決步驟:先讓使用者輸入數值,然後開始判斷如果是我們需要的 1, 2, 3 就開始讓使用者輸入相關的圖形數據,
如果不是我們預期的 1, 2, 3 的話,就直接用 System.out.println 去罵人好了
- 還是需要讓使用者輸入資料,所以依舊需要匯入 java.util.Scanner;
- 宣告類別名稱為 unit05_3_3 (就是檔名)
- 開啟方法為 main 的程式
- 利用 Scanner 建立名為 input 的物件,並讓使用者輸入 1, 2, 3 等整數值
- 透過 input.nextInt() 取得使用者取得的整數值,設定變數名為 select 好了。
- 設定 double 型態變數有 area, radius, xline, yline 並且都給予初始值為 0 好了。
- 設定字串類型的 vbmesg 訊息內容為空的
- 開始 if 的判別式:
- 如果 select 為 1 時,讓使用者輸入圓形的半徑,並且計算 area 面積,並開始輸出結果
- 如果 select 為 2 時,讓使用者輸入三角形的底長與高,並計算 area 面積,並設定 vbmesg 訊息
- 如果 select 為 3 時,讓使用者輸入矩形的底長與高,並計算 area 面積,並設定 vbmesg 訊息
- 如果以上皆非,就顯示錯誤訊息告知使用者。
- 透過 System.out.println 輸出剛剛建立的訊息資料即可
- 關閉 main
- 關閉類別
- 程式設計:其實很簡單!重點在於處理出 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 );
- 編譯、執行與測試:執行測試會有底下的執行情況:
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↵ 喂, 喂, 不要亂選!臭小子!不理你了
根據你的選項可以有不同的撰寫方式囉!
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 的意思~這樣就抓出最大值了!現在讓使用者輸入三個數值, 然後你幫忙抓出最大最小值囉!
- 分析問題:讓使用者輸入三個數值之後,進行找出最大值的行為其實不難,只要透過上述的作法來找到最大值並且予以替換即可。
- 解決步驟:
- 因為要使用者輸入資料,所以需要匯入 java.util.Scanner 套件
- 宣告類別名稱為 unit05_3_4 (就是檔名)
- 開啟方法為 main 的程式
- 建立名為 input 的 Scanner 物件,並透過 input.nextDouble() 取得三個數值
- 使用 max = (a>b)?a:b; 的語法找出最大值
- 透過 System.out.println 輸出最大值
- 關閉 main
- 關閉類別
- 程式設計:最主要的程式碼其實只有兩行:
max = (a1>a2)?a1:a2; max = (max>a3)?max:a3;
- 編譯、執行與測試:
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),如下所示。
開發一隻程式,要求使用者輸入兩個值 ( 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 (純文字檔)
- 完成上課的習題內容回答:
- 條件判斷『 if ( on_off == true ) 』可以簡化為什麼樣式?寫下語法
- 有個程式碼如下,請簡化該程式碼
if ( myres == false ) { System.out.println ("this is error message"); } else { System.out.println ("this is all write message"); }
- 請以 draw.io 繪製 unit05_3_3.java 的流程圖分析:
- 根據 BMI 以及 unit04_4_2.java 的說明,讓使用者輸入身高後,主動計算出 BMI,並且告知使用者他是標準、太輕還是太重喔!
當使用『 java unit05_bmi 』時,會出現如下的結果:
- 根據維基百科所載,地球、火星、木星的半徑大約是: 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↵ 看屁啦!