聲明:文中觀點僅代表個人,其中文字、圖檔未經本人許可,不得部分或全部轉載,違者所造成影響後後果自負!聯系本人方式: [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()函數為被調函數,表示它們被其它函數調用了。 |