第七章 副程式.

Slides:



Advertisements
Similar presentations
Visual Basic 2010 程式設計經典 第 4 章 陣列與自定程序. 4.1 陣列 一個變數只能存放一個資料,程式中需要使用大量且 同一性質資料時,若宣告大量的變數將顯得非常麻煩。 例如,輸入 1,000 位學生的計概成績,就必須使用 1,000 個不同的變數名稱來存放,如此將增加程式的複.
Advertisements

第一單元 建立java 程式.
第4章 VB.NET程式與 網頁製作的應用 主講人: 姚奉緒 M
陳維魁 博士 儒林圖書公司 第七章 參數的傳遞 陳維魁 博士 儒林圖書公司.
程式設計 博碩文化出版發行.
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
TQC+ JAVA全國教師研習會 PLWeb 程式設計練習平台 簡介.
Chapter 5 遞迴 資料結構導論 - C語言實作.
主題五 CPU Learning Lab.
Chapter 5 迴圈.
Chapter 7 Subroutine and Function
基本程式範例.
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
第十一章 結構.
Java簡介.
程式語言簡介.
JDK 安裝教學 (for Win7) Soochow University
PHP 5 陣列與自定函數 陣列應用 自定函數.
101北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
C 程式設計— 函式 台大資訊工程學系 資訊系統訓練班.
第十四單元 弧長與旋轉體的表面積.
Chapter 7 指標.
第6章 函數與巨集 6-1 由上而下的設計方法 6-2 建立函數 6-3 函數的參數呼叫方式 6-4 變數的有效範圍 6-5 遞迴函數
講師:戴志華 國立台灣大學電機工程研究所 Visual Basic 程式設計 講師:戴志華 國立台灣大學電機工程研究所.
(Circular Linked Lists)
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
第7章 程序與函數 7-1 模組化程式設計 7-2 程序與函數 7-3 程序與函數的變數範圍 7-4 常用的內建函數 7-5 遞迴函數.
Java 程式設計 講師:FrankLin.
Introduction to the C Programming Language
Chap3 Linked List 鏈結串列.
Introduction to the C Programming Language
程式設計實習課(四) ----C 函數運用----
第一單元 建立java 程式.
遞迴 Recursive 授課老師:蕭志明.
INDEX 資訊學科種子教師研習 課程說明 教學活動計畫.
第 19 章 XML記憶體執行模式.
|07 函數.
第十章 指標.
大綱:加減法的化簡 乘除法的化簡 去括號法則 蘇奕君 台灣數位學習科技股份有限公司
GUI Title and GUI Status
第7章 指標 7-1 指標的基礎 7-2 指標變數的使用 7-3 指標運算 7-4 指標與陣列 7-5 指向函數的指標.
挑戰C++程式語言 ──第8章 進一步談字元與字串
函數 博碩文化出版發行.
引用檔案.
C qsort.
PHP5與MySQL5 入門學習指南 凱文瑞克 著 第 14 章 自定函數.
函數應用(二)與自定函數.
陣列與結構.
北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
實習八 函式指標.
Chap 6 函數 故用兵之法,十則圍之,五則攻之,倍則分之, 敵則能戰之,少則能逃之,不若則能避之。 故小敵之堅,大敵之擒也。
期末報告第一題 通訊四甲 B 湯智瑋.
查表法&電腦IO Port二進制轉七段顯示器
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
Introduction to the C Programming Language
Chapter 6 函數.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
NFC (近場通訊, Near Field Communication) 靜宜大學資管系 楊子青
Array(陣列) Anny
Chapter 4 Multi-Threads (多執行緒).
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
Unix指令4-文字編輯與程式撰寫.
微 處 理 機 專 題 – 8051 C語言程式設計 主題:階乘計算
方法(Method) 函數.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

第七章 副程式

本章學習目標 讓讀者瞭解主程式與副程式的呼叫方式及如何傳遞參數。 說明遞迴呼叫方式及應用。

本章內容 7-1 副程式 7-2 參數傳遞方式 7-3 傳值呼叫(Call By Value) 7-4 傳址呼叫(Call By Address) 7-5 陣列傳遞呼叫 7-6 自定函數 7-7 內建類別函數庫 7-8 遞迴函數

前言 當撰寫程式時,都不希望重複撰寫類似程式。因此最簡單做法,就是把某些會重複使用程式獨立出來,這個獨立出來的部分就稱做「副程式(Subroutine)」或「函數(Function)」。這樣可以避免一再重複撰寫相似的程式碼,讓程式看起來更有結構,有利於日後維護。

7-1 副程式(1/5) 副程式(Subroutine)就是一個獨立程式區塊,當主程式或其它程式須要它時,直接呼叫副程式即可使用,而為什麼要寫副程式呢?因為可把一些常用且重複撰寫的程式,集中在一個獨立程式中,使程式更加的簡短而易於維護。

7-1 副程式(2/5) 一、副程式的呼叫過程: 一般而言,「原呼叫的程式」稱之為「主程式」,而「被呼叫的程式」稱之為「副程式」。當主程式在呼叫副程式的時候,會把「實際參數」傳遞給副程式的「形式參數」,而當副程式執行完成之後,又會回到主程式呼叫副程式的「下一行程式」開始執行下去。如圖7-1所示:

7-1 副程式(3/5) 【說明】 實際參數實際參數1,實際參數2,……,實際參數N 形式參數 形式參數1,形式參數2,……,形式參數N 定義副程式時,可分為兩種:一種是「有傳回值」,另一種則是「無傳回值」。 如果使用「無傳回值」時,就必須要在副程式名稱的前面加上「void」。主程式呼叫副程式時,不一定要傳遞參數。 結束副程式的方式: (1)副程式執行到右大括號”}” (2)副程式執行到Return

7-1 副程式(4/5) 二、撰寫副程式的優點 可使程式更簡化,因為把重覆程式模組化。 增加程式可讀性。 提高程式維護性。 節省程式所佔用的記憶體空間。 節省重覆撰寫程式時間。

7-1 副程式(5/5) 三、撰寫副程式的缺點:降低執行效率,因為程式會Call來Call去。

7-2 參數的傳遞方式(1/2) 在前面的實例中,主程式呼叫副程式時,並沒有傳遞任何參數,但是為了提高副程式實用性,往往會在呼叫副程式的同時,主程式也會傳遞一些參數給副程式。

7-2 參數的傳遞方式(2/2)

7-3傳值呼叫(Call By Value) (1/5) 是指主程式呼叫副程式時,主程式會將實際參數的「值」傳給副程式的形式參數,而不是傳送位址。因此在副程式中改變了形式參數的值(內容)時,也不會影響到主程式的實際參數值(內容)。其運作原理如下所示:

7-3傳值呼叫(Call By Value) (2/5)

7-3傳值呼叫(Call By Value) (3/5)

7-3傳值呼叫(Call By Value) (4/5)

7-3傳值呼叫(Call By Value) (5/5)

7-4 傳址呼叫(Call By Address) (1/5) 是指主程式呼叫副程式時,主程式會將實際參數的「位址」傳給副程式的形式參數,使得主程式與副程式共用相同的記憶體位址。因此一旦副程式中改變了形式參數的值(內容)時,也將隨之影響到主程式的實際參數值(內容)。因此在使用傳址呼叫時不能使用常數做為參數。系統預設參數傳遞方式為「傳值呼叫」,因此在傳址呼叫時,副程式中的參數必須要加入「ref」關鍵字。其運作原理如下所示:

7-4 傳址呼叫(Call By Address) (2/5)

7-4 傳址呼叫(Call By Address) (3/5)

7-4 傳址呼叫(Call By Address) (3/5)

7-4 傳址呼叫(Call By Address) (4/5)

7-5 陣列傳遞呼叫 (1/3) 在前面單元中,主程式呼叫副程式時,將主程式的實際參數傳遞給副程式的形式參數。而這些參數一般都只是單一變數。但是如果想要一次傳遞非常多變數時,可以利用「陣列」方式達成之。 步驟: 在主程式(呼叫程式)中的實際參數中,只要在陣列名稱前面加上「ref」關鍵字即可。如下列程式中的行號160的BubSort(ref A, 10); 在副程式(被呼叫程式)中的形式參數中,在陣列名稱前面加上「ref」關鍵字,並且資料型態後面的中括號內,不要設定陣列大小。如下列程式中行號230 static void BubSort(ref int[] A, int n)

7-5 陣列傳遞呼叫 (2/3)

7-5 陣列傳遞呼叫 (3/3)

7-6 自定函數(1/3) 函數(Function)是另一種特殊形式的副程式,這種副程式有些存在於VC#2008語言系統裡,稱為「內建類別函數庫」。 例如:曾經使用過的Random( )、Replace( )等等,就是VC#2008的內建類別函數庫。另一種函數就像副程式一樣可以由使用者自己定義的,稱為「自定函數」。

7-6 自定函數(2/3)

7-6 自定函數(3/3)

7-7 內建類別函數庫(1/3) 為了讓程式設計師快速完成程式的需求,VC#2008環境中將一些常用且標準的運算及問題處理方法,設計在VC#2008的函數庫中,此稱為「內建類別函數庫」(Built-In Class Function)。亦即VC#2008程式內部本來就提供的函數,使用者不須再自行定義撰寫,只要拿出來套用即可。

7-7 內建類別函數庫(2/3)

7-7 內建類別函數庫(3/3)

7-8 遞迴函數(1/12) 何謂的「遞迴(Recursion)」是指不斷的呼叫本身函數,並將尚未傳回的函數值暫時存放在主記憶體中(堆疊),等到最後結果產生時,再將主記憶體中(堆疊)的值,逐一傳回。亦即函數本身又可呼叫自己的副程式。遞迴函數呼叫的過程,如下圖所示:

7-8 遞迴函數(2/12) 【說明】 當主程式呼叫Total(4)時,第一次進入Total函數中,N=4,則執行Total=N*Total(N-1)部份,因此,又是呼叫Total函數,所以N=3,則又執行Total=N*Total(N-1)部份,直到N=0時,Total=1,才開始Return回到上一層,逐一回到原先呼叫它的副程式,並且將值傳回去。

7-8 遞迴函數(3/12)

7-8 遞迴函數(4/12) 由以上的例子中,可清楚得知,遞迴函數呼叫過程是不能無限次的呼叫本身。否則會產生無窮迴圈。因此基本上一個合乎演算法的遞迴函數必須要有下列條件: 遞迴函數必須要設定「初值」與「終值」。例如:以上例子中,行號20中的Max=10就是「初值」設定。 行號80中的if (N ==0) 就是「終值」設定。 遞迴函數必須要有更新值。例如:以上例子中,行號110中的MyFunction(N - 1)。變數N的值每次都會遞減,不可以是常數。 遞迴函數必須要自己呼叫自己。例如:以上例子中,行號60的遞迴函數名稱(MyFunction)必須要與行號110 的函數呼叫相同。

7-8 遞迴函數(5/12)

7-8 遞迴函數(6/12)

7-8 遞迴函數(7/12)

7-8 遞迴函數(8/12)

7-8 遞迴函數(9/12)

7-8 遞迴函數(10/12)

7-8 遞迴函數(11/12)

7-8 遞迴函數(12/12)