




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第 6 章 函 數(shù) 和 模 塊 設(shè) 計 7/29/20221精選課件第 6 章 函數(shù)和模塊設(shè)計 6.1 結(jié)構(gòu)化程序設(shè)計 6.2 函數(shù)的定義和調(diào)用 6.3 程序嵌套調(diào)用和遞歸調(diào)用 6.4 作用域和存儲類型 6.5 內(nèi)部函數(shù)和外部函數(shù) 6.6 模塊化程序設(shè)計 6.7 應(yīng)用舉例 7/29/20222精選課件 對大千世界的許多描述大都可以在計算機中運用程序設(shè)計中的函數(shù)問題來解決,C語言程序設(shè)計也不例外。 一個功能較大的系統(tǒng),它一定包含有若干個相對獨立的子功能,通過子程序模塊來描述這些子功能,再通過對這些子程序的組織和調(diào)用,來實現(xiàn)整個程序的功能要求。而這些功能比較獨立的子程序模塊則稱之為函數(shù) 。本章用于
2、揭開函數(shù)的真面目!7/29/20223精選課件6.1 結(jié)構(gòu)化程序設(shè)計 6.1.1 結(jié)構(gòu)化程序設(shè)計的基本概念結(jié)構(gòu)化程序設(shè)計基本思想: 將一個大的程序按功能分割成一些子模塊,再通過對這些子模塊的組織和調(diào)用,來實現(xiàn)整個程序的功能要求。7/29/20224精選課件#include stdio.h void main( ) float a,b,c,v; scanf(”%f,%f,%f”,&a,&b,&c); v=volume(a,b,c); print_message( ); float volume(float a,float b,float c) float v; v=a*b*c; return(v
3、); void print_message( ) printf(”v=%f”,v); 輸出體積組織和調(diào)用計算立方體示例:編程序計算一立方體的體積,并在屏幕上輸出。7/29/20225精選課件6.1 結(jié)構(gòu)化程序設(shè)計 6.1.1 結(jié)構(gòu)化程序設(shè)計的基本概念 結(jié)構(gòu)化程序設(shè)計特點:各模塊相對獨立、功能單一、結(jié)構(gòu)清晰;控制了程序設(shè)計的復(fù)雜性;提高元件的可靠性縮短開發(fā)周期;避免程序開發(fā)的重復(fù)勞動;易于維護和功能擴充;開發(fā)方法: 自上向下,逐步求精 ,模塊化 ,限制使用goto語句。 7/29/20226精選課件6.1 結(jié)構(gòu)化程序設(shè)計 6.1.2 結(jié)構(gòu)化程序設(shè)計的基本特征 1. 程序的三種基本結(jié)構(gòu) AB順序結(jié)
4、構(gòu)圖 條件AB真假選擇結(jié)構(gòu)圖 條件A假真循環(huán)結(jié)構(gòu)圖 7/29/20227精選課件2. C語言是模塊化程序設(shè)計語言C程序結(jié)構(gòu)ABCDEFGHI7/29/20228精選課件3.程序設(shè)計采用自頂向下逐步細化過程 工資計算程序工資計算信息輸入工資額計算工資表打印應(yīng)發(fā)部分扣除部分基本工資其他補貼水電、公積金7/29/20229精選課件6.2 函數(shù)的定義和調(diào)用 函數(shù)是C語言程序的一種基本組成部分, C語言程序的功能是通過函數(shù)之間的調(diào)用來實 現(xiàn),一個完整的C語言程序可由一個或多個函 數(shù)組成。 0;-x) y=y*x; return(y); 傳統(tǒng)式例 有參函數(shù) long facto(int x) long y
5、; for(y=1;x0;-x) y=y*x; return(y); 現(xiàn)代式函數(shù)類型 函數(shù)名(形參類型說明表)說明部分語句部分現(xiàn)代格式函數(shù)返回值類型缺省 int 型無返回值 void合法標識符可以為空也可以有多個參數(shù)函數(shù)體例 無參函數(shù) void print_message( ) printf(”v=%f”,v); 例 空函數(shù)myfile( ) 函數(shù)體為空7/29/202213精選課件6.2 函數(shù)的定義和調(diào)用 6.2.2 函 數(shù) 的 調(diào) 用 一.函數(shù)調(diào)用格式及執(zhí)行過程 調(diào)用形式函數(shù)名(實參列表);說明:實參與形參個數(shù)相等,類型一致,按順序一一對應(yīng);實參列表求值順序,因系統(tǒng)而定(Turbo C 自
6、右向左);實參的量可以是常量、有值的變量或運算表達式. 7/29/202214精選課件#include stdio.h void main( ) int i=1,n; n=f(i,+i); printf(”nn=%dn”,n); f(int a,int b) int c; if(a=b) c=1; else c=0; return(c); 自右向左順序 #include stdio.h void main( ) int i=1,n; n=f(i,+i); printf(”nn=%dn”,n); f(int a,int b) int c; if(a=b) c=1; else c=0; retur
7、n(c); 自左向右順序 【例6_3】 實參求值順序舉例。 運行結(jié)果:n=0 運行結(jié)果:n=1 i(1),+i(2)a(1),b(2)c=0;i(2),+i(2)a(2),b(2)c=1;7/29/202215精選課件函數(shù)調(diào)用語句的執(zhí)行過程: 首先計算每個實參表達式的值,并把此值存入所對應(yīng) 的形參單元中, 執(zhí)行流程轉(zhuǎn)入函數(shù)體,執(zhí)行函數(shù)體中的各語句。 函數(shù)體執(zhí)行完之后,return (c)返回到調(diào)用該函數(shù)的 函數(shù)中的調(diào)用處的下一條語/*計算面積*/ #include stdio.h void main( ) int x=5,y=4,s=0; s=f(x,y); printf(”ns=%dn”,s
8、); f(int a,int b) c=a*b; return(c); x=5y=4a=5b=4c=5*4=20s=20運行結(jié)果:s=20 7/29/202216精選課件二. 函 數(shù) 的 調(diào) 用 方 式 3. 以函數(shù)調(diào)用中的一個實際參數(shù)形式調(diào)用 例如 k=hust(hust(m,n),j); printf(”%d”,power(a,b); 2. 以函數(shù)表達式的一個運算對象形式調(diào)用 例如 k=hust(m,n)*hust(i,j); 1. 以函數(shù)調(diào)用語句形式調(diào)用例如 hust( ); 7/29/202217精選課件三.對被調(diào)用函數(shù)的使用說明 在程序中調(diào)用另一個函數(shù)時,要滿足以下三個條件: 被調(diào)用
9、函數(shù)可以是已存在的用戶自定義函數(shù)或庫函數(shù)。 #include stdio.h void main( ) int x=5,y=4,s=0; s=f(x,y); printf(”ns=%dn”,s); f(int a,int b) c=a*b; return(c); 用戶自定義函數(shù)庫函數(shù) 若是庫函數(shù),應(yīng)用#include命令將有關(guān)庫函數(shù)所需的信息包含到本文件中 #include stdio.h void main( ) printf( “*”); 若是用戶自定義的函數(shù),且該函數(shù)與調(diào)用它的函數(shù)(即調(diào)用函數(shù))在同一個源文件中,則在調(diào)用函數(shù)中應(yīng)對被調(diào)用函數(shù)返回值的類型加以說明。 7/29/202218精
10、選課件#include stdio.h void main( ) float volume(float a,float b,float c) float x,y,z,v; scanf(”%f%f%f”,&x,&y,&z); v=volume(x,y,z); printf(”v=%fn”,v); float volume(float a,float b,float c) float d; d=a*b*c; return(d); 【例6_4】 求長方形體積的程序。 對自定義函數(shù)volume說明 調(diào)用自定義函數(shù)volume 7/29/202219精選課件6.2 函數(shù)的定義和調(diào)用 6.2.3 函數(shù)的返
11、回值 返回語句形式return(表達式);說明:系統(tǒng)默認的返回值類型為int型 當函數(shù)有返回值時,凡是允許表達式出現(xiàn)的地方,都可以調(diào)用該函數(shù) 當函數(shù)沒有返回值時,函數(shù)的返回值類型可以說明為void型(空類型)若無return語句,遇 時,自動返回調(diào)用函數(shù)函數(shù)中可有多個return語句或return 表達式;或return ;功能:利用return語句,將計算結(jié)果(或不帶結(jié)果)返回給調(diào)用程序,同時,也使程序的執(zhí)行流程轉(zhuǎn)到調(diào)用語句的下一語句去執(zhí)行。7/29/202220精選課件 float count(int n) int i; float s; if(n=0); printf(”The%d is
12、 invalid”,n); return(0); else s=0; for(i=1;i=n;i+) s+=1/(float)i; return(s); 【例6_5】編一函數(shù),求112131n的值。 強制轉(zhuǎn)換成實型 7/29/202221精選課件 void spc(int n) int i; for(i=0;in;i+) printf(”%c”, ); return(0); 【例6_6】 打印n個空格的函數(shù)。 void spc(int n) int i; for(i=0;in;i+) printf(”%c”, ); 返回調(diào)用函數(shù) 或7/29/202222精選課件void line(int n)
13、 line(int n) int i; for(i=1;i=n;i+) printf(”%c”,-); return; 調(diào)用該函數(shù): printf(”%d”,line(30); 當無返回值的函數(shù)將void省掉時, 函數(shù)將返回一個不確定的值。例如: 輸出一段虛線的同時,還輸出line函數(shù)的返回值,它是一個不確定的值。引起編譯錯誤 7/29/202223精選課件 double power(float x,int n) int i; double pw; pw=l; for(i=1;i=n;i+) pw*=x; return pw; 【例6_7】編一函數(shù),求x的n次方的值,其中n是整數(shù)。 將 x、n
14、 做為函數(shù)參數(shù) 結(jié)果通過return語句返回調(diào)用程序 7/29/202224精選課件 to_str(int n) char str10; int i; if(n0); while(-i=0) putchar(stri); 【例6_8】將一個給定的整數(shù)轉(zhuǎn)換成相應(yīng)的字符串后顯示出來。 將數(shù)值型的數(shù)據(jù)轉(zhuǎn)換成數(shù)值字符的內(nèi)碼 7/29/202225精選課件正確的形參定義 int hust(a,b) int a,b; int hust(int a,int b)或錯誤的形參定義 int hust(int a,b) int b; int hust(int a,b)或6.2 函數(shù)的定義和調(diào)用 6.2.4 函數(shù)參
15、數(shù)及函數(shù)間的數(shù)據(jù)傳遞 形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名。實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達式。例如形參與實參實參的定義 s=hust(x,y); 7/29/202226精選課件/*計算面積*/ #include stdio.h void main( ) int x=5,y=4,s=0; s=f(x,y); printf(”ns=%dn”,s); f(int a,int b) c=a*b; return(c); 實參 形參 s=f(x,y);(main 函數(shù))(f 函數(shù))f(int a,int b)c=a*b; return(c); 7/29/202227精選課件6.2 函數(shù)
16、的定義和調(diào)用 6.2.4 函數(shù)參數(shù)及函數(shù)間的數(shù)據(jù)傳遞 形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名。實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達式。形參與實參說明:實參可以是常量、已賦值的變量或表達式。實參在次序、類型和個數(shù)上應(yīng)與相應(yīng)形參表中的形參保持一致。 通常,當需要從調(diào)用函數(shù)中傳值(或傳地址)到被調(diào)用函數(shù)中的形參時應(yīng)設(shè)置實參。7/29/202228精選課件6.2 函數(shù)的定義和調(diào)用 6.2.4 函數(shù)參數(shù)及函數(shù)間的數(shù)據(jù)傳遞 值的傳遞 :調(diào)用函數(shù)將實參(常數(shù)、變量、數(shù)組元素或可計算的表達式)的值傳遞到被調(diào)用函數(shù)形參設(shè)置的臨時變量存儲單元中,被調(diào)用函數(shù)形參值的改變對調(diào)用函數(shù)的實參沒有影響。調(diào)用結(jié)束
17、后,形參存儲單元被釋放,實參仍保持原值不變。 傳遞形參值的兩種方法 特點 :形參與實參占用不同的內(nèi)存單元.單向傳遞7/29/202229精選課件#include stdio.h void main( ) int i=25; printf(”The value of i in main( ) before calling sqr(x) is %dn”,i); printf(”Calling sqr(x):sqr(%d)=%dn”,i, sqr(i) ); printf(”The value of i in main( ) after calling sqr(x) is %dn”,i); sqr(
18、int x) x=x*x; return(x); 【例6_9】值的傳遞程序舉例 實參值復(fù)制給形參25i:調(diào)用前:調(diào)用:25x:25i: 運行結(jié)果: The value of i in main( ) before calling sqr(x) is 25 Calling sqr(x):sqr(25)=625 The value of i in main( ) after calling sqr(x) is 25sqr:25i:6252525x:25i:調(diào)用結(jié)束: 結(jié)論: 在值的傳遞調(diào)用中,只是實參的復(fù)制值被傳遞, 被調(diào)用函數(shù)中的操作不會影響實參的值。7/29/202230精選課件6.2 函數(shù)的
19、定義和調(diào)用 6.2.4 函數(shù)參數(shù)及函數(shù)間的數(shù)據(jù)傳遞 地址的傳遞 :調(diào)用函數(shù)將實參(數(shù)組名或指針型變量)的地址作為參數(shù)傳遞給形參。若實參是數(shù)組名,則調(diào)用函數(shù)將實參數(shù)組的起始地址傳遞給形參的臨時變量單元;若實參是指針變量或地址表達式,則調(diào)用函數(shù)將實參指針變量所指向單元的地址或?qū)崊⒌牡刂穫鬟f給形參的臨時變量存儲單元。 傳遞形參值的兩種方法 特點 :形參與實參占用相同的內(nèi)存單元.雙向傳遞實參和形參必須是地址常量或變量7/29/202231精選課件void f(int b ) int max,max_i,i; max=b0,max_i=0; for(i=0;i10;i+) if(maxbi) max=b
20、i;max_i=i; max=b0; b0=bmax_i; bmax_i=max; return; #include stdio.h void main( ) void f(int b ); int a10,i; for(i=0;i10;i+) scanf(”%d”,&ai); f(a); for(i=0;i10;i+) printf(”n%4d”,ai); 【例6_11】將數(shù)組中的最大元素值與第一個元素值交換 運行結(jié)果: 0 1 2 3 4 5 6 7 8 9 9 1 2 3 4 5 6 7 8 0 調(diào)用前0a9b調(diào)用0a9交換b9a0返回9a0 結(jié)論: 在地址的傳遞調(diào)用中,數(shù)組b與數(shù)組a共
21、用同一存儲空間。 所以被傳遞的數(shù)據(jù)在被調(diào)用函數(shù)中對存儲空間的值做出某種 變動后,必然會影響到使用該空間的調(diào)用函數(shù)中變量的值。 實參數(shù)組的起始地址傳遞給形參7/29/202232精選課件6.2 函數(shù)的定義和調(diào)用 6.2.4 函數(shù)參數(shù)及函數(shù)間的數(shù)據(jù)傳遞 一、非數(shù)組名作為函數(shù)參數(shù) 參數(shù)傳遞的兩種形式 當非數(shù)組名作為函數(shù)參數(shù),在函數(shù)調(diào)用時,C語言編譯系統(tǒng)根據(jù)形參的類型為每個形參分配存儲單元,并將實參的值復(fù)制到對應(yīng)的形參單元之中,形參和實參分別占用不同的存儲單元,且形參值的改變不影響與其對應(yīng)的實參,即按“值的傳遞”方法操作。 7/29/202233精選課件 f(int a,int b) a=a+2; b
22、=b+4; printf(”a=%d,b=%dn”,a,b); return(a); #include stdio.h void main( ) int f(int a,int b); int x=1,y=2,z; static int a =0,1,2,3,4; z= f(x,y) ; printf(”z=%d,x=%d,y=%dn”,z,x,y); z= f(a3,a4); printf(”z=%d,a3=%d,a4=%dn” ,z,a3,a4); z= f(x,y+1); printf(”z=%d,x=%d,y=%dn”,z,x,y); 【例6_12】非數(shù)組名作為參數(shù)的值的傳遞程序舉例
23、運行結(jié)果: a=3,b=6 z=3,x=1,y=2a=5,b=8 z=5,a3=3,a4=4a=3,b=7 z=3,x=1,y=27/29/202234精選課件6.2 函數(shù)的定義和調(diào)用 6.2.4 函數(shù)參數(shù)及函數(shù)間的數(shù)據(jù)傳遞 二、數(shù)組名作為函數(shù)參數(shù) 參數(shù)傳遞的兩種形式 單個數(shù)組元素可以作為函數(shù)參數(shù),這同非數(shù)組名作為函數(shù)參數(shù)的情形完全一樣,即遵守”值傳遞”方式。 7/29/202235精選課件1、數(shù)組名作為函數(shù)參數(shù)的表示方法 當數(shù)組名作為函數(shù)參數(shù)時,需要對其類型進行相應(yīng)的說明 例如 int test(int array10) . 若數(shù)組說明時不指定數(shù)組的長度 ,可用另一個參數(shù)來表示數(shù)組的長度 例
24、如 int test(int array,int n ) . 用形參n來表示array數(shù)組的實際長度,更靈活7/29/202236精選課件int solve( int a ,int n) int sum,i; sum=0; for(i=0;in;i+) if(ai!=0) sum+; return(sum); 【例6_13】編一函數(shù),用來統(tǒng)計一個一維數(shù)組中非0元素的個數(shù)用形參n來表示a數(shù)組的實際長度。7/29/202237精選課件1、數(shù)組名作為函數(shù)參數(shù)的表示方法 當多維數(shù)組名作為函數(shù)參數(shù)時,除第一維可以不指定長度外,其余各維都必須指定長度。例如 check(float a 10,float n
25、) . 下面的參數(shù)說明都是不正確的: 例如 float a ; 或 float a10 ; . 7/29/202238精選課件說明: 用數(shù)組名作為函數(shù)參數(shù)時,應(yīng)該在調(diào)用函數(shù)和被調(diào)用函數(shù) 中分別定義數(shù)組。 實參數(shù)組和形參數(shù)組類型應(yīng)一致,否則出錯。 形參數(shù)組的大小應(yīng)大于等于實參數(shù)組的大小,否則得不到 實參數(shù)組的全部值。 特別注意的是,數(shù)組名作為函數(shù)參數(shù)時,是將實參數(shù)組 的首地址傳給形參數(shù)組,兩數(shù)組的對應(yīng)元素占用同一內(nèi) 存單元。傳遞時按數(shù)組在內(nèi)存中排列的順序進行。7/29/202239精選課件2、數(shù)組名作為函數(shù)參數(shù)的傳遞方式 數(shù)組名作為函數(shù)參數(shù)時,不是采用“值傳遞”方式, 而是采用“地址傳遞”方式。
26、 這意味著形參數(shù)組中某一元素的改變,將直接影響到 與其對應(yīng)的實參數(shù)組中的元素。 7/29/202240精選課件void sort(int array10) int i,j,k,t; for(i=0;i9;i+) k=i; for(j=i+1;j10;j+) if(arrayjarrayk) k=j; t=arrayk;arrayk=arrayi; arrayi=t; #include stdio.h void main( ) int x10,i; void sort(int array10); for(i=0;i10;i+) scanf(”%d,”,&xi); sort(x); printf(
27、”The sorted array:n”); for(i=0;i10;i+) printf(”%d,”,xi); printf(”n”); 【例6_14】將一個10個元素的一維數(shù)組用函數(shù)調(diào)用實現(xiàn)選擇排序。 9,8,7,6,5,4,3,2,1,0 The sorted array: 0,1,2,3,4,5,6,7,8,9調(diào)用前9x009 調(diào)用9x009array 交換0 x909array 返回0 x909scanf(”%d,”,&xi);尋找排序7/29/202241精選課件6.3 嵌套調(diào)用和遞歸調(diào)用 C語言中的函數(shù)定義是互相獨立的,函數(shù)和函數(shù)之間沒有從屬關(guān)系,即一個函數(shù)內(nèi)不允許包含另一個函數(shù)
28、的定義。一個函數(shù)既可以被其他函數(shù)調(diào)用,同時,它也可以調(diào)用別的函數(shù),這就是函數(shù)的嵌套調(diào)用。函數(shù)的嵌套調(diào)用為自頂向下、逐步求精及模塊化的結(jié)構(gòu)化程序設(shè)計技術(shù)提供了最基本的支持。=0) break; result=fact(n) ; printf(”Result=%ld”,result);【例6_16】 從鍵盤輸入一非負整數(shù)n,并求出n!的值。n!=n*(n-1)!結(jié)果分析:n=4 f(4)= 4*fac(4-1) =3 f(3)= 3*fac(3-1) =2 f(2)= 2*fac(2-1) =1 f(1)= 1*fact(1-1) =0 f(0)= 1回推遞推運行情況:Input a number
29、: 4Result =24遞歸調(diào)用嵌套調(diào)用if(n=0) /*遞歸終止條件*/ f=1;遞歸過程的兩個階段:fact(4)是主函數(shù)調(diào)用的。在一次調(diào)用fact函數(shù)時并不是立即得到fact(4)的值,而是一次又一次地進行遞歸調(diào)用(回推),直到fact(1)時才有確定的值。之后,再遞推出fact(2)、 fact(3)、 fact(4)的值。7/29/202246精選課件double xpower(float x,int n) if(n=0) return(1); else return(x*xpower(x,n-1);#include stdio.h void main( ) double xpo
30、wer(float x,int n); float x; int n; double r scanf(”%f%d”,&x,&n); r=xpower(x,n); printf(”Result=%f”,r);【例6_17】編一程序,利用函數(shù)的遞歸調(diào)用求x的n次方的值,其中n為正整數(shù)。 運行情況:2,3Result =8 小結(jié):任何有意義的遞歸調(diào)用總是由兩部分組成:即遞歸方式與遞歸終止條件。 if(n=0) /*遞歸終止條件*/ return(1);7/29/202247精選課件6.4 作用域和存儲類型 變量是對程序中數(shù)據(jù)的存儲空間的抽象 變量的屬性數(shù)據(jù)類型:變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性)存儲
31、屬性存儲器類型:寄存器、靜態(tài)存儲區(qū)、動態(tài)存儲區(qū)生存期:變量在某一時刻存在 靜態(tài)變量與動態(tài)變量作用域:變量在某區(qū)域內(nèi)有效 局部變量與全局變量 變量的存儲類型 auto 自動型 register 寄存器型 static 靜態(tài)型 extern 外部型 變量定義格式: 存儲類型定義符 數(shù)據(jù)類型 變量名表;如: int sub; auto int x,y,z; register int n; static float a,b;7/29/202248精選課件6.4 作用域和存儲類型 6.4.1 局部變量及其存儲類型 定義在 函數(shù) 或 復(fù)合語句 內(nèi)部定義的變量稱為 局部變量。 說明主函數(shù)main中定義的變量
32、也只在主函數(shù)中有效,其它函數(shù)不能引用;不同函數(shù)中可以使用相同名字的變量,它們代表不同的對象,占用不同的內(nèi)存單元,互相獨立;形式參數(shù)也是局部變量;可以在復(fù)合語句中定義變量,其作用域只是本復(fù)合語句。7/29/202249精選課件 float hust1(int a) int x, y; 舉 例局部變量a、x、y的作用范圍 float hust2(int b,int c) char s; 局部變量b、c、s的作用范圍void main( ) int m, n; 局部變量m、n的作用范圍7/29/202250精選課件舉 例#include ”stdio.h” void main( ) int p, q
33、; int x; x=p+q; x 的有效范圍p、q的有效范圍7/29/202251精選課件6.4 作用域和存儲類型 6.4.1 局部變量及其存儲類型 1.自動存儲變量 auto自動存儲變量 在函數(shù)或復(fù)合語句中定義和說明的變量,通常稱為自動變量。自動變量前可以冠以“auto”,若變量前不加任何存儲類別說明 ,則按缺省規(guī)則都為自動存儲類別的變量。作用域: 自動變量通常是局部變量,它的作用域僅限于定義它的那個函數(shù)或復(fù)合語句。它的可見性與生存期和作用域相同。 auto float a; float a;或7/29/202252精選課件【例6_18】 不同函數(shù)中的同名變量#include stdio.
34、hvoid main( ) int a; a=0; data( ); a=a+100; printf(”main:a=%dn”,a);data( ) int a; a=-199; printf(”data:a=%dn”,a);運行結(jié)果:data:a=-199main:a=100不指定為auto型不指定為auto型#include stdio.hvoid main( ) int a; a=1; data( ); a=a+100; printf(”main:a=%dn”,a);data( ) int a; printf(“da=%dn,a); a=-199; printf(”data:a=%dn”
35、,a);運行結(jié)果: da=1 data:a=199 main:a=1017/29/202253精選課件【例6_18】 不同函數(shù)中的同名變量#include stdio.hvoid main( ) int a; a=10; printf(“ma=%d,%xn,a,&a); data( ); a=a+100; printf(”main:a=%dn”,a ,&a);data( ) int a; printf(“da=%dn,a ,&a); a+=1; printf(“daa=%d,%xn,a,&a); a=-199; printf(”data:a=%dn”,a ,&a);運行結(jié)果:ma=10,ffd
36、cda=404,ffd6daa=405,ffd6data:a =199,ffd6main:a=110,ffdc7/29/202254精選課件6.4 作用域和存儲類型 6.4.1 局部變量及其存儲類型 2. 靜態(tài)局部變量 static 如果希望在函數(shù)調(diào)用結(jié)束后仍然保留函數(shù)中定義的局部變量的值,則可以將該局部變量定義為靜態(tài)局部變量。 靜態(tài)局部變量前可以冠以“static ” 例如 static int t,s; 說明:靜態(tài)局部變量的作用域在定義它的函數(shù)內(nèi)部,它的值在函 數(shù)調(diào)用結(jié)束后并不消失,但其他函數(shù)仍然不能訪問它。靜態(tài)局部變量賦初值是在編譯過程中進行的,且只賦一次 初值。而且連續(xù)保留上一次函數(shù)調(diào)
37、用時的結(jié)果。靜態(tài)局部變量的默認初值數(shù)值型為0,字符型為Null7/29/202255精選課件【例6_19】編一程序,觀察靜態(tài)局部變量在調(diào)用過程中的情況。 #include stdio.h void test( ) static int a=0; printf(”a=%dn”,a); +a; void main( ) int i; for(i=0;i4;i+) test( ); 運行結(jié)果: a=0 a=1a=2a=37/29/202256精選課件#include int func(int a,int b) static int m=0, i=0; i+=m+1; m=i+a+b; return(
38、m); main() int k=3,m=2,p; p=func(k,m); printf(“p1=%dn”,p); p=func(k,m); printf(“p2=%dn”,p); 運行結(jié)果:p1= 課堂練習(xí):看程序?qū)懡Y(jié)果*i=i+(m+1)=0+(0+1)=1*m=1+3+2=6*i=i+(m+1)=1+(6+1)=8*m=8+3+2=13*6p2=137/29/202257精選課件6.4 作用域和存儲類型 6.4.1 局部變量及其存儲類型 3. 寄存器變量 register 為提高程序的運行速度,可將使用十分頻繁的局部變量說明為寄存器變量,即在局部變量前冠以register,告知編譯系統(tǒng)
39、將其存儲在CPU的寄存器中 void test_r(register int n) register char c; . 說明:變量的存儲類型為寄存器變量時,auto說明符可省,冠以register說明符即可寄存器變量的使用與機器的硬件特性有關(guān),有一些限制:如寄存器變量的個數(shù);它只適用于自動變量和函數(shù)的形參;它的類型只能是char、short int、unsigned int、int和指針型;不允許對寄存器變量取地址等。 Turbo C中寄存器變量只能用于整型和字符型,且限制最多只允許定義兩個 寄存器變量。一旦超過,系統(tǒng)就自動地將其余的作為非寄存器變量來處理。 7/29/202258精選課件i
40、的作用范圍【例6_20】 輸出1到5的階乘的值。 #include stdio.h void main( ) int fac(int n); int i; for(i=1;i=5;i+) printf(”%d!=%dn”,i,fac(i); int fac(int n) register int i,f=1; for(i=1;i=n;i+) f=f*i; return(f); 運行結(jié)果: 1!=1 2!=23!=64!=24i、f的作用范圍5!=1207/29/202259精選課件【例6_21】編一程序,輸入10名學(xué)生的成績,并求出平均成績 #include stdio.h float asc
41、ore(float a ,int n) register int i; float sum; sum=0; for(i=0;in;i+) sum+=ai; return(sum/n); void main( ) float array10; register int i; for(i=0;i10;i+) scanf(”%f”,&arrayi); printf(”Average score=%f”,; ascore(array,10);i的作用范圍i的作用范圍7/29/202260精選課件6.4 作用域和存儲類型 6.4.2 全局變量及其存儲類型 定義一個源程序文件可以包含一個或若干個函數(shù)。在函
42、數(shù)之外定義的變量稱為全局變量或全程變量(又稱外部變量)。 全局變量與局部變量的區(qū)別:全局變量在函數(shù)之外定義,局部變量在函數(shù)之內(nèi)定義;局部變量在本函數(shù)之內(nèi)有效,全局變量從定義變量的位置開始到本源文件結(jié)束均有效。編譯時全局變量分配在靜態(tài)存儲區(qū),而局部變量則不一定。7/29/202261精選課件【例6_22】編一程序,打印九九表 #include stdio.h void row(); int a=1; /*外部變量*/ void main( ) int k; for(k=1;k=9;+k,+a) row( ); void row( ) int b; for(b=1;b=a;+b) printf(”
43、%4d”,a*b); printf(”n”); k的有效范圍b的有效范圍作用域a7/29/202262精選課件6.4 作用域和存儲類型 6.4.2 全局變量及其存儲類型 1. 外部變量 extern 外部變量 沒有說明為static的全局變量,其存儲類型都是外部的,統(tǒng)稱為外部變量。外部變量說明extern 數(shù)據(jù)類型 變量表;注意:凡在函數(shù)外定義的全局變量,按缺省規(guī)則可以不寫說明extern, 但在函數(shù)體內(nèi)說明其后所定義的全局變量時,要冠以extern。若一個文件要引用另一個文件中的全局變量,應(yīng)該在需要引用該 變量的文件中,用 extern說明該變量為外部的全局變量。7/29/202263精選課
44、件【例6_23】編一程序,打印九九表 #include stdio.hvoid row();void main( ) int k; for(k=1;k=9;+k,+a) row( ); int a=1; /*定義外部變量*/ void row ( ) int b; for(b=1;b=a;+b) printf(”%4d”,a*b); printf(”n”); 作用域a作用域a擴展extern int a; /*說明外部變量*/extern只能用來說明變量,而不能用來定義變量。 7/29/202264精選課件 例如 在不同的文件中引用外部變量 文件f1.c的內(nèi)容:# include “f2.c”
45、int x; /*外部變量定義*/main() int sum,y; scanf(“%d”,&y); store(); sum=x+y; printf(“sum=%d”,sum);文件f2.c的內(nèi)容:extern int x; /*外部變量引用說明*/void store() x=10; 7/29/202265精選課件6.4 作用域和存儲類型 6.4.2 全局變量及其存儲類型 2. 靜態(tài)外部變量 static 靜態(tài)全局變量一定是在本文件中定義的全局變量,其存儲類型說明符是static。 靜態(tài)全局變量的作用域是其定義點開始到該文件的結(jié)束,在本文件外不能訪問。 這種全局變量起到一個屏蔽作用。也可以
46、對函數(shù)定義成靜態(tài)的,來限制函數(shù)的作用域。 靜態(tài)外部變量與外部變量的相同與區(qū)別:兩者都是在靜態(tài)存儲區(qū)中分配單元;外部變量不僅在本函數(shù)之內(nèi)使用,還可以用于其他函數(shù),但靜態(tài)外部變量則不能用于其他函數(shù);7/29/202266精選課件 例如 下面對靜態(tài)全局變量的引用是錯誤的: file1.c static int a; /*靜態(tài)外部變量定義*/main() a=1; printf(”%dn”,f(a); file2.c extern int a; /*靜態(tài)外部變量引用說明*/int f(int x) x=a+x; printf(”%dn”,x); return(x);即使使用了extern說明,也無法使
47、用該變量。 7/29/202267精選課件6.5 內(nèi)部函數(shù)和外部函數(shù) C語言程序系統(tǒng)由若干個函數(shù)組成,這些函數(shù)既可在同一文件中,也可分散在多個不同的文件中,根據(jù)函數(shù)能否被其它源文件調(diào)用,可將它們分為內(nèi)部函數(shù)和外部函數(shù)。7/29/202268精選課件6.5 內(nèi)部函數(shù)和外部函數(shù) 6.5.1 內(nèi)部函數(shù)(靜態(tài)函數(shù) ) 如果一個函數(shù)只能被本文件中其它函數(shù)所 調(diào)用,稱為內(nèi)部函數(shù)(或靜態(tài)函數(shù))。 定義時在函數(shù)類型前加static:static 類型標識符 函數(shù)名 static float hust(int a,int b) 函數(shù)hust的作用范圍僅局限于定義本文件,而在其它文件中不能調(diào)用此函數(shù)。 7/29/
48、202269精選課件6.5 內(nèi)部函數(shù)和外部函數(shù) 6.5.2 外 部 函 數(shù)外部函數(shù)在函數(shù)定義的前面冠以extern說明符的函數(shù),稱為外部函數(shù)。定義外部函數(shù) extern 類型標識符 函數(shù)名說明: 在定義函數(shù)時省去了extern說明符時,則隱含為外部函數(shù)。 在需要調(diào)用外部函數(shù)的文件中,應(yīng)該用extern說明所用的函數(shù) 是外部函數(shù)。7/29/202270精選課件【例6_24】輸入一個字符,將已知字符串中的該字符刪除,要求用外部函數(shù)實現(xiàn)。 /*file1.c*/#include stdio.h“void main( )extern enter_string(char str80);extern de
49、lete_string(char str ,char ch);extern print_string(char str ); char c; static char str80; enter_string(str); scanf(”%c”,&c); delete_string(str,c); print_string(str); /*file2.c*/#include “stdio.h“/*輸入字符串*/ extern enter_string(char str80) gets(str);/*file3.c*/#include stdio.h“/*刪除給定的字符 */extern delete
50、_string(char str ,char ch) int i,j; for(i=j=0;stri!=0;i+) if(stri!=ch) strj+=stri; strj=0; /*file4.c*/ /*打印操作結(jié)果 */extern print_string(char str ) printf(”%s”,str); 運行結(jié)果:abcdefgc cabcdefg7/29/202271精選課件上機操作過程:方法一:(1)在file1.c文件開頭加入如下內(nèi)容#include ”file2.c”#include ”file3.c”#include ”file4.c”(2)對file1.c文件進
51、行編譯、連接、運行。方法二: 分別對4個文件進行編譯得到四個目標文件 (.obj文件)。 用link功能將四個目標文件連接起來: 在MS C系統(tǒng)上用命令: link file1+ file2+ file3+ file4 執(zhí)行結(jié)果生成一個可執(zhí)行文件(.exe文件)7/29/202272精選課件6.6 模塊化程序設(shè)計 在程序設(shè)計時,如果待解決的問題比較簡單,所編制的程序又不大,可將整個程序放在一個模塊中。但對大而復(fù)雜的設(shè)計任務(wù),不可能由1個人用1個程序來實現(xiàn)。7/29/202273精選課件6.6 模塊化程序設(shè)計 6.6.1 模塊化程序設(shè)計方法的指導(dǎo)思想基本思想:將一個大的程序按功能分割成一些小模塊
52、。開發(fā)方法:自頂向下,逐步求精 。特點:各模塊相對獨立、功能單一、結(jié)構(gòu)清晰、接口簡單。控制了程序設(shè)計的復(fù)雜性。提高元件的可靠性??s短開發(fā)周期。避免程序開發(fā)的重復(fù)勞動。易于維護和功能擴充。7/29/202274精選課件C語言是模塊化程序設(shè)計語言C程序結(jié)構(gòu)ABCDEFGHIC是函數(shù)式語言必須有且只能有一個名為main的主函數(shù)C程序的執(zhí)行總是從main函數(shù)開始,在main中結(jié)束函數(shù)不能嵌套定義,可以嵌套調(diào)用7/29/202275精選課件程序設(shè)計采用自頂向下逐步細化過程 工資計算程序工資計算信息輸入工資額計算工資表打印應(yīng)發(fā)部分扣除部分基本工資其他補貼水電、公積金7/29/202276精選課件6.6 模
53、塊化程序設(shè)計 6.6.2 模塊分解的原則 模塊分解用“自頂向下”的方法進行系統(tǒng)設(shè)計,即先整體后局部。復(fù)雜系統(tǒng)化大為小,化繁為簡。按功能劃分法把模塊組成樹狀結(jié)構(gòu),層次清楚,提高系統(tǒng)設(shè)計 效率(多人并行開發(fā)),便于維護。模塊的大小要適中,語句行數(shù)不大于100行。各模塊間的接口要簡單。盡可能使每個模塊只有一個入口,一個出口。7/29/202277精選課件模塊的劃分和設(shè)計可參考如下規(guī)則: (1)如果一個程序段被很多模塊所共用,則它應(yīng)是一個獨立的模塊。(2)如果若干個程序段處理的數(shù)據(jù)是共用的,則這些程序段應(yīng)放在一個 模塊中。(3)若兩個程序段的利用率差別很大,則應(yīng)分屬于兩個模塊。(4)一個模塊既不能過大
54、,也不能過小。過大則模塊的通用性較差,過 小則會造成時間和空間上的浪費。 (5)力求使模塊具有通用性,通用性越強的模塊利用性越高。(6)各模塊間應(yīng)在功能上,邏輯上相互獨立,盡量截然分開,特別應(yīng)避 免用轉(zhuǎn)移語句的模塊間轉(zhuǎn)來轉(zhuǎn)去。(7)各模塊間的接口應(yīng)該簡單,要盡量減少公共符號的個數(shù),盡量不用 共用數(shù)據(jù)存儲單元,在結(jié)構(gòu)或編排上有聯(lián)系的數(shù)據(jù)應(yīng)放在一個模塊 中,以免相互影響,造成查錯困難。 (8)每個模塊的結(jié)構(gòu)應(yīng)盡量設(shè)計成單入口,單出口的形式。這樣的程序 便于調(diào)試,閱讀和理解且可靠性高。7/29/202278精選課件6.7 應(yīng) 用 舉 例 7/29/202279精選課件【例6_25】編一程序,從鍵盤為
55、一個1010維整型數(shù)組輸入數(shù)據(jù),并對該數(shù)組進行轉(zhuǎn)置操作,即行、列互換。 #include stdio.hvoid rotate(int a1010)int i,j,temp; for(i=0;i10;i+) for(j=i+1;j10;j+) temp=aij; aij=aji; aji=temp; void main( )int a1010,i,j; for(i=0;i10;i+) for(j=0;j10;j+) scanf(”d”,&aij); putchar(n); rotate(a); for(i=0;i10;i+) for(j=0;j10;j+) printf(”%d”,aij);
56、說明:由于rotate函數(shù)的參數(shù)a是數(shù)組,因此,它采用的是“地址傳遞”方式,即rotate函數(shù)中形參a數(shù)組的改變,直接影響到在main函數(shù)中調(diào)用rotate函數(shù)時的實參數(shù)組a。7/29/202280精選課件分析:題意要求計算字符串長度??梢杂米址麛?shù)組來存儲字符串。主函數(shù)main用來輸入字符串和輸出字符串長度值,函數(shù)strlen()用來計算字符串長度。其遞歸結(jié)束條件是元素值為0,此時,應(yīng)返回字符串長度,否則應(yīng)判斷下一個字符?!纠?_26】編寫一個計算字符串長度的遞歸函數(shù)。 #include stdio.hint i=0;void main( )int str_len(char s); char
57、str100; printf(”Input string:n”); gets(str); printf(”O(jiān)utput string:n”); puts(str); i=str_len(str); printf(”The string length=%dn”,i);int str_len(char s) if(si=0) return(i); else i+; str_len(s); 說明:程序的遞歸函數(shù)中,若不滿足條件(si=0)時,一方面長度 I 要加 1,另一方面將數(shù)組中下一個元素的地址作為實參進行遞歸調(diào)用。這是因為 s 是數(shù)組的第一個元素的地址,則 s+1 是第二個元素的地址, s+I
58、 是第 i+1 個元素的地址。7/29/202281精選課件【例6_27】變量存儲類型及作用域應(yīng)用舉例 /*文件file1.c內(nèi)容*/ #include stdio.h“int i=1;next( ) return(i+);void main( )int i,j; i=reset( ); for(j=1;j=3;j+) printf(”i=%dtj=%dt”,i,j); printf(”next( )=%dt”,next( ); printf(”last( )=%dt”,last( ); printf(”new(i+j)=%dt”,new(i+j); printf(”n”); /*文件file
59、2.c*/static int i=10; last( ) return(i-=1); new(int i) static int j=5; return(i=j+=+i);/*文件file3.c*/extern int i;reset() return(i); 運行結(jié)果:i=1 j=1 next( )=1 last( )=9 new(i+j)=8i=1 j=2 next( )=2 last( )=8 new(i+j)=12i=1 j=3 next( )=3 last( )=7 new(i+j)=17 7/29/202282精選課件 這是一個由三個文件組成的程序,分別是file1.c、file
60、2.c、file3.c。 在file1.c的頭部對i變量進行了外部說明,照例它是全局變量,其作用域是整個文件。然而,主函數(shù)main( )內(nèi)又對i變量重新作了說明,這個i是自動變量,它與外部那個全局的i無關(guān)。在函數(shù)next( )中,i在使用前已經(jīng)作了外部說明,所以可直接引用,不需用extern作外部說明。在文件file2.c中,把i說明成外部靜態(tài)變量,照例它的作用域是文件file2.c內(nèi)。但是在new( )函數(shù)中,i為形參,和自動變量一樣,它與外部靜態(tài)變量i無關(guān),而且它也與文件file1.c中的外部變量i無關(guān)。在文件file3.c中,開頭就對i變量作了外部說明,因此,它與file1.c中的外部變
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZZB 3633-2024 原液著色滌綸牽伸絲
- T-ZSM 0074-2024 餐飲業(yè)油煙排放在線監(jiān)測儀
- 二零二五年度旅游行業(yè)客服業(yè)務(wù)員雇傭服務(wù)協(xié)議
- 二零二五年度總經(jīng)理社會責(zé)任與公益慈善聘用協(xié)議
- 2025年度模特時尚活動贊助商權(quán)益合作協(xié)議
- 二零二五年度荒山承包轉(zhuǎn)讓及林業(yè)資源開發(fā)利用合同
- 二零二五年度學(xué)校事業(yè)單位校車司機勞動合同
- 二零二五年度私人土地買賣合同案:森林資源開發(fā)合作合同樣本
- 二零二五年度學(xué)生校園交通安全管理協(xié)議范本匯編
- 二零二五年度合作社職業(yè)經(jīng)理人鄉(xiāng)村振興聘用協(xié)議
- 《動畫場景設(shè)計》第一章 動畫場景設(shè)計概述
- 2023年湖北宜昌伍家新城投資控股集團有限公司招聘筆試題庫含答案解析
- 內(nèi)燃平衡重式叉車
- 品質(zhì)管理人員角色定位
- 專業(yè)形體訓(xùn)練項目課程標準
- 人保理賠員試題車險查勘定損
- 小學(xué)生寒假生活成長冊PPT
- GB/T 25775-2010焊接材料供貨技術(shù)條件產(chǎn)品類型、尺寸、公差和標志
- 全省檢察機關(guān)公訴業(yè)務(wù)知識考試試卷
- 10KV開關(guān)柜教學(xué)講解課件
- 花城版三年級下冊音樂教學(xué)計劃
評論
0/150
提交評論