第7章用函數實現模塊化序設計_第1頁
第7章用函數實現模塊化序設計_第2頁
第7章用函數實現模塊化序設計_第3頁
第7章用函數實現模塊化序設計_第4頁
第7章用函數實現模塊化序設計_第5頁
已閱讀5頁,還剩177頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、7.1 函數是什么函數是什么7.2 函數的定義和調用函數的定義和調用7.3 函數的嵌套調用和遞歸調用函數的嵌套調用和遞歸調用7.4 數組作為函數參數數組作為函數參數7.5 變量的作用域和生存期變量的作用域和生存期7.6 內部函數和外部函數內部函數和外部函數7.7 提高部分提高部分p1687.1 函數是什么函數是什么如果程序的功能比較多,規(guī)模比較大,如果程序的功能比較多,規(guī)模比較大,把所有的程序代碼都寫在一個主函數把所有的程序代碼都寫在一個主函數中,就會使主函數變得龐雜、頭緒不中,就會使主函數變得龐雜、頭緒不清,使閱讀和維護程序變得困難。清,使閱讀和維護程序變得困難。p168有時程序中要多次實現

2、某一功能,就有時程序中要多次實現某一功能,就需要多次重復編寫實現此功能的程序需要多次重復編寫實現此功能的程序代碼。這使程序冗長,不精煉。代碼。這使程序冗長,不精煉。7.1 函數是什么函數是什么p168采用采用“組裝組裝”的辦法簡化程序設計過程的辦法簡化程序設計過程事先編好一批函數實現各種不同的功能事先編好一批函數實現各種不同的功能用到什么函數就直接裝使用就可以用到什么函數就直接裝使用就可以這就是這就是模塊化的程序設計模塊化的程序設計7.1 函數是什么函數是什么p168函數就是功能函數就是功能(function)每一個函數用來實現一個特定的功能每一個函數用來實現一個特定的功能函數的名字應反映其代

3、表的功能函數的名字應反映其代表的功能7.1 函數是什么函數是什么p168在設計一個較大的程序時,往往把它分在設計一個較大的程序時,往往把它分為若干個程序模塊,每一個模塊包括一為若干個程序模塊,每一個模塊包括一個或多個函數,每個函數實現一個特定個或多個函數,每個函數實現一個特定的功能。的功能。7.1 函數是什么函數是什么p168一個程序可由一個主函數和若干個其一個程序可由一個主函數和若干個其他函數構成。由主函數調用其他函數,他函數構成。由主函數調用其他函數,其他函數也可以互相調用。同一個函數其他函數也可以互相調用。同一個函數可以被一個或多個函數調用任意多次可以被一個或多個函數調用任意多次7.1

4、函數是什么函數是什么p1687.1 函數是什么函數是什么p168mainabcfghdeie除了可以使用庫函數外,除了可以使用庫函數外,還可以還可以編寫一編寫一些些本領域或本單位常用到一些專用函數,本領域或本單位常用到一些專用函數,供本領域或本單位的人員使用供本領域或本單位的人員使用。、。、在程序設計中要善于利用函數,可以減在程序設計中要善于利用函數,可以減少各人重復編寫程序段的工作量,同時少各人重復編寫程序段的工作量,同時可以方便地實現模塊化的程序設計??梢苑奖愕貙崿F模塊化的程序設計。7.1 函數是什么函數是什么p1687.1 函數是什么函數是什么p168例例7.1 輸出以下的結果,用函數調

5、用實現。輸出以下的結果,用函數調用實現。 * how do you do! *7.1 函數是什么函數是什么p168解題思路:解題思路:u在輸出的文字上下分別有一行在輸出的文字上下分別有一行“*”號,顯然不號,顯然不必重復寫這段代碼,用一個函數必重復寫這段代碼,用一個函數print_star來來實現輸出一行實現輸出一行“*”號的功能。號的功能。u再寫一個再寫一個print_message函數來輸出中間一函數來輸出中間一行文字信息行文字信息u用主函數分別調用這兩個函數用主函數分別調用這兩個函數#include void main()void print_star(); void print_mes

6、sage(); print_star(); print_message(); print_star(); void print_star () printf(*n);void print_message() printf( how do you do!n);輸出輸出18個個*輸出一行文字輸出一行文字#include void main()void print_star(); void print_message(); print_star(); print_message(); print_star(); void print_star () printf(*n);void print_mes

7、sage() printf( how do you do!n);聲明函數聲明函數定義函數定義函數說明:說明:(1) 一個程序由一個或多個程序模塊組成一個程序由一個或多個程序模塊組成,每一個程序模塊作為一個源程序文件。對于較每一個程序模塊作為一個源程序文件。對于較大的程序,一般不把所有內容全放在一個源程大的程序,一般不把所有內容全放在一個源程序文件中,而是將它們分別放在若干個源文件序文件中,而是將它們分別放在若干個源文件中,由若干個源程序文件組成一個中,由若干個源程序文件組成一個c程序。這程序。這樣便于分別編寫、分別編譯,提高調試效率。樣便于分別編寫、分別編譯,提高調試效率。一個源程序文件可以為

8、多個一個源程序文件可以為多個c程序所調用。程序所調用。說明:說明:(2) 一個源程序文件由一個或多個函數以及其一個源程序文件由一個或多個函數以及其他有關內容組成。一個源程序文件是一個編譯他有關內容組成。一個源程序文件是一個編譯單位,在程序編譯時是以源程序文件為單位進單位,在程序編譯時是以源程序文件為單位進行編譯的,而不是以函數為單位進行編譯的。行編譯的,而不是以函數為單位進行編譯的。說明:說明:(3) 不論不論main函數出現在什么位置,函數出現在什么位置,總是從總是從main函數開始執(zhí)行函數開始執(zhí)行。如果在。如果在main函數中調函數中調用其他函數,在調用后流程返回到用其他函數,在調用后流程

9、返回到main函數函數,在,在main函數中結束整個程序的運行。函數中結束整個程序的運行。說明:說明:(4) 所有函數都是平行的,即在定義函數時是所有函數都是平行的,即在定義函數時是分別進行的,是分別進行的,是互相獨立的互相獨立的。一個函數并不從。一個函數并不從屬于另一個函數,即函數屬于另一個函數,即函數不能嵌套定義不能嵌套定義。函數。函數間可以互相調用,但不能調用間可以互相調用,但不能調用main函數。函數。main函數是由系統(tǒng)調用的。函數是由系統(tǒng)調用的。說明:說明: (5) 從用戶使用的角度看,函數有兩種。從用戶使用的角度看,函數有兩種。u庫函數庫函數,它是由系統(tǒng)提供的,用戶不必自己定,它

10、是由系統(tǒng)提供的,用戶不必自己定義而直接使用它們。應該說明,不同的義而直接使用它們。應該說明,不同的c語言語言編譯系統(tǒng)提供的庫函數的數量和功能會有一些編譯系統(tǒng)提供的庫函數的數量和功能會有一些不同,當然許多基本的函數是共同的。不同,當然許多基本的函數是共同的。u用戶用戶自己自己定義的函數定義的函數。它是用以解決用戶專門。它是用以解決用戶專門需要的函數。需要的函數。說明:說明:(6) 從函數的形式看,函數分兩類。從函數的形式看,函數分兩類。 無參函數無參函數。函數沒有參數,一般用來執(zhí)行。函數沒有參數,一般用來執(zhí)行固定的一組操作。無參函數可以帶回或不帶回固定的一組操作。無參函數可以帶回或不帶回函數值,

11、但一般以不帶回函數值的居多。函數值,但一般以不帶回函數值的居多。 有參函數有參函數。在調用函數時,要給出實參。在調用函數時,要給出實參。主調函數在調用被調用函數時,通過參數向被主調函數在調用被調用函數時,通過參數向被調用函數傳遞數據,一般情況下,執(zhí)行被調用調用函數傳遞數據,一般情況下,執(zhí)行被調用函數時會得到一個函數值,供主調函數使用。函數時會得到一個函數值,供主調函數使用。7.2 函數的定義和調用函數的定義和調用7.2.1 為什么要定義函數為什么要定義函數7.2.2 函數定義函數定義7.2.3 函數的調用函數的調用7.2.4 對被調用函數的聲明和函數原型對被調用函數的聲明和函數原型p170c語

12、言要求,在程序中用到的所有函數,語言要求,在程序中用到的所有函數,必須必須“先定義,后使用先定義,后使用”指定函數指定函數名字名字、函數、函數返回值類型返回值類型、函數、函數實現的實現的功能功能以及以及參數的個數與類型參數的個數與類型,將,將這些信息通知編譯系統(tǒng)。這些信息通知編譯系統(tǒng)。7.2.1 為什么要定義函數為什么要定義函數p170指定函數的名字,以便以后按名調用指定函數的名字,以便以后按名調用指定函數類型,即函數返回值的類型指定函數類型,即函數返回值的類型指定函數參數的名字和類型,以便在調指定函數參數的名字和類型,以便在調用函數時向它們傳遞數據用函數時向它們傳遞數據指定函數的功能。這是最

13、重要的,這是指定函數的功能。這是最重要的,這是在函數體中解決的在函數體中解決的7.2.1 為什么要定義函數為什么要定義函數p170如果程序中要調用庫函數,只需用如果程序中要調用庫函數,只需用#include指令把有關的頭文件包含到指令把有關的頭文件包含到本文件模塊中即可。本文件模塊中即可。如果想使用庫函數中沒有的函數,需要如果想使用庫函數中沒有的函數,需要程序設計者在程序中自己定義。程序設計者在程序中自己定義。7.2.1 為什么要定義函數為什么要定義函數p1707.2.2 函數定義函數定義1.怎樣定義無參函數怎樣定義無參函數函數名后面圓括號中空的,沒有參數函數名后面圓括號中空的,沒有參數定義無

14、參函數的一般形式為定義無參函數的一般形式為: 類型名類型名 函數名()函數名() 函數體函數體 p171包括聲明部分和包括聲明部分和語句部分語句部分指定函數指定函數值的類型值的類型7.2.2 函數定義函數定義1.怎樣定義無參函數怎樣定義無參函數函數名后面圓括號中空的,沒有參數函數名后面圓括號中空的,沒有參數定義無參函數的一般形式為定義無參函數的一般形式為: 類型名類型名 函數名()函數名() 函數體函數體 p171表示不需要表示不需要帶回函數值帶回函數值void7.2.2 函數定義函數定義2. 怎樣定義有參函數怎樣定義有參函數定義有參函數的一般形式為定義有參函數的一般形式為: 類型標識符類型標

15、識符 函數名(形式參數表列)函數名(形式參數表列) 函數體函數體 p1717.2.2 函數定義函數定義2. 怎樣定義有參函數怎樣定義有參函數 int max (int x,int y) int z; if(xy) z=x; else z=y; return(z); p171函數的功能函數的功能是什么?是什么?求求x和和y二者二者中大者中大者7.2.3 函數的調用函數的調用1.調用無參函數的形式調用無參函數的形式 函數名函數名() 如如print_star()2. 調用無參函數的形式調用無參函數的形式 函數名(實參表列)函數名(實參表列)如如max(a,b)p172如果有多個如果有多個參數,用逗

16、參數,用逗號隔開號隔開例例7.2 輸入兩個整數,輸出二者中的輸入兩個整數,輸出二者中的大者。要求在主函數中輸入兩個整大者。要求在主函數中輸入兩個整數,用一個函數數,用一個函數max求出其中的大求出其中的大者,并在主函數中輸出此值。者,并在主函數中輸出此值。解題思路:解題思路:題目要求用一個題目要求用一個max函數實現比較兩個函數實現比較兩個整數,并將得到的大數帶回主函數。顯整數,并將得到的大數帶回主函數。顯然,二個整數中的大者也應該是整數,然,二個整數中的大者也應該是整數,因此因此max函數應當是函數應當是int型型。兩個數是在主函數中輸入的,在兩個數是在主函數中輸入的,在max函函數中進行比

17、較,因此應該定義為有參函數中進行比較,因此應該定義為有參函數,在函數調用時進行數據的傳遞數,在函數調用時進行數據的傳遞。#include int max(int x,int y) int z; if (xy) z=x; else z=y; return(z); 參數類型參數類型函數類型函數類型定義函數定義函數定義函數內定義函數內使用的變量使用的變量#include void main() int max(int x,int y); int a,b,c; printf(”please input two number:”); scanf(“%d,%d”,&a,&b); c = m

18、ax(a,b); printf(“max is %dn”,c); int max(int x,int y) int z; if (xy) z=x; else z=y; return(z); 調用函數調用函數 c=max(a,b); (main函數)函數)int max(int x, int y) (max函數)函數) int z; z=xy?x:y; return(z); #include void main() int max(int x,int y); int a,b,c; printf(”please input two number:”); scanf(“%d,%d”,&a,&

19、amp;b); c = max(a,b); printf(“max is %dn”,c); int max(int x,int y) int z; if (xy) z=x; else z=y; return(z); if (xy) return(x);else return(y);#include void main() int max(int x,int y); int a,b,c; printf(”please input two number:”); scanf(“%d,%d”,&a,&b); c = max(a,b); printf(“max is %dn”,c); i

20、nt max(int x,int y) int z; if (xy) z=x; else z=y; return(z); 形式參數形式參數實際參數實際參數函數調用的函數調用的過程過程:在定義函數中指定的形參,在未出現函數在定義函數中指定的形參,在未出現函數調用時,它們并不占內存中的存儲單元。調用時,它們并不占內存中的存儲單元。在發(fā)生函數調用時,函數在發(fā)生函數調用時,函數max的形參被臨的形參被臨時分配內存單元。時分配內存單元。2a3bxy23實參實參形參形參函數調用的函數調用的過程過程:2a3bxy23實參實參形參形參調用結束,形參單元被釋放調用結束,形參單元被釋放實參單元仍保留并維持原值,沒

21、有改變實參單元仍保留并維持原值,沒有改變如果在執(zhí)行一個被調用函數時,形參的值如果在執(zhí)行一個被調用函數時,形參的值發(fā)生改變,不會改變主調函數的實參的值發(fā)生改變,不會改變主調函數的實參的值調用函數的調用函數的方式方式:按函數在程序中出現的位置來分,可以有按函數在程序中出現的位置來分,可以有以下以下3種函數調用方式種函數調用方式. 函數語句函數語句調用沒有返回值的函數,函數調用單獨作調用沒有返回值的函數,函數調用單獨作為一個語句為一個語句 如例如例7.1中的中的“print_star();”調用函數的調用函數的方式方式:按函數在程序中出現的位置來分,可以有按函數在程序中出現的位置來分,可以有以下以下

22、3種函數調用方式種函數調用方式. 函數表達式函數表達式函數出現在一個表達式中,這種表達式稱函數出現在一個表達式中,這種表達式稱為函數表達式為函數表達式 如例如例7.2中的中的“c=max(a,b);”調用函數的調用函數的方式方式:按函數在程序中出現的位置來分,可以有按函數在程序中出現的位置來分,可以有以下以下3種函數調用方式種函數調用方式. 函數參數函數參數函數調用作為一個函數的實參函數調用作為一個函數的實參 如如printf (%d, max (a,b);7.2.4 對被調用函數的聲明對被調用函數的聲明和函數原型和函數原型p175在一個函數中調用另一個函數需要具備如在一個函數中調用另一個函數

23、需要具備如下條件:下條件:(1) 被調用函數必須是已經定義的函數(是庫被調用函數必須是已經定義的函數(是庫函數或用戶自己定義的函數)函數或用戶自己定義的函數)。(2) 如果使用庫函數,應該在本文件開頭加相如果使用庫函數,應該在本文件開頭加相應的應的#include指令指令。(3) 如果使用自己定義的函數,而該函數的位如果使用自己定義的函數,而該函數的位置在調用它的函數后面置在調用它的函數后面,應該應該進行函數進行函數聲明聲明7.2.4 對被調用函數的聲明對被調用函數的聲明和函數原型和函數原型p175函數原型的一般形式有兩種:函數原型的一般形式有兩種:如如 int max(int x,int y

24、); int max(int,int);原型說明可以放在文件的開頭,這時本文原型說明可以放在文件的開頭,這時本文件中所有函數都可以使用此函數件中所有函數都可以使用此函數7.3 函數的嵌套調用和遞歸調用函數的嵌套調用和遞歸調用p1777.3.1 函數的嵌套調用函數的嵌套調用7.3.2 函數的遞歸調用函數的遞歸調用7.3.1 函數的嵌套調用函數的嵌套調用調用一個函數的過程中,又可以調調用一個函數的過程中,又可以調用另一個函數用另一個函數p1777.3.1 函數的嵌套調用函數的嵌套調用p177main函數函數調用調用a函數函數結束結束a函數函數調用調用b函數函數b函數函數 例例7.3 輸入輸入4個整

25、數,找出其中最大的數。個整數,找出其中最大的數。用一個函數來實現。用一個函數來實現。解題思路:解題思路:u定義定義max_4函數,找函數,找4個數中最大者個數中最大者umax_4中再多次調用中再多次調用max,找,找4個數中的大個數中的大者,然后把它作為函數值返回者,然后把它作為函數值返回main函數函數#include void main() int max_4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d)

26、; max=max_4(a,b,c,d); printf(max=%d n,max); 主函數主函數對對max_4 函數聲明函數聲明#include void main() int max_4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max_4(a,b,c,d); printf(max=%d n,max); 主函數主函數輸入輸入4個整數個整數#include void main() int m

27、ax_4(int a,int b,int c,int d); int a,b,c,d,max; printf(“4 interger numbers:); scanf(%d%d%d%d,&a,&b,&c,&d); max=max_4(a,b,c,d); printf(max=%d n,max); 主函數主函數調用后肯定是調用后肯定是4個數中最大者個數中最大者輸出最大者輸出最大者int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(

28、m,d); return(m); max_4函數函數對對max 函數聲明函數聲明int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(m,d); return(m); max_4函數函數a,b中較大者中較大者a,b,c中較大者中較大者a,b,c,d中最大者中最大者int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(m,d); r

29、eturn(m); max_4函數函數int max(int x,int y) if(xy) return x; else return y; max函數函數找找x,y中較大者中較大者int max_4(int a,int b,int c,int d) int max(int a,int b); int m; m=max(a,b); m=max(m,c); m=max(m,d); return(m); max_4函數函數int max(int x,int y) if(xy) return x; else return y; max函數函數return(xy?x:y);int max_4(int

30、 a,int b,int c,int d)int max(int a,int b); m=max(a,b);m=max(m,c);m=max(m,d); return(m); int max(int x,int y) return(xy?x:y); #include void main() max=max_4(a,b,c,d); 7.3.2 函數的遞歸調用函數的遞歸調用p179在調用一個函數的過程中又出現直接或間在調用一個函數的過程中又出現直接或間接地調用該函數本身,稱為函數的接地調用該函數本身,稱為函數的遞歸調遞歸調用用。語言的特點之一就在于允許函數的遞歸語言的特點之一就在于允許函數的遞歸調

31、用。調用。7.3.2 函數的遞歸調用函數的遞歸調用p179 f2函數函數調用調用f1函數函數 int f(int x) int y,z; z=f(y); return (2*z); f函數函數調用調用f函數函數 f1函數函數調用調用f2函數函數應使用應使用if語句控制結束調用語句控制結束調用直接調用本函數直接調用本函數間接調用本函數間接調用本函數 例例7.6 有有5個學生坐在一起個學生坐在一起u問第問第5個學生多少歲?他說比第個學生多少歲?他說比第4個學生大個學生大2歲歲u問第問第4個學生歲數,他說比第個學生歲數,他說比第3個學生大個學生大2歲歲u問第問第3個學生,又說比第個學生,又說比第2個

32、學生大個學生大2歲歲u問第問第2個學生,說比第個學生,說比第1個學生大個學生大2歲歲u最后問第最后問第1個學生,他說是個學生,他說是10歲歲u請問第請問第5個學生多大個學生多大解題思路:解題思路:u要求第個年齡,就必須先知道第個年齡要求第個年齡,就必須先知道第個年齡u要求第個年齡必須先知道第個年齡要求第個年齡必須先知道第個年齡u第個年齡又取決于第個年齡第個年齡又取決于第個年齡u第個年齡取決于第個年齡第個年齡取決于第個年齡u每個學生年齡都比其前個學生的年齡大每個學生年齡都比其前個學生的年齡大解題思路:解題思路:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)

33、+2age(2)=age(1)+2age(1)=10) 1(2) 1()() 1(10)(nnagenagennage age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1) =10 age(2) =12 age(3) =14 age(4) =16 age(5) =18 回溯階段回溯階段 遞推階段遞推階段 age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1) =10 age(2) =12 age(3) =14 age(4)

34、 =16 age(5) =18 回回溯溯階段階段 遞推階段遞推階段結束遞歸的條件結束遞歸的條件#include int age(int n) int c; if(n=1) c=10; else c=age(n-1)+2; return(c); void main() printf(“%dn,age(5); age(5)輸出輸出age(5)mainc=age(4)+2age函數函數n=5c=age(3)+2age函數函數n=4c=age(1)+2age函數函數n=2c=age(2)+2age函數函數n=3c=10age函數函數n=1age(1)=10age(2)=12age(3)=14age(4

35、)=16age(5)=1818例例7.5 分別用遞推方法和遞歸方法求分別用遞推方法和遞歸方法求!,即,即12 n。1.用遞推方法求用遞推方法求!解題思路:解題思路:u從從1開始,乘開始,乘2,再乘,再乘3一直乘到一直乘到n。這種。這種方法容易理解,也容易實現。遞推法的特點是方法容易理解,也容易實現。遞推法的特點是從一個已知的事實出發(fā),按一定規(guī)律推下一個從一個已知的事實出發(fā),按一定規(guī)律推下一個事實,再從這個新的已知的事實出發(fā),再向下事實,再從這個新的已知的事實出發(fā),再向下推出一個新的事實推出一個新的事實這是和遞歸不同的。這是和遞歸不同的。#include void main() long fac

36、(int n); int n; long fact=0; printf(“input an integer number:”); scanf(“%d”,&n); fact=fac(n); printf(“%d!=%ldn”,n,fact); long fac(int n) int i; long fact=1; for(i=1;i=n;i+) fact=fact*i; return fact;2.用遞歸方法求用遞歸方法求!解題思路:解題思路:u遞歸的思路和遞推是相反的,并不是先求遞歸的思路和遞推是相反的,并不是先求1 再再 求求1 2再再 3,直到,直到 n,而是直接,而是直接從目標出

37、發(fā)提出問題:從目標出發(fā)提出問題: !等于等于!,而,而!,而,而1!是已知的,不必再回溯了是已知的,不必再回溯了) 1() 1() 1 , 0(1!nnnnnn#include void main() long fac(int n); int n,y; printf(input an integer number:); scanf(%d,&n); y=fac(n); printf(%d!=%ldn,n,y);long fac(int n) long f; if(n0) printf(“n0,data error!”); else if(n=0 | n=1) f=1; else f=fa

38、c(n-1)*n; return(f); fac(5)輸出輸出fac(5)mainf=fac(4)5fac函數函數n=5f=fac(3)4fac函數函數n=4f=fac(1)2fac函數函數n=2f=fac(2)3fac函數函數n=3f=1fac函數函數n=1fac(1)=1fac(2)=2fac(3)=6fac(4)=24fac(5)=120120遞歸調用的特點:遞歸調用的特點:執(zhí)行執(zhí)行“未知未知未知未知遞歸邊界條件已知遞歸邊界條件已知已知已知已知已知”的過程。的過程。用遞歸方法解題的條件:用遞歸方法解題的條件:(1)所求解的問題能轉化為用同一方法解決的所求解的問題能轉化為用同一方法解決的子

39、問題。子問題。(2) 子問題的規(guī)模比原問題的規(guī)模小。子問題的規(guī)模比原問題的規(guī)模小。(3) 必須要有遞歸結束條件,停止遞歸,否必須要有遞歸結束條件,停止遞歸,否則形成無窮遞歸,系統(tǒng)無法實現。則形成無窮遞歸,系統(tǒng)無法實現。7.4 數組作為函數參數數組作為函數參數7.4.1 數組元素作函數實參數組元素作函數實參7.4.2 數組名作函數參數數組名作函數參數p1847.4.1 數組元素作函數實參數組元素作函數實參 由于實參可以是表達式,而數組元素可以由于實參可以是表達式,而數組元素可以是表達式的組成部分,因此數組元素可以是表達式的組成部分,因此數組元素可以作為函數的實參。作為函數的實參。p185例例7.

40、6 有兩個運動隊有兩個運動隊a和和b,各有,各有10個隊員個隊員,每個隊員有一個綜合成績。將兩個隊的,每個隊員有一個綜合成績。將兩個隊的每個隊員的成績按順序一一對應地逐個比每個隊員的成績按順序一一對應地逐個比較(即較(即a隊第隊第1個隊員與個隊員與b隊第隊第1個隊員比個隊員比,)。如果)。如果a隊隊員的成績高于隊隊員的成績高于b隊相隊相應隊員成績的數目多于應隊員成績的數目多于b隊隊員成績高于隊隊員成績高于a隊相應隊員成績的數目隊相應隊員成績的數目(例如,例如,a隊蠃隊蠃6次次,b隊蠃隊蠃4次次),則認為,則認為a隊勝。統(tǒng)計出兩隊勝。統(tǒng)計出兩隊隊員比較的結果隊隊員比較的結果(a隊高于、等于和低于

41、隊高于、等于和低于b隊的次數隊的次數)。解題思路:解題思路:u設兩個數組設兩個數組a和和b,各有,各有10個元素,分別存放個元素,分別存放10個隊員的成績個隊員的成績u將兩個數組的相應元素逐個比較,用將兩個數組的相應元素逐個比較,用3個變量個變量n,m,k分別累計分別累計a隊隊員高于、等于和低于隊隊員高于、等于和低于b隊隊員的次數隊隊員的次數u用一個函數用一個函數higher來判斷每一次比較的結果來判斷每一次比較的結果,如果,如果a隊員高于隊員高于b隊員,結果為隊員,結果為1,二者相,二者相等,結果為等,結果為0,a隊員低于隊員低于b隊員,結果為隊員,結果為-1。最后比較。最后比較n和和k即可

42、得到哪隊勝的結果即可得到哪隊勝的結果#include void main() int higher(int x,int y); int a10,b10,i,n=0,m=0,k=0; printf(enter array a:n); for(i=0;i10;i+) scanf(%d,&ai); printf(n); printf(“enter array b:n”); for(i=0;i10;i+) scanf(%d,&bi); printf(n);輸入輸入a隊隊員成績隊隊員成績輸入輸入b隊隊員成績隊隊員成績for(i=0;ik) printf(a wins!n); else i

43、f (ny) flag=1; else if(xy) flag=-1; else flag=0; return(flag); 7.4.2 數組名作函數參數數組名作函數參數p186希望在函數中處理整個數組的元素時,可希望在函數中處理整個數組的元素時,可以用數組名作為函數實參以用數組名作為函數實參注意,此時只是將數組的首元素的地址傳注意,此時只是將數組的首元素的地址傳遞給所對應的形參,因此對應的形參應當遞給所對應的形參,因此對應的形參應當是指針變量是指針變量(見第見第8章章)。例例7.7 有有10個學生成績,用一個函數求全個學生成績,用一個函數求全體學生的平均成績。體學生的平均成績。解題思路:解題

44、思路:u在主函數中定義一個實型數組在主函數中定義一個實型數組score,將輸入,將輸入的的10個學生成績存放在數組中個學生成績存放在數組中u設計函數設計函數average,用來求學生平均成績,用來求學生平均成績u需要把數組有關信息傳遞給需要把數組有關信息傳遞給average函數函數u采取用數組名作為實參,把數組地址傳給采取用數組名作為實參,把數組地址傳給average函數,在該函數中對數組進行處理函數,在該函數中對數組進行處理#include void main() float average(float array10); float score10,aver; int i; printf(

45、input 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); aver=average(score); printf(average score is %5.2fn,aver); 數組名作實參數組名作實參float average(float array10) int i; float aver,sum=array0; for(i=1;i10;i+) sum=sum+arrayi; aver=sum/10; return(aver); 與與score共占同一存儲單元共占同一存儲單元實參、形參都是實參、形參都是float型型相當于相當于sc

46、ore0相當于相當于scorei例例7.8 有兩個班,學生數不同,編寫一有兩個班,學生數不同,編寫一個函數,用來分別求各班的平均成績。個函數,用來分別求各班的平均成績。解題思路:解題思路:u問題的關鍵是用同一個函數求不同人數的班問題的關鍵是用同一個函數求不同人數的班級平均成績級平均成績u在定義形參時不指定大小,函數對不同人數在定義形參時不指定大小,函數對不同人數的班級都是適用的班級都是適用u由于數組名傳遞的是數組首地址,可以利用由于數組名傳遞的是數組首地址,可以利用同一個函數求人數不同的班平均成績同一個函數求人數不同的班平均成績u在定義在定義average函數時,增加一個參數函數時,增加一個參

47、數n,用來指定當前班級的人數,用來指定當前班級的人數#include void main() float average(float array ,int n); float score_15=98.5,97,91.5,60,55; float score_210=67.5,89.5,99,69.5, 77,89.5,76.5,54,60,99.5; printf(“%6.2fn”,average(score_1,5); printf(“%6.2fn”,average(score_2,10); float average(float array ,int n) int i; float ave

48、r,sum=array0; for(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver);調用形式為調用形式為average(score_1,5)時時相當于相當于score_10相當于相當于score_1i相當于相當于5float average(float array ,int n) int i; float aver,sum=array0; for(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver);調用形式為調用形式為average(score_2,10)時時相當于相當于score_20

49、相當于相當于score_2i相當于相當于10例例7.9 用一個函數實現用選擇法對用一個函數實現用選擇法對10個個整數按升序排列。整數按升序排列。解題思路:解題思路:u所謂選擇法就是先將所謂選擇法就是先將10個數中最小的數個數中最小的數與與a0對換;再將對換;再將a1到到a9中最小的中最小的數與數與a1對換對換每比較一輪,找出一每比較一輪,找出一個未經排序的數中最小的一個個未經排序的數中最小的一個u共比較共比較9輪輪a0 a1 a2 a3 a4 3 6 1 9 4 1 6 3 9 4 1 3 6 9 4 1 3 4 9 6 1 3 4 6 9小到大排序小到大排序#include void mai

50、n()void sort(int array,int n); int a10,i; printf(enter the array:n); for(i=0;i10;i+) scanf(%d,&ai); sort(a,10); printf(the sorted array:n); for(i=0;i10;i+) printf(%d ,ai); printf(n); void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; t=arrayk; ar

51、rayk=arrayi; arrayi=t;在在sortisort9中,中,找最小數下標找最小數下標在在sortisort9中,中,最小數與最小數與sorti對換對換例例7.10 有有4個學生,個學生,5門課的成績,設計門課的成績,設計一個函數,用來求出其中的最高成績。一個函數,用來求出其中的最高成績。解題思路:解題思路:u先使變量先使變量max的初值為二維數組中第一個的初值為二維數組中第一個元素的值,然后將二維數組中各個元素的元素的值,然后將二維數組中各個元素的值與值與max相比,每次比較后都把相比,每次比較后都把“大者大者”存放在存放在max中,取代中,取代max的原值。全部元的原值。全部

52、元素比較完后,素比較完后,max 的值就是所有元素的最的值就是所有元素的最大值。大值。#include void main()float highest_score(float array45); float score45=61,73,85.5,87,90, 72,84,66,88,78, 75,87,93.5,81,96, 65,85,64,76,71 ; printf(“%6.2fn,highest_score(score);float highest_score(float array45) int i,j; float max; max=array00; for(i=0;i4;i+)

53、 for(j=0;jmax) max=arrayij; return (max);7.5 變量的作用域和生存期變量的作用域和生存期7.5.1 變量的作用域變量的作用域-局部變量和全局變量局部變量和全局變量7.5.2 變量的存儲方式和生存期變量的存儲方式和生存期7.5.3 作用域和生存期的小結作用域和生存期的小結p1927.5.1 變量的作用域變量的作用域局部變量和全局變量局部變量和全局變量1 局部變量局部變量u在函數和復合語句內定義的變量,稱為內部在函數和復合語句內定義的變量,稱為內部變量或變量或局部變量局部變量u只在只在本函數或復合語句內本函數或復合語句內范圍內有效范圍內有效(從定從定義點開

54、始到函數或復合語句結束義點開始到函數或復合語句結束)u在此函數或復合語句以外是不能使用這些變在此函數或復合語句以外是不能使用這些變量的量的p192說明說明:(1) 主函數中定義的變量也只在主函數中有效主函數中定義的變量也只在主函數中有效,主函數也不能使用其他函數中定義的變量。,主函數也不能使用其他函數中定義的變量。(2) 不同函數中可以使用相同名字的變量,它不同函數中可以使用相同名字的變量,它們代表不同的對象,們代表不同的對象,互不干擾互不干擾。(3) 形式參數也是局部變量。在函數中可以使形式參數也是局部變量。在函數中可以使用本函數定義的形參,在函數外不能引用它。用本函數定義的形參,在函數外不

55、能引用它。(4) 在一個函數內部,可以在復合語句中定義在一個函數內部,可以在復合語句中定義變量,這些變量只在本復合語句中有效。變量,這些變量只在本復合語句中有效。2 全局變量全局變量u一個程序可以包含一個或若干個源程序文件一個程序可以包含一個或若干個源程序文件(即程序模塊即程序模塊),而一個源文件可以包含一個或,而一個源文件可以包含一個或若干個函數若干個函數u在函數之外定義的變量是外部變量,也稱為在函數之外定義的變量是外部變量,也稱為全局變量全局變量(或全程變量或全程變量)u全局變量的有效范圍為從定義變量的位置開全局變量的有效范圍為從定義變量的位置開始到本源文件結束,在此范圍內可以為本文件始到

56、本源文件結束,在此范圍內可以為本文件中所有函數所共用中所有函數所共用2 全局變量全局變量u在一個函數中既可以使用本函數中的局部變在一個函數中既可以使用本函數中的局部變量,又可以使用有效的全局變量。量,又可以使用有效的全局變量。u如果在同一個源文件中,外部變量與局部變如果在同一個源文件中,外部變量與局部變量同名,則在局部變量的作用范圍內,外部量同名,則在局部變量的作用范圍內,外部變量被變量被“屏蔽屏蔽”了,即它不起作用,此時局了,即它不起作用,此時局部變量是有效的。部變量是有效的。 例例7.11有有4個學生,個學生,5門課的成績,要求門課的成績,要求輸出其中的最高成績以及它屬于第幾個輸出其中的最

57、高成績以及它屬于第幾個學生、第幾門課程。學生、第幾門課程。解題思路:解題思路:u在例在例7.10中,通過調用中,通過調用highest_score函數,得到最高分函數,得到最高分u除了輸出最高分以外,還要輸出該分數是屬除了輸出最高分以外,還要輸出該分數是屬于第幾個學生、笫幾門課的信息,即需要輸于第幾個學生、笫幾門課的信息,即需要輸出出3個結果個結果u調用一個函數只能得到一個函數值,因此例調用一個函數只能得到一個函數值,因此例7.10程序無法解決這個問題程序無法解決這個問題u可以使用全局變量,通過全局變量從函數中可以使用全局變量,通過全局變量從函數中得到所需要的值得到所需要的值#include

58、int row,column; void main() float highest_score(float array45); float score45=61,73,85.5,87,90, 72,84,66,88,78,75,87,93.5,81,96, 65,85,64,76,71; printf(“he highest score is %6.2fn, highest_score(score); printf(student no.is %dn course no. is %dn,row,column);定義全局變量定義全局變量float highest_score(float arra

59、y45) int i,j; float max; max=array00; for(i=0;i4;i+) for(j=0;jmax) max=arrayij; row=i; column=j; return (max);行的序號賦給全局變量行的序號賦給全局變量row將列的序號賦給全局變量將列的序號賦給全局變量column score 函數調用函數調用 row column array max row columnmain函數函數highest_score函數函數建議不在必要時不要使用全局變量建議不在必要時不要使用全局變量全局變量全局變量rowcolumn7.5.2 變量的存儲方式和生存期變量的

60、存儲方式和生存期變量的變量的生存期生存期:變量值存在的時間:變量值存在的時間變量的兩種變量的兩種存儲方式存儲方式:靜態(tài)存儲方式和:靜態(tài)存儲方式和動態(tài)存儲方式動態(tài)存儲方式u靜態(tài)靜態(tài)存儲方式是指在程序運行期間由系統(tǒng)分存儲方式是指在程序運行期間由系統(tǒng)分配固定的存儲空間的方式配固定的存儲空間的方式u動態(tài)動態(tài)存儲方式是在程序運行期間根據需要進存儲方式是在程序運行期間根據需要進行動態(tài)的分配存儲空間的方式行動態(tài)的分配存儲空間的方式p1957.5.2 變量的存儲方式和生存期變量的存儲方式和生存期全局變量采用靜態(tài)存儲方式全局變量采用靜態(tài)存儲方式,在程序開,在程序開始執(zhí)行時給全局變量分配存儲區(qū),程序始執(zhí)行時給全局變量分配存儲區(qū),程序執(zhí)行完畢釋放。在程序執(zhí)行過程中它們執(zhí)行完畢釋放。在程序執(zhí)行過程中它們占據固定的存儲單元,而不是動態(tài)地進占據固定的存儲單元,而不是動態(tài)地進行分配和釋放。行分

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論