第 3 堂課 - 變數應用與程式互動功能
上次更新日期 2018/07/31
回到前一章 2.7 的情境下,我們要同時計算一圓的面積與週長,結果你得要將那個 5.5 公分重複的寫在程式碼的很多地方。 萬一你要計算的是 10.5 的圓,那整個程式碼就會改得很痛苦。此時,透過變數 (就是 R 本身) 來設計時,你就會發現~啊~ 只要改一個地方就好了!真是方便!也就是說:『如果是後續的程式碼會持續使用到的資料,你應該要使用 "常數" 或 "變數" 來設計, 這樣資料的可用性才會增加』!這點務必放在心裡!
回到前一章 2.6 的情境下,你想要計算溫度單位的轉換時,得要自己設計好所有的數值,要是你想要計算其他的數據,就得要重新修改整份程式碼, 然後重新編譯、重新執行,這樣似乎有點笨。能不能透過讓使用者輸入資料,然後透過程式碼互動的功能,將該資料加以計算呢? 這樣未來我們直接讓使用者去輸入資料,就無須每次都得要重新設計程式碼了!是否變得更簡單?這就是我們需要的『輸入』功能!
- 3.0: 英打練習與上週作業執行
- 3.1: 初次使用變數
- 3.2: 數值類型的變數宣告與使用
- 3.3: 變數的命名規則
- 3.4: 字串類型的變數宣告與使用
- 3.5: 可經由鍵盤輸入的互動程式製作
- 3.6: 彈出式視窗的互動功能
- 3.7: 設定常數
- 3.8: 課後練習
3.0: 英打練習與上週作業執行
資訊科技的技術,如果不是老闆,生產力人員 (就是你我) 通常不會只使用手持式裝置,至少會使用到各式鍵盤。因此,打字就非常重要, 好的打字速度帶你上天堂,差的打字速度讓你呆成糖 (蟲的台語,慢吞吞之意)!關於打字練習的重要注意事項請參考第 0 堂課的說明, 同時,請花 10 分鐘完成第 0 堂課的英文打字練習。完成之後,請打開你的 notepad++ 軟體,輸入底下的字串喔!
variable must be declare before you use it in your codes. ↵ the area of circle is PI * R ^ 2 ↵ Integer types are byte, short, int, long. the int is favor. ↵ float and double used for decimal point number. double is default. ↵ output maybe System.out.println and System.out.print ↵ double rate = 0.31837493; ↵ int age = 30; ↵ "int public" is illegal declare. ↵ ↵ import javax.swing.JOptionPane;↵ public class demo1 {↵ public static void main (String args[]) {↵ String vbname = JOptionPane.showInputDialog(null,↵ "請輸入您的大名","測試輸入中",JOptionPane.QUESTION_MESSAGE);↵ JOptionPane.showMessageDialog(null,"歡迎 "+vbname+"使用我們的 java 程式",↵ "歡迎歡迎",JOptionPane.INFORMATION_MESSAGE);↵ }↵ }↵
你不需要複製貼上,這單純是要讓你的打字速度變快!所以不要太緊張!練習就對了!沒練習完畢?沒關係,有空繼續練習即可!
- 上週作業的執行
請從 class.vbird.tw 上面下載你上週的作業 java 文字檔,然後先行編譯成功後,等待老師過來查閱是否編譯成功與執行成功! 若執行成功,在你的作業成績會打 v !
3.1: 初次使用變數
讓我們回到 2.7 章節的計算半徑面積與週長的程式,如果你要計算出半徑為 5.5 公分的圓時,那麼就得要這樣寫:
Area = 3.14 * 5.5 * 5.5 Perimeter = 2 * 3.14 * 5.5
這沒問題啊!很簡單啊!好~來想想,如果你的圓變成 10.5 公分,請問這個程式碼你需要改幾個地方?隨便算算就需要 3 個地方了! 如果改錯還很麻煩咧~那怎辦?這時候就可以透過所謂的『變數』來處理了。舉例來說,像底下的模樣:
double R = 5.5
Area = 3.14 * R * R
Perimeter = 2 * 3.14 * R
同樣的,如果你需要改成半徑為 10.5 公分的圓,上面這個程式碼你只要修改第一行的 R 值即可,後續用到的程式碼會主動的改變成為你設定的值! 這就是一般伺服器用到的設定檔的方式,透過變數來處理。也就是說:『如果程式碼裡面會一直反覆用到的數據資料, 做成變數後,就可以減少程式碼反覆修改的行為』。對於優秀的程式設計師來說,變數與常數的設計,可以簡化很多程式碼的更動頻率, 讓你的程式碼變得更容易維護喔!
- 變數的宣告
或許你會問,鳥哥啊,變數的功能我知道了,但是如上所示,為啥 R = 5.5 前面要加上一個怪異的英文,就是那個『 double 』是啥鬼? 很好喔!夠聰明!回到前一章我們在算溫度轉換的行為時,記不記得 1/5 與 1.0/5 的結果是不一樣的?因為『整數』與『浮點數(就是含有小數點的數值)』是不同的概念! 另外,『文字字串』又是另一個資料,這些資料雖然可以透過某些程式碼轉換,但是預設的情況下,他們就是需要被宣告使用才行! 所以囉,當你使用變數時,請告知程式碼,這個變數的內容是什麼才行!
那個 double 指的是『雙精度浮點數』的意思,可以紀錄較長的小數點下的位數。等等我們再來談論其他的宣告類型,先知道這個就是具有小數點的宣告方式即可。 因此,現在我們來設計 unit03_1_1.java 的內容,同樣的設計出一個半徑的變數來處理面積與週長的程式碼:
- 分析問題:想要透過一個變數來給予半徑值,然後透過該變數直接設計找出面積與週長的程式碼
- 解決步驟:先要宣告變數,假設為 R 這個變數名稱。然後直接給予變數一個值,之後的程式碼就用 R 來當作設計的依據。
- 宣告類別名稱為 unit03_1_1 (就是檔名)
- 開啟方法為 main 的程式
- 指定一個 double 浮點數的變數,並且直接給予 5.5 的數值;
- 透過 System.out.println 開始進行圓的半徑、圓的面積、圓的週長進行三次結果輸出;
- 關閉 main
- 關閉類別
- 程式設計:開始如下的設計來處理了:
double R = 5.5; System.out.println ("圓的半徑為: " + R ); System.out.println ("此圓的面積: " + 3.14159 * R * R ); System.out.println ("此圓的週長: " + 2 * 3.14159 * R );
- 編譯、執行與測試:執行的結果會有點像底下這樣:
C:\Users\dic\java>java unit03_1_1 圓的半徑為: 5.5 此圓的面積: 95.0330975 此圓的週長: 34.55749
3.2: 數值類型的變數宣告與使用
從上面簡單的用法,我們知道了:
- 『變數』通常就是程式碼內部一直重複被使用的資料,這個資料我們用一個代號來表示他!
- 為了擔心不小心誤用了變數的功能,因此變數在使用前,需要事先宣告
- 然後給予該變數一個值,之後才能夠帶入程式碼當中使用。
就如同我們在 System.out.println 裡面的資料中,如果是字串需要使用雙引號包起來表示,如果是數值運算則需要注亦有沒有小數點等等, 變數也有很多的格式,最常分別的就是字串類與數值類,其中如果程式碼是用在推算某些運算的話,那麼數值類的變數資料就很重要了。 另外,如果分整數與浮點數,則有底下的分類:
類型 | 宣告方式 | 數值範圍 | 儲存容量 |
整數 | byte | -27 ~ 27-1 (-128 ~ 127) | 8 bit |
short | -215 ~ 215-1 (-32768 ~ 32767) | 16 bit | |
int | -231 ~ 231-1 (-2147483648 ~ 2147483647) | 32 bit | |
long | -263 ~ 263-1 | 64 bit | |
浮點數 | float | 負數: -3.4028E+38 ~ -1.4E-45 正數: 1.4E-45 ~ 3.4028E+38 | 32 bit |
double | 負數: -1.7977E+308 ~ -4.9E-324 正數: 4.9E-324 ~ 1.7977E+308 | 64 bit |
因為不同的宣告會佔用不同的記憶體容量與資料儲存量,在小量樣本中影響不大,如果數據資料太大時,錯誤的挑選宣告的項目, 就可能導致記憶體容量不足,或者是磁碟容量的浪費。所以才會有這麼多針對整數與浮點數的不同類型的宣告。一般來說, 如果是我們常用的環境底下,使用 int 以及 double 就很足夠了!另外, java 預設發現到小數點時,都會主動給予 double 的型別喔!
- 計算複利率的公式
年輕人,現在錢不好賺,所以,你可能會嘗試透過定存來讓自己保持定期定額的存錢習慣。假設你每個月可以存 3000 元, 銀行給的年利率大約是 1.15% (0.0115) 左右,假設銀行還不錯,給你的是每個月計算的複利率,那麼你每個月可以計算出來的利息可以是這樣:
年利率: 1.15% 月利率: 0.0115/12 = 0.000958 每月存: 3000 第一月: A1 = 3000*(1+0.000958) 第二月: A2 = (3000+A1)*(1+0.000958) 第三月: A3 = (3000+A2)*(1+0.000958) ...
請寫出一個 unit03_2_1.java 的程式來推算到第 6 個月的利息+本金的錢共有多少?因為利率可能是會浮動的,因此請指定為變數, 而你的定存價格未來也可能會改變,因此定存價格也請設定為變數。另外也指定六個月的本金+利息的變數分別為 A1, A2... A6 喔!方便計算。
- 分析問題:最主要的目的是找出定存的利率可以幫助你存多少本金可以回饋多少利息的意思。
- 解決步驟:先指定兩個變數,年利率與定存金額。之後透過上述的程式碼,寫出六行計算式,就能夠計算出六個月的本金+利息。最終只要印出 A6 的結果即可。
- 宣告類別名稱為 unit03_2_1 (就是檔名)
- 開啟方法為 main 的程式
- 分別給予 double 類型的變數,包括利率 (rate)、本金 (money)、六個月的本金+利率的錢錢 (A1, A2...A6)
- 透過前述功能,計算出 A1, A2, A3... 的實際金額有多少
- 透過 System.out.println 最終輸出 A6 的錢錢即可得到 6 個月的本金+利息了!
- 關閉 main
- 關閉類別
- 程式設計:簡單的書寫如下
double rate = 0.0115/12; // 月利率 double money = 3000.0; // 定存 double A1, A2, A3, A4, A5, A6; // 六個月的本金+利息 A1 = money * ( 1. + rate ); A2 = ( A1 + money ) * ( 1. + rate ); A3 = ( A2 + money ) * ( 1. + rate ); A4 = ( A3 + money ) * ( 1. + rate ); A5 = ( A4 + money ) * ( 1. + rate ); A6 = ( A5 + money ) * ( 1. + rate ); System.out.println ("六個月本金+利息: " + A6 + " 元");
- 編譯、執行與測試:最終得要能夠輸出正確的金額才行,否則回去重新改寫程式!執行成果有點像這樣:
C:\Users\dic\java>java unit03_2_1 六個月本金+利息: 18060.471524759105 元
最終,由程式的輸出結果你或許會發現,其實利息真的不多!但是,要讓自己保持存錢的想法就好了!另外, 1. 與 1.0 一樣啊!
透過上面簡單的計算,你現在知道卡奴是怎麼產生的了嘛?!所以,不要以為借錢不用還啊!很可怕的!
3.3: 變數的命名規則
大致了解變數的使用之後,再來想想,那麼變數名稱有沒有什麼要求呢?我能不能隨便設定變數名稱為 1st, 2nd 等等的? 好像不太可能~因為變數的命名是有一定的要求的!基本要求如下:
- 變數的字元組成主要為英文大小寫、數字、底線 (_) 等,盡量不要包含特殊字元,也不要使用中文
- 變數的第一個字元必須要英文大小寫,或底線或錢字號 ($),不可以是數字 (所以 1st, 2nd 不能用)
- 變數的名稱不可以用到 java 保留字,例如 public, class, float, double 等等,都不能作為變數名稱
- 變數名稱的字數沒有限制,不過盡量不要產生莫名其妙的文字組合,擔心未來不好理解。
一般來說,鳥哥習慣自己的程式碼當中,只要是變數名稱,可能都會加上 vb 為開頭的文字,例如『 vb_rate 』之類的, 因為如此一來就絕對不可能跟保留字發生衝突。另外,Java 或 Javascript 都習慣將句子組合成為變數,只是每個英文的第一個字元變大寫。 例如 bank rate is 可能寫成 bankRateIs 之類的模式,提供給大家作為參考。
另外,變數除了要宣告之外,基本上給予值的方法,就跟國小、國中數學差不多:
- 等號 (=) 左側是未知的,就是變數名稱;
- 等號 (=) 右側是已知的,就是數值,或者是已經設定的變數資料。
例如剛剛前面小節設定過的樣式:
double rate = 0.0115; // 宣告與給予值同時進行 double money; // 僅宣告變數型態 money = 3000.; // 僅設定變數值 double A1, A2; // 有相同型別的變數,可以統一用此方式設定好即可 int i = 1; i = i + 3; // 再次說明,左側為未知,右側為已知,用這個方式去考慮即可。
如果你玩數學,那當然知道上面最後一行絕對不可能是等式:『 i = i + 3 』是不可能存在於實際社會的。不過在程式語言的角度上, 等號左邊就是變數名稱而已,是個可以帶入數值的容器。右邊則是已知數,必須是已經存在的數值,否則程式就會失敗!因為倒數第 2 行已經設定好 i = 1 了,因此, i = i + 3 --> i = 1 + 3 --> i = 4,就是這樣的處理方式。
1. double rate = 0.35; 2. int age1; 3. float My_money; 4. int 1st_age; 5. int $money; 6. int #money; 7. double true; 8. int public;
另外,嘗試進行下底下程式碼的編譯,看看會出現什麼錯誤?
public class unit03_3_1 { public static void main (String args[]) { int a = 3; int b = 5; c = a + b; System.out.println ("計算結果: " + c ); } }
如前所述,當設定變數時,等號的右側是已知值才行。如果你沒有宣告變數,也沒有給予變數初始值,那麼這個變數當然就肯定是『未知』, 那你將未知值帶入等號右側時,當然也就產生失敗了!同時,如果你使用了未經宣告的變數,那就代表這個變數的內容可能是無法掌握的, 那麼程式碼很可能就會產生某些不明原因的錯誤了。因此,比較嚴謹的傳統程式語言,一般都會要求,你的變數應該在使用前要予以宣告才行! 所以,明白哪裡錯誤了嘛?請將上述的程式碼訂正吧!
- 常見的識別字
一般來說, java 常見的保留字有底下這些,盡量取變數名稱的時候,不要跟這些保留字衝突喔!
abstract assert boolean break byte case catch char class const |
continue default do double else enum extends final finally float |
for goto if implements import instanceof int interface long native |
new package private protected public return short static strictfp super |
switch synchronized this throw throws transient try void volatile while |
持續挑戰自己的眼力,看看底下的程式碼,應該要訂正何處後,編譯與執行才能成功?同時,在執行之前,先嘗試自己分析一下,可能的結果數值為何?
// 單純進行一些基本的計算 public class unit03_3_2 { public static main (String args[]) { int myage = 18; int myfater = 43; myfater = 43.5 mydiffage = myfater - myage; system.out.println ("我父親比我年紀大: " + mydiffage + " 歲"); } }
3.4: 字串類型的變數宣告與使用
跟數值要使用的時候得要宣告一樣,字串 (就是文字) 的使用也是需要宣告的!為啥文字也需要設定成為變數呢? 舉例來說,你的姓名可能會出現在廣告單當中數次吧?如果是要列印給不同人,當然最簡單的方法就是直接抽換人名就好。 此時,就得要有字串的宣告了!
String varname = "content";
你沒看錯,那個 String 第一個字元是大寫!很怪異,對吧!呵呵!背起來就好。至於一般字串的設定需要給予雙引號來包含起來, 你也能夠用單引號,不過,一般比較常見使用雙引號就是了。那字串能不能相加?可以的,透過加號 (+) 來處理即可。
- 廣告信函的處理模式
假設你們公司針對新進員工的培訓時,需要給予這些詞句:
致新進員工『某某某』: 首先在此非常榮幸地歡迎各位加入『XXX公司』這個正在成長中的大家庭。從今天起, 你們已成為這個企業的一個重要成員。公司以人為本,尊重知識, 尊重人才的氣氛早已在『XXX公司』開花結果,希望你們能與這個大家庭的每位成員互相尊重, 相互理解。『XXX公司』欣賞及認同那些為生活而辛勤工作的公司同仁。 在這裡,無論是什麼崗位,都享有平等的晉升機會。 另外各種培訓也不斷推進,"在每日的工作中進步!"是我們的心得。本著"以人為本"的人才策略, 『XXX公司』為優秀的員工提供完備的發展空間,這不僅是提供良好的工作環境及待遇, 而且能最大地激發個人的潛力,發揮自身的價值。在為社會創造財富的同時,也為自己創造財富。 歡迎你們的加入!祝願你們在『XXX公司』前程似錦!
假設上述的『某某某』需要填寫姓名,而『XXX公司』需要填寫你的公司,那麼你該如何處理呢?另外,上面是經過排版的結果, 事實上,上述的資料其實分為四大段落,因此,每一行使用一個 System.out.println 似乎也是挺蠢的! 所以,如果能夠將上述的資料全部彙整成為一個訊息資訊,那麼只需要一個 System.out.println 就行了! 但是如何處理斷行呢?簡單的斷行字元可以用『 \n\n 』來處理喔!
- 分析問題:主要是透過設計數個變數後,將員工姓名與公司姓名,以及歡迎詞帶入到變數內,最後將變數印出到螢幕即可。
- 解決步驟:整個解決流程很簡單,將會改變的部份抽換出來,最終組合成一個完整的文章內容即可:
- 宣告類別名稱為 unit03_4_1 (就是檔名)
- 開啟方法為 main 的程式
- 使用 String 字串類型,宣告三個變數,分別是 (1)員工的姓名 (2)公司的名稱 (3)歡迎詞 這三個變數。
- 在歡迎詞變數中,大概有四個段落的緣故,因此在每個段落的文句後面加上 \n\n 來斷行即可。 因為程式碼在文字的部份似乎不能加入斷行,所以需要使用多個 + "..." 來處理喔!
- 最終將結果由 System.out.println 印出即可。
- 關閉 main
- 關閉類別
- 程式設計:將上述的解決步驟實際撰寫出來:
String 第一個變數 = 員工姓名; String 第二個變數 = 公司名稱; String 第三個變數 = "致新進員工 " + Somename + " :\n\n" + "首先在此非常榮幸地歡迎各位加入" + 第二個變數 + "這個正在成長中的大家庭。從今天起," + ... System.out.println ( 第三個變數 );
- 編譯、執行與測試:執行的結果會有點像這樣:
C:\Users\dic\java>java unit03_4_1 致新進員工 鳥哥: 首先在此非常榮幸地歡迎各位加入資傳大家庭這個正在成長中的大家庭。從今天起,你們已 成為這個企業的一個重要成員。公司以人為本,尊重知識,尊重人才的氣氛早已在資傳大家 庭開花結果,希望你們能與這個大家庭的每位成員互相尊重, 相互理解。資傳大家庭欣賞 及認同那些為生活而辛勤工作的公司同仁。在這裡,無論是什麼崗位,都享有平等的晉升機 會。 另外各種培訓也不斷推進,"在每日的工作中進步!"是我們的心得。本著"以人為本"的人才 策略,資傳大家庭為優秀的員工提供完備的發展空間,這不僅是提供良好的工作環境及待遇 ,而且能最大地激發個人的潛力,發揮自身的價值。在為社會創造財富的同時,也為自己創 造財富。 歡迎你們的加入!祝願你們在資傳大家庭前程似錦!
對於文字的整理有沒有更理解呢?另外,除了上述的 \n 是斷行字元之外,其實還有許多的特殊字元可以用在文字或者是輸出當中喔!
跳脫字元 | 意義說明 |
\n | 如前所述,這個是斷行字元,在後面的資料會由新的一行開始輸出 |
\b | 倒退鍵,可以往左刪除一個字元的意思,將文字刪除呢!相當有趣的功能! |
\t | 就是加入一個 [tab] 的按鍵推出來的空白空間 |
\r | 回到目前同一行的最前面行首處繼續輸出 |
\f | 換到下一頁的定位點繼續輸出,不過單純終端機恐怕看不出情況。如果你將資料複製貼上類似 word 的文件, 就可以看到這個 \f 所在處,會多出一條分頁符號喔! |
\' | 如果你的資料是『 'This is VBird's work' 』時,應該就需要寫成『 'This is VBird\'s work' 』文字資料內容的兩側, 只能存在成對的單引號或雙引號,其他的同樣符號,就得要用 \ 跳脫才行! |
\" | 同樣的意思,是雙引號 |
\\ | 因為反斜線 (\) 有特殊功能,所以你要輸出反斜線,就得要用兩條反斜線才行啊!將反斜線自己跳脫的意思! |
文字的處理有其特殊性,所以許多的特殊字元還是記憶一下的好喔!
3.5: 可經由鍵盤輸入的互動程式製作
變數就只能這樣使用嘛?當然不是!讓我們回到 3.1 的計算圓的面積與週長的程式碼~在該題目中,我們如果要改換不同的圓半徑, 其實還是得要重新編寫程式碼,然後重新編譯並執行。但事實上,我們只有變更變數的內容而已耶,整個運算與程式碼都沒有改變。 能不能透過某些方式,讓使用者自己填入半徑後,讓該變數變成使用者輸入的資料,這樣不就直接運作程式,而不用重新設計程式碼了嘛? 沒錯!就是這個想法!
- 透過掃描輸入資料 (Scanner) 來取得使用者輸入參數
想要讓使用者輸入資料來取得,就得要透過所謂的 System.in 的方式來處理!我們已經知道系統輸出使用 System.out.println 這個程式碼, 那麼同樣的,要找尋使用者從鍵盤的輸入,就是使用 System.in 這個程式碼而已。只是這個程式碼的使用,必須要透過所謂的掃描物件來取得! 這個動作需要匯入 java.util.Scanner 的套件來處理才行!如下所示:
import java.util.Scanner; // 匯入掃描物件 .... .... Scanner input = new Scanner ( System.in ); // 建立一個掃描物件,名稱為 input double R = input.nextDouble(); // 建立 R 雙精倍數,且由 input 物件取得數值 // 底下就開始處理圓周等等的項目 } }
上述程式碼當中的『 input 』是由 Scanner 套件所宣告的一個物件,這個物件可以掃描系統輸入 (System.in) , 然後將資料帶給這個新的物件。你可以更改 input 這個名字,其他的則是關鍵字,不能亂變動的意思。
至於輸入的資料是什麼型態?這就得要事先宣告才行!其實就跟數值型態與字串型態搭配啦!有底下幾款呼叫的方式:
- 整數型態:如 bytes, short, int, long 的呼叫方式如下:
- nextBytes()
- nextShort()
- nextInt()
- nextLong()
- 浮點數型態:就是 float 與 double 囉!
- nextFloat()
- nextDouble()
- 字串型態,其實就是讀入字或行的分別而已!
- next() 讀取結束於空白之前的字串
- nextLine() 讀取按下 Enter 之前的那串文字成為字串
其實就是對應整數、浮點數與字串的常見宣告模式,就是上面的三個特殊行的資料而已。好了,那麼將 unit03_1_1.java 做個修改吧! 假設改成檔名為 unit03_5_1.java 囉!
- 分析問題:將原本直接將半徑的數值 (R) 寫入程式碼,變成透過讓使用者輸入的方式來計算。
- 解決步驟:其實只要增加一個匯入 java.util.Scanner 的套件,加上一個 Scanner 的物件宣告,然後替換直接宣告的 R 值即可:
- 匯入一個名為 java.util.Scanner 的套件,注意, S 是大寫
- 宣告類別名稱為 unit03_5_1 (就是檔名)
- 開啟方法為 main 的程式
- 產生一個 Scanner 的物件,物件名稱取名為 inputR 好了
- 宣告 double 的變數 R ,R 可經由此物件來取得雙精倍數型態的數值
- 透過 System.out.println 開始進行圓的半徑、圓的面積、圓的週長進行三次結果輸出;
- 關閉 main
- 關閉類別
- 程式設計:在 public 之前使用 import 匯入,然後在 R 的宣告之前加入兩行,一個是物件,一個是掃描 System.in 即可!
- 編譯、執行與測試:執行的過程會有點像這樣:
C:\Users\dic\java>java unit03_5_1 5.5↵ <==這裡是使用者手動輸入的地方! 圓的半徑為: 5.5 此圓的面積: 95.0330975 此圓的週長: 34.55749
執行的時候,你可能會以為程式卡死了!其實沒有喔~實際上只是他在等待你的輸入而已~別害怕!請輸入一個數值, 然後按下 enter ,就能夠看到輸出的結果囉!
- 上面測試的結果中,我們會發現到執行後系統會卡住,沒有提示字元的話,大家會覺得很惶恐!所以, 你能不能修改上面的程式碼,增加一行:『請您輸入圓的半徑,我會幫你計算該圓的面積與週長: 』這樣的字樣? 讓程式碼變得更好看又好用!另外,該行可以使用 System.out.print 處理即可,不需要加上 ln 喔!
- 請反覆執行該程式,每次都輸入正確的數值型態,但最後一次輸入文字,系統會出現什麼!? 同時請仔細查閱輸出的訊息,了解一下問題的所在喔!
經過上面的實做,你已經具有『設計出可以跟用戶做基礎互動的程式碼了!』當真是了不起的進展! ^_^
- 請透過類似上方的功能,將 unit03_4_1.java 修改成為 unit03_5_2.java ,讓使用者可以輸入兩個資料,一個是使用者人名,一個是公司名稱, 最後將信件內容整個輸出到螢幕上。
- 設計時請注意,不要有兩個 Scanner 物件,只需要一個即可!同時持續透過 input.nextLine() 之類的資料來反覆取得輸入 Enter 後的文字, 就能順利的取得多個變數內容了!只是,在 Scanner 運作之前,最好還是能有訊息提示較佳喔!
3.6: 彈出式視窗的互動功能
除了透過 MSDOS 界面直接取得從鍵盤的輸入之外,是否可以透過類似 JOptionPane 的彈出式視窗來提供使用者輸入資料呢? 好像也是可以的!而且要取得使用者的輸入資訊也不難,直接透過名為 showInputDialog 的視窗界面來處理即可!如下所示:
import javax.swing.JOptionPane;
....
String name = JOptionPane.showInputDialog (null, "提示訊息", "標題文字", icon);
....
一般來說,我們預設使用者輸入的資料是字串的型態,所以上述的指令中,我們就先令使用者輸入完畢的回傳值設定為字串類型 (使用了 String)。 先來做個簡單的測試,看看能不能讓你的程式碼順利的取得使用者的輸入呢!就是讓使用者輸入自己的姓名,然後再由彈出式視窗回報歡迎使用 java 程式!
- 分析問題:一開始先彈出一個輸入視窗,標題就填『測試輸入中』,訊息就寫『請輸入您的大名』,當然,這都需要用到 JOptionPane 的功能!
- 解決步驟:當然需要匯入 JOptionPane 的套件,然後依序寫入 showInputDialog 以及 showMessageDialog 即可!
- 匯入 javax.swing.JOptionPane 這個套件;
- 宣告類別名稱為 unit03_6_1 (就是檔名)
- 開啟方法為 main 的程式
- 宣告一個名為 vbname 的字串變數,該變數透過 JOptionPane.showInputDialog 來取得的!
- 透過 JOptionPane.showMessageDialog 來回傳歡迎訊息!
- 關閉 main
- 關閉類別
- 程式設計:其實也是挺單純的
import javax.swing.JOptionPane; .... String vbname = JOptionPane.showInputDialog(null, "請輸入您的大名: ", "測試輸入中", JOptionPane.QUESTION_MESSAGE); JOptionPane.showMessageDialog(null,"歡迎 " + vbname + "使用我們的 java 程式", "歡迎歡迎", JOptionPane.INFORMATION_MESSAGE); ....
- 編譯、執行與測試:要按下多次的確定按鈕才行,出現的畫面有點像這樣:
你會發現很簡單就取得彈出式視窗的資料了!真是可喜可賀~可喜可賀!
- 資料的型別轉換
前面提到這個彈出式視窗的回傳資料型態是字串,但是,我們如果要讓使用者輸入的資料來提供計算呢?那當然就不能使用字串了! 這個時候我們可能就得要透過型別轉換來處理這個資料囉!怎麼將字串換成數據資料呢?可以透過底下兩個簡單的玩意兒!
int var = Integer.parseInt(name); double var = Double.parseDouble(name);
上面的 var 是你自己指定的數值變數名稱,而 name 則是字串的變數名稱,其他的都是關鍵字!連字元大小寫都需要記憶! 其實也沒有很難記,因為 Integer 是整數的完整英文, Int 是縮寫而已,而 parse 則有『解析』的意思~這樣就比較好背誦了!
現在再讓我們玩一個彈出式視窗的應用,剛剛我們從 MSDOS 視窗輸入圓的半徑,能不能使用彈出式視窗來讓使用者輸入, 同樣用彈出式視窗來輸出結果呢?
- 分析問題:將原本由 MSDOS 的輸入變成彈出式視窗的處理方案
- 解決步驟:很簡單,就抽換 Scanner 成為 JOptionPane 的方式而已
- 匯入 javax.swing.JOptionPane 這個套件;
- 宣告類別名稱為 unit03_6_2 (就是檔名)
- 開啟方法為 main 的程式
- 宣告一個名為 stringR 的字串變數,該變數透過 JOptionPane.showInputDialog 來取得的!
- 宣告一個名為 R 的 double 變數,內容由變更 stringR 而得到
- 宣告一個名為 vbmesg 的字串變數,將原本 System.out.println 的資料彙整成在一起,但是還是需要使用 \n 來分行喔!
- 透過 JOptionPane.showMessageDialog 來顯示剛剛的訊息 (vbmeg)!
- 關閉 main
- 關閉類別
- 程式設計:最重要的其實就是 JOptionPane 而已,比較重要的項目有點像底下這樣:
String stringR = JOptionPane.showInputDialog(null, "輸入圓的半徑: ", "計算圓周、面積", JOptionPane.QUESTION_MESSAGE); double R = Double.parseDouble(stringR); String vbmesg = "圓的半徑為: " + R + "\n此圓的面積: " + 3.14159 * R * R + "\n此圓的週長: " + 2 * 3.14159 * R ; JOptionPane.showMessageDialog(null,vbmesg,"計算圓周、面積", JOptionPane.INFORMATION_MESSAGE);
- 編譯、執行與測試:執行的結果會有點像這樣喔:
簡單的幾個動作,可以讓你的程式碼完成度更高喔!
3.7: 設定常數
我們談到會持續在不同地方被使用的資料,可以的話設定成為變數,這樣未來應用會比較方便。但如果這個資料會持續被使用, 但是卻不應該被修改掉呢?有這種東西嘛?有啊~例如上面我們持續用到的那個 PI 的數值就是了!會持續被使用到, 但是他的精確度是可以調整的~例如可以是 3.14 也可以是 3.14159 等等。
這種應該會被重複利用的資料,但是卻不能任意被修改的,就可以設定成為『常數』了!所謂的常數,就是他設定好之後, 理論上,不應該被更動的資料!
那麼常數要怎麼設定呢?很簡單喔!在一樣的變數設定前增加一個『 final (最後) 』即可!舉例來說,我想要訂定一個 PI 值, 就可以這樣做:
final double PI = 3.14159;
現在,請將 unit03_6_2.java 儲存成 unit03_7_1.java,將裡面的 3.14 資料以 PI 值重新處理囉!輸出的結果會與 unit03_6_2 一模一樣, 所以這裡就不予以擷取資料了。自行設定看看吧!
3.8: 課後練習
請先查閱 1.3 小節的介紹,了解雲端系統的登入、繳交資料檔名等等的設計,然後再繼續底下的習題。 最終要上傳的檔案有:
- unit03-4070CXXX-你的名字.docx
- unit03_character.java (純文字檔)
- unit03_mile2km.java (純文字檔)
- unit03_yourname.java (純文字檔)
- unit03_cal.java (純文字檔)
- 完成底下的問題回應:
- 常見的數值類型的變數型態,主要在宣告的時候有哪些型態?寫出六種型態出來 (數值喔!)
- 承上,(1)一般整數數值預設的型態為何?(2)一般浮點數的預設型態為何?
- 假設有個變數名稱為 myname ,且內容為 "VBird Tsai" 時,你該如何宣告這個變數?
- 要印出一行內容,並且結尾使用斷行,可以透過 System.out.println,那如果印出一行內容,但是不斷行, 應該要用那一個程式碼?
- 如何匯入 Scanner 套件?
- 承上,那如何產生一個名為 myscan 的 Scanner 物件?該物件主要掃描 System.in 的鍵盤輸入行為?
- 承上,那如何透過 myscan 取得 (1)整數值 (2)雙精倍數值 (3)一整行字串?
- 彈出式視窗讓使用者輸入,透過匯入那一個套件?
- 如何設定一個常數,常數名稱為 PI 且內容為 3.14159 的雙精倍數
- 你想要設定一個名為 unit03_character.java 的程式,當你執行時,可以告知你特殊字元的使用方式,
當你執行『 java unit03_character 』時,會出現如下的字樣喔:
許多特殊字元的用法 \ 是跳脫字元 \\ 顯示反斜線 \n 會斷行 \t 就是 [tab] 的功能
- 你想要知道看大聯盟的棒球賽時,螢幕上出現的球速 (?? mile/hr) 所代表的時速,因為 1mile 相當於 1.6km,
依此要領設計名為 unit03_mile2km.java 的程式,當執行此程式,並且輸入 50~105 之間的數值時,他就會告知你轉成時速的速度為多少。
當執行『 java unit03_mile2km 』時,會出現類似底下的情況:
請輸入大聯盟棒球時速 (50~105 mile/hr): 50 ↵ 換成台灣常見的時速 (km/hr): 80
- 當你執行『 java unit03_yourname 』時,會出現底下的字樣與執行流程:
請輸入你的姓氏: 鳥↵ 請輸入你的名字: 哥↵ 哈囉!歡迎光臨啊 鳥哥
- 老師說,平時成績佔 20%、期中考佔 30%、期末考佔 40%、出席率與其他佔有 10% 的成績比重,然後,
當你執行『 java unit03_cal 』時,會出現底下的字樣與執行流程,最終會出現彈出式視窗告知你的學期平均喔!
底下要幫你計算你的程式成績,請依序填寫底下的成績 (0~100) 平時考成績: 90↵ 出席率成績: 90↵ 期中考成績: 90↵ 期末考成績: 90↵