第五章 函數與儲存類別. 函數 函數為完成某一次特定任務或工作的小程式 函數的類型 庫存函數 (library functions) 如: scanf() 、 printf() 函數 … 等 此函數為系統所提供可以直接呼叫使用之 自定函數 (user-define functions) 此函數是使用者自行定義之函數.

Slides:



Advertisements
Similar presentations
1 生物計算期末作業 暨南大學資訊工程系 2003/05/13. 2 compare f1 f2  只比較兩個檔案 f1 與 f2 ,比完後將結果輸出。 compare directory  以兩兩比對的方式,比對一個目錄下所有檔案的相 似程度。  將相似度很高的檔案做成報表輸出,報表中至少要.
Advertisements

Divide-and-Conquer. 什麼是 divide-and-conquer ? Divide 就是把問題分割 Conquer 則是把答案結合起來.
6-1 指標簡介 6-2 指標與陣列 6-3 動態配置記憶體 6-4 本章綜合練習
布林代數的應用--- 全及項(最小項)和全或項(最大項)展開式
第七章 抽樣與抽樣分配 蒐集統計資料最常見的方式是抽查。這 牽涉到兩個問題: 抽出的樣本是否具有代表性?是否能反應出母體的特徵?
學習C++的基本語法 認識關鍵字與識別字的不同 學習程式碼偵錯的流程 學習如何提高程式的可讀性
: A-Sequence 星級 : ★★☆☆☆ 題組: Online-judge.uva.es PROBLEM SET Volume CIX 題號: Problem D : A-Sequence 解題者:薛祖淵 解題日期: 2006 年 2 月 21 日 題意:一開始先輸入一個.
:Word Morphing ★★☆☆☆ 題組: Problem Set Archive with Online Judge 題號: 10508:word morphing 解題者:楊家豪 解題日期: 2006 年 5 月 21 日 題意: 第一行給你兩個正整數, 第一個代表下面會出現幾個字串,
“Rule” By OX. By Check CREATE TABLE 員工薪資 ( 編號 int IDENTITY PRIMARY KEY, 薪資 smallmoney, CHECK ( 薪資 > 0 AND 薪資
Reference, primitive, call by XXX 必也正名乎 誌謝 : 部份文字取於前輩 TAHO 的文章.
What is static?. Static? 靜態 ? class Test { static int staticX; int instanceX; public Test(int var1, int var2) { this.staticX = var1; this.instanceX =
1 Web of Science 利用指引 單元二 瀏覽與處理查詢結果. 2 瀏覽檢索結果 查出的結果,預設以時間排列, 使用者可改變結果的排列方式: 還可以依被引用次數、相關度、 第一作者、刊名、出版年等排序 回到前先查的結果畫面 點選想看資料的完整書目 本館訂購範圍的期刊 全文,便可直接連結.
Review of Chapter 3 - 已學過的 rules( 回顧 )- 朝陽科技大學 資訊管理系 李麗華 教授.
: OPENING DOORS ? 題組: Problem Set Archive with Online Judge 題號: 10606: OPENING DOORS 解題者:侯沛彣 解題日期: 2006 年 6 月 11 日 題意: - 某間學校有 N 個學生,每個學生都有自己的衣物櫃.
第一章 變數、常數及資料型態. 變數 C 程式語言的變數名稱 第一個字必須是英文字母或底線 (_) 之後可以是數字, 英文字母或底線 (_) 不可以是保留字 例: Num (Ο) _score (Ο) C&C (X) 8num (X)
STAT0_sampling Random Sampling  母體: Finite population & Infinity population  由一大小為 N 的有限母體中抽出一樣本數為 n 的樣 本,若每一樣本被抽出的機率是一樣的,這樣本稱 為隨機樣本 (random sample)
第 13 章 常數、靜態成員與朋友關 係 13-1 常數物件與成員 13-1 常數物件與成員 13-2 物件成員與巢狀類別 13-2 物件成員與巢狀類別 13-3 靜態成員資料與函數 13-3 靜態成員資料與函數 13-4 朋友關係 13-4 朋友關係.
1. 假設以下的敘述為一未提供 “ 捷徑計算 ” 能力的程式段,試用程 式設計的技巧,使此敘述經此改 寫的動作後,具有與 “ 捷徑計算 ” 之 處理方法相同之處理模式。 if and then E1 else E2 endif.
例外處理. 內 容 大 綱 例外的產生 捕捉例外 丟出例外 例外的產生 (1/4) 一般常見的執行時期錯誤包括整數除法分母為 0(divide by zero) ,陣列索引值越限 (array index out of range) ,輸入輸出錯誤 (I/O error) 、檔案 不存在或無法存取.
第三章 變數與繫結 陳維魁 博士 儒林圖書公司. 2 大綱  變數的定義  變數元件  儲存區配置問題  參考的透明性  完全計算  捷徑計算  繫結 (binding)  繫結時間  精選習題.
McGraw-Hill/Irwin © 2003 The McGraw-Hill Companies, Inc.,All Rights Reserved. 肆 資料分析與表達.
Monte Carlo Simulation Part.2 Metropolis Algorithm Dept. Phys. Tunghai Univ. Numerical Methods C. T. Shih.
第 7 章 程序與函數 7-1 模組化程式設計 7-1 模組化程式設計 7-2 VB.NET 的程序與函數 7-2 VB.NET 的程序與函數 7-3 程序與函數的變數範圍 7-3 程序與函數的變數範圍 7-4 VB.NET 常用的內建函數 7-4 VB.NET 常用的內建函數 7-5 遞迴函數 7-5.
第 1 章 PC 的基本構造. 本章提要 PC 系統簡介 80x86 系列 CPU 及其暫存器群 記憶體: Memory 80x86 的分節式記憶體管理 80x86 的 I/O 結構 學習組合語言的基本工具.
Introduction to Java Programming Lecture 17 Abstract Classes & Interfaces.
第 5 章 深入 Response 物件 製作. 網頁的轉向與強制輸出 - 讓網頁轉彎的 Redirect 敘述 運用 Response 物件的 Redirect 方法,將瀏覽器顯 示的網頁,導向至其他網頁,語法如下: Response.Redirect 網頁路徑與名稱 此網頁路徑與名稱  若是導向到同一台.
第九章 結構. 結構的宣告 結構 它是由許多不同 ( 或相同 ) 資料型態的變數所組成的 集合,通常利用結構標籤稱呼此集合 struct student { char *name; int score; }; struct 為保留字,表示結構的宣告開始 結構項目需定義於大括號「 { } 」內 結尾需加上分號.
24-6 設定開始與結束場景中的 程式 最後我們要替這個遊戲收個尾, 幫它把開始 的等待畫面跟結束畫面處理一下。
最新計算機概論 第 5 章 系統程式. 5-1 系統程式的類型 作業系統 (OS) : 介於電腦硬體與 應用軟體之間的 程式,除了提供 執行應用軟體的 環境,還負責分 配系統資源。
7 陣列與搜尋 7.1 陣列 一般資料變數 宣告一維陣列 起始一維陣列 7-4
: Happy Number ★ ? 題組: Problem Set Archive with Online Judge 題號: 10591: Happy Number 解題者:陳瀅文 解題日期: 2006 年 6 月 6 日 題意:判斷一個正整數 N 是否為 Happy Number.
: Fast and Easy Data Compressor ★★☆☆☆ 題組: Problem Set Archive with Online Judge 題號: 10043: Fast and Easy Data Compressor 解題者:葉貫中 解題日期: 2007 年 3.
第十章 再論結構. 指標與結構的關係 /* File name: ex10-1a.c */ #include int main() { struct student { char *name; int score; }; struct student st= {"Brian", 97}; struct.
: Ahoy, Pirates! ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11402: Ahoy, Pirates! 解題者:李重儀 解題日期: 2008 年 8 月 26 日 題意:有一個海盜島有 N 個海盜,他們的編號 (id)
: Multisets and Sequences ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 11023: Multisets and Sequences 解題者:葉貫中 解題日期: 2007 年 4 月 24 日 題意:在這個題目中,我們要定義.
:Nuts for nuts..Nuts for nuts.. ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 10944:Nuts for nuts.. 解題者:楊家豪 解題日期: 2006 年 2 月 題意: 給定兩個正整數 x,y.
1. 假設以下的敘述為一未提供 “ 捷徑計算 ” 能力的程式段,試用程 式設計的技巧,使此敘述經此改 寫的動作後,具有與 “ 捷徑計算 ” 之 處理方法相同之處理模式。 if and then E1 else E2 endif.
資料結構實習-一 參數傳遞.
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2008.
計算機概論 演算法與程式語言 李明山.
: Beautiful Numbers ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 11472: Beautiful Numbers 解題者:邱經達 解題日期: 2011 年 5 月 5 日 題意: 若一個 N 進位的數用到該.
Section 4.2 Probability Models 機率模式. 由實驗看機率 實驗前先列出所有可能的實驗結果。 – 擲銅板:正面或反面。 – 擲骰子: 1~6 點。 – 擲骰子兩顆: (1,1),(1,2),(1,3),… 等 36 種。 決定每一個可能的實驗結果發生機率。 – 實驗後所有的實驗結果整理得到。
函式 Function Part.2 東海大學物理系‧資訊教育 施奇廷. 遞迴( Recursion ) 函式可以「呼叫自己」,這種動作稱為 「遞迴」 此程式的執行結果相當於陷入無窮迴圈, 無法停止(只能按 Ctrl-C ) 這給我們一個暗示:函式的遞迴呼叫可以 達到部分迴圈的效果.
JAVA 程式設計與資料結構 第二十章 Searching. Sequential Searching Sequential Searching 是最簡單的一種搜尋法,此演 算法可應用在 Array 或是 Linked List 此等資料結構。 Sequential Searching 的 worst-case.
資料結構實習-二.
演算法 8-1 最大數及最小數找法 8-2 排序 8-3 二元搜尋法.
845: Gas Station Numbers ★★★ 題組: Problem Set Archive with Online Judge 題號: 845: Gas Station Numbers. 解題者:張維珊 解題日期: 2006 年 2 月 題意: 將輸入的數字,經過重新排列組合或旋轉數字,得到比原先的數字大,
Chapter 10 m-way 搜尋樹與B-Tree
: Function Overloading ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 11032:Function Overloading 解題者:許智祺 解題日期: 2007 年 5 月 8 日 題意:判對輸入之數字是否為.
演算法課程 (Algorithms) 國立聯合大學 資訊管理學系 陳士杰老師 Course 7 貪婪法則 Greedy Approach.
Probability Distribution 機率分配 汪群超 12/12. 目的:產生具均等分配的數值 (Data) ,並以 『直方圖』的功能計算出數值在不同範圍內出現 的頻率,及繪製數值的分配圖,以反應出該 機率分配的特性。
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2009.
5 重複迴圈 5.1 增減運算符號 增量運算符號 減量運算符號
INTRODUCTION TO MATLAB SHAWNNTOU. What Is MATLAB? MATLAB® is a high-performance language for technical computing. MATLAB® is a high-performance language.
函式 Function 東海大學物理系‧資訊教育 施奇廷. 函式簡介 當程式越來越大、越複雜時,程式的維護、 除錯會變得更困難,此時必須引入函式來 簡化程式或將程式分段,將程式重複的部 分改寫為函式,將程式「模組化」 這種作法有下列優點:節省程式發展的時 間、邏輯容易瞭解、程式容易除錯、可分 工合作完成程式.
Visual C++重點複習.
1 Introduction to Java Programming Lecture 3 Mathematical Operators Spring 2008.
11 Ch05 遞迴 淡江大學 周清江 1. 2  遞迴函數乃是一個自己反覆呼叫自己的函數  一個典型的遞迴演算法 n! = n * (n-1)! = n * (n-1) * (n-2)! = n * (n-1) * (n-2) * (n-3)! = … = n * (n-1) * (n-2)
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2010.
C 語言練習題 2010/12/2. C 程式的格式 一、 C 程式的格式 (1). /* …. */ 是 C 程式的 ______ main() 的內容是由敘述構成的 (2). 敘述要以 __ 為結束符號 (3). 變數、函數都要做 ____ 的宣告 (4). ‘=’ 是 ____ 用的算符 (5).
數字系統與資料表示法 教師: 陳炯勳 數系轉換 r進制數字 稱為 base r或 radix r 有r個計數符號,計數順序逢r歸零(進位) A n A n - 1 ‥‥A 2 A 1 A 0 ﹒A -1 A -2 ‥‥A -m 其中A n 及A.
: Finding Paths in Grid ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11486: Finding Paths in Grid 解題者:李重儀 解題日期: 2008 年 10 月 14 日 題意:給一個 7 個 column.
著作權所有 © 旗標出版股份有限公司 第 14 章 製作信封、標籤. 本章提要 製作單一信封 製作單一郵寄標籤.
6 使用者函數 6.1 函數定義 宣告函數 呼叫函數 呼叫多個函數 6-6
幼兒行為觀察與記錄 第八章 事件取樣法.
1 Introduction to Java Programming Lecture 3 Mathematical Operators Spring 2009.
第 1 章 PC 的基本構造. 本章提要 PC 系統簡介 80x86 系列 CPU 及其暫存器群 記憶體: Memory 80x86 的分節式記憶體管理 80x86 的 I/O 結構 學習組合語言的基本工具.
VHDL語法(3).
: How many 0's? ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 11038: How many 0’s? 解題者:楊鵬宇 解題日期: 2007 年 5 月 15 日 題意:寫下題目給的 m 與 n(m
McGraw-Hill/Irwin © 2003 The McGraw-Hill Companies, Inc.,All Rights Reserved. 肆 資料分析與表達.
Presentation transcript:

第五章 函數與儲存類別

函數 函數為完成某一次特定任務或工作的小程式 函數的類型 庫存函數 (library functions) 如: scanf() 、 printf() 函數 … 等 此函數為系統所提供可以直接呼叫使用之 自定函數 (user-define functions) 此函數是使用者自行定義之函數 函數的其它特點 它與變數一樣都有資料型態 函數傳回值之資料型態必須和函數之資料型態一致

函數的三個要素 /* File name: ex5-1a.c */ #include void print_star(); int main( ) { print_star(); printf("Bright Tsai"); print_star(); } void print_star( ) { printf("***********"); } 函數的語法 函數的呼叫 函數的定義

函數的三個要素 函數的語法 好比說英文或法文時,需符合英文文法或法文文法 一樣,因此當您在函數呼叫時,若與函數語法不符, 編譯程式便在編譯時期會發出錯誤訊息 函數的語法,一般寫在 main( ) 函數的上面,從此便 可知此程式用到了幾個函數 函數的呼叫 函數的呼叫是執行函數的定義區段 函數的定義 此區段為函數所要完成的工作,如範例 5-1a.c 為印 出 11 個 ’ * ’

函數的呼叫 函數的呼叫可以帶有參數 參數的類型 形式參數( formal argument ) 實際參數( actual argument ) 參數傳遞方式 傳值呼叫( call by value ) 傳址呼叫( call by address ) 範例 ex5-1b.c

傳值呼叫 /* File name: ex5-1b.c */ #include void print_star(int); int main() { print_star(30); printf( “ Mr. Bright Tsai is at the NCTU\n ” ); print_star(30); } void print_star(int k) { int i; for(i = 1; i <= k; i++) printf( “ * ” ); print( “ \n ” ); } 形式參數 實際參數

return 敘述 在函數定義中, return 敘述表示將此結果傳回給呼 叫此函數的敘述,並將控制權交回 若無 return 敘述,則遇到右大括號( } )便結束函數 定義且交回控制權給呼叫此一敘述的下一個敘述 C 程式中不可有巢狀函數 (nested function)

return 程式範例 ( 一 ) /* File name: ex5-2a.c */ #include double average(double, double); int main( ) { double score_1, score_2, aver; printf("Enter two double numbers: "); while(scanf("%lf %lf", &score_1, &score_2) == 1) { printf("Input error!!\n"); printf("Enter two number: "); } aver = average(score_1, score_2); printf("%.2f + %.2f / 2 = %.2f\n", score_1, score_2, aver); } double average(double f1, double f2) {

return 程式範例 ( 一 ) float average(float f1, float f2) { return ((f1 + f2) / 2); } 程式解說 當一函數執行完有傳回值傳回呼叫函數的敘述時, 必須注意此函數的資料型態必須與傳回值的資料型 態一致才可 如傳回值為 ((f1+f2)/2) 是一浮點數,故 average 的函 數資料型態也必須為浮點數

return 程式範例 ( 二 ) /* File name: ex5-2b.c */ #include void funct(int, int); int main() { int a = 1000, b = 2000; funct(a, b); printf( “ a = %d b = %d\n ”, a, b); }

return 程式範例 ( 二 ) void funct(int a, int b) { int c; c = a + b; printf("a + b = %d\n", c); return c; } 程式解說 若參數使用 void ,如 funct(void) 是表示 funct 函數 不接受任何參數

遞迴函數 遞迴函數 (recursive function) 在函數本身中, 若有一敘述又呼叫它本身函數 遞迴函數範例 計算某數的階層,如: 6! 費氏數列 設計遞迴函數時必須注意結束點

計算 n 階層 /* File name: ex5-3a.c */ #include int fact(long); int main() { long number, total; printf( “ Enter a number: ” ); while(scanf( “ %ld ”, &number) == 1) if(number > 13) { printf( “ Input must be less than 13\n ” ); printf( “ Enter a number: ” ); } else break; total = fact(number); printf( “ %ld! = %ld\n ”, number, total); }

計算 n 階層 long fact(long number) { if(number == 0 || number == 1) /* 返迴點 */ return 1; else return (number * fact(number -1)); }

計算 n 階層 程式解說 如輸入為 6 ,則其執行的步驟如下: 6 * fact(5) 5 * fact(4) 4 * fact(3) 3 * fact(2) 2 * fact(1) 傳回 1

費氏序列 /* File name: ex5-3c.c */ #include int fibonacci(int); int main() { int n, ans; printf( “ Enter a number(n > = 0): ” ); scanf( “ %ld ”, &n); if(n < 0) printf( “ Number must be > 0\n ” ); else { ans = fibonacci(n); printf( “ fibonacci(%ld) = %ld\n ”, n, ans); }

int fibonacci(int n) { if(n == 0) return 0; else if(n == 1) return 1; else return (fibonacci(n – 1) + fibonacci(n -2)); }

巨集指令 乃是用 #define 以某一名稱代替一些處理問題的步驟 巨集指令會比函數產生較多的程式碼,但其執行比 較快 如: #define SQUARE(x) x * x

巨集指令範例 /* File name: ex5-4a.c */ #include #define SQUARE(x) x * x void main() { printf( “ Square of 10 is %d/n ”, SQUARE(10)); printf( “ Square of is %d\n ”, SQUARE(8 + 2)); }

前置處理程式 #define 前置處理程式 除了用來當做巨集指令外,最常用的不外乎以某一 符號常數( Symbol constant )代替此一常數 如:將 RATE 取代 #include #define RATE void main( ) { float total;... total = RATE * 5000;... }

區域變數與全域變數 區域變數 定義在函數裡面的變數 全域變數 定義在函數外面的變數

區域變數與全域變數 區域變數與全域變數的特性 當一程式區域變數和全域變數同名時,以區域變數 優先 使用區域變數前,一定要設定初值,或由使用者輸 入該變數的初值後才使用,否則可能產生 “ garbage value ” 全域變數的勢力範圍是其定義位置底下的所有函數, 在其以上的函數是不能用的 區域變數的存活期在函數執行完畢之後,區域變數 所佔的記憶體將被回收,等再進入函數時,才會再 次的為此變數配置記憶體

區域變數與全域變數程式範例 #include void a(); void b(); void a() { printf( “ k = %d\n ”, k); } int k = 200; /* 全域變數 */ void b() { printf( “ k = %d\n ”, k); } void main() { int k = 100; /* 區域變數 */ printf( “ k = %d\n ”, k); a(); b(); } K 的勢力範圍

儲存類別 變數利用資料型態以配置記憶體,並利用儲存 類別規範其存活期 儲存類別分別有 auto, static, register, extern 儲存類別放在資料型態的前面或後面皆可,但 習慣上會以儲存類別在前,資料型態在後

儲存類別 --auto auto 儲存類別 先前我們提到的變數皆為 auto ,此為內定值,亦即 不必加以註明也可以,如 auto int i; 與 int i; 具有相同的意義

儲存類別 --register register 儲存類別 屬於此類的變數,系統會將它放在 CPU 中的暫存器 (register) 放在暫存器的變數比放在記憶體的變數,處理的速 度來得快,不過由於 CPU 的暫存器有限,且每個皆 各有所司,因此系統最多給程式兩個暫存器儲存類 別的變數,其餘的皆會主動設定為 auto 因此 register 和 auto 大致上功能類似 假設在程式中有一多層的迴圈,若最內層的變數設 定為 register ,會使得程式的執行加快

儲存類別 --static 靜態儲存類別變數之宣告方式 在變數名稱前加一 static 關鍵字 靜態儲存類別變數的類型 靜態區域變數:此類變數在程式結束時, 此變數才會 消失 靜態全域變數:資料隱藏

儲存類別 --static /* File name: ex5-6a.c */ #include void stat_ai(); int main() { int i; for(i = 1; i <= 5; i++) stat_ai(); } void stat_ai() { int ai = 1; static int si = 1; printf("ai = %d\n", ai++); printf("si = %d\n\n", si++); }

儲存類別 --extern /* file 1 */ void callme() int i = 100; int main() { int i = 200; i += 30; callme(); } /* file 2 */ int callme() { extern int i; /* 宣告 */ i += 100; printf( “ i = %d ”, i); } …