Download presentation
Presentation is loading. Please wait.
1
C 程式設計— 函式 台大資訊工程學系 資訊系統訓練班
2
課程大綱 C語言簡介 基本資料型態, 變數, 基本輸入輸出 控制敘述- 選擇控制與重覆控制 陣列 函式 指標 字元與字串 結構 檔案處理
3
本次課程大綱 函式基本概念 函式建立 函式使用 引數傳遞 儲存類別 遞迴函式
4
函式的基本概念 函式--是一個副程式 C程式中 函式有以下的優點. 例子 所有函式的地位一律平等; 函式可以自行呼叫本身函式.
所有函式的地位一律平等; 函式可以自行呼叫本身函式. 函式有以下的優點. 避免造成相同程式區段的重覆出現. 開發較大程式時, 可以分工處理, 最後再把所有函式合起來. 增加程式的可讀性, 減少維修成本. 結構化語言. 例子
5
程式階層圖
6
數學函式 數學函式 呼叫一個函式 通用的數學運算式 多個參數以逗號隔開 呼叫sqrt 函式 所有數學函式會傳double的資料型態
#include <math.h> 呼叫一個函式 函式名稱( 參數列 ); 多個參數以逗號隔開 printf( "%.2f", sqrt( ) ); 呼叫sqrt 函式 所有數學函式會傳double的資料型態
7
常用的數學函式(1) 例子: 函式 說明 x和y的資料型態 exp(x) 指數函式e^x double或float
log(x) 自然對數函式; ln(x) double或float log10(x) 以10為底的對數 double或float sqrt(x) x的開平方根值 double或float fabs(x) x的絕對值 double或float pow(x,y) x的y次方值 x^y double 例子:
8
常用的數學函式(2) 例子: 函式 說明 x的資料型態 sin(x) 正弦函式 double或float
cos(x) 餘弦函式 double或float tan(x) 正切函式 double或float asin(x) 反正切函式 double或float acos(x) 反餘弦函式 double或float atan(x) 反正切函式 double或float 例子:
9
使用者自訂函式 使用者自訂函式三步驟 函式宣告 函式定義 函式呼叫
10
函式宣告 函式宣告 函式名稱 參數 回傳值 當函式定義在使用之前,就必須先宣告 舉例:
int maximum( int x, int y, int z ); 使用三個整數參數 回傳整數
11
函式定義 函式格式 函式內不可再次定義函式 回傳值的資料型態 函式名稱( 參數列) { 變數宣告 指令敘述 } 函式名稱 任意名稱
回傳值的資料型態 函式名稱( 參數列) { 變數宣告 指令敘述 } 函式名稱 任意名稱 回傳值的資料型態 void – 指沒有回傳值 參數列: 每個參數都要指定它的資料型態和名稱 函式內不可再次定義函式 int func ( int a, int b) { int c; c=a+b; return c; }
12
函式呼叫 函式的呼叫形式 不傳參數, 不傳回值. 不傳參數, 有傳回值. 傳參數, 不傳回值. 傳參數, 有傳回值.
void func(void); 不傳參數, 有傳回值. int func(void); 傳參數, 不傳回值. void func (a); (a的資料型態需與指定參數的資料型態相等) 傳參數, 有傳回值. Int func (a); (a的資料型態需與指定參數的資料型態相等)
13
#include <stdio.h>
int min(int x,int y); // int min(int,int) also works int main() { int i,j; scanf(“%d%d”,&i,&j); printf(“%d”,min(i,j)); } int min(int x,int y) return x>y?y:x; 宣告 #include <stdio.h> int min(int x,int y) { return x>y?y:x; } int main() int i,j; scanf(“%d%d”,&i,&j); printf(“%d”,min(i,j)); 定義 定義
14
練習時間 例子1: 設計一個函式, 將兩個整數相加, 並傳回主函式. 例子2: 修改例子1
15
資料型態的轉換 (1) 選擇優先權最高的資料型態轉換
轉換完畢後就進行實際運算,並且將運算結果轉換為等號左邊變數所屬的資料型態,最後將運算結果回存到左邊的變數中。
16
資料型態的轉換 (2) 假設共有5個變數,其資料類型如下: int a; char b; float c; double d; int x;
x=(a-b)+(c*d)/b
17
強制型態轉換 (強制轉換型態)運算式或變數 (float) x, (float) x/y Int x,y; Float z;
z = x / y => z=3 z = (float)x / (float)y => z=3.75
18
實質參數跟形式參數 形式參數 實質參數 它們被定義在函式名稱之後 它們被實際傳入函式內 它們可以是常數,變數或實際數值
int mySqrt(double i) 實質參數 它們被實際傳入函式內 mysqrt(200.0) mysqrt(i) 它們可以是常數,變數或實際數值
19
引數傳遞(1) Call by value傳值呼叫 Call by reference傳址呼叫 通常用來提高效能 只將實際參數的數值傳入函式
原始的數值不會因為函式而改變 通常使用在不需要改變實際參數的數值 例子 Call by reference傳址呼叫 將實際參數的指標傳入 函數將會改變參數的原始值 只使用在確定可以信任的函式 會將原來的值保留,而將新的值儲存在另一個記憶體空間 通常用來提高效能
20
引數傳遞(2) 傳值呼叫 傳址呼叫
21
引數傳遞(3) 傳回值個數大於1時 傳址呼叫 全域變數
22
儲存類別 其主要功能在說明變數的生命期(life time)及範圍(scope). 主要分為區域變數及全域變數 生命期就是變數存在的時間.
範圍就是變數的可使用範圍. 主要分為區域變數及全域變數
23
宣告方式 區域變數 全域變數 宣告在函式本體, 或函式參數列中 宣告在任何函式定義之外 auto int num;
static int num; 全域變數 宣告在任何函式定義之外
24
生命期 區域變數 全域變數 auto變數在其宣告的區塊作用期間佔用記憶體.
static變數從程式開始執行時便已經存在, 一直到程式結束為止, 也就是說它只會初始化一次. 全域變數 同static變數
25
範圍 區域變數 全域變數 區域變數只能在它宣告的區塊使用. 當同時兩層出現同名區域變數時, 用的是最內層的區域變數.
全域變數從它宣告的地方開始, 到處都可以使用. 例子 Note:函式宣告與可用範圍與變數相同.
26
亂數產生函式(1) i = rand(); rand 函式 int rand(void); 存在在 <stdlib.h>
產生亂數 回傳0到32757的亂數 i = rand(); 每次程式執行的時候都會拿到同樣順序的亂數 例子
27
亂數產生函式(2) 決定亂數範圍 1 + ( rand() % n ) 希望得到1到n之間的亂數 rand() % n 回傳0到n-1的亂數
1到6之間的亂數 例子
28
亂數產生函式(3) Time函式 time_t time(time_t *timrptr); 存在在 <time.h>
取得由格林威治時間1970/1/1 00:00:00至今經過的秒數 例子
29
亂數產生函式(4) srand 函式 srand( seed ); void srand(unsigned int seed);
存在在 <stdlib.h> 設定亂數產生器種子 srand( seed ); Seed:亂數產生器的種子 例子 srand( time( NULL )) 回傳電腦內當時程式執行的時間作為亂數種子
30
遞迴函式 (1) 一個遞迴函式, 就是在函式的指令敘述內, 呼叫自己本身這個函式 遞迴函式用來處理大量而相同狀況的問題 如n!的計算.
31
遞迴函式 (2) n!的計算 請注意: 利用遞迴去計算 先解決基本狀況 (1! = 0! = 1) 之後逐步處理
5! = 5 * 4 * 3 * 2 * 1 請注意: 5! = 5 * 4! 4! = 4 * 3! ... 利用遞迴去計算 先解決基本狀況 (1! = 0! = 1) 之後逐步處理 2! = 2 * 1! = 2 * 1 = 2; 3! = 3 * 2! = 3 * 2 = 6;
32
遞迴函式 (3) 例子: 利用遞迴函式求n! (a) 遞迴呼叫的順序 (b) 遞迴值的回傳順序 最後值 = 120 5!
回傳 5! = 5 * 24 = 120 回傳 4! = 4 * 6 = 24 回傳 2! = 2 * 1 = 2 回傳 3! = 3 * 2 = 6 回傳 1 5 * 4! 1 4 * 3! 3 * 2! 2 * 1! 例子: 利用遞迴函式求n!
33
其他例子 問題: 利用遞迴函式求 1+2+3+…+n的值. sum(n) = 1, 如果 n = 1
sum(n) = n + sum(n-1), 如果 n > 1
34
遞迴函式: 費式數列 f( 3 ) f( 1 ) f( 2 ) f( 0 ) return 1 return 0 return +
35
練習時間 利用遞迴函式求費式數列 Fib(n) = 0, 如果 n=0; Fib(n) = 1, 如果 n=1;
Fib(n) = Fib(n-1) + Fib(n-2), 如果n不為0或1
36
練習時間 計算m和n 二數的最大公因數 輾轉相除法 gcd(m,n) = n, 如果 m%n 等於 0
gcd(m,n) = gcd(n, m%n), 如果m%n 不等於 0
37
今天學到什麼… 什麼是函式 如何建立一個函式 如何使用函式 如何傳遞變數 什麼是儲存類別 如何建立遞迴函式
Similar presentations