第1章

Similar documents
第1章

第1章

全國各級農會第 2 次聘任職員統一考試試題 科目 : 程式設計類別 : 九職等以下新進人員作答注意事項 : 1 全部答案請寫在答案卷內, 如寫在試題紙上, 則不予計分 2 請以黑色或藍色鋼筆或原子筆書寫, 並以橫式書寫 ( 由左至右, 由上而下 ) 一 選擇題 ( 每題 4 分, 共 40 分 )

Microsoft Word - Prog1-981.docx

Microsoft PowerPoint - EmbSys102_JavaOOP [相容模式]

Microsoft PowerPoint - ch4.pptx

untitled

Microsoft Word - JAVA Programming Language Homework I ans

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

Microsoft PowerPoint - C-Ch08.ppt

Microsoft PowerPoint - java2012-ch08投影片.ppt

Microsoft PowerPoint - 12 struct and other datatypes.ppt

新・解きながら学ぶJava

Microsoft PowerPoint - java2012-ch12投影片.ppt

Microsoft Word - ch04三校.doc

第1章

Microsoft PowerPoint - 第10章.ppt

Microsoft PowerPoint - C-Ch10.ppt

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

《大话设计模式》第一章

第3章.doc

CHAPTER VC#


OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

The Embedded computing platform

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

chp6.ppt

Microsoft PowerPoint - plan06.ppt

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

untitled

C/C++基礎程式設計班

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

EJB-Programming-4-cn.doc

Microsoft PowerPoint - C-Ch11.ppt

多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

Microsoft PowerPoint - SE7ch06.ppt

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

Microsoft Word - 第3章.doc

電機工程系認可證照清單 /7/1

Microsoft PowerPoint - 14Threads.ppt

全国计算机技术与软件专业技术资格(水平)考试

2013_423WBD_HKPanel_JSC_01

Microsoft PowerPoint - Class4.pptx

Microsoft Word - CPMidTerm2011SpringSolution

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

Microsoft PowerPoint - 05-func.ppt

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

建模与图形思考

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

Microsoft PowerPoint - Chap03.ppt [相容模式]

JavaIO.PDF

( 总 第 1073 期 ) 浙 江 省 人 民 政 府 主 办 2015 年 3 月 17 日 出 版 省 政 府 令 省 政 府 文 件 目 录 浙 江 省 大 型 群 众 性 活 动 安 全 管 理 办 法 ( 浙 江 省 人 民 政 府 令 第 333 号 ) (3) 浙 江 省 人 民 政

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

<4D F736F F D DA5BFA6A1C476C1C92DBEC7ACECB8D5A8F728B57BB35D292E646F63>

第1章

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

Java 程式設計初階 第 5 章:基本輸出入 & 流程控制

運算子多載 Operator Overloading

Microsoft Word - AEL 序-.doc

javaexample-02.pdf

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

一、

C++

c_cpp

2. 參考網站 C 語言考古題 & C 的解題 程式設計學習入門 ( 網址 : c.blogspot.com/) 網站 : 星子 ACM 小窩 ( 網址 : 網站 :ACM Onli

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

Microsoft PowerPoint - java2012-ch13投影片.ppt

Microsoft PowerPoint - 13_ClassAndObj.ppt

標題

Microsoft PowerPoint - 07-overloaded.ppt

Transcription:

第 8 章 函式 1

本章提要 8.1 前言 8.2 如何定義函式 8.3 函式的呼叫和返回 8.4 傳遞陣列 8.5 方法多載 8.6 遞迴 8.7 綜合練習 8.8 後記 2

8.1 前言 每一種高階程式語言都有提供函式 (Function)( 或稱函數 ) 的功能, 以便將經常使用到的程式功能包裝成函式的形式, 如此一來便能反覆地呼叫該函式來完成某件特定工作在高階程式語言中, 副程式 (Subroutine) 程序(Procedure) 和函式都是同義詞, 它們都代表一個具有獨立功能且可以被反覆呼叫 執行的程式片斷 3

8.1 前言 函式具有下列優點 : 將程式模組化, 可以重複地呼叫 使用, 減少程式開發的成本 簡化程式碼, 讓程式看起來較為簡潔, 容易閱讀 容易除錯, 可以降低程式維護的成本 可以充分發揮資訊隱藏 多載 改寫 (Override) 等物件導向特性 4

8.1 前言 本章將介紹的主題有 : 如何定義函式函數的呼叫和返回傳遞引數傳遞陣列方法多載遞迴 5

8.2 如何定義函式 存取方式 public: 公開的 讓這個函式可以從 main() 裡去呼叫它 private protected 6

8.2 如何定義函式 static: 用來表示這個函式為 類別函式 ( 或稱類別方法 ) 類別函式的用法規則如下 : 一般 ( 非類別 ) 函式的呼叫方式是必須先建立物件, 然後以 物件名稱. 函式名稱 ( 引數列 ) 來呼叫 類別函式除了可以採用一般函式的呼叫方式外, 也可以直接用 函式名稱 ( 引數列 ) 來呼叫, 或以 類別名稱. 函式名稱 ( 引數列 ) 來呼叫 static 函式只能存取 static 成員, 亦即類別函式只能存取類別變數和類別函式, 不能存取實例變數和實例函式 ( 參考第 9 章 9.5 節 ) 7

傳回值型別 8.2 如何定義函式 又稱函式型別, 就是指函式傳回 (return) 值的資料型別 函式若沒有傳回值則 傳回值型別 須用 void 來表示 函式名稱 參數列 函式主體 8

8.2 如何定義函式 呼叫函式的語法 呼叫函式的語法 1. 函式名稱 ( 引數 1, 引數 2,...); // 呼叫函式 2. 變數 = 函式名稱 ( 引數 1, 引數 2,...); // 呼叫函式, 並將傳回值指定給變數 9

8.3 函式的呼叫和返回 8.3.1 沒有傳遞引數的函式 8.3.2 呼叫函式時的引數傳遞 10

8.3.1 沒有傳遞引數的函式 範例程式 1 呼叫函式, 不傳遞引數, 沒有傳回值 2 // 程式名稱 :ch08_print.java 8 public static void main(string args[]) 9 { 10 System.out.println(" 呼叫 print() 函式..."); 11 print(); 12 System.out.println(" 從 print() 函式返回 "); 13 } 14 15 public static void print() // 必須宣告為 static 16 { 17 System.out.println("I love java!"); 18 } 執行結果 呼叫 print() 函式... I love java! 從 print() 函式返回 11

8.3.1 沒有傳遞引數的函式 圖 8.1: 函式的呼叫和返回 12

8.3.2 呼叫函式時的引數傳遞 傳值 (Pass By Value) 傳遞以基本資料型別宣告的引數時 將引數的值拷貝一份, 然後將這份拷貝指定給對應之參數 不會對引數有任何影響 傳參照 (Pass By Reference) 傳遞陣列或物件時 將引數陣列的起始位置傳遞給參數 若在函式的執行過程中改變了陣列的值, 那麼引數陣列的值也會被改變 13

8.3.2 呼叫函式時的引數傳遞 範例程式 2 找出兩數之大者 ( 傳值 ) 2 // 程式名稱 :ch08_max.java 10 int i = 1, j = 2; 11 12 System.out.println("max(" + i + "," + j + ")=" + max(i, j)); 13 } 14 15 public static int max(int x, int y) 16 { 執行結果 17 return (x >= y)? x : y; max(1,2)=2 18 } 14

8.3.2 呼叫函式時的引數傳遞 圖 8.2: 傳值 ( 將引數 i j 的值傳遞給參數 x y) 15

8.3.2 呼叫函式時的引數傳遞 範例程式 3 兩數相加 ( 傳值 ) 2 // 程式名稱 :ch08_add.java 10 int i = 1, j = 2, k = 0 ; 11 12 System.out.println("< 在主程式 main() 內 > i=" + i + ", j=" + j + 13 ", k=" + k); 14 k = add(i, j); // 引數 i j 15 System.out.println("< 在主程式 main() 內 > i=" + i + ", j=" + j + 16 ", k=" + k); 17 } 16

8.3.2 呼叫函式時的引數傳遞 19 public static int add(int i, int j) // 參數 i j 20 { 21 i = i + j; 22 System.out.println(" < 在函式 add() 內 > i=" + i); 23 return i; 24 } 執行結果 < 在主程式 main() 內 > i=1, j=2, k=0 < 在函式 add() 內 > i=3 < 在主程式 main() 內 > i=1, j=2, k=3 17

8.4 傳遞陣列 傳遞陣列時, 是以 傳參照 (Pass By Reference) 的方式來進行 若在函式裡變更了參數陣列的元素值, 那麼引數陣列的元素值也會一起改變 因為兩者都是參照到相同記憶體位置的資料 18

8.4.1 傳遞 main() 的引數 c>java 程式名稱 引數 0 引數 1... 引數 n public static void main(string args[]) { }... 19

8.4.1 傳遞 main() 的引數 範例程式 4 main() 的引數 2 // 程式名稱 :ch08_args.java 8 public static void main(string args[]) 9 { 執行結果 10 String s0, s1, s2, s3; 12 s0 = args[0]; 13 s1 = args[1]; 14 s2 = args[2]; 15 s3 = s0 + s1+ s2; 17 System.out.println("s0=" + s0); 18 System.out.println("s1=" + s1); 19 System.out.println("s2=" + s2); 20 System.out.println("s3=" + s3); c:\java\ch08>java ch08_args 我愛喝 s0= 我愛喝 s1=java s2= 咖啡 s3= 我愛喝 java 咖啡 java 咖啡 20

8.4.2 傳遞一維陣列 範例程式 5 取平方根 2 // 程式名稱 :ch08_sqrt.java 8 public static void main(string args[]) 9 { 10 int a[] = {2, 4, 9, 16, 25, 36, 49, 64, 81}; 11 12 print(a); 13 sqrt(a); 14 print(a); 15 } 21

8.4.2 傳遞一維陣列 17 public static void print(int x[]) 18 { 19 System.out.print(" 陣列內容為 :"); 20 for(int i = 0; i < x.length; i++) 21 System.out.print(x[i] + " "); 22 System.out.println(); 23 } 25 public static void sqrt(int x[]) 26 { 27 for(int i = 0; i < x.length; i++) 28 x[i] = (int)math.sqrt((double)x[i]); 29 } 執行結果 15 } 陣列內容為 :2 4 9 16 25 36 49 64 81 陣列內容為 :1 2 3 4 5 6 7 8 9 22

8.4.2 傳遞一維陣列 圖 8.3: 傳參照 ( 將引數陣列 a 的位址傳遞給參數陣列 x) 23

8.4.3 傳遞二維陣列 範例程式 6 將 a b 兩陣列相加 2 // 程式名稱 :ch08_matrixadd.java 10 int a[][] = {{1, 2, 3, 4, 5}, 11 {6, 7, 8, 9, 10}}; 12 int b[][] = {{0, 1, 2, 3, 0}, 13 {2, 1, 3, 3, 5}}; 14 int c[][] = new int[a.length][a[1].length]; 15 16 print('a', a); 17 print('b', b); 18 c = add(a, b); 19 print('c', c); 24

8.4.3 傳遞二維陣列 22 public static void print(char c, int x[][]) 23 { 24 System.out.println(c + " 陣列內容為 :"); 25 for(int i = 0; i < x.length; i++){ 26 for(int j = 0; j < x[i].length; j++) 27 System.out.printf("%2d ", x[i][j]); 28 System.out.println(); 29 } 30 System.out.println(); 31 } 25

8.4.3 傳遞二維陣列 33 public static int[][] add(int x[][], int y[][]) 34 { 35 int z[][] = new int[x.length][x[1].length]; 36 37 for(int i = 0; i < x.length; i++){ 執行結果 38 for(int j = 0; j< x[i].length; j++) a 陣列內容為 : 39 z[i][j] = x[i][j] + y[i][j]; 1 2 3 4 5 40 } 6 7 8 9 10 41 return z; b 陣列內容為 : 0 1 2 3 0 42 } 2 1 3 3 5 c 陣列內容為 : 1 3 5 7 5 8 8 11 12 15 26

8.5 方法多載 方法多載 (Method Overloading) 使用同一個方法 ( 函式 ) 名稱, 但它具備多種相似的功能例如, 我們可以設計加法函式, 讓它可以處理整數的相加, 浮點數的相加, 字串的相加, 並且都是使用 add 這個函式名稱 public static int add(int i, int j) public static String add(string i, String j) 27

8.5 方法多載 範例程式 7 方法多載 2 // 程式名稱 :ch08_add_overloading.java 10 int i = 1, j = 2, k = 0 ; 11 String s1 = "I love "; 12 String s2 = "Java!"; 13 String s3 = new String(); 14 15 k = add(i, j); 16 s3 = add(s1, s2); 17 18 System.out.println("i=" + i + ", j=" + j + ", k=i+j=" + k); 19 System.out.println("s1=\"" + s1 + "\", s2=\"" + s2 + 20 "\", s3=s1+s2=\"" + s3 + "\""); 28

8.5 方法多載 23 public static int add(int i, int j) 24 { 25 return (i+j); 26 } 27 28 public static String add(string i, String j) 29 { 30 return (i+j); 31 } 執行結果 i=1, j=2, k=i+j=3 s1="i love ", s2="java!", s3=s1+s2="i love Java!" 29

8.6 遞迴 計算出 2n 之值的公式如下 : 30

8.6 遞迴 圖 8.4: 以遞迴方式計算 2 的 n 次方 31

8.6 遞迴 撰寫遞迴程式可以從下列幾點著手 : 1. 函數名稱? 2. 函數引數及其資料型別? 3. 何時要遞迴呼叫? 4. 遞迴呼叫時要傳遞的參數值? 5. 何時該終止遞迴? 6. 遞迴函數的傳回值為何? 32

8.6 遞迴 15 public static int power2n_r(int n) // 函數名稱, 函數引數及其資料型別 16 { 17 int i, ans = 1; 18 19 if(n == 0) 20 return 1; // 終止遞迴, 傳回值 21 if(n >= 1) 22 return (2 * power2n_r(n-1)); // 遞迴呼叫 23 else 24 return -1; // n 必須為正整數 25 } 33

8.6 遞迴 範例程式 8 以非遞迴方式計算 2 的 n 次方之值,n 為正整數 2 // 程式名稱 :ch08_power2n.java 10 int i = 3; 11 12 System.out.println("2 的 " + i + " 次方 =" + power2n(i)); 13 } 34

8.6 遞迴 15 public static int power2n(int n) 16 { 17 int i, ans = 1; 18 19 if(n == 0) 20 return 1; 21 if(n >= 1){ 22 for(i = n; i > 0; i--){ 23 ans = 2 * ans; 24 } 25 return ans; 26 } 27 else 28 return -1; // n 必須為正整數 29 } 執行結果 2 的 3 次方 =8 35

8.6 遞迴 範例程式 9 以遞迴方式計算 2 的 n 次方之值,n 為正整數 2 // 程式名稱 :ch08_power2n_r.java 10 int i = 3; 11 12 System.out.println("2 的 " + i + " 次方 =" + power2n_r(i)); 13 } 36

8.6 遞迴 15 public static int power2n_r(int n) // 函式名稱, 函式引數及其資料型別 16 { 17 int i, ans = 1; 18 19 if(n == 0) 20 return 1; // 終止遞迴, 傳回值 21 if(n >= 1) 22 return (2 * power2n_r(n-1)); // 遞迴呼叫 23 else 24 return -1; // n 必須為正整數 25 } 執行結果 1 到 10 的奇數和 = 25 37

8.7.1 單字的擷取 8.7 綜合練習 8.7.2 以遞迴方式計算 n! 之值 38

8.8 後記 函式具有下列優點 : 將程式模組化, 可以重複地呼叫 使用, 減少程式開發的成本 簡化程式碼, 讓程式看起來較為簡潔, 容易閱讀 容易除錯, 可以降低程式維護的成本 可以充分發揮資訊隱藏 多載 改寫 ( 第 10 章 ) 等物件導向優點 39

8.8 後記 一般 ( 非類別 ) 函式的呼叫方式為 : 物件名稱. 函式名稱 ( 引數列 ) 類別函式的呼叫方式有以下兩種 : 1. 函式名稱 ( 引數列 ) 2. 類別名稱. 函式名稱 ( 引數列 ) 40

8.8 後記 呼叫函式時將引數值傳遞給參數是遵守以下規則 : 1. 傳遞以基本資料型別宣告的引數時, 是採用 傳值 (Pass By Value) 的方式傳遞 2. 傳遞陣列 ( 或物件 ) 時, 則採用 傳參照 (Pass By Reference) 的方式傳遞 41