#學習筆記 C語言模塊化程序設計

實驗樓的學習筆記
地址:https://www.shiyanlou.com/courses/57

  1. 函數的分類
  • 從用戶的角度:庫函數;自定義函數
  • 從函數的形式角度:有參函數(帶回函數的值);無參函數(不帶回函數的值)
    有參函數:
    一般形式爲:
    類型名 函數名(形式參數列表) { ​ 函數體 }
    例子:
#include<stdio.h>

int main()
{
    int max(int x,int y);    //聲明 max 函數
    int a = 10,b = 20;
    int c;
    c = max(a,b);                //a, b 爲實際參數;調用max函數,傳遞的是a,b的值給 max 函數。
    printf("%d",c);

    return 0;
}

int max(int x,int y)         //int 代表的是返回值是 int 型
{
    int z;
    z = x>y ? x:y;
    return (z);

注意:其中,x和y是形參,a和b是實參

無參函數
其一般形式爲
類型名 函數名() { ​ 函數體 }
例子:

void printstar ()
{

}
  1. 兩種函數調用的方法
  • 嵌套調用

在這裏插入圖片描述
例子:

輸入四個整數,找出其中最大的整數。

include<stdio.h>
int main()
{
    int max4(int a,int b,int c,int d);
    int a,b,c,d,max;

    printf("please enter 4 integer number:");
    scanf("%d%d%d%d",&a,&b,&c,&d);
    max=max4(a,b,c,d);
    printf("max=%d\n",max);

    return 0;
}

int max4(int a,int b,int c,int d)
{
    int max2(int a,int b);      //聲明max2
    int m;

    m = max2(a,b);
    m = max2(m,c);
    m = max2(m,d);

    return(m);
}

int max2(int a,int b)
{
    if(a>=b)
      return a;
    else
      return b;     
}
  • 遞歸調用
    在調用一個函數的過程中又出現直接或間接的調用該函數本身,稱爲函數的遞歸調用。
    例子:
    用遞歸的方法求n!
#include<stdio.h>
int main()
{
    int fac(int n);
    int n,y;

    printf("please input an integer number:");
    scanf("%d",&n);
    if(n<0)
        printf("data error");   //n不能小於0
    else
    {
        y = fac(n);
        printf("%d!=%d\n",n,y);
    }

    return 0;
}

int fac(int n)
{
    int f;

    if(n==0||n==1)
        f = 1;
    else 
        f = fac(n-1) * n;

    return f;
}

相當於用n*(n-1)!

3.數組與函數

  • 把數組的元素作爲實參
    數組元素可以作爲函數實參,不能作爲函數形參。因爲形參是在函數被調用時臨時分配的存儲單元,不可能作爲一個數組元素單獨分配存儲單元(數組是一個整體,在內存中佔連續的一段存儲單元)。在用數組元素作爲函數實參時,把實參的值傳給形參,是「值傳遞」的方式。

例子:輸入 10 個數,要求輸出其中值最大的元素和該數是第幾個數。
解題思路:可以定義一個長度爲 10 的數組。設計一個函數 max,用來求兩個數中的大者。在主函數中定義一個變量 m,m 的初值爲 a[0],每次調用 max 函數後的返回值存放在 m 中。用打擂臺算法,將數組元素 a[1] 到 a[9] 與 m 比較,最後的到的 m 就是最大值。

#include<stdio.h>
int main()
{
    int max(int x,int y);
    int a[10],m,n,i;

    printf("please enter 10 integer number:");
    for(i=0;i<10;i++)
        scanf("%d",&a[i]);
    printf("\n");

    for(i=1,m=a[0],n=0;i<10;i++)   
    {
        if(max(m,a[i])>m)          //若max函數返回值大於m
        {
            m = max(m,a[i]);        //max函數的返回值取代m
            n = i;                  //把數組元素的序號記下來,放到n中
        }
    }
    printf("the largest number is %d\n it is the %dth number \n",m,n+1);

    return 0;
}

int max(int x,int y)
{
    return(x>y?x:y);
}
  • 數組名作爲函數參數
    除了可以用數組元素作爲函數的參數外,還可以用數組名做函數參數(包括實參和形參)。應當注意的是:用數組元素作爲實參時,向形參變量傳遞的是數組所對應數組元素的值,而用數組名做函數實參時,向形參(數組名或指針變量)傳遞的是數組首元素的地址。

例子:有一個一維數組 score,內放 10 個學生成績,求平均成績。

解題思路:用一個函數 average 來求平均成績,不用數組元素作爲函數實參,而是用數組名作爲函數的實參,形參也用數組名,在 average 函數中引用各數組的元素,求平均成績並返回 main 函數。

#include<stdio.h>
int main()
{
    float average(float array[10]);
    float score[10],aver;
    int i;

    printf("please enter 10 scores:");
    for(i=0;i<10;i++)
        scanf("%f",&score[i]);
    printf("\n");

    aver = average(score);   //注意這裏調用函數時,向形參傳遞的是數組首元素的地址
    printf("average score is %5.2f\n ",aver);

    return 0;
}

float average(float array[10])
{
    int i;
    float aver,sum = 0;

    for(i=0;i<10;i++)
        sum = sum + array[i];
    aver = sum / 10;

    return(aver);
}

需要注意的是,主函數中調用 float average(float array[10]) 這個函數,使用的是
aver = average(score); 這個語句
將一開始定義的score[10]帶入到 float average(float array[10])函數中。

課後習題
1.編寫函數 fun,其功能是:用戶輸入一個數 m,打印 1~m 能被 7 或 11 整除的所有整數。

例如,如果傳給 m 的值是 50,則程序輸出:
7 11 14 21 22 28 33 35 42 44 49

#include<stdio.h>

int fun(int num){
    if((num%7)==0 || (num%11)==0)
        printf("%d\t",num);
}

int main()
{
    int m;
    scanf("%d",&m);
    //調用函數
    for(int i=0;i<m;i++)
        fun(i+1);

    return 0;
}

編寫函數fun,其功能是將兩個兩位數的正整數a、b合併成一個整數放在c中。合併的方式是:將a數的十位和個位依次放在c數的十位和千位上,b數的十位和個位依次放在c數的百位和個位上。

例如,當a=45,b=12 時,調用該函數後,c=5142。

#include<stdio.h>

int fun(int a,int b){
    int c;
    c = a%10*1000 + a/10*10 + b/10*100 + b%10;
    printf("%d",c);
}

int main()
{
    int a,b;
    scanf("%d%d",&a,&b);

    //a,b必須是兩位數
    if(a<10 || a>99 || b<10 || b>99){
        printf("Enter erro!");
        return 0;
    }

    //調用函數
    fun(a,b);

    return 0;
}