1. 程式人生 > >c語言之函數

c語言之函數

大寫 形參與實參 多個 定義 進制 函數的原型 gif hide else

函數
1、函數的原型和調用(函數在使用前必須定義或者聲明)
  #include<stdio.h>
  int max(int a,int b); //函數聲明

  int main(void)
  {
    int a = 3;
    int b = 21;
    max_one = max(a,b);
    printf("%d\n",max_one);
    return 0;
  }

  int max(int a,int b)
  {
    int max;
    if (a>b)
  {
    max = a;


  }
  else{
    max = b;
    }
  return max;
  }  

2、函數的形參與實參
  形參:定義函數時,函數名後的括號內就是“形式參數”,簡稱形參。
  實參:在調用函數時,函數名後的括號中的變量或表達式稱為“實際參數”,簡稱實參。
  1、實參可以是變量、常量,也可以是表達式。
  2、形參必須指定數據類型,實參和形參必須一一對應。
  3、如果一個函數沒有明確地標明函數的返回類型,那麽函數的返回類型就是int。
  4、如果一個函數沒有返回值,那麽函數的返回類型為void.
  5、c語言中,實參形參的數據傳遞是‘值傳遞’,即單向傳遞,只能由實參傳給形參,


  而不能由形參傳遞給實參。
  如果函數的形參是一個數組,那麽可以通過形參修改實參的值。
  如:void str(char s[])
  {  
    s[0] = ‘a‘;
    s[1] = ‘b‘;
  }
   int main(void)
   {
    char str1[100] = "hello world";
    str(str1);
    printf("%s\n",str1); //輸出: abllo world

    return 0;
   }

3、函數的返回類型與返回值
  1、返回值通過return獲得,返回值為void時可不需要return語句。
  如:void max(){
  語句;
  }
  2、return 語句中的返回值數據類型應與函數定義時相同。
  3、如果函數沒有return語句,那麽函數將返回一個不確定的值。

4、多個源代碼文件程序的編譯
  1、頭文件的使用
    如果把main函數放在第一個文件中,而把自定義函數放在第二個文件中,
    那麽就需要在第一文件中聲明函數原型。
    如果把函數原型包含在一個頭文件裏,那麽就不必每次使用函數的時候都聲明其原型了,把函數聲明放入頭文件是好習慣。
  2、#include與#define的意義
    #include 就是簡單的文件內容替換
    #denfine就是簡單的文本替換
  3、#ifndef 和 endif
    #ifndef __AH__//如果沒有__AH__這個宏,那就編譯#endif之間的代碼,如果有的話,不再預編譯
    #define __A__H__//具體宏的名字是自定義的
    在#ifndef中的宏,一定要大寫和下劃線,必要時加數字,避免和其他頭文件中名字沖突。
    #endif //防止多次include的同一個文件的時候,重復預編譯頭文件內容。

5、函數遞歸
  遞歸給某些編程問題提供了最簡單的方法。
  缺點:有缺陷的遞歸會耗盡計算機資源,遞歸程序難以理解和維護。  

    #include<stdio.h> 

    void test(int j)
    {
        while(j>0)
        {
            j--;
            printf("先序遞歸:%d\n",j);//先序遞歸,代碼順序執行 
            test(j); //自身調用自身
            printf("後序遞歸:%d\n",j);//後序遞歸,代碼逆序執行 
        }
    }

  實例1:一個隊列,前一個人 總是比後一個人大2歲 ,求第n個人的年齡

技術分享圖片
  實例1:求第n個人的年齡,前一個人 總是比後一個人大2歲 
    #include<stdio.h> 
    int age(int n);//函數聲明
    int main(void)
    {
        int n=5;
        printf("age=%d\n",age(n));
        return 0;
    }

    int age(int n) 
    {
        if(n==1)
        {
            return 10;
        }
        else{
            return age(n-1)+2; //前一個人 總是比後一個人大2歲 
        }
        
    }
View Code

  實例2:10進制轉2進制

技術分享圖片
    #include<stdio.h>

    void bin(int j)  //10進制轉2進制 ,除2求余,倒序排列 
    {
        int n = j%2;
        if(j>0)
        {
            //printf("%d",n);//先序遞歸,順序輸出 
            bin(j/2);
            printf("2進制:%d",n); //後序遞歸,逆序輸出 1101 

        }
    }

    int main(void)
    {
        int i = 13;
        bin(i);
        return 0;
    }
View Code

  實例3:求fib數列和自然數的和

技術分享圖片
    #include<stdio.h> 
    int fib(int n) //fib數列,1,1,2,3,5,8... 
    {
        if(n==1||n==2){
            return 1;
        }
        if(n>2)
        {
            return fib(n-2)+fib(n-1); //從第三個位置開始,等於前兩個位置的數值和 
        }
    }
    
    int sum(int m) // 求自然數的和
    {
        if(m==1)
        {
            return 1;
        }
        else{
            return sum(m-1)+m;
        }
    }
    int main(void)
    {
        int i,res1,res2; //輸入要求的第i個位置的數,res1和res2分別為fib函數和sum函數的返回值  
        scanf("%d",&i);
        res1=fib(i) ;
        res2=sum(i);
        printf("你要求的位置的數是:%d\t%d",res1,res2);
        return 0;
    }
View Code

  實例4:遞歸求字符串長度

技術分享圖片
    #include<stdio.h> 

    int sum_str(char s[],int i)
    {
        if(s[i])
        {
            return sum_str(s,i+1);
        }
        else{
            return i;
        }

    }
    int main(void)
    {
        char a[100];
        scanf("%s",a); 
        printf("%d\n",sum_str(a,0));
        return 0;
    }
View Code

c語言之函數