天天看點

第8章 函數(一)子函數的誕生

     聲明:文中觀點僅代表個人,其中文字、圖檔未經本人許可,不得部分或全部轉載,違者所造成影響後後果自負!聯系本人方式: [email protected]

QQ:80368704

       前面7章都是一些簡單的算法,或者我叫它微型程式(Tiny Program),而本章将介紹制作小型程式(Small Program)的技術,也就是面向過程的自頂向下的子產品化技術,進而使程式的多人合作開發成為可能。

第一節、函數的誕生

1、将3個程式合并為1個程式的簡單方法。

     在以前,陸續的,我做了3個小小程式如下:

/********************************************************/

程式1: /*求任意2個數字的最大值max。*/

#include〈stdio.h〉

void main()

{float a,b,m;

scanf("%f%f",&a,&b);

m=a>b?a:b;

printf("%f/n",m);

}

程式2:/*求任意2個數字的最小值min。*/

{float a,b,m;

m=a<b?a:b;

程式3:/*求任意2個數字的平均值average.*/

m=(a+b)/2;

     C語言學習到現在,你瞧,上面3個程式看起來是不是很簡單。

     此前,我有時隻想求出任意2個數中的最大值(max);

     有時隻求最小值(min),

     有時隻求平均值(average),

     不過現在,我希望将任意2個數字的上面3種值一次性都求出來。

     于是腦子裡,辦法馬上就來了,把上面的程式各自運作1次,不就可以了嗎,哈哈,當然對啦。

     不過有些麻煩,得運作3次程式,于是我決定将3個程式合并成1個程式,當然合并過程越簡單越好,也就是改動越少越好。

上面3個程式合并為1個程式,我們叫它程式4,如下:

程式4:

/*求任意2個數字的最大值。*/

void max()/*void main()*/

/*求任意2個數字的最小值。*/

/*#include〈stdio.h〉重複了,是以注釋掉*/

void min()/*void main()*/

/*求任意2個數字的平均值。*/

void average()/*void main()*/

/*新加一個main()函數,

在main後的{...}中将上面改了名的3個程式,分别運作了1次*/

{

max();

min();

average();

/**********************************************************/

     這樣我們成功的實作了程式的3合1,程式4是一個多功能(具體說是3功能)的程式。

2、多功能程式分析。

我們看到新的程式中有4部分:

     main()

     max()

     min()

     average()

     第3章我們已經知道辨別符,變量的名字是辨別符,而上面為每一個程式段起的名字也是一種辨別符。比如:max,min,average 。

     而且我們發現,辨別某個程式段的辨別符後面緊跟一對圓括号,比如max(),min(),average();

     這一對圓括号是一個重要的标志,它标志着該辨別符代表的是一段程式。比如:

     max這個辨別符後面緊跟着一對(),表示在其後面的{...}中是一段程式,這裡是求2個數最大值的程式;

     我們把這種帶圓括号的辨別符,連同其後的{...},合在一起,稱為函數;

     其中的辨別符(如max,min,average)叫函數名,

     函數名和其後的(),合在一起是函數首部,比如void max(),就是max函數的函數首部,

     而函數首部後的{...}稱為函數體。

     比如下面,就是max函數的完整定義,有2個重要的部分:函數首部和函數體:

     void max()             /*函數首部*/

     {             /*其代表的程式段(即函數體的)開始,用"{"表示*/

         float a,b,m;

         scanf("%f%f",&a,&b);

         m=a>b?a:b;

         printf("%f/n",m);

     }             /*其代表的函數體(即程式段)結束處,用"}"表示*/

3、函數的嵌套調用的概念

     在main()函數後面的{...}中,分别運作上面3個函數,我們叫函數調用;如下:

     void main()

     {

     max();/*****************/

     min();/*****************/

     average();/*************/

     }

     我們很早就知道main()叫主函數,是以main()也是函數,而在函數main()中調用函數max()、min()、average(),就叫做函數調用函數,又叫函數的嵌套調用.

4、關于程式合并的說明

     我們在将3個程式合并成1個程式的過程,主要有5步:

     (1)将求任意2個數字的最大值程式的main改成max,

     (2)将求任意2個數字的最小值程式的main改成min,

     (3)将求任意2個數字的平均值程式的main改成average,

     (4)将上面3個程式複制合并為1個程式

     (5)重新寫一個main函數,将max();min();average();分别執行一次

     為什麼不保持各程式原有的main,而要分别改為max、min和average呢?

     原因很簡單:因為作為函數名的辨別符和變量的辨別符一樣,不能重複,隻能有一個main()。

5、多函數程式的執行順序。

     我們的程式中有4個函數,第一個執行的是哪一個,肯定是main();是以main();被稱為主函數;其他函數則稱為子函數。

     一旦程式開始運作,就進入主函數main()中,我們的程式4中main()函數按照順序書寫了3個函數調用,如下:

         void main()

             {

                 max();/**********1**調用max()函數****/

                 min();/***********2**調用min()函數****/

                 average();/******3**調用average()函數****/

             }

     于是按順序先執行max();語句,我們說此刻main()函數在調用max()函數。函數max()被調用之後, 執行函數體中的程式段,當max()函數執行完畢後,程式會傳回到main()調用max()的地方,即max();語句處;然後main()再向下執行,即調用min()函數;最後調用average()函數。

     我們稱本程式中的main()函數為主調函數,表示它調用了别的函數。而稱max()、min()以及average()函數為被調函數,表示它們被其它函數調用了。

繼續閱讀