C語言----函數

函數是什麼?

在計算機科學中,子程序(英語:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一個大型程序中的某部分代碼,由一個或多個語句塊組成。它負責完成某項特定任務,而且相較於其他代碼,具備相對的獨立性。一般會有輸入參數並有返回值,提供對過程的封裝和細節的隱藏。這些代碼通常被集成爲軟件庫。
C語言中函數的分類:

  1. 庫函數

MSDN(Microsoft Developer Network)
https://www.cplusplus.com/
http://en.cppreference.com/
2. 自定義函數

自定義函數和庫函數一樣,有函數名,返回值類型和函數參數。 但是不一樣的是這些都是我們自己來設計。
3.函數的參數

實際參數(實參):
真實傳給函數的參數,叫實參。實參可以是:常量、變量、表達式、函數等。無論實參是何種類 型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。
形式參數(形參):
形式參數是指函數名後括號中的變量,因爲形式參數只有在函數被調用的過程中才實例化(分配 內存單元),所以叫形式參數。形式參數當函數調用完成之後就自動銷燬了。因此形式參數只在 函數中有效。

當實參傳給形參的時候,形參是實參的一份臨時拷貝,對於形參的修改不會影響實參4.函數的調用:

傳值調用
函數的形參和實參分別佔有不同內存塊,對形參的修改不會影響實參。
傳址調用
傳址調用是把函數外部創建變量的內存地址傳遞給函數參數的一種調用函數的方式。 這種傳參方式可以讓函數和函數外邊的變量建立起正真的聯繫,也就是函數內部可以直接操 作函數外部的變量

// 寫一個函數可以判斷一個數是不是素數。
#include <stdio.h>
#include <math.h>
int ss(int i)
{
   int j = 0;
   for (j = 2; j <sqrt(i); j++)
   {
      if (i % j == 0)
      {
         return 0;
      }
   }
   return 1;
}
int main()
{
   int i = 0;
   for (i = 100; i <= 200; i++)
   {
      if (ss(i) == 1)
      {
         printf("%d ", i);
      }
   }
   return 0;
}
// 寫一個函數判斷一年是不是閏年。
#include <stdio.h>
int rn(int y)
{
   return ((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0);
}
int main()
{
   int year = 0;
   for (year = 1000; year <= 2000; year++)
   {
      rn;
      printf("%d ", year );
   }
   return 0;
}
//寫一個函數,實現一個整形有序數組的二分查找。
#include <stdio.h>
#include<math.h>
int binary_search(int arr[],int k,int sz)
{
       int left = 0;
       int right = sz - 1;
       while (left <= right)
       {
              int mid = (left + right) / 2;
              if (arr[mid] > k)
              {
                     right = mid - 1;
              }
              else if(arr[mid] < k)
              {
                     left = mid + 1;
              }
              else
              {
                     return mid;
              }
       }
       return -1;
}
int main()
{
       int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
       int k = 7;
       int j = sizeof(arr);
       int sz = sizeof(arr) / sizeof(arr[0]);
       int ret = binary_search(arr, k, sz);
       if(ret == -1)
       {
              printf("找不到\n");
       }
       else
       {
              printf("找到了,下標是:%d\n", ret);
       }
       return 0;
}
//寫一個函數,每調用一次這個函數,就會將num的值增加1。
#include <stdio.h>
void add(int *p)
{
       (*p)++;
}
int main()
{
       int num = 0;
       while (num <= 5)
       {
              printf("%d\n", num);
              add(&num);
              
       }
       return 0;
}

5.函數的嵌套調用和鏈式訪問

嵌套調用
函數和函數之間可以有機的組合的。
鏈式訪問
把一個函數的返回值作爲另外一個函數的參數。
6.函數的聲明和定義

函數聲明:
1. 告訴編譯器有一個函數叫什麼,參數是什麼,返回類型是什麼。但是具體是不是存在,無關 緊要。
2. 函數的聲明一般出現在函數的使用之前。要滿足先聲明後使用。
3. 函數的聲明一般要放在頭文件中的。
函數定義:
函數的定義是指函數的具體實現,交待函數的功能實現。
1.test.h的內容 放置函數的聲明

#ifndef    __TEST_H_____   
#define    __TEST_H_____      
int Add(int x, int y);
#endif //   _____TEST_H_____    

2.test.c的內容 放置函數的實現

#include "test.h"
int Add(int x, inty)
{
return x+y;
}

7.函數遞歸

什麼是遞歸?
程序調用自身的編程技巧稱爲遞歸( recursion)。 遞歸做爲一種算法在程序設計語言中廣泛應用。 一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型複雜的問題層層轉化爲一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可 描述出解題過程所需要的多次重複計算,大大地減少了程序的代碼量。 遞歸的主要思考方式在於:把大事化小
遞歸的兩個必要條件
存在限制條件,當滿足這個限制條件的時候,遞歸便不再繼續。 每次遞歸調用之後越來越接近這個限制條件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章