1.函數(shù)的用途
函數(shù)(function)又稱函式﹐亦和副程式(subprogram)相似﹐利用函數(shù)有下列優(yōu)點(diǎn):
1.1 當(dāng)某項(xiàng)工作需重覆多次時(shí)﹐可寫成函數(shù)﹐在需要時(shí)呼叫它即可﹐這樣可避免程式碼的重覆撰寫。
1.2 因?yàn)閷⒊淌椒指畛筛饔兴救蝿?wù)的函數(shù)﹐因此程式易於了解﹐架構(gòu)清楚。
1.3 每一函數(shù)有獨(dú)立性﹐因?yàn)楹瘮?shù)內(nèi)的區(qū)域變數(shù)只有函數(shù)本身可使用﹐所以維護(hù)也容易。(不會(huì)兩三天後就看不懂程式碼)
2.函數(shù)的範(fàn)例
//定義hello函數(shù) void hello(){ printf(“Hello!\n”); }
int main(){ //呼叫hello函數(shù)hello(); }
|
3.函數(shù)的定義
syntax:
回傳資料型態(tài) 函數(shù)名稱([資料型態(tài)1 參數(shù)1, 資料型態(tài)2 參數(shù)2…..]){ 敘述1 敘述2….. [return 回傳值] }
|
e.g.
//下列函式可回傳x、y中較大的值 int max(int x,int y){ if(x>y) return x; else return y; }
|
說(shuō)明:如不須回傳資料,則回傳資料型態(tài)可用void,如不須傳入?yún)?shù),則可留空白,如前例void hello(),
4.函數(shù)的呼叫
syntax:
函數(shù)名稱([參數(shù)1,參數(shù)2…..])
|
e.g.
show_table();//無(wú)參數(shù),且無(wú)回傳值的函數(shù) minvalue=min(15,10);//有參數(shù),且有回傳值的函數(shù) printf("%d",max(5,10));
|
說(shuō)明:呼叫函數(shù)時(shí),應(yīng)在呼叫前先行定義函數(shù)。另外呼叫函數(shù)時(shí),所傳入的參數(shù)數(shù)目與資料型態(tài)須與函數(shù)宣告時(shí)一致。
5.區(qū)域變數(shù)與全域變數(shù)(Local variables vs Glabal variables)
函數(shù)內(nèi)的變數(shù)為區(qū)域變數(shù)﹐外界無(wú)法使用。
若定義全域變數(shù)﹐則在定義後的所有段落均可使用。
請(qǐng)見下例:
int a=1; void foo_before(int c) { int d=a+1; a=c+d; //b=...錯(cuò)誤!在此不能存取b,因其為main的區(qū)域變數(shù)。}
int main() { int b=2; foo_before(); printf("a=%d",a); //d=...錯(cuò)誤!在此不能存取d,因其為foo_before的區(qū)域變數(shù)。 //foo_after()...錯(cuò)誤!在此不能呼叫foo_after,因foo_after的宣告在後。}
void foo_after() { /* Empty function */ }
|
6.想想看,請(qǐng)寫出下列函數(shù)。
6.1.min(x,y)(求最小值)
6.2.power(x,y)(求x的y次方值)
6.3.ctf(degree)(將攝氏溫度轉(zhuǎn)華氏溫度,公式為 華式溫度=1.8*攝式溫度+32)
7.參數(shù)傳遞方式
7.1 傳值呼叫(pass by value)
參數(shù)利用複製值的方式傳遞﹐於函數(shù)結(jié)束時(shí)參數(shù)的值不受改變。
7.2 傳址呼叫(pass by address)
參數(shù)利用指標(biāo)方式傳遞(記憶體位址)﹐參數(shù)值可被更改。
7.3 傳參考呼叫(pass by reference)
機(jī)制類似傳址呼叫﹐但使用上較為簡(jiǎn)單方便﹐僅需在函數(shù)定義時(shí)註明&。
7.4 e.g.﹕
//x:pass by value,y:pass by address,z:pass by reference int foo(int x,int *y,int &z){ x=x+1; *y=*y+2; z=z+3; }
int main(){ int a,*b,c; a=5,b=&a,c=a; //執(zhí)行foo()函式前,a,*b,c數(shù)值為5,5,5printf(“a=%d,b=%d,c=%d\n”,a,*b,c); foo(a,b,c); //執(zhí)行foo()函式後,a,*b,c數(shù)值為5,7,8printf(“a=%d,b=%d,c=%d\n”,a,*b,c); }
|
7.5 想想看:
7.5.1 寫一函數(shù)swap(x,y)﹐能將兩參數(shù)調(diào)換。
7.5.2 寫一函數(shù)order(x,y,z)﹐能將三參數(shù)依大小順序排好。
8.遞迴函數(shù)(recursion)
8.1 遞迴函數(shù)具有以下特徵
特徵1﹕呼叫自身函數(shù)
特徵2﹕需有終止條件
8.2 範(fàn)例一﹕階乘 N!=N*(N-1)*(N-2)*...*2*1
//階乘函數(shù) fact(n)=n*(n-1)*(n-2)*……*1 int fact(int n){ if(n==1) return 1; //終止條件else return n*fact(n-1); //呼叫自身函數(shù)}
|
8.3 範(fàn)例二﹕費(fèi)布納西數(shù)列 f(x)=f(x-2)+f(x-1),f(0)=1;f(1)=1
int fib(int n){ if(n==0||n==1) return 1; else return fib(n-2)+fib(n-1); }
|
8.4 範(fàn)例三﹕河內(nèi)塔
8.4.1 遊戲說(shuō)明:請(qǐng)參考九章出版社網(wǎng)址
http://ccmp.chiuchang.com.tw/toy/hanoi/hanoi.html
8.4.2 線上河內(nèi)塔游戲
http://www.shes.hcc.edu.tw/~oddest/math181.swf
8.4.3 河內(nèi)塔範(fàn)例程式
#include <stdio.h> #include <stdlib.h> int steps=0; void honai(char src,char dest,char aux,int disk) { if(disk>=1) { honai(src,aux,dest,disk-1); printf("move disk %d from %c to %c\n",disk,src,dest); steps++; honai(aux,dest,src,disk-1); } }
int main() { int disk; printf("How many disks?"); scanf("%d",&disk); honai('A','C','B',disk); printf("Total steps:%d\n",steps); system("pause"); }
|
8.5 想想看
//待補(bǔ)遞迴之練習(xí)題及範(fàn)例