第五章•函數與儲存類別

※函數的基本型式

#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++);
}