第五張 方法.

Slides:



Advertisements
Similar presentations
软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Advertisements

第3-2章 类与 对象 Java类的特性 教学内容: 类的私有成员与公共成员 方法的重载 构造方法 实例成员与静态成员 重点: 重载 难点:
第四章 类、对象和接口.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
6. 6 Overloading methods and constructors 6
项目6 通用堆栈.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
四資二甲 第三週作業 物件導向程式設計.
第7章 C#函數與.NET Framework類別函數庫
算法设计与分析 Algorithm Design and Analysis
TQC+ 物件導向程式認證-JAVA.
第二章 基本程式設計.
第一章 面向对象程序设计.
第二章 JAVA语言基础.
第三章 控制结构.
程式設計實作.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
Introduction to the C Programming Language
控制流程 邏輯判斷 迴圈控制.
物件導向程式設計 (Object-Oriented rogramming)
第二章 C# 基础知识.
常用工具类.
實作輔導 日期: 3/11 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
教材 《C++程序设计》.谭浩强. 清华大学出版社 王雪晶
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
第3章 語法入門 第一個Java程式 文字模式下與程式互動 資料、運算 流程控制.
JAVA程序设计 第5章 深入理解JAVA语言----补充.
程式設計實作.
抽象类 File类 String类 StringBuffer类
第2章回顾 标识符:不用记,动手 关键字:if, else, switch, for, while, do, break, continue, void, …… 局部变量和成员变量 ①变量作用域 ②内存布局 基本数据类型 ①4类8种 ②互相转换 流程控制语句 ①分支 if……else, switch.
Function.
程式撰寫流程.
6 使用者函數 6.1 函數定義 宣告函數 呼叫函數 呼叫多個函數 6-6
2019/1/16 Java语言程序设计-类与对象 教师:段鹏飞.
2019/1/17 Java语言程序设计-程序流程 教师:段鹏飞.
第5讲 使用类和对象编程(三) 内部类 实例 程序控制结构 选择语句.
Ch02-基礎語法.
第十章 模板 丘志杰 电子科技大学 计算机学院 软件学院.
C/C++/Java 哪些值不是头等程序对象
第六章 属性、索引器、委托和事件.
第七章 函数及变量存贮类型 7.1 函数基础与C程序结构 7.2 函数的定义和声明 7.3 函数的调用 7.4 函数的嵌套与递归
第11章 递归 张坤龙 天津大学计算机学院.
第三章 C# 基础知识.
實作輔導 2 日期: 3/24(星期六) 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
第二章Java基本程序设计.
第三课 标识符、关键字、数据类型.
第二章 Java基本语法 讲师:复凡.
Chapter 2 & Chapter 3.
1.2 C语言程序的结构与书写规则 一、 C语言程序的总体结构
動態規劃 Dynamic Programming (DP)
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
C程序设计.
第二章 Java语法基础.
#include <iostream.h>
方法進階及物件導向基礎 Lecturer: 楊昌樺.
Ch07. 函式.
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
JAVA 程式設計與資料結構 第三章 物件的設計.
變數、資料型態、運算子.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
05 方法. 05 方法 5.1 方法 在一個較大型的程式中,通常會將具有特定功能或經常重複使用的程式,撰寫成獨立的小單元,稱為「方法」(Method),並賦予方法一個名稱,當程式需要時就可以呼叫此方法來執行該段特定程式。(此種重複使用的程式小單元在其他語言中可能稱為程序、副程式或函式, Visual.
迴圈(重複性結構) for while do while.
判斷(選擇性敘述) if if else else if 條件運算子.
第 5 章 常用类的使用 伍孝金
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Presentation transcript:

第五張 方法

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

問題 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);

問題 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);

解答 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));

本章綱要 使用形式參數(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.10-5.11) 將方法萃取的概念應用在軟體開發上(§5.12) 使用逐步細緻化(stepwise refinement)的方式,設計與實作方法(§5.12)

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

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

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

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

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

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

animation 呼叫方法

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

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

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

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

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

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

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

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

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

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

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

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

呼叫堆疊

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

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

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

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

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

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

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

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

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

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

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

傳遞參數 假設你使用下方敘述來呼叫方法 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”);

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

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

傳值

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

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

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

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

不明確的呼叫 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) {

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

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

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

區域變數有效範圍

區域變數有效範圍 // 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;

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

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

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

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

三角函數方法 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)

指數方法 範例: 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 22.91765 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.

四捨五入方法 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).

四捨五入方法 - 範例 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

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

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

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

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

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

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

範例程式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

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

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

設計圖

設計圖

設計圖

設計圖

設計圖

設計圖

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

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