Download presentation
Presentation is loading. Please wait.
1
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文
2
Outline Control Flow Statements Your Turn 方法(Methods)
Looping statement for statements while/do-while statements Branching statement break, continue, label: and return Your Turn 方法(Methods) 參數 (Arguments) 傳值 (Pass-by-Value) 傳址 (Pass-by-Reference) 傳回值 (return)
3
Control Flow Statements
4
Control Flow Statements – if-else
if (expression) { BODY 1 if(expression) { BODY 1a } else { BODY 1b } else { BODY 2 }
5
Decision; Condition if (a>b) { max = a; min = b; } else { min = a; max = b; } if (c>max) { max = c; } if (c<min) { min = c; }
6
? : 運算子 public class Compare { public static void main (String[] args)
int x = Integer.parseInt(args[0]); int y = Integer.parseInt(args[1]); int z = Integer.parseInt(args[2]); int max, min; max =x > y ? x : y; min =x < y ? x : y; max =z > max ? z : max; min =z < max ? z : min; System.out.println("Max: "+max+", Min: "+min); }
7
Control Flow Statements – switch-case
switch statement expression的數值,將會被拿來比對下面每一個case的value 程式將會跳至第一個比對成功(數值相等)的地方繼續執行,假如遇到break;敘述,就結束整個switch敘述 否則將會一直往下比對。沒有比對成功的話,則執行default:之後的程式段 沒遇到break時,會繼續執行下一行指令敘述 switch(expression) { case value1: statements… break; case value2: … default: }
8
Control Flow Statements
Looping 將一段程式,重複執行數次,我們稱這段重複執行的程式為迴圈。 Java looping statement 的種類: for while do-while
9
Control Flow Statements – for
for statement 語法 initialization:初始條件 在此宣告之變數其有效範圍僅存在於此迴圈內 例:for(int x=0; x<10; x++) { … } termination:終止條件,決定何時迴圈結束 increment:遞增,每次迴圈進行後所要做的事 for( initialization; termination; increment ) { statements… }
10
Control Flow Statements – for
Example: ForExample.java /** * 在螢幕上印出 1 ~ 10 */ for (int i=1; i <=10; i++) { System.out.println ("i = " + i); }
11
Control Flow Statements – for
Example: ForExample.java /** * 印出 1~10, 最後在印出最後的 i 值 */ int i; for (i=1; i <=10; i++) System.out.println ("i = " + i); System.out.println ("After loop, i = " + i);
12
Control Flow Statements – for
迴圈控制變數 名稱習慣用 i , j , k 來命名,盡量在迴圈內使用就好,可降低程式錯誤的機率 在一個迴圈內,可以同時有多個控制變數 例:for(int i=1, j=i+1; i<5; i++, j=i*2) { … } 巢狀迴圈 for 迴圈中還有 for 迴圈 在複雜的情況下使用 無窮迴圈 infinite loop for(;;) {}
13
Control Flow Statements – for
Example: ForExample.java /** * 一個迴圈內,可以有多個控制變數 */ int maxX = 10; int maxY = 15; for (int x = 0, y = 0; (x < maxX) && (y < maxY); x++, y = x * 2) { System.out.println(" x < 10 : " + x + ", y < 15 : " + y); }
14
Control Flow Statements – for
Example: ForExample.java /** * 巢狀迴圈的使用方法 */ for (int i=1; i <=10; i++) { for (int j=1; j <=10; j++) { for (int k=1; k <=10; k++) { System.out.println("i = " + i + " j = " + j + " k = " + k); } // end of for k } // end of for j } // ned of for i
15
Control Flow Statements – while/do-while
while statement 語法 while 會先執行括號內的運算式(expression),此運算式必回傳 true 或 false 若運算式結果為 true 則執行區塊內部敘述,否則跳離 適用情況:不知道幾次迴圈才會停止 無窮迴圈 while (true) { … } while (expression) { statements… }
16
Control Flow Statements – while/do-while
Example: WhileExample.java public class WhileExample { public static void main(String[] args) { double r = 0; while(r < 0.99d) { r = Math.random(); // Math 類別中提供產生亂數的類別方法 System.out.println(r); } // end of while }
17
Control Flow Statements – while/do-while
do-while statement 語法 do…while 敘述先執行區塊內部,執行完畢後才執行括號內的運算式(expression),回傳 true 或 false 若運算式結果為 true,則再執行區塊敘述,否則跳離 do…while 敘述必至少執行一次區塊內部敘述 Do { statements… } while (expression);
18
Control Flow Statements – while/do-while
Example: DoWhileExample.java /** * 計算所有平方值小於 100 的數字並印出 */ public class DoWhileExample { public static void main (String[] args) { int i=0, j; do { i++; j = i * i; System.out.println ( i + " * " + i + " = " + j); } while (j < 100); }
19
Control Flow Statements – branching
Branching Statements break 語法:break; 中斷執行,立即跳出 用在 switch、迴圈 continue 語法:continue; 跳過剩餘的程式碼,直接進行下一次迴圈 用在迴圈中 return 程式會跳出目前所在的 method,回到原先呼叫的 method 的地方 離開方法並回傳值:return count;
20
Control Flow Statements – branching
Exmaple: BreakAndContinue.java for(int i = 0; i < 100; i++) { if(i == 74) break; // Out of for loop if(i % 9 != 0) continue; // Next iteration System.out.println(i); }
21
Control Flow Statements – branching
break、continue 加上 label break 搭配 break 的使用,可以用來終止更外層的迴圈 contine 搭配 break 的使用,會跳過以 label 標示的外層迴圈當輪的執行,直接進行該外層迴圈的下一輪 label本身並不是一行指令,代表的是下一行程式開始執行的地方
22
Control Flow Statements – branching
break with label search: for ( ; i < arrayOfInts.length; i++) { for (j = 0; j < arrayOfInts[i].length; j++) { if (arrayOfInts[i][j] == searchfor) { foundIt = true; break search; }
23
Control Flow Statements – branching
continue with label test: for (int i = 0; i <= max; i++) { int n = substring.length(); while (n-- != 0) { if (n == 1) continue test; System.out.println(“no move!!!”); } //end of while foundIt = true; break test; } // end of for i
24
實例複習 實例:Menu.java 結合之前 decision making 以及 looping,可以做出一個使用者介面程式
可以根據使用者輸入的值來做相對應的功能
25
Your Turn Basic Practice 請寫出一個程式讀入一個整數,畫出以下形狀。 例如,java Triangle 4 *
* * * * * * * * *
26
Your Turn Advanced Practice 請寫出一個程式讀入一個整數,畫出以下形狀。 例如:java Triangle2 3
* * * * * *
27
方法(Method) 定義 格式 範例:public static void main (String[] args);
可重複使用的程式碼片段 格式 範例:public static void main (String[] args); 存取範圍 方法特性 static final abstract native synchronized public protected (空白) private 方法傳回型態 方法名稱 (參數宣告);
28
方法(Method) 等同於 C/C++ 或其他語言中的函式(functions) 基本組成 參數 Arguments 參數型態
名稱(name) 參數(arguments) 傳進方法中的資訊 回傳值型態(return type) 主體(body) 參數 Arguments 參數是由逗號分隔的多個變數宣告所構成 例:int stuScore(String stuName, int stuNum) 參數型態 可以是任何合法的 Java 資料型態,包括 primitive 以及 reference 資料型態 ReturnType MethodName(Arg List) /* Method Declaration */ { /************ Method Body ************/ }
29
方法(Method) 定義 methods public Object push (Object item) 存取等級
static 宣告本 method 為 class method abstract 宣告本 method 內不需任何程式碼 final 宣告本 method 不允許被 subclass 覆蓋(override) native 宣告本 method 為其他程式語言所寫成 synchronized 必須由 monitor 來控制執行時機 (參數列) 參數列 throws 異常事件 宣告本 method 丟出的例外(exceptions)
30
方法(Method) 為 method 命名,一般命名習慣 將資料傳入method – 參數
應該採用英文動詞,可以串接多個單字:整個字串的第一個字母小寫,其他串接單字的第一個字母大寫 如: toString(), compareTo(), setX(), getX()… Method 名稱不能和 class 名稱一樣,因 class 名稱保留給建構元使用 將資料傳入method – 參數 只要是合法的 Java 資料型態,都可以傳入 method 中 如:double, float 與 int,或是物件 Java 中不允許將 methods 當成參數,傳入另一個 method 中
31
方法(Method) 在 Java 語言中,方法只能在類別中被創造 方法的呼叫 透過物件呼叫(instance methods)
必須使用正確的方法名稱、參數個數與型態 如 str.substring() 透過類別呼叫(static methods or class methods) 如:Math.power()
32
方法(Method) Example: MethodDemo.java
static void printTriangle(int level) { int i, j; for ( i = 1; i <= level; i++) { for ( j = 1; j <= i; j++ ) System.out.print("*"); System.out.println(); }
33
參數傳遞(Passing Argument)
參數名稱 參數名稱在 method 中用來指稱所傳入的變數 參數名稱可與類別中的成員變數名稱相同,此時成員變數將被隱藏(hide),也就是說,在 method 中所指稱的乃所傳入之變數,此時可用 this 來指定成員變數 參數傳遞方式 傳值 Pass-by-Value 傳入參數為 primitive 型態,在 method 內對參數的改變將不影響原來 method 外變數的值 傳址 Pass-by-Reference 傳入參數為 reference 型態,無法更動 reference 對象,但可使用物件的 methods 與變數
34
參數傳遞(Passing Argument)
Example: PassArgDemo.java static void myMethod1 (int i) { i += 1; System.out.println("In MyMethod(): " + i); } public static void main(String[] args) { int i = 10; // 參數以 primitive 的型態傳入 myMethod(i); // 不會改變在 main 中的 i 值 System.out.println("In main(): " + i);
35
參數傳遞(Passing Argument)
Example: PassArgDemo.java static void myMethod2 (int[] i) { i[0] = i[0] +1; System.out.println("In MyFunc(): " + i[0]); } public static void main(String[] args) { int[] i = {10}; myMethod2(i); System.out.println("In main(): " + i[0]);
36
參數傳遞(Passing Argument)
Memory i 0x5678 0x1234 public static void main(String[] args) i[0] 10 0x5678 0x5678 0x9012 i static void MyFunc(int[] i)
37
從 method 回傳數值(return) return
宣告 method 時可設定回傳型態,在 method 主體中,必須使用 return 敘述,回傳適當的數值 宣告為 void 的 method,不能包含任何 return 敘述 回傳的數值的資料型態,必須要符合 method 宣告設定的資料型態一致
38
從 method 回傳數值(return) Example: PassArgDemo.java
static int myMethod3 (int i) { i *= 10; return i; } public static void main(String[] args) { int i = 10; int j = myMethod3(i); System.out.println("The return value: " + j);
39
Your Turn 試寫二個 static method 方法: static void printAdd2N(int max)
static int getAdd2N(int max) 方別傳入一個參數 max,可以計算從 1 加到 max 的運算 最後再寫一個 main() 來測試 如: = 55 Result: 55
Similar presentations