JAVA程式設計入門(II) Ch01 JAVA程式語言簡介
本章大綱 JAVA程式語言的由來及平台 JAVA程式語言的開發環境 宣告變數 資料型態 運算子 流程控制 – if , switch 11/10/2018 本章大綱 JAVA程式語言的由來及平台 JAVA程式語言的開發環境 宣告變數 資料型態 運算子 流程控制 – if , switch 重覆控制 – for , while
Java的由來 誕生:為了因應智慧型電器時代的來臨 例如:網際網路冰箱 11/10/2018 Java的由來 誕生:為了因應智慧型電器時代的來臨 例如:網際網路冰箱 智慧型電器的微處理器種類太多,需要跨平台,移植性高的嵌入式韌體,以控制微處理器 由Green團隊發展出可跨平台,可重用性高的物件導向程式語言,一開始取名為OAK,因為與另一程式語言同名,再改名為Java
Java的由來 成長:全球資訊網路廣受歡迎,Java的跨平台及製作動態網頁的潛力,使Green專案繼續發展下去。 11/10/2018 Java的由來 成長:全球資訊網路廣受歡迎,Java的跨平台及製作動態網頁的潛力,使Green專案繼續發展下去。 發展:使用Java可以發展的程式-applet、application、servlet、JavaBean、JSP等。Java現今的版本稱為Java 2。
Java的跨平台 當你將原本要在Windows上執行的C/C++程式,拿到Linux上執行時,你必須要有以下的動作: 11/10/2018 Java的跨平台 當你將原本要在Windows上執行的C/C++程式,拿到Linux上執行時,你必須要有以下的動作: 必須要有程式的原始檔(source code)。 變更程式中,和平台相關的程式碼。 重新編譯成執行檔。
11/10/2018 Java的跨平台 C程式欲在不同平台執行時,必須重新編譯。
11/10/2018 Java的跨平台 Java程式只要編譯一次,就可以在擁有JRE的平台上執行。
11/10/2018 Java程式語言-Java平台 Java程式語言的「平台」(Platform):平台是一種結合硬體和軟體的執行環境,簡單的說,電腦程式是在平台上執行,因為Java是與硬體無關和跨平台的程式語言,所以Java平台屬於一種軟體平台,主要是由JVM和Java API兩個元件所組成。
11/10/2018 Java的虛擬機器(JVM) Java先經過編譯的程序,編成位元碼(byte-codes:與平台無關的機器碼),再利用直譯器解譯並執行Java的位元碼 任何一種可執行Java的軟體均可看成是Java的虛擬機器(Java Virtual Machine, JVM)
Java API Java API(Java Application Programming Interface) 11/10/2018 Java API Java API(Java Application Programming Interface) Java API是軟體元件的集合,也就是在C/C++語言所謂的函式庫,提供集合物件、GUI元件、檔案處理、資料庫存取和網路等相關的類別和介面,稱為「套件」(Packages)(後面的章節再詳述)。
11/10/2018 Java程式編譯與執行 虛擬碼是指postal code(即流程規劃)
11/10/2018 Java程式編譯與執行 使用JVM(也稱為Java解譯器)執行Java程式 時,會先載入類別檔再執行。
Java的跨平台機制與虛擬機 資料來源:http://java.sun.com 11/10/2018 JVM是指Java HotSpot Runtime Java API:是指已經開發的工具程式,透過API,使用者可以方便開發應用程式,例如圖中的:applet,sound, math, text, …這些小塊 Java Plug-in是嵌在瀏覽器的Java Applet解譯器 上述的總和為JRE(Java Runtime Environment)Java執行環境 SDK為JDK,是指Java程式開式套件,除了JRE外,再加上compiler和Debugger 但是,JDK並不含程式的編輯器(像筆記本的文件編輯器),因此,在編輯程式和編譯程式時是環境,要換來換去,如果覺得不方便,可以購買Java IDE(整合開發環境,如:Jbuilder)
11/10/2018 Java的優缺點 優點: 容易學習 跨平台 物件導向 安全 多執行緒 資源回收機制 缺點: 效能較差
11/10/2018 Java語言的開發環境-說明 程式語言的「開發環境」(Development Environment)是一組工具程式用來建立、編譯和維護程式語言所建立的應用程式。 目前高階程式語言大都擁有「整合開發環境」(Integrated Development Environment、簡稱IDE),在同一個應用程式就可以編輯、編譯、執行和除錯特定語言的應用程式。
Java語言的開發環境-常用的整合開發環境 11/10/2018 Java語言的開發環境-常用的整合開發環境 Sun Java Studio Standard:Sun昇陽公司的Java整合開發環境,其網址為:http://wwws.sun.com/software/sundev/jde/index.html。 NetBeans IDE:NetBeans是一個開放原始碼計劃,其網址為:http://www.netbeans.org/。 Borland JBuilder:Borland公司的Java整合開發環境,Personal版可以免費下載,其網址:http://www.borland.com。 Gel:Gexperts公司的免費整合開發環境,這是由Gerald Nunn使用Delphi所開發支援中文使用介面的Java/JSP IDE,其網址為:http://www.gexperts.com/index.html。 JCreator:Xinox軟體公司的JCreator整合開發環境,分為LE(Lite Edition)和Pro(Pro Edition)兩種版本,其網址:http://www.jcreator.com。
11/10/2018 昇陽JDK的安裝 一般來說,整合開發環境有些在安裝時就同時安裝JDK,例如:JBuilder,不過大部分的整合開發環境需要自行安裝JDK,昇陽的JDK分成多種版本,本書使用的是J2SE(Java 2 Platform Standard Edition)。 JDK可以從昇陽網站免費下載,網址為:http://java.sun.com/j2se/。 在下載Windows版本的開發工具檔案【jdk-1_5_0-windows-i586.exe】後,只需執行此執行檔案,就可以安裝JDK。
JDK的環境設定 在安裝好JDK後,如果使用整合開發環境,在安裝整合開發環境時會自動搜尋JDK的安裝路徑,然後選擇使用的JDK版本即可。 11/10/2018 JDK的環境設定 在安裝好JDK後,如果使用整合開發環境,在安裝整合開發環境時會自動搜尋JDK的安裝路徑,然後選擇使用的JDK版本即可。 如果使用「命令提示字元」視窗以命令列指令編譯和執行Java程式,我們需要設定JDK的執行環境,這是在Windows XP新增環境變數Path的搜尋路徑「C:\Program Files\Java\jdk1.5.0\bin」,其中C:\Program Files\Java\jdk1.5.0\是JDK的安裝路徑。
11/10/2018 安裝JDK說明文件 JDK Java Documents說明文件提供Java語言的特點、新增功能和API套件的詳細說明,在下載JDK時,可以一同下載JDK Document說明文件,1.5.0版的檔案名稱為【jdk-1_5_0-doc.zip】。 JDK說明文件是ZIP格式的壓縮檔案,只需使用WinZIP等解壓縮工具,或是Java JDK內建的jar工具程式,其指令如下所示: C:\>jar xvf d:\jdk-1_5_0-doc.zip Enter 上述指令可以解壓縮文件檔案,”d:\”是光碟機的代碼,在執行目錄會建立名為「docs」資料夾,
第一個Java程式-編輯程式內容 請執行「開始」→「所有程式」→「附屬應用程式」→「記事本」指令啟動記事本,然後輸入下列程式碼,如下所示: 11/10/2018 第一個Java程式-編輯程式內容 請執行「開始」→「所有程式」→「附屬應用程式」→「記事本」指令啟動記事本,然後輸入下列程式碼,如下所示: 01: /* 程式範例: Ch1_4_1.java */ 02: // 主類別 03: public class Ch1_4_1 04: { // 主程式 05: public static void main(String[] args) 06: { // 顯示訊息 07: System.out.println("第一個Java應用程式"); 08: } 09: }
11/10/2018 第一個Java程式-編譯Java程式 在建立和儲存Java程式檔案後,Windows XP請執行「開始」→「所有程式」→「附屬應用程式」→「命令提示字元」指令啟動命令提示字元的視窗。 現在我們就可以編譯Java程式檔案Ch1_4_1.java,請輸入下列指令編譯Java程式,如下所示: D:\Java2\Ch01>javac Ch1_4_1.java Enter 稍等一下,如果再次看到提示符號,沒有看到任何錯誤訊息,就表示編譯成功,可以看到建立的Ch1_4_1.class類別檔案。
11/10/2018 第一個Java程式-執行Java程式 當Java程式檔案編譯成Ch1_4_1.class類別檔案後,就可以輸入指令執行Java程式(不需要輸入.class副檔名),如下所示: D:\Java2\Ch01>java Ch1_4_1 Enter
11/10/2018 宣告變數 宣告變數的用意: 設定變數所佔的記憶體大小 不會發生資料因無心而蓋掉的錯誤 (相同名稱的變數不能重複宣告)
變數的宣告-語法 Java變數宣告的語法,如下所示: 宣告格式使用資料型態開頭,後面跟著變數名稱,目的是「配置一個宣告資料型態的變數」。 11/10/2018 變數的宣告-語法 Java變數宣告的語法,如下所示: 資料型態 變數名稱; 宣告格式使用資料型態開頭,後面跟著變數名稱,目的是「配置一個宣告資料型態的變數」。 Java擁有8種基本資料型態byte、int、short、long、float、double、char和boolean
11/10/2018 宣告變數 語法: 宣告多個變數: int j; 資料型別 變數名稱 int i, j, k; 以逗號隔開
11/10/2018 變數的宣告-初值 變數宣告單純只是表示保留記憶體空間,至於儲存的資料是什麼?可以在宣告時指定初始值,或是使用指定敘述在程式碼設定變數值。在Java宣告變數且指定變數初值,如下所示: int score = 85; int i = 20;
11/10/2018 Java的命名語法-規則 名稱是一個合法的「識別字」(Identifier),識別字是使用英文字母開頭,不限長度的Unicode統一字碼字元的字串,包含字母、數字和底線”_”。例如:一些合法的名稱範例,如下所示: T, n, size, z100, long_name, helloWord, Test, apple 名稱區分英文字母的大小寫,例如:apple、Apple和APPLE屬於不同變數。 名稱不能使用Java語法的「關鍵字」(Keyword)、保留字的布林值true或false和null。 名稱在「範圍」(Scope)中必需是唯一的,例如:在程式中可以使用相同的變數名稱,不過各變數名稱需要在不同的範圍。
11/10/2018 變數的命名 變數名稱不能為關鍵字或保留字 變數名稱的第一個字元可以為Unicode字元(如: 中文字)、英文字母、 底線符號(_)或者金錢符號($、£ 、 ¥ ),第二個字元以後,可以使用前述字元及數字字元 避免在變數名稱中使用$ 在相同變數領域,不能重複宣告一個變數名稱
Java關鍵字和保留字 Java的關鍵字 abstract assert boolean break byte case catch char class continue default do double else extends final finally float for 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 Java的保留字 const goto true false null 11/10/2018
Java的資料型態 Java語言是「強調型態」(Strongly Typed)程式語言,在變數儲存的值需要指定資料型態。 11/10/2018 Java的資料型態 Java語言是「強調型態」(Strongly Typed)程式語言,在變數儲存的值需要指定資料型態。 資料型態的目的是告訴編譯程式宣告的變數準備儲存什麼樣的資料,而且不論如何存取變數值,都不能更改變數的資料型態。 Java的資料型態分為「基本」(Primitive)和「參考」(Reference)兩種資料型態,如下: 基本資料型態:變數有byte、short、int、long、float、double、char和boolean共8種資料型態。 參考資料型態:變數值是一個記憶體位置,這個位置值是物件儲存的位置。
基本資料型別 基本資料型態 可用之型別關鍵字 整數 byte、short、int、long 浮點數 float、double 字元 char 11/10/2018 基本資料型別 基本資料型態 可用之型別關鍵字 整數 byte、short、int、long 浮點數 float、double 字元 char 布林值 boolean
整數 型別 關鍵字 名稱 佔用 記憶體 數值範圍 byte 位元組 8 bits -128 ~ 127(-27 ~ 27-1) short 11/10/2018 整數 型別 關鍵字 名稱 佔用 記憶體 數值範圍 byte 位元組 8 bits -128 ~ 127(-27 ~ 27-1) short 短整數 16 bits -32768 ~ 32767(-215 ~ 215-1) int 整數 32 bits -2147483648 ~ 2147483647 (-231 ~ 231-1) long 長整數 64 bits -263 ~ 263-1
整數 八進位和十六進位的整數表示法: 長整數表示法: int j = 012; //八進位的變數值設定 11/10/2018 整數 八進位和十六進位的整數表示法: 長整數表示法: int j = 012; //八進位的變數值設定 int k = 0x2a; //十六進位的變數值設定 int m = 0x1B0C; //十六進位的變數值設定 long a = 123; //以一般整數設定給長整數變數 long b = 123L; //以長整數設定給長整數變數
long型別的數值不可設定給int型別的變數: 11/10/2018 整數 超出int的範圍,應在尾端加上l或L: long型別的數值不可設定給int型別的變數: long a = 123456789123; //錯誤 long b = 123456789123L; //正確 Long a = 123456789123 : 123456789123為一個整數int的表示方法, 但是其超出了整數int型別可儲存的範圍, 此時會“integer number too large”的錯誤訊息 int c = 123L; //錯誤的設值
浮點數 型別關鍵字 名稱 佔用記憶體 數值範圍 float 單精數 32 bits 1.4E-45 ~ 3.4E+38 11/10/2018 浮點數 型別關鍵字 名稱 佔用記憶體 數值範圍 float 單精數 32 bits 1.4E-45 ~ 3.4E+38 -1.4E-45 ~ -3.4E+38 double 倍精數 64 bits 4.9E-324 ~ 1.79E+308 -4.9E-324 ~ -1.79E+308 float 的準確度到小數點下7位數,double到15位數,超出部份會被去掉 例:987654321.123456789f (float) 9.8765432E8 987654321.123456789 (double) 9.876543211234568E8 (四捨五入)
浮點數 浮點數預設型別為double,所以只要數值中出現小數點或E時,皆視為double double型別的值不能設定給float型別的變數 11/10/2018 浮點數 浮點數預設型別為double,所以只要數值中出現小數點或E時,皆視為double double型別的值不能設定給float型別的變數 float ft1 = 1.23f; float ft2 = 1.234F; float ft3 = 1.234; //錯誤 float ft3 = 10E2; //錯誤 Float ft3 = 1.234 和 float ft3 = 10E2 在Java中均視為double的浮點數,所以double不可以設定給float
字元 使用Unicode,每個字元佔 2 bytes,其中包括中文,日文,韓文,德文, 法文等. 字元以單引號(’)包起來表示 11/10/2018 字元 使用Unicode,每個字元佔 2 bytes,其中包括中文,日文,韓文,德文, 法文等. 字元以單引號(’)包起來表示 宣告字元變數使用char關鍵字 char c = ‘A’; char d = ‘字’;
字元 字元變數的設值可以使用一般整數設定 ,範圍為 0~65535(0xffff) 11/10/2018 字元 字元變數的設值可以使用一般整數設定 ,範圍為 0~65535(0xffff) Unicode表示法,以‘\uXXXX’表示一個字元其中X為十六進位的數字,且必須為 4 位數 char c = 26131; char c = ‘\u74CF’;
布林值 布林值也叫真假值,不是真(true), 就是假(false) 11/10/2018 布林值 布林值也叫真假值,不是真(true), 就是假(false) 宣告布林變數使用boolean關鍵字,設定其值時只能使用 true 或 false,或者運算結果為 true 或 false 的運算式 boolean b1 = true; boolean b2 = 18 > 17; 18大於17,故得true
不同型別的值與變數 自動型別轉換的限制 同資料型態,小體積的型別值可以設定給大體積的型別變數,反之則否。 例:int 可設定給 long 11/10/2018 不同型別的值與變數 自動型別轉換的限制 同資料型態,小體積的型別值可以設定給大體積的型別變數,反之則否。 例:int 可設定給 long boolean型別不同於其它基本型別,不能和其它基本型別相互成為設定值。 char型別可以視為int型別,但所有整數型別皆不能視為char型別。 所有整數型別皆可以設定給所有浮點數型別,反之則否。
11/10/2018 不同型別的值與變數 自動型別轉換圖解
自訂常數 自訂常數的語法 宣告自訂常數時,一定要同時設定初始值才算合法。 若要變更所有的值時,只要變更初設值即可。 常數名稱比數值容易了解。 11/10/2018 自訂常數 自訂常數的語法 宣告自訂常數時,一定要同時設定初始值才算合法。 若要變更所有的值時,只要變更初設值即可。 常數名稱比數值容易了解。 避免不小心被更動。(若不小心在程式的其他地方變更其值時,會出現編譯錯誤訊息) final 型別關鍵字 常數名稱 = 常數數值; final float pi = 3.14159f;
指定運算子 「=」的左邊一定是變數,不能是數值。 結合性是由右至左。 多重指定的例子: a = b = c = d = 5; 11/10/2018 指定運算子 「=」的左邊一定是變數,不能是數值。 結合性是由右至左。 多重指定的例子: a = b = c = d = 5; D = 5 C = d c=5 B = c b = 5 A = b a = 5
算術運算子 算術運算子的結合性是由左至右 優先序為:先(*/%)後(+-) 注意「運算時,型別的自動轉換」 運算子 語法 說明 11/10/2018 算術運算子 算術運算子的結合性是由左至右 優先序為:先(*/%)後(+-) 注意「運算時,型別的自動轉換」 運算子 語法 說明 a=5, b=2的 運算結果 + a + b a加b 7 - a – b a減b 3 * a * b a乘b 10 / a / b a除以b 2.5 % a % b a除以b的餘數 1
遞增、遞減運算子 不指定給其它變數,則兩種方式是相同的 若指定給另一個變數時,兩種方式的意義不同 a++ ++a a=a+1 → a++ 11/10/2018 遞增、遞減運算子 a=a+1 → a++ b=b-1 → b-- 不指定給其它變數,則兩種方式是相同的 a++ ++a 若指定給另一個變數時,兩種方式的意義不同 c = ++a; // 先將a加一後,再將a的內容指定給c c = a++; // 先將a的內容指定給c,a再加一 b = a++ + 5 可視為: b = a + 5; a++
算術指定運算子 各種算術指定運算子 算術指定運算子為二元運算子 結合性是由右至左 a=a+2 → a+=2 a=a+3 → a+=3 11/10/2018 算術指定運算子 算術指定運算子為二元運算子 結合性是由右至左 a=a+2 → a+=2 a=a+3 → a+=3 各種算術指定運算子 算術指定運算子 一般算術式 簡化後的運算式 += a = a + b a += b -= a = a – b a -= b *= a = a * b a *= b /= a = a / b a /= b %= a = a % b a %= b
關係運算子 布林值之間的關係運算只能使用 ==和 != 兩個運算子,其餘的關係運算子都不能使用 關係運算子 說明 範例 範例結果 > 11/10/2018 關係運算子 布林值之間的關係運算只能使用 ==和 != 兩個運算子,其餘的關係運算子都不能使用 關係運算子 說明 範例 範例結果 > 是否大於 5 > 2 true >= 是否大於等於 5 >= 2 < 是否小於 5 < 2 false <= 是否小於等於 5 <= 2 == 是否等於 5 == 2 != 是否不等於 5 != 2
關係運算子 關係運算子的運算優先順序較算術運算子低 運算優先序:先(><>=<=)後(==!=) 關係運算子結合性皆為由左至右 11/10/2018 關係運算子 關係運算子的運算優先順序較算術運算子低 運算優先序:先(><>=<=)後(==!=) 關係運算子結合性皆為由左至右 布林值之間的關係運算只能使用==和 !=兩個運算子,其餘的關係運算子都不能使用
邏輯運算子 邏輯運算子語法 真值表 運算子 意義 語法 && 且,and a && b || 或,or a || b ! 非,not ! a true false 11/10/2018
邏輯運算子 運算順序: ! > 關係運算子 > && > || 11/10/2018 邏輯運算子 運算順序: ! > 關係運算子 > && > || && 和 || 稱為快捷運算子(short circuit) 當a&&b時, 如果知道a為false, 則a&&b一定為false 當a||b時, 如果知道a 為true , 則a||b一定為true, 不用等b的值 (6<5) && (39>17) && (a==7) false 不判斷 不判斷 (3<9) || (7<12) || (b<=a) true 不判斷 不判斷
位元運算子 運算子 說明 & 以兩數值逐位元做且(and)運算。 | 以兩數值逐位元做或(or)運算。 ~ 以一數值逐位元做非(not)運算,也就是取1補數。 ^ 以兩數值逐位元做互斥(exclusive or)。兩位元不一樣時得1,同為0或同為1時得0。 << 位元左移(left shift)。 >> 位元有號右移(right shift)。 >>> 位元無號右移(unsigned right shift)。 11/10/2018
11/10/2018 運算子的優先權 單元運算子 算術運算子 位元移動運算子 關係運算子 邏輯運算子 條件運算子 指定運算子
11/10/2018 流程控制敘述 五種控制敘述: if/else Switch For While do/while 選擇敘述 迴圈敘述
If 選擇敘述 若條件式為true,執行敘述區塊。若條件式為false,則跳過敘述區塊。(如果區塊內只有一個敘述,則大括弧可省略) 11/10/2018 If 選擇敘述 若條件式為true,執行敘述區塊。若條件式為false,則跳過敘述區塊。(如果區塊內只有一個敘述,則大括弧可省略) 例題:若I為偶數 ,則輸出訊息. if(條件式) { //程式敘述 }
11/10/2018 if/else敘述基本用法 若條件式為true,執行區塊敘述一;若條件式為false,執行區塊敘述二。(如果區塊內只有一個敘述,則大括弧可省略) if/else 的流程圖 if(條件式){ //區塊敘述一 } else{ //區塊敘述二
11/10/2018 if/else的巢狀結構 兩層巢狀 if/else 的可能情況
Switch 選擇敘述 為多選一敘述語法 switch (鍵值){ case 條件值1: // 區段1敘述 break; 11/10/2018 Switch 選擇敘述 為多選一敘述語法 switch (鍵值){ case 條件值1: // 區段1敘述 break; case 條件值2: // 區段2敘述 …… case 條件值N: // 區段N敘述 default: // default區段敘述 }
11/10/2018 Switch 選擇敘述 流程圖: 執行switch敘述時,會先求得鍵值,接著將鍵值和條件值1做比對,如果兩值相等,則執行區段1敘述, 接著遇到break 之後,離開switch敘述,如果兩值不相等則再往下比對。 如果鍵值和所有的條件值都不相等,則執行default
Switch 選擇敘述 使用switch敘述時應注意的事項 11/10/2018 Switch 選擇敘述 使用switch敘述時應注意的事項 鍵值必須為可自動轉換成int的型別;例如:byte, short, char, int.而long, float, double不行 鍵值會和所有 case 標籤一一比對。 case 後面只能接常數或是常數的運算式,不能包含變數。 當鍵值和所有 case 標籤比對過,而且沒有符合的 case 標籤時,default 標籤以下的敘述會被執行。 case 和 default 視為標籤,其順序沒有限制。 .
11/10/2018 Switch 選擇敘述 Case和default搭配(:)是特殊標籤,它們的功能是將switch 區塊內的敘述分區,switch透過鍵值可以決定從哪個標籤開始執行敘述。 default部份在switch 敘述中是選擇性的,可有可無,而且不一定要放在最後面 在switch敘述中,每個單元的開頭是case,而結尾通常是break Case後面敘述沒有使用大括弧包起來,因此,case與case間並不是區塊,所以需要break跳離switch結構
11/10/2018 break敘述 沒有break時,繼續往下執行,並忽略標籤
For的語法與流程 for迴圈語法 起始式-進入迴圈時,一開始執行的程式運算式,只執行一次。通常起始式,多為設定控制迴圈執行變數的起始值。 11/10/2018 For的語法與流程 for迴圈語法 起始式-進入迴圈時,一開始執行的程式運算式,只執行一次。通常起始式,多為設定控制迴圈執行變數的起始值。 條件式-判斷是否重複執行迴圈的依據。如果條件式的結果為true,則繼續執行迴圈;如果為false,則跳離迴圈。 步進式-每經過一次迴圈,就會執行一次的運算式。通常步進式,多為設定控制迴圈執行變數的遞增或遞減運算式。 for (起始式; 條件式; 步進式) { //區塊內敘述 }
範例1 連續印出1-9的平方: for (int j=1; j<=9; j++) { 11/10/2018 範例1 連續印出1-9的平方: for (int j=1; j<=9; j++) { System.out.print(j*j + "\t"); } 程式於程式區\java(1)\Ch05\Ch05_01.java
For的語法與流程 使用for迴圈應注意的事項: 起始式、條件式及步進式,可以視情況省略 11/10/2018 For的語法與流程 使用for迴圈應注意的事項: 起始式、條件式及步進式,可以視情況省略 若起始式或步進式,有不只一個敘述時,以逗號區隔運算式。 括弧內用以區隔起始式、條件式及步進式的兩個分號是不能省略的。
For迴圈的變化型 連續印出1-9的平方: 法一: for(int j=1; j<=9; ) { 11/10/2018 For迴圈的變化型 連續印出1-9的平方: 法一: for(int j=1; j<=9; ) { System.out.print(j*j + "\t"); j++; } 法二: int k = 1; for(; k<=9; ) System.out.print(k*k + "\t"); k++; 程式於程式區\java(1)\Ch05\Ch05_01_01.java
For迴圈的變化型 計算1-9的平方的總和: int k, sum; 11/10/2018 For迴圈的變化型 計算1-9的平方的總和: int k, sum; for(k = 1, sum = 0; k < 10 ; sum += k*k, k++); System.out.println(sum);
For 範例 For( j = 1; j <= 100 ; j++) 共執行??次 11/10/2018 For 範例 For( j = 1; j <= 100 ; j++) 共執行??次 J 由 1 到 100, 共100次 For( j = 1; j < 100 ; j++) 共執行??次 J 由 1 到 99, 共 99次 For( j = 1; j <= 100 ; j+=2) 共執行??次 J 由 1, 3, 5, 7,… 到 99, 共 50次 For( j = 2; j <=128 ; j*=2) 共執行??次 J 由 2, 4, 8, 16, … 到 128, 共 7次
For巢狀結構 for(int i=1; i<=5; i+=2) { for(int j=2; j<=6; j+=2) 11/10/2018 For巢狀結構 for(int i=1; i<=5; i+=2) { for(int j=2; j<=6; j+=2) System.out.print("(" + i + "," + j + ")\t"); } System.out.print("\n"); 執行方向 外層for第1次 內層for第1次 (1,2) 內層for第2次 (1,4) 內層for第3次 (1,6) 換行 外層for第2次 內層for第4次 (3,2) 內層for第5次 (3,4) 內層for第6次 (3,6) 外層for第3次 內層for第7次 (5,2) 內層for第8次 (5,4) 內層for第9次 (5,6) 程式於程式區\java(1)\Ch05\Ch05_02.java
While 迴圈 標上起始式和步進式的 while 迴圈 while的流程圖 //起始式 while(條件式) { // 區塊內敘述 11/10/2018 While 迴圈 標上起始式和步進式的 while 迴圈 while的流程圖 //起始式 while(條件式) { // 區塊內敘述 // 步進式 } 起始式和步進式在何處?
範例一:計算1到100總和 int i=1, sum=0; while(i<=100) { sum+=i; i++; } 11/10/2018 int i=1, sum=0; while(i<=100) { sum+=i; i++; } System.out.println("1+2+3+...+100="+sum); sum += i++ ; 程式於程式區\java(1)\Ch9\EX4_14.java
do/while 迴圈 do/while的語法: do/while的條件式擺在結構的最後面,也就表示先執行區塊敘述一次,再做條件式判斷。 11/10/2018 do/while 迴圈 do/while的語法: do { // 區塊內敘述 } while (條件式); do/while的條件式擺在結構的最後面,也就表示先執行區塊敘述一次,再做條件式判斷。 基本上,for和while敘述可以相互取代,而不可以使用do/while敘述取代(因為,do/while一定至少執行一次)
範例二:計算1到100總和 int i=1, sum=0; do { sum+=i; i++; } while(i<=100); 11/10/2018 int i=1, sum=0; do { sum+=i; i++; } while(i<=100); System.out.println("1+2+3+...+100="+sum);
範例三:判斷質數 int n, i=2; boolean isPrime=true; //取得輸入的值存在n do { 11/10/2018 範例三:判斷質數 int n, i=2; boolean isPrime=true; //取得輸入的值存在n do { if( (n%i==0) && (n!=2) ) isPrime=false; i++; } while(i<n); System.out.println(isPrime ? "質數" : "不是質數"); 程式於程式區/java(1)/Ch9/EX4_16.java
break break的作用是跳離敘述區塊 常見與迴圈、switch搭配演出 while(true) { if(i==7) break; 11/10/2018 break break的作用是跳離敘述區塊 常見與迴圈、switch搭配演出 while(true) { if(i==7) break; System.out.print(i+"\t"); i++; } i 為 7 時跳出 while 迴圈
當發現n可被小於n的某數整除時,立刻跳離迴圈,可以提升效率 範例四:判斷質數(使用break) 11/10/2018 int n, i=2; boolean isPrime=true; //將傳入的參數存放在n中 do { if( (n%i==0) && (n!=2) ) { isPrime=false; break; } i++; } while(i<n); System.out.println(isPrime ? "質數" : "不是質數"); 當發現n可被小於n的某數整除時,立刻跳離迴圈,可以提升效率
範例五:測試continue for(int j=0; j<10; j++) { if(j==4) continue; 11/10/2018 範例五:測試continue for(int j=0; j<10; j++) { if(j==4) continue; System.out.print(j + "\t"); } System.out.println("\n找找看少了哪個數字?");
break 與 continue 如果有巢狀迴圈出現,break 與 continue 可不可以一次跳兩層呢? Ans: 不行 11/10/2018 break 與 continue 如果有巢狀迴圈出現,break 與 continue 可不可以一次跳兩層呢? Ans: 不行 修正方法: 使用迴圈標籤
11/10/2018 練習一 使用do while,來輸出下圖: 程式於程式區\java(1)\Ch9\Ex9_2.java
11/10/2018 練習二 求圓周率 N到199999 程式於程式區\java(1)\Ch9\Ex9_3.java
11/10/2018 練習二參考答案 class 圓周率 { public static void main(String [] args) double pi = 0.0; for(int i = 1; i< 200000; i=i+2) if(i % 4 == 1) pi = pi + 1.0/i; else pi = pi - 1.0/i; } pi = pi * 4.0; System.out.println("PI=" + pi);