一個較大的程序一般要劃分成多個程序模塊_第1頁
一個較大的程序一般要劃分成多個程序模塊_第2頁
一個較大的程序一般要劃分成多個程序模塊_第3頁
一個較大的程序一般要劃分成多個程序模塊_第4頁
一個較大的程序一般要劃分成多個程序模塊_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、 第8章 函 數(shù)8.1 概述 一個較大的程序一般要劃分成多個程序模塊,或把多次重復(fù)執(zhí)行的一段程序獨立編寫一個模塊,這些模塊稱為函數(shù),一個C程序就是由一個主函數(shù)和若干函數(shù)構(gòu)成的。 main()abcdehgfij主函數(shù)函數(shù)1函數(shù)2函數(shù)21 第8章 函 數(shù)例 8.1 main() printstar(); print_message(); printstar(); printstar() printf(* * * * * * * * * * * * * * * * * * * * * * * * * * n); print_message() printf(* How do you do ! *n

2、); 主函數(shù)調(diào)用打印星號函數(shù)調(diào)用打印信息函數(shù)再調(diào)用打印星號函數(shù)打印星號函數(shù)打印信息函數(shù)2關(guān)于函數(shù)說明:一個源程序由若干函數(shù)組成,源文件為編譯單位, 即一次全部編譯完。2.一個C程序可由一個或若干個源文件組成,可 別編輯、編譯。經(jīng)連接生成可執(zhí)行文件。3.一個C 程序從main函數(shù)開始,在main函數(shù)中結(jié)束。main() ;。4.所有函數(shù)都是平行的,即相互獨立,互不從屬。5.從用戶角度,函數(shù)分為:(1)標(biāo)準(zhǔn)函數(shù)(如:數(shù)學(xué)計算, 字符處理)(2)用戶定義的函數(shù):解決專門問題。36、從函數(shù)形式上,分為: (1)有參函數(shù):主調(diào)用函數(shù)和被調(diào)函數(shù)之間 有參數(shù)傳遞。 主調(diào)用函數(shù)(實參) 被調(diào)函數(shù)(形參) (2

3、)無參函數(shù):主調(diào)函數(shù)和被調(diào)函數(shù)之間無 參數(shù)傳遞,一般被調(diào)函數(shù)也 不帶回返回值。傳送4 8.2 函數(shù)定義的一般形式1、無參函數(shù)的定義形式: 類型標(biāo)識符 函數(shù)名( ) 說明部分 語句 無參函數(shù)無返回值,可省略類型標(biāo)識符符。如:printstar() printf(“* * * * * * * * * * n”); 52、有參函數(shù)定義的一般形式: 類型標(biāo)識符 函數(shù)名(形式參數(shù)列表) 聲明部分 語句 例: int max(x,y) int x,y; int z; z=xy?x:y; return(z); 聲明部分聲明部分定義整型函數(shù)max()函數(shù)max的返回值63、允許有空函數(shù)的存在,形式為: 類型表

4、示符 函數(shù)名( ) 如: int max(a,b) int a,b; int max() 函數(shù)max的返回值一般是待編函數(shù)7 8.3 函數(shù)參數(shù)和函數(shù)的值8.3.1 形式參數(shù)和實際參數(shù)形式參數(shù):在定義函數(shù)時函數(shù)名后面括號中的 變量名稱形式參數(shù),簡稱形參。實際參數(shù):在調(diào)用函數(shù)時函數(shù)名后面括弧中的 表達(dá)式稱實際參數(shù),簡稱實參。舉例說明: main()主函數(shù)調(diào)用前面定義的max函數(shù):8main ()int a, b,c;scanf(%d,%d,&a, &b);c=max(a,b);printf(Max is %d,c);max(int x, int y)int z;z=xy?x:y;return (z

5、);實參形參形參聲明給返回參數(shù)賦值返回max的值9關(guān)于形參和實參的說明:1、形參在函數(shù)沒被調(diào)用時,不分配內(nèi)存單元; 只有被調(diào)用時才分配,調(diào)用結(jié)束后釋放。2、實參可以是常量、變量或表達(dá)式,但要有確 定值。形參如果是數(shù)組名,則將數(shù)組的首地 址傳遞給對應(yīng)的形參。3、在被定義的函數(shù)中,必須指定形參類型。 如:max (int x, int y);4、形參與實參對應(yīng)的類型和個數(shù)必須一致。 如: max(a,b) max (int x, int y);10關(guān)于形參和實參的說明:5、實參對形參變量的數(shù)據(jù)傳遞是“值傳遞”, 形參值的改變并不會改變主調(diào)函數(shù)實參值。6、ANSIC允許在列出形參列表時同時定義類型。

6、 int max(int x, int y) 等價于: int max( x, y) int x, int y 11 8.3.2 函數(shù)的返回值 主函數(shù)調(diào)用函數(shù)得到返回值。對返回值說明:1、函數(shù)返回值通過 return語句獲得: 一個函數(shù)中可以包含多個return 語句,但只 能有一個起作用。以下retutrn形式都可以: return z;或return(z);或return(xy?x:y);2、定義函數(shù)類型必須與返回值類型一致。int max(float x,float y)int z;return zchar letter(char c1,char c2)char creturn cdou

7、ble min(int x,int y)double z;return z12 8.3.2 函數(shù)的返回值 主函數(shù)調(diào)用函數(shù)得到返回值。對返回值說明:3、函數(shù)返回值類型不同于函數(shù)類型時,自動轉(zhuǎn) 換為函數(shù)類型。 max (float x,float y); float z;return (z)4、如果函數(shù)中不使用return語句,函數(shù)將帶回 一不確定的值。5、為了明確表示“不帶回值”可用void定義函數(shù) 為無類型(空類型)。因max是整型所以z 轉(zhuǎn)換為整型13main ( )float a, b;int c;scanf(%f,%f,&a,&b);c=max(a,b);printf(Max is %d

8、,c);max(x,y)float x,y;float z;z=xy?x:y;return (z);定義為實型默認(rèn)為整型輸出整型數(shù)14 main ( )float a, b;int c;scanf(%f,%f,&a,&b);c=max(a,b);printf(Max is %d,c);max(x,y)float x,y;xy?x:y;無返回語句值不定15void printstar()printf(* * * * * * * * * * * * * * * * * * * * * * * * * * n);void print_message()printf(* How do you do !

9、 *n);main()printstar();print_message();printstar(); 定義空類型函數(shù)定義空類型函數(shù)調(diào)用函數(shù)語句不變16 8.4 函數(shù)的調(diào)用8.4.1 函數(shù)調(diào)用的一般形式: 函數(shù)名(實參列表);Turbo C傳遞實參自右向左。8.4.2 函數(shù)調(diào)用的方式: 按函數(shù)出現(xiàn)的位置分三種調(diào)用方式:1、函數(shù)語句: 把函數(shù)作為一個語句。 printstar();2、函數(shù)表達(dá)式:把函數(shù)作為一個表達(dá)式 c=a+max(a,b);3、函數(shù)參數(shù):函數(shù)調(diào)用作為另一個函數(shù)的實參。 d=max(c,max(a,b);17main()int i=2,p;p=f(i,+i);printf(%d

10、,p);int f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);先計算+i結(jié)果?修改為后計算+i18 8.4.3 對被調(diào)函數(shù)的說明 一個函數(shù)調(diào)用另一個函數(shù)須具備條件:1、被調(diào)用函數(shù)必須存在。2、如果被調(diào)函數(shù)是庫函數(shù),則需在文件開頭用 #inlcude形式包含所在庫文件。 比如用到:sqrt 則需包含 math.h strcpy() 則需包含 string.h getchar() 則需包含 stdio.h3、調(diào)用自定義的函數(shù),一般應(yīng)在主調(diào)函數(shù)內(nèi)對 調(diào)用函數(shù)的返回值類型作說明。 一般形式: 類型說明符 被調(diào)用函數(shù)的

11、函數(shù)名( )19main()float a, b, c;float add();scanf(%f,%f,&a,&b);c=add(a,b);printf(sum is %f,c);float add(x,y)float x,y;float z;z=x+y;return (z);對被調(diào)用的函數(shù)進(jìn)行說明否則出錯 被調(diào)用的函數(shù)20 C規(guī)定,以下情況調(diào)用函數(shù)前不用說明:1、函數(shù)返回整型或字符型。2、被調(diào)函數(shù)在主調(diào)函數(shù)之前定義(舉上例)。3、在函數(shù)開頭或函數(shù)外部已說明了函數(shù)類型。如: float add(); main() . folat add(float x,float y) 再函數(shù)外部說明21 8

12、.5 函數(shù)的嵌套調(diào)用 C規(guī)定: 函數(shù)不能嵌套定義,但能嵌套調(diào)用。 嵌套調(diào)用的示意: main 函數(shù) a 函數(shù) b 函數(shù) 調(diào)用a函數(shù) 調(diào)用b函數(shù) 結(jié)束調(diào)用返回22main()int n;scanf(%d,&n);printf(%d,sum(n);sum(int m)int i,s;s=0;for(i=1;i1)遞歸結(jié)束遞歸調(diào)用調(diào)用遞歸函數(shù)age(5)=age(4)+2age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+227 遞歸函數(shù)調(diào)用執(zhí)行過程mainage(5)=18age(4)=16age(3)=14age(2)=12age(1)=10age(3)+

13、2age(2)+2age(1)+2age(4)+210輸出age(5)age(5)age函數(shù)n=5n=4n=3n=2n=1288.8 用遞歸方法求 n! 一般方法:main()int i, sum=1, n;scanf(%d,&n);for(i=1;i1main()int n;scanf(%d,&n);printf(%d,fac(n);float fac(n)int c; if(n=1|n=0)c=1; else c=n*fac(n-1); return(c);遞歸結(jié)束遞歸調(diào)用31計算實型數(shù)(大數(shù)的階乘),修改如下:main()int n;float fac();scanf(%d,&n);pr

14、intf(%f,fac(n);float fac(int n)float c; if(n=1|n=0)c=1; else c=n*fac(n-1); return(c);32Hanoi(漢諾)塔問題 相傳古代印度“布拉瑪廟”的僧侶們玩的一種游戲,游戲的裝置是一塊銅板上有三根針,最左針上由大到小串有64個金盤,游戲的規(guī)則是將64個金盤移到最右針上,每次移動一個金盤且始終保持小盤在大盤上面。 計算移動的次數(shù): 264-1=18,446,744,073,709,511,615次 計算機計算每微秒移動1次需100萬年 如果人每秒移動1次需5800億年 33Hanoi(漢諾)塔問題這是一個只有用遞歸方法

15、才能解決的問題。 AC,AB,CB, AC,BA,BC,AC將 n-1個盤子從一根針上移到另一根針上將1個盤子從一根針上移到另一根針上ABC小中小大小中小(23 1=7次)34Hanoi(漢諾)塔問題 老和尚的做法:如果有一個和尚能將63個盤子從一個針移到另一個針就可以了, 老和尚只需做:(1)命令第2個和尚將63個盤子從A針移到B針; (2)自己最后的一個盤子從A針移到C針;(3)再命令第2個和尚將63個盤子從B針移到C針; 實際問題并沒解決,第2個和尚又找第3個和尚 第1人 =第2人=第3人 =第64人 63個盤62個盤1個盤35問題分析歸納:將N個盤子從A針移到針可分為3步:(1)將A針

16、上n-1個盤子借助C針移到B針; (2) 把A針上剩下的一個盤子移到C針;(3)將B針上n-1個盤子借助A針移到C針; 第1步和第3步都是移動n-1盤子,只是針不同,歸納: “將one針上n-1個盤子移到two針借助three針”只是(1)和(3) one, two,three和A,B,C的對應(yīng)關(guān)系不同第1步對應(yīng)關(guān)系: one A, two -B, three C第3步對應(yīng)關(guān)系: one B, two -C, three A可把上面3個步驟化成2步:1,移動n-1個盤子(小和尚任務(wù)層層下放,遞歸完成);2,由大和尚將一個盤子從一個針移到另一個針.36void move(char x,char

17、y)printf(%c-%cn,x,y);void hanoi(int n,char one,char two,char three)if(n=1) move(one,three); else hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three);main()int m;printf(input the number of diskes:);scanf(%d,&m);printf(The step to moving %3d diskes:n,m);hanoi(m,A,B,C);從X移到Y(jié)從1針移到3針從1針移到

18、3針從1針借助3針移到2針從2針借助1針移到3針37 8.7 數(shù)組作為函數(shù)的參數(shù)1、數(shù)組元素作為函數(shù)的實參:例如:比較兩個數(shù)的最大值max(x,y)return (xy?x:y);main( )int a2, max_num;scanf(%d,%d,&a0,&a1);max_num=max(a0,a1);printf(%dn,max_num);382、數(shù)組名作為函數(shù)的參數(shù) 即:實參和形參都使用數(shù)組名作為參數(shù)例8.11 有一個一維數(shù)組score, 存放10個學(xué)生成績, 求平均成績。float average(float array10)int i;float aver,sum=array0;fo

19、r(i=1;i5;i+)sum=sum+arrayi;aver=sum/5;return(aver);累加總分計算平均分回帶結(jié)果累加單元賦初值39主函數(shù):實現(xiàn)數(shù)據(jù)輸入, 函數(shù)調(diào)用, 數(shù)據(jù)輸出main()float score10,aver;int i;for(i=0;i5;i+)scanf(%f,&scorei);aver=average(score);printf(average score is %5.2f,aver);調(diào)用函數(shù)注意格式符40說明:1、應(yīng)在主函數(shù)和被調(diào)函數(shù)之間分別定義數(shù)組;2、實參和形參類型應(yīng)一致;3、形參數(shù)組大小可以不指定,可由另一參數(shù)傳遞。 float averge(a

20、rray,n) float array ; int n; . 4、數(shù)組名作為函數(shù)參數(shù),實現(xiàn)“地址傳遞” 傳遞地址值。(實參,形參共用同一地址)修改上例查看結(jié)果(內(nèi)存單元)41例8.13用將數(shù)組中10個數(shù)由小到大排序。 “冒泡法”:是一邊比較一邊交換。 “選擇法”:是比較一輪交換一次。 數(shù)據(jù)排序前 1與a0交換 3與a1交換 4與a2交換 6與a3交換選擇法: 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 42void sort(int a,int n) 選擇法排序int i,j,k,t;for(i=0;in;i

21、+) k=i; for(j=i+1;jn;j+) if(ajak)k=j; t=ak;ak=ai;ai=t;main()int b10,i;for(i=0;i10;i+) scanf(%d,&bi);sort(b,10);for(i=0;i10;i+) printf(%6d,bi); 記住小數(shù)的下標(biāo)每輪第一個數(shù)的下標(biāo)將小數(shù)交換到前面43 8.8 局部變量和全局變量8.8.1 局部變量在函數(shù)內(nèi)定義的變量,只在本函數(shù)內(nèi)有效,稱為局部變量。例如:add(int a,int b)a=a+b;return(a);main()int a,b; a=10;b=20; printf(add=%d,add(a,

22、b); printf(main=%d,a); a,b局部于add函數(shù)a,b局部于main函數(shù) 結(jié)果? 加c后結(jié)果?main()int a,b,c=0; a=10;b=20; int c; c=a+b; printf(c=%d,c); printf(add=%d,add(a,b); printf(main=%d,%d,a,c);getch();44局部變量說明:1、主函數(shù)內(nèi)定義的變量,也只在本函數(shù)內(nèi)有效。2、不同函數(shù)可以使用相同名字的變量,但表示 不同的變量。3、形參也是局部變量。4、復(fù)合語句定義的變量,只在該語句中有效。 main() int a,b; : int c; c=a+b; : :

23、a,b,c的有效范圍a,b的有效范圍458.8.2 全局變量在函數(shù)外定義的變量,為外部變量(全局變量)。int p=1,q=5; (外部變量)float f1(a)int a;int b,c;:char c1,c2; (外部變量)char f2(int x,int y)int i,j;:main()int m,n:c1c2的作用范圍pq的作用范圍46float max,min;float fun(float a,int n)int i;float av,sum=a0;max=min=a0;for(i=1;imax)max=ai; if(aimin)min=ai; sum=sum+ai; av=

24、sum/10; return(av);main()float s10; int i; for(i=0;i10;i+) scanf(%f,&si); printf(%f,%f,%f,max,min,fun(s,10);輸入10個學(xué)生成績到數(shù)組打印最高,最低和平均分定義全局變量回帶3個值47關(guān)于全局變量說明:1、增加函數(shù)間數(shù)據(jù)聯(lián)系的渠道,返回多個值。2、建議少使用全局變量,因降低通用性。3、如果外部變量和局部變量重名,則在局部變量的范圍內(nèi),外部變量被“屏蔽”。int a,b;add(a)a=a+a;b=2*a;return(a);main()int a;a=10;printf(add=%d,add

25、(a);printf(main=%d,%d,a,b);a被屏蔽 結(jié)果?48 8.9 變量的存儲類別 全局變量 局部變量 靜態(tài)存儲變量 動態(tài)存儲變量靜態(tài)存儲方式:在程序運行期間分配固定存儲空間動態(tài)存儲方式:在程序運行期間根據(jù)需要動態(tài)分配 存儲空間 從變量的作用域區(qū)分從變量值存在時間區(qū)分49 內(nèi)存中供用戶使用的空間在C語言中一個變量和函數(shù)有兩個屬性, 即: 數(shù)據(jù)類型: int , float, char 等 自動的(auto) 靜態(tài)的(static) 寄存器的(register) 外部的(extern)存放全局變量存放局部變量, 形參, 保留地址程 序 區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)用戶區(qū) 存儲類別: 下

26、面分別介紹508.9.2 用auto聲明局部自動變量前面函數(shù)中的局部變量都屬于自動變量,自動變量說明可以省略。 int f(inta) auto int b,c=3; auto int b,c=3; int b,c=3;定義b,c為自動變量兩個語句等價518.9.3 用static聲明局部靜態(tài)變量 如果在調(diào)用函數(shù)時,希望上次調(diào)用時的數(shù)據(jù) 不消失,可定義為局部靜態(tài)變量,如: f(int a) auto b=0; static c=3; b=b+1; c=c+1; return(a+b+c); main() int a=2,i; for(i=0;i3;i+) printf(%d ,f(a);定義c

27、為靜態(tài)變量 結(jié)果?528.9.3 用static聲明局部靜態(tài)變量例8.18 打印1到5的階乘。int fac(int n)static int p=1;p=p*n;return(p);main()int i;for(i=1;iy?x:y; return(z);main()extern A,B;printf(%d,max(A,B);int A=13,B=-8;2,再聲明A, B為全局變量3,所以此處可用1,因為在函數(shù)后聲明558.9.5 用extern聲明全局變量2、如果在一個文件中引用另外一個文件中定義的全局變量, 則用extern 來進(jìn)行說明:例8.21 給定b的值,輸入a和m, 求ab和am的值。 文件:f1.c 文件:f2.cint A;main()int p(int); int b=3,c,d,m; scanf(%d,%d,&A,&m); c=A*b; printf(%d*%d=%dn,A,b,c); d=p(m); printf(%d*%d=%d,A,m,d);extern A;p(int n)int i,y=1;for(i=1;i=n;i+) y=y*A;return(y);聲明A為全局變量568.11 如何運行一個多文件的程序一個源程序可以由多文件組成,運行一個多文件的程序的方法如下(如文件f1.

溫馨提示

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

評論

0/150

提交評論