Presentation is loading. Please wait.

Presentation is loading. Please wait.

第五張 方法.

Similar presentations


Presentation on theme: "第五張 方法."— Presentation transcript:

1 第五張 方法

2 Opening Problem 分別取得1到10,20到37,以及35到49間整數的總和

3 問題 int sum = 0; for (int i = 1; i <= 10; i++) sum += i;
System.out.println("Sum from 1 to 10 is " + sum); sum = 0; for (int i = 20; i <= 30; i++) System.out.println("Sum from 20 to 30 is " + sum); for (int i = 35; i <= 45; i++) System.out.println("Sum from 35 to 45 is " + sum);

4 問題 int sum = 0; for (int i = 1; i <= 10; i++) sum += i;
System.out.println("Sum from 1 to 10 is " + sum); sum = 0; for (int i = 20; i <= 30; i++) System.out.println("Sum from 20 to 30 is " + sum); for (int i = 35; i <= 45; i++) System.out.println("Sum from 35 to 45 is " + sum);

5 解答 public static int sum(int i1, int i2) { int sum = 0;
for (int i = i1; i <= i2; i++) sum += i; return sum; } public static void main(String[] args) { System.out.println("Sum from 1 to 10 is " + sum(1, 10)); System.out.println("Sum from 20 to 30 is " + sum(20, 30)); System.out.println("Sum from 35 to 45 is " + sum(35, 45));

6 本章綱要 使用形式參數(formal parameters)定義方法(§5.2)
使用實際參數(actual parameters),也就是引數(arguments)呼叫方法(§5.2) 定義帶有回傳值的方法(§5.3) 定義不帶有回傳值的方法(§5.4) 以傳值的方式傳遞引數(§5.5) 開發模組化,易閱讀、易偵錯、易維護,且可重複使用的程式碼(§5.6) 撰寫將十進位轉換成十六進位的方法(§5.7) 使用多載方法,並了解不明確的多載(§5.8) 判斷變數的有效範圍(§5.9) 利用Math類別裡的方法,解決數學問題(§§ ) 將方法萃取的概念應用在軟體開發上(§5.12) 使用逐步細緻化(stepwise refinement)的方式,設計與實作方法(§5.12)

7 定義方法 方法定義由方法名稱、參數、回傳值型態,以及主體內容所組成。

8 方法簽名 方法名稱及參數列表共同組成了方法簽名(method signature)。

9 形式參數 定義於方法標頭的變數被稱作形式參數 (formal parameters) 或簡稱參數(parameters)。

10 實際引數 When a method is invoked, you pass a value to the parameter. This value is referred to as actual parameter or argument.

11 回傳值型態 方法可回傳值。回傳值型態returnValueType為方法回傳值的資料型態。有些方法執行指定運算後,並不會回傳值。在這種情況下,returnValueType就會以關鍵字void表示。舉個例子,main方法的回傳值型態是void。

12 呼叫方法 測試 max 方法 此程式利用呼叫max方法找出最大的int值並回傳。 TestMax

13 animation 呼叫方法

14 animation 追蹤呼叫方法 i 目前是 5

15 animation 追蹤呼叫方法 j 目前是 2

16 animation 追蹤呼叫方法 呼叫 max(i, j)

17 變數 i 的值被傳入 num1 變數 j 的值被傳入num2
animation 追蹤呼叫方法 呼叫 max(i, j) 變數 i 的值被傳入 num1 變數 j 的值被傳入num2

18 animation 追蹤呼叫方法 定義變數result

19 (num1 > num2) 是 true (num1目前是5,num2目前是2)
animation 追蹤呼叫方法 (num1 > num2) 是 true (num1目前是5,num2目前是2)

20 animation 追蹤呼叫方法 result 目前是 5

21 animation 追蹤呼叫方法 回傳變數result的值

22 回傳變數result的值給max( I , j )
animation 追蹤呼叫方法 回傳變數result的值給max( I , j )

23 animation 追蹤呼叫方法 執行印出敘述

24 警告 回傳值方法需要帶有return敘述。以下(a)所示的方法邏輯上是正確的,但會產生編譯錯誤,因為Java編譯器認為此方法可能不會回傳值。
要解決這個問題,請將(a)的if ( n < 0 )移除,讓編譯器不論if敘述如何被解析,都能確保有return敘述來回傳值。

25 於其他類別中乎方法 註釋:方法允許程式碼分享與重複使用。max方法可從任何類別裡呼叫,不只是TestMax。假若建立一個新類別,便可透過「類別名稱.方法名稱」呼叫max方法(例如:TestMax.max )。

26 呼叫堆疊

27 animation 追蹤呼叫堆疊 宣告並初始化變數 i

28 animation 追蹤呼叫堆疊 宣告並初始化變數 j

29 animation 追蹤呼叫堆疊 宣告變數 k

30 animation 追蹤呼叫堆疊 呼叫 max(i, j)

31 animation 追蹤呼叫堆疊 變數 I 、j 的值被 傳入變數num1、num2

32 animation 追蹤呼叫堆疊 宣告變數result

33 animation 追蹤呼叫堆疊 (num1 > num2) 是 true

34 animation 追蹤呼叫堆疊 將變數num1的值 傳給變數result

35 將變數result的值回傳 並指定給變數 k
animation 追蹤呼叫堆疊 將變數result的值回傳 並指定給變數 k

36 animation 追蹤呼叫堆疊 執行印出敘述

37 範例程式5.2 TestVoidMethod.java
void方法並不會回傳任何數值。呼叫void方法必須是個敘述。 TestVoidMethod

38 傳遞參數 假設你使用下方敘述來呼叫方法 nPrintln(“Welcome to Java”, 5); 則輸出為何?
public static void nPrintln(String message, int n) { for (int i = 0; i < n; i++) System.out.println(message); } 假設你使用下方敘述來呼叫方法 nPrintln(“Welcome to Java”, 5); 則輸出為何? nPrintln(“Computer Science”, 15); 可以使用下方敘述呼叫方法嗎? nPrintln(15, “Computer Science”);

39 範例程式5.4 Increment.java 此程式說明了傳值的效果。 Increment

40 範例程式5.5 TestPassByValue.java
此程式說明了傳值的效果。 TestPassByValue

41 傳值

42 GreatestCommonDivisorMethod
模組化程式 方法可用來減少多餘的程式碼,允許程式碼重複使用,還可以用來模組化程式碼,提升程式品質。 GreatestCommonDivisorMethod PrimeNumberMethod

43 範例程式5.8 Decimal2HexConversion.java
撰寫一個將十進位數字轉換為十六進位的程式。 Decimal2HexConversion

44 TestMethodOverloading
多載方法 多載 max 方法 public static double max(double num1, double num2) { if (num1 > num2) return num1; else return num2; } TestMethodOverloading

45 不明確的呼叫 有時候方法呼叫會有兩個以上可能的執行選項,但編譯器無法決定何者最合適。這種情況被稱作不明確的呼叫(ambiguous invocation)。不明確的呼叫會導致編譯錯誤。

46 不明確的呼叫 public class AmbiguousOverloading {
public static void main(String[] args) { System.out.println(max(1, 2)); } public static double max(int num1, double num2) { if (num1 > num2) return num1; else return num2; public static double max(double num1, int num2) {

47 區域變數有效範圍 區域變數(local variable)義於方法內的變數。 範圍(scope):變數於程式中可被使用的部分。
區域變數的有效範圍起始於宣告點,結束於包含該變數的區塊結尾。區域變數必須在被使用之前先做宣告與指定數值。

48 區域變數有效範圍 我們可在方法裡的不同區塊內宣告相同名稱的區域變數,但不能在相同區塊或巢狀區塊內宣告相同名稱的區域變數

49 區域變數有效範圍 參數即是區域變數。方法參數的有效範圍涵蓋整個方法。宣告於for迴圈標頭初始行為的變數,其有效範圍為整個迴圈。然而,宣告於for迴圈主體內的變數,其有效範圍被侷限在迴圈主體裡的宣告點與包含該變數的區塊結尾之間。

50 區域變數有效範圍

51 區域變數有效範圍 // Fine with no errors public static void correctMethod() {
int x = 1; int y = 1; // i is declared for (int i = 1; i < 10; i++) { x += i; } // i is declared again y += i;

52 區域變數有效範圍 // With errors public static void incorrectMethod() {
int x = 1; int y = 1; for (int i = 1; i < 10; i++) { int x = 0; x += i; }

53 方法萃取 方法萃取(method abstraction)將方法使用從實作內容分離出來。使用者可在不知道實作內容的情況下使用方法。

54 方法的好處 一勞永逸 對使用者隱藏資訊 減少複雜

55 Math類別 類別包含: 類別方法: PI E Trigonometric Methods Exponent Methods
Rounding Methods min、 max 、 abs 和 random Methods

56 三角函數方法 sin(double a) cos(double a) tan(double a) acos(double a)
asin(double a) atan(double a) 範例: Math.sin(0) returns 0.0 Math.sin(Math.PI / 6) returns 0.5 Math.sin(Math.PI / 2) returns 1.0 Math.cos(0) returns 1.0 Math.cos(Math.PI / 6) returns 0.866 Math.cos(Math.PI / 2) returns 0 Radians toRadians(90)

57 指數方法 範例: exp(double a) Returns e raised to the power of a.
Math.exp(1) returns 2.71 Math.log(2.71) returns 1.0 Math.pow(2, 3) returns 8.0 Math.pow(3, 2) returns 9.0 Math.pow(3.5, 2.5) returns Math.sqrt(4) returns 2.0 Math.sqrt(10.5) returns 3.24 exp(double a) Returns e raised to the power of a. log(double a) Returns the natural logarithm of a. log10(double a) Returns the 10-based logarithm of a. pow(double a, double b) Returns a raised to the power of b. sqrt(double a) Returns the square root of a.

58 四捨五入方法 double ceil(double x)
x rounded up to its nearest integer. This integer is returned as a double value. double floor(double x) x is rounded down to its nearest integer. This integer is returned as a double value. double rint(double x) x is rounded to its nearest integer. If x is equally close to two integers, the even one is returned as a double. int round(float x) Return (int)Math.floor(x+0.5). long round(double x) Return (long)Math.floor(x+0.5).

59 四捨五入方法 - 範例 Math.ceil(2.1) returns 3.0 Math.ceil(2.0) returns 2.0
Math.floor(2.1) returns 2.0 Math.floor(2.0) returns 2.0 Math.floor(-2.0) returns –2.0 Math.floor(-2.1) returns -3.0 Math.rint(2.1) returns 2.0 Math.rint(2.0) returns 2.0 Math.rint(-2.0) returns –2.0 Math.rint(-2.1) returns -2.0 Math.rint(2.5) returns 2.0 Math.rint(-2.5) returns -2.0 Math.round(2.6f) returns 3 Math.round(2.0) returns 2 Math.round(-2.0f) returns -2 Math.round(-2.6) returns -3

60 min、max、abs方法 max(a, b)and min(a, b) abs(a) random() 範例:
Returns the maximum or minimum of two parameters. abs(a) Returns the absolute value of the parameter. random() Returns a random double value in the range [0.0, 1.0). 範例: Math.max(2, 3) returns 3 Math.max(2.5, 3) returns 3.0 Math.min(2.5, 3.6) returns 2.5 Math.abs(-2) returns 2 Math.abs(-2.1) returns 2.1

61 random方法 隨機產生一個介於 0.0 到 1.0 的double變數。 (0 <= Math.random() < 1.0). 範例: 總而言之:

62 個案研究:產生隨機字元 電腦程式處理數值資料與字元。我們已看過多個涉及數值資料的例子。了解字元,以及處理字元的方式也很重要。本小節將介紹產生隨機字元的範例。 如2.17小節所介紹的,每個字元都含有一個獨特,介於十六進位0到FFFF(相當於十進位的65535)的Unicode。要產生一個隨機字元,就要利用以下運算式,產生一個介於0到65535之間的隨機整數(請注意,由於0 <= Math.random() < 1.0,您必須對65535加1): (int)(Math.random() * ( ))

63 個案研究:產生隨機字元 現在讓我們來看如何產生隨機小寫字母。小寫字母的Unicode為a,b,c,…,z的Unicode的連續整數。a的Unicode為 (int)'a‘ 因此,(int) 'a'與(int) 'z'之間的隨機整數為 (int)((int)'a' + Math.random() * ((int)'z' - (int)'a' + 1)

64 個案研究:產生隨機字元 如2.17.3小節所討論的,所有的數值運算子皆可作用於char運算元。如果另一個運算元為數字或字元,char運算元便會被轉換為數字。因此,上述這個運算式可簡化如下: 'a' + Math.random() * ('z' - 'a' + 1) 而隨機小寫字母為 (char)('a' + Math.random() * ('z' - 'a' + 1))

65 個案研究:產生隨機字元 因此,介於任兩字元ch1與ch2之間,且ch1 < ch2的隨機字元可如下產生:
(char)(ch1 + Math.random() * (ch2 – ch1 + 1))

66 範例程式5.10 RandomCharacter.java
// RandomCharacter.java: Generate random characters public class RandomCharacter { /** Generate a random character between ch1 and ch2 */ public static char getRandomCharacter(char ch1, char ch2) { return (char)(ch1 + Math.random() * (ch2 - ch1 + 1)); } /** Generate a random lowercase letter */ public static char getRandomLowerCaseLetter() { return getRandomCharacter('a', 'z'); /** Generate a random uppercase letter */ public static char getRandomUpperCaseLetter() { return getRandomCharacter('A', 'Z'); /** Generate a random digit character */ public static char getRandomDigitCharacter() { return getRandomCharacter('0', '9'); /** Generate a random character */ public static char getRandomCharacter() { return getRandomCharacter('\u0000', '\uFFFF'); RandomCharacter TestRandomCharacter

67 逐步細緻化 方法萃取的概念可應用在開發程式的過程中。當撰寫大型程式時,可使用分治法(divide-and-conquer)策略,又被稱作逐步細緻化(stepwise refinement),將程式分解成好幾個子問題。各個子問題又可進一步分解成更小,更容易管理的問題。

68 PrintCalender 範例研究 讓我們使用 PrintCalendar 範例說明逐步細緻化。 PrintCalendar

69 設計圖

70 設計圖

71 設計圖

72 設計圖

73 設計圖

74 設計圖

75 由上而下設計 (Top-Down Design)
top-down方法由上往下,一次實作一個結構圖表裡的方法。stub是一個簡單但不完整的方法,可用在等待被實作的方法上。stub的使用讓使用者得以快速建立程式框架。先實作main方法,接著對printMonth方法使用stub。比方說,讓printMonth於stub裡顯示年份與月份。程式因此會如下展開: A Skeleton for printCalendar

76 由下而上設計(Button-Up Design)
bottom-up方法由下往上,一次實作一個結構圖表裡的方法。對於每個實作的方法,撰寫一支測試程式作測試,此程式又被稱作驅動程式 (driver)。top-down與bottom-up都很不錯:兩者皆逐步實作方法,協助分離程式設計錯誤,讓偵錯更容易。兩種方法可一起使用。


Download ppt "第五張 方法."

Similar presentations


Ads by Google