Presentation is loading. Please wait.

Presentation is loading. Please wait.

6 使用者函數 6.1 函數定義 宣告函數 呼叫函數 呼叫多個函數 6-6

Similar presentations


Presentation on theme: "6 使用者函數 6.1 函數定義 宣告函數 呼叫函數 呼叫多個函數 6-6"— Presentation transcript:

1 6 使用者函數 6.1 函數定義 6-2 6.1.1 宣告函數 6-3 6.1.2 呼叫函數 6-4 6.1.3 呼叫多個函數 6-6
6 使用者函數 6.1 函數定義 6-2 6.1.1 宣告函數 6-3 6.1.2 呼叫函數 6-4 6.1.3 呼叫多個函數 6-6 6.1.4 多重呼叫函數 6-8 6.1.5 宣告函數原型 6-10 6.2 傳遞參數 6-12 6.2.1 傳遞單一參數 6-12 6.2.2 傳遞多個參數 6-14 6.2.3 傳遞常數符號 6-16 6.2.4 傳遞變數數值 6-18 6.2.5 傳遞變數位址 6-20 6.2.6 傳遞預設參數 6-22 6.3 函數傳回值 6-23 6.3.1 return敘述 6-24 6.3.2 傳回數值 6-26 6.3.3 傳回布林值 6-27 6.4 變數範圍 6-28 6.4.1 區域變數auto 6-28 6.4.2 公用變數 6-30 6.4.3 外部變數extern 6-32 6.4.4 暫存器變數register 6-35 6.4.5 靜態變數static 6-36 6.5 函數特殊用途 6-38 6.5.1 遞迴函數 6-38 6.5.2 exit函數 6-40 6.5.3 定義函數巨集 #define 6-41

2 6.0 計算1加到100的和 #include <iostream.h> void main() { int sum = 0;
6.0 計算1加到100的和 #include <iostream.h> void main() { int sum = 0; for(int i=1; i<=100; i++) sum += i; cout << " = " << sum << endl; cout << endl; }

3 如果題目改成 計算1加到100的和 計算1加到200的和 計算1加到300的和 複製→貼上?

4 #include <iostream.h>
void main() { int sum = 0; for(int i=1; i<=100; i++) sum += i; cout << " = " << sum << endl; cout << endl; for(int i=1; i<=200; i++) cout << " = " << sum << endl; for(int i=1; i<=300; i++) cout << " = " << sum << endl; }

5 #include <iostream.h>
void main() { int sum = 0; for(int i=1; i<=100; i++) sum += i; cout << " = " << sum << endl; cout << endl; for(i=1; i<=200; i++) cout << " = " << sum << endl; for(i=1; i<=300; i++) cout << " = " << sum << endl; }

6 #include <iostream.h>
void main() { int sum = 0; for(int i=1; i<=100; i++) sum += i; cout << " = " << sum << endl; cout << endl; sum = 0; for(i=1; i<=200; i++) cout << " = " << sum << endl; for(i=1; i<=300; i++) cout << " = " << sum << endl; }

7 6.0 可以改用函數的方式 #include <iostream.h> void main() { int sum = 0;
6.0 可以改用函數的方式 #include <iostream.h> void main() { int sum = 0; for(int i=1; i<=100; i++) sum += i; cout << " = " << sum << endl; cout << endl; } #include <iostream.h> void total(int n) { int sum = 0; for(int i=1; i<=n; i++) sum += i; cout << "1+...+" << n << " = " << sum << endl; cout << endl; }

8 6.0 改用函數的程式 #include <iostream.h> void total(int n) {
6.0 改用函數的程式 #include <iostream.h> void total(int n) { int sum = 0; for(int i=1; i<=n; i++) sum += i; cout << "1+...+" << n << " = " << sum << endl; cout << endl; } void main() total(100); total(200); total(300);

9 執行結果

10 6.0 只須計算和的寫法 #include <iostream.h> int total(int n) {
6.0 只須計算和的寫法 #include <iostream.h> int total(int n) { int sum = 0; for(int i=1; i<=n; i++) sum += i; return sum; } void main() cout << " = " << total(100) << endl << endl; cout << " = " << total(200) << endl << endl; cout << " = " << total(300) << endl;

11 執行結果

12 6.1 函數定義 函數呼叫與返回

13 6.1.1 宣告函數 傳回型態 函數名稱 (參數列) { //函數本體 return 傳回值; } 範例
宣告函數 傳回型態 函數名稱 (參數列) { //函數本體 return 傳回值; } 範例 void womain(void) //使用者函數 { cout << "How are you doing main, from womain."; cout << endl; }

14 6.1.2 呼叫函數 函數名稱 (參數0, 參數1, 參數2, …); 範例 womain(); //呼叫使用者函數womain
呼叫函數 函數名稱 (參數0, 參數1, 參數2, …); 範例 womain(); //呼叫使用者函數womain 程式6-01

15 呼叫函數 (續) 呼叫函數方塊圖

16 呼叫多個函數 呼叫多個函數方塊圖

17 呼叫多個函數 (續) 範例 2 程式6-02

18 多重呼叫函數 多重呼叫函數方塊圖

19 多重呼叫函數 (續) 範例 程式6-03

20 6.1.5 宣告函數原型 傳回型態 函數名稱 (參數型態0, 參數型態1, 參數型態2, …); 範例
宣告函數原型 傳回型態 函數名稱 (參數型態0, 參數型態1, 參數型態2, …); 範例 void womain(void); //宣告使用者函數原型 void main(void) //main 函數 { cout << "Hi womain, This is main." << endl; womain(); //呼叫使用者函數womain cout << "Fine, thank you!" << endl; } void womain(void) //使用者函數 cout << "How are you doing main, from womain."; cout << endl; 程式6-04

21 Ex 10 寫一個C++程式計算圓面積 定義一個cArea( r )函數,接收到半徑的參數後,會印出當半徑是多少時,圓面積的值是多少。
在main函數中,分別以5, 6, 7, 8, 9, 10的半徑值,呼叫cArea去計算並印出圓面積的值。

22 6.2 傳遞參數 傳遞參數流程

23 傳遞單一參數 範例 void number(int); //宣告函數原型 程式6-05

24 傳遞多個參數 void sum(int, int, int); //宣告函數原型 程式6-06

25 傳遞常數符號 void area(float, float); //宣告函數原型 程式6-07

26 傳遞變數數值 void calculate(int, int, int); //宣告函數原型 程式6-08

27 傳遞變數位址 void swap(int &, int &); //宣告函數原型 程式6-09

28 6.2.6 傳遞預設參數 範例 void weight(float lb = 1.0); //指定參數預設值
傳遞預設參數 範例 void weight(float lb = 1.0); //指定參數預設值 void weight(float lb) //重量轉換函數 { cout << lb << "磅 = " << lb/ << "公斤"; //顯示函數傳回值 cout << endl; } 程式6-10

29 6.3 函數傳回值 函數傳回值

30 6.3.1 return敘述 return 傳回值; 範例一 int main() //傳回整數資料給OS { //敘述區
} 範例二 void main() //不須傳回任何資料給OS //不須要return敘述 } //main函數結束點

31 return敘述 (續) 程式6-11

32 傳回數值 程式6-12

33 傳回布林值 程式6-13

34 6.4 變數範圍 變數範圍是指變數可使用的範圍,包括區域變數、公用變數、外部變數、靜態變數、與暫存器變數。例如在main函數區塊內宣告的變數只有main函數區塊內的敘述可以使用,其他函數則不能直接存取main函數內的變數。 同理,任何函數內的區域變數只有該函數內的敘述可以使用。而公用變數則可提供同一程式中所有函數的敘述使用。

35 6.4.1 區域變數auto auto 資料型態 變數名稱 = 初值; 範例一 void main() //沒有傳回值 {
auto int ft; //宣告main區域變數 . } //不需要return敘述 double long(int ft) auto double m; //宣告long區域變數 }

36 6.4.1 區域變數auto (續) 範例二 void main() { //沒有傳回值
for (int count=0; count<10; count++) //main區域變數count . } //不需要return敘述 double length(int ft) { for (int count=1; count<=5; count++) //length區域變數count }

37 範例 #include <iostream.h> int total(int n) { count++;
int sum = 0; for(int i=1; i<=n; i++) sum += i; return sum; } void main() int count = 0; cout << " = " << total(100) << endl << endl; cout << " = " << total(200) << endl << endl; cout << " = " << total(300) << endl; cout << "count = " << count << endl;

38 範例 #include <iostream.h> int total(int n) { int count = 0;
int sum = 0; for(int i=1; i<=n; i++) sum += i; return sum; } void main() cout << " = " << total(100) << endl << endl; cout << " = " << total(200) << endl << endl; cout << " = " << total(300) << endl; cout << "count = " << count << endl;

39 範例 #include <iostream.h> int total(int n) { int sum = 0;
for(int i=1; i<=n; i++) sum += i; n++; return sum; } void main() int n = 5; cout << " = " << total(100) << endl << endl; cout << " = " << total(200) << endl << endl; cout << " = " << total(300) << endl; total(n); cout << "n = " << n << endl;

40 6.4.2 公用變數 資料型態 變數名稱 = 初值; 範例 double m; //宣告公用變數 double ft; //宣告公用變數
公用變數 資料型態 變數名稱 = 初值; 範例 double m; //宣告公用變數 double ft; //宣告公用變數 void main() { . m = 10; //10存入公用變數m length(); //呼叫函數 cout << m << '\t' << ft; //顯示公用變數值 } void length() { //重量轉換函數 ft = * m; //運算值存入公用變數ft

41 範例 #include <iostream.h> int count = 10; int total(int n) {
int sum = 0; for(int i=1; i<=n; i++) sum += i; return sum; } void main() cout << " = " << total(100) << endl << endl; cout << " = " << total(200) << endl << endl; cout << " = " << total(300) << endl; cout << "count = " << count << endl;

42 Ex 11 寫一個C++程式計算球面積與體積 定義一個sArea( r )函數,接收到半徑r的參數,傳回球面積給呼叫敘述。
定義一個sVolume( r )函數,接收到半徑r的參數,傳回球體積給呼叫敘述。 在main函數中,分別以5, 6, 7, 8, 9, 10 (用迴圈)的半徑值,去呼叫sArea與sVolume函數,收到球面積和球體積的值,顯示在螢幕上。

43 Homework 4 寫一個函數 寫一個主程式 傳入參數是西元年 傳出值是該西元年的天數
例:int DaysOfYear( int Year) 寫一個主程式 讓user輸入西元年 使用迴圈並呼叫上面所寫的函數,計算從西元元年到該年元旦,共經過多少天 計算該年元旦是星期幾,並將結果輸出

44 6.4.3 外部變數extern extern 資料型態 變數名稱 = 初值; 在C++程式中,使用每個變數之前都必須先宣告。
若有一個公用變數被宣告於函數之後,則使用該變數之前必須先宣告該變數為外部變數(external variable)。

45 6.4.3 外部變數extern 範例 double degree(void) { //溫度轉換函數
extern double c; //宣告外部變數 double f; //宣告區域變數 f = ((9 * c ) / 5) + 32; //攝氏轉成華氏 … } double c; //宣告公用變數 void main(void) { //main函數 for (c = 36; c <= 40; c++) //攝氏溫度=計數

46 6.4.4 暫存器變數register register 資料型態 變數名稱 = 初值; 範例
int main(void) //main函數 { register double f; //宣告暫存器變數 . } double degree(double fahr) //溫度轉換函數 register double c; //宣告暫存器變數

47 6.4.5 靜態變數static static 資料型態 變數名稱 = 初值;
區域變數所佔用的記憶體位置,於函數返回時會被清除並釋放,而靜態變數(static variable)所佔用的記憶體位置,會直到程式結束時才交還給系統,所以存放在靜態變數的值,也將保留直到再寫入或程式結束為止。 在編譯時,靜態變數初值會被自動設為0。

48 //儲存檔名:d:\C++06\C0618.cpp #include <iostream.h> int total(int); //宣告函數原型 void main(void) //main函數 { int count, oddsum; //宣告區域變數 for (count = 1; count <= 100; count += 2) //呼叫函數迴圈 oddsum = total(count); //oddsum=函數傳回值 cout << " =" << oddsum; //顯示最後oddsum值 cout << endl; } int total(int n) //計算總和函數 static int sum; //宣告靜態變數 sum += n; //sum(n+1)=sum(n)+n return sum; //返回並傳回sum

49 執行結果

50 6.5.1 遞迴函數 遞迴函數呼叫(Recursive Function Calls)就是函數中包含一個呼叫自己的敘述。 範例
遞迴函數 遞迴函數呼叫(Recursive Function Calls)就是函數中包含一個呼叫自己的敘述。 範例 int total(int n) //計算總和函數 { . }

51 6.5.1 遞迴函數 遞迴函數呼叫(Recursive Function Calls)就是函數中包含一個呼叫自己的敘述。 範例
遞迴函數 遞迴函數呼叫(Recursive Function Calls)就是函數中包含一個呼叫自己的敘述。 範例 int total(int n) //計算總和函數 { if (n > 1) //若 n > 1 return n + total(n-1); //呼叫函數自身 else //若n<=1 return 1; //結束遞回呼叫,並傳回1 }

52 遞迴函數 (續)

53 6.5.2 exit函數 #include <stdlib.h> void exit(int 傳回值)
exit函數可以用來中斷程式,就好像break敘述可以用來中斷迴圈一樣。 傳回值(return code)是回傳給呼叫程式,通常是作業系統。 0: 正常結束 1: 異常終止

54 6.5.2 exit函數 範例 #include <stdlib.h> void main(void) {
if(!display_mode()) exit(1); play(); }

55 6.5.3 定義函數巨集 #define #define 巨集名稱 數值 #define 巨集名稱 字串 #define 巨集名稱 函數
範例一 #define PI //定義符號 pi 範例二 #define BEGIN  { //定義起始符號 #define END  } //定義結束符號 #define TAB  '\t' //定義定位符號

56 6.5.3 定義函數巨集 #define (續) 範例三 #define ABS(n) (n<0 ? –n : n)
//定義取絕對值函數巨集 #define EVEN(n) (n%2==0 ? "偶數" : "奇數") //定義判斷奇偶數函數巨集

57 範例 //儲存檔名:d:\C++06\C0623.cpp #include <iostream.h>
#define MAX(x, y) ((x>y) ? x : y) //判斷較大值函數巨集 #define MIN(x, y) ((x<y) ? x : y) //判斷較小值函數巨集 void main(void) { int num1, num2; cout << "請輸入二個整數:"; cin >> num1 >> num2; cout << num1 << " 和 " << num2; cout << " 的較大值是 " << MAX(num1, num2); //呼叫巨集函數MAX cout << endl; cout << " 的較小值是 " << MIN(num1, num2); //呼叫巨集函數MIN }

58 執行結果

59 Ex 12 寫一C++程式,利用遞回呼叫函數的方法,求n! (階乘)的值。

60 Homework 5 利用遞迴及非遞迴方式撰寫Fibonacci的程式。 User輸入n值,計算出Fib(n)
Fib(n) = Fib(n-1) + Fib(n-2) Fib(0) = 0, Fib(1) = 1 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …


Download ppt "6 使用者函數 6.1 函數定義 宣告函數 呼叫函數 呼叫多個函數 6-6"

Similar presentations


Ads by Google