第五章•函數與儲存類別
※函數的基本型式
例 #include <stdio.h>
#include <stdlib.h>
int add(int);/*函式的語法*/
int main(void)
{
int x,y;
printf(" Enter a number:");
scanf("%d",&x);
y=add(x);/*函式的呼叫*/
printf("sum(1~%d)=%d\n",x, y);
system("pause");
return 0;
}
/*函式的定義*/
int add(int num)
{
int i, total=0;
for(i=1; i<num; i++)
{
total=total+i;
}
return total;/*表示將結果傳回給呼叫此函數的敘述*/
}
※遞迴函數
定義:在函數本身中,若有一敘述又呼叫它本身函數。
例 #include <stdio.h>
#include <stdlib.h>
long fact(long);
int main(void)
{
long x,y;
printf(" Enter a number(<13):");
scanf("%ld",&x);
y=fact(x);
printf("%ld! = %ld \n",x, y);
system("pause");
return 0;
}
long fact( long num)
{
if(num==0 || num==1)
{
return 1;
}
else
{
return( num*fact(num-1));
}
}
例 #include <stdio.h>
#include <stdlib.h>
long fibonacci(long);
int main(void)
{
long x,y;
printf(" Enter a number:");
scanf("%ld",&x);
y=fibonacci(x);
printf("%ld! = %ld \n",x, y);
system("pause");
return 0;
}
long fibonacci( long num)
{
if(num==0)
{
return 0;
}
else if(num==1)
{
return 1;
}
else
{
return( fibonacci(num-1)+fibonacci(num-2));
}
}
※巨集指令
定義:利用#define以某一名稱代替一些處理問題的步驟
功能:類似函數,但產生較多的程式碼且執行比較快,因為函數需要檢查實際參數與形式參數的個數和資料型態是否一致,且須配置暫時空間給區域變數,完成後還要回收記憶體空間。
例 #include <stdio.h>
#include <stdlib.h>
#define SQR(x) (x)*(x)
int main(void)
{
printf("Input a number:");
scanf("%d",&num);
printf("sqr of %d is %d.\n", num, SQR(num));
system("pause");
return 0;
}
※區域變數與全域變數
例 #include <stdio.h>
#include <stdlib.h>
int i=100;/*全域變數*/
int j=1000;/*全域變數*/
int main(void)
{
int i=200;/*區域變數*/
printf("i=%d\n", i);
printf(j=%d\n", j);
system("pause");
return 0;
}
※儲存類別
變數利用資料型態配置記憶體,並利用儲存類別規範變數的存活期,分為auto、static、register、extern。
auto:內定值
register:放在CPU暫存器,處理速度比較快,一般系統最多給程式兩個。
static:靜態區域變數須等到程式結束才會被回收,若未設定初始值也會自動設為0。
靜態全域變數僅供給其存在於本身檔案使用,另一個檔案即使利用extern也無法擷取。
extern:一個程式分割成多個檔案時,檔案間若要分享全域變數,則需使用extern。
例 #include <stdio.h>
#include <stdlib.h>
void test( );
int main(void)
{
int i=1;
for(i=1;i<5;i++)
{
test( );
}
system("pause");
return 0;
}
void test( )
{
int x=1;
static int y=1;
printf("x=%d\n", x++);
printf("y=%d\n\n", y++);
}