Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chapter 6 函數.

Similar presentations


Presentation on theme: "Chapter 6 函數."— Presentation transcript:

1 Chapter 6 函數

2 簡介 函數功能 參數的傳遞 函數原型 變數存活周期 自動變數、靜態變數、全域變數

3 C的函數 敘述句的集合 定義在文件範圍 擁有獨一無二的名子 使用大括號包括起來 進行某一明確定義的操作 或許有輸入參數 或許會回傳值

4 Example #include <stdio.h> #include <stdlib.h>
float avg(int n, int m) { return (n + m) / 2.0; } int main(int argc, char *argv[]) { int n1, n2; printf("Enter the 1st number:"); scanf("%d", &n1); printf("Enter the 2nd number:"); scanf("%d", &n2); printf("The average is %.2f\n", avg(n1, n2)); system("pause"); return 0;

5 參數的傳遞 參數僅傳值不傳址 函數將接收到每個參數的複本 原始參數將不受影響 結果的傳遞也是傳值 a = b + avg(c,d);

6 void 關鍵字 使用在函數不需要回傳值 作法 void f( int x, float y) {…} 使用在不需參數的函數 void f2(void){ printf( "Welcome to ..."); } … f2 ();

7 Example #include <stdio.h> #include <stdlib.h>
void print_ints(int num[], int n) { int i; if (n <= 0) return; for (i = 0; i < n; ++i) { if (i > 0) printf(","); printf("%d", num[i]); } int main(int argc, char *argv[]) { int a[] = {1, 2, 3, 4, 5}; print_ints(a, 5); system("pause"); return 0;

8 使用函數 傳入的參數型別需要先定義且不得違反 編譯器可以抓出型態不符合的錯誤 使用函數必須事先定義 但是必須提供相關資訊
C++ 和 Java 也相同

9 函數原型 函數具有幾個要點 署名(名字+ 參數型別) 回傳型態 定義明確的使用方法 為函式庫的基礎要素

10 Example #include <stdio.h> #include <stdlib.h>
float avg(int, int); /* 函式原型*/ int main(int argc, char *argv[]) { int n1, n2; printf("Enter the first number:"); scanf("%d", &n1); printf("Enter the second number:"); scanf("%d", &n2); printf("The average is %.2f\n", avg(n1, n2)); system("pause"); return 0; } float avg(int n, int m) { return (n + m) / 2.0;

11 Example /* file myfun.h */ float avg(int, int); … /* file myfun.c */
float avg(int n, mt m) { return (n + m) / 2.0; } /* file mymain.c */ #include <stdio.h> #include "myfun.h" int main(int argc, char *argv[]) { avg(x, y) return 0;

12 變數存活周期 那裡可看見這個變數 三種狀況: 區域有效 或 區塊有效 檔案有效 全域有效

13 區域有效 區塊內有效 (一對大括號) 函數內 迴圈和判斷 該變數直到區塊結束才失效

14 檔案有效 宣告在任何函數之外 在同一個檔案的任何地方都看見

15 Example #include <stdio.h> #include <stdlib.h>
int i = 3; /* 檔案有效*/ int main(int argc, char *argv[]) { int j; printf(“%d\t”, i); // ←i 檔案有效 for (j = 0; j < i; ++j) { int i = 99; // ←i 區域有效 printf("%d\t", i); { int i = j; // ←i 區域有效 } system("pause"); return 0; //

16 自動變數(auto) 存放在程式的堆疊中 存在任何在區塊內變數 每次進入區塊內會重新分配位址跟初始值

17 Example #include <stdio.h> #include <stdlib.h>
int count() { auto int n = 0; return ++n; } int main(int argc, char *argv[]) { int i; for (i = 0; i < 5; ++i) printf("%d ", count()); system("pause"); return 0; }//

18 靜態變數(static) 居住在一個特別資料區 必須定義在區塊外面 僅一次初始化 (Static) data segment 如 檔案變數
就在程式剛啟動

19 Example #include <stdio.h> #include <stdlib.h>
int count() { static int n = 0; return ++n; } int main(int argc, char *argv[]) { int i; for (i = 0; i < 5; ++i) printf("%d ", count()); system("pause"); return 0; }//

20 全域變數(extern ) 又叫程式變數 可以在不同程式原始檔之間存取 定義一個檔案變數 定義全域變數需要使用 extern 關鍵字
不需要 static 關鍵字 定義全域變數需要使用 extern 關鍵字 static + file scope = private to the file

21 Example /* file1.c */ int i = 10; /* global */
static int j = 20; /* private */ int get_j(void) { return j; } /* file2.c */ #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { extern int i; /* extern optional for funtions: */ int get_j(void); printf("i == %d\n", ++i); //i=11 printf("j == %d\n", get_j()); //j=20 system("pause"); return 0;

22 總結 函數 函數是有名字的敘述句集合 C 參數採傳值呼叫 變數存活週期區域 隱藏資訊的好幫手 statics 或許需要參數 或許有回傳值
區域, 檔案, 程式 隱藏資訊的好幫手 statics


Download ppt "Chapter 6 函數."

Similar presentations


Ads by Google