




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、C語言程序基礎教程語言程序基礎教程(第(第8-13章)章)整理課件第8章 函數(shù) C語言程序設計 第八章 函數(shù)概述函數(shù)定義的一般形式函數(shù)參數(shù)和函數(shù)的值函數(shù)的調用函數(shù)的嵌套調用函數(shù)的遞歸調用數(shù)組作為函數(shù)參數(shù)局部變量和全局變量變量的存儲類別內(nèi)部函數(shù)和外部函數(shù)運行一個多文件的程序整理課件本章學習目標: C語言程序設計 第八章 函數(shù)認識到函數(shù)是一種簡化程序結構的重要手段;理解函數(shù)調用和函數(shù)調用過程中的參數(shù)傳遞;理解函數(shù)原型(聲明)和怎樣寫函數(shù)原型;能夠用前幾章的知識實現(xiàn)簡單的函數(shù);能夠用return語句實現(xiàn)函數(shù)的返回值;能夠理解函數(shù)調用過程中形式參數(shù)和實際參數(shù)的關系,理解數(shù)組名作為函數(shù)參數(shù)時代表的意義;
2、能夠理解函數(shù)的嵌套調用和遞歸調用機制 。整理課件 概述函數(shù)的概念 C語言程序設計 第八章 函數(shù)一個大的程序一般應分為若干個程序模塊,每個模塊實現(xiàn)一個特定的功能,這些模塊稱為子程序,在C語言中子程序用函數(shù)實現(xiàn)。mainabca1abb1b2不能被調用所有函數(shù)都是平行的,不能嵌套定義分為:庫函數(shù)和自定義函數(shù)整理課件 C語言程序設計 第八章 函數(shù)一、常規(guī)方法:各函數(shù)包含在一個文件中例T8-1.c #include void main( ) void printstar( ); void print_message( ); printstar( ); print_message( ); printst
3、ar( ); void printstar( ) printf (“* n” ); void print_message( ) printf (“_ _ _ _ _How_do_you_do!n”) ; 運行結果: * How do you do! * *整理課件 C語言程序設計 第八章 函數(shù)二、工程的方法 例:某程序由四個文件組成,其中,一個文件包含主函數(shù),兩個文件包含兩個被調用函數(shù)。一個為工程文件,包含這個程序的三個文件名。 操作:Alt+p Project name :T8-1-4.prj Alt +R 結果同上T8-1-1.c main( ) p1( ) ; p2( ) ; p1( )
4、 ; T8-1-2.c p1( ) printf (“* n”); T8-1-3.c p2( ) printf (“ How do you do! n”); T8-1-4.prj T8-1-1T8-1-2T8-1-3整理課件 C語言程序設計 第八章 函數(shù)三、文件包含的方法 在主函數(shù)中使用文件包含預編譯命令,將不在本文件而在其它文件中的函數(shù)進行預編譯處理把各文件中的函數(shù)包含到本文件中來,然后一起進行編譯、連接、運行。 T8-1-5.c #include “T8-1-2.c”#include “T8-1-3.c”main( ) p1( ); p2( ) ; p1( ) ; 運行結果同上整理課件幾點
5、說明:(1)一個源文件由一個或者多個函數(shù)組成。(2)一個C程序由一個或者多個源文件組成。(3)C程序的執(zhí)行從main 函數(shù)開始。(4)所有的子函數(shù)都是平行的。(5)從用戶的角度看,函數(shù)分庫函數(shù)和自定義函數(shù)。(6)函數(shù)形式:主調函數(shù)無數(shù)據(jù)傳送給被調函數(shù),可帶或不帶返回值。主調函數(shù)與被調函數(shù)間有參數(shù)傳遞,主調函數(shù)可將實參傳送給被調函數(shù)的形參, 被調函數(shù)的數(shù)據(jù)可返回主調函數(shù)。 C語言程序設計 第八章 函數(shù)整理課件 根據(jù)(1)(2)(3)可知,邏輯上一個C語言程序是由函數(shù)構成的,C語言程序從主函數(shù)開始執(zhí)行,在主函數(shù)中調用其他函數(shù),這些函數(shù)可能又調用別的函數(shù),主函數(shù)執(zhí)行完畢代表整個程序結束。主函數(shù)只能調
6、用不能被調用。物理上一個程序由一個或者若干個文件(源文件)構成,函數(shù)分別放置在這些文件中。整理課件 函數(shù)定義的一般形式無參函數(shù)的定義形式v類型標識符:l用于指定函數(shù)帶回的值的類型,不寫時為int型。l不帶回值時可以不寫。 C語言程序設計 第八章 函數(shù)類型標識符 函數(shù)名() 說明部分 語句例 無參函數(shù) printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); 整理課件有參函數(shù)定義的一般形式 C語言程序設計 第八章 函數(shù)類型標識符 函數(shù)名(形式參數(shù)表列) 說明部分 語句現(xiàn)代風格:例 有參函數(shù)(現(xiàn)代風格) int max(int x,in
7、t y) int z; z=xy?x:y; return(z); 例 有參函數(shù)(現(xiàn)代風格) int max(int x, y) int z; z=xy?x:y; return(z); 整理課件空函數(shù)v為擴充功能預留,在主調函數(shù)中先占一個位置。 C語言程序設計 第八章 函數(shù)類型標識符 函數(shù)名() 例 空函數(shù) dummy( ) 對形參的聲明的傳統(tǒng)方式v即把對形參的聲明放在函數(shù)定義的下一行類型標識符 函數(shù)名(形參表)形參類型說明 說明部分 語句例 有參函數(shù)(傳統(tǒng)風格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); 整理課件 函數(shù)參數(shù)和函數(shù)的值形式
8、參數(shù)和實際參數(shù)v形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名v實際參數(shù):調用函數(shù)時函數(shù)名后面括號中的表達式 C語言程序設計 第八章 函數(shù)例比較兩個數(shù)并輸出大者#include void main() int max(int x,int y); 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);形參實參c=max(a,b);(main 函數(shù))(max 函數(shù))max(int x, int y) int z; z=xy?
9、x:y; return(z); 運行:7,8 Max is 8整理課件v幾點說明:l實參可以是常量、變量或表達式。必須有確定的值。當函數(shù)調用時,將實參的值傳遞給形參,若是數(shù)組名,則傳送的是數(shù)組首地址。 l形參必須指定類型,只能是簡單變量或數(shù)組,不能是常量或表達式l形參與實參類型一致,個數(shù)相同順序相同。l若形參與實參類型不一致,自動按形參類型轉換函數(shù)調用轉換l形參在函數(shù)被調用前不占內(nèi)存;函數(shù)調用時為形參分配內(nèi)存;調用結束,內(nèi)存釋放l實參對形參的數(shù)據(jù)傳送是值傳送,也是單向傳送,當被調函數(shù)的形參發(fā)生變化時,并不改變主調函數(shù)實參的值。形、實參占據(jù)的是不同的存儲單元 C語言程序設計 第八章 函數(shù)整理課件
10、 C語言程序設計 第八章 函數(shù)例:形、實參占據(jù)的是不同的存儲單元#include void main( ) int a=2,b=3; printf (“a=%d, b=%d n”,a, b); printf(“&a=%x,&b=%xn” ,&a,&b); add(a,b); printf(“a=%d,b=%dn”, a,b); printf(“&a=%x,&b=%xn”, &a,&b); add(int x,int y) x=x+8; y=y+12; printf(“x=%d,y=%d n”,x,y); printf(“&
11、x=%x,&y=%xn”,&x,&y); 2+8=103+12=1523ffd2ffd4ffd6ffd8xayb運行結果: a=2,b=3&a=ffd6,&b=ffd8 x=10,y=15 &x=ffd2,&y=ffd4a=2, b=3&a=ffd6,&b=ffd8整理課件函數(shù)的返回值v返回語句形式: return(表達式);或 return 表達式; v功能:使程序控制從被調用函數(shù)返回到調用函數(shù)中,同時把返值帶給調用函數(shù) C語言程序設計 第八章 函數(shù)整理課件 說明: 函數(shù)的返回值,必須用 return 語句帶回。 ret
12、urn 語句只能把一個返值傳遞給調用函數(shù)。 函數(shù)中可有多個return語句,執(zhí)行哪一個由程序執(zhí)行情況來定。 if(ab) return(a); else return(b); return 后的值可以是一個表達式,如:return(x y ? x : y); 返回值的類型為定義的函數(shù)類型,不指定的按整型處理。如: int max(int x, int y) float min(float a,float b) double abc(float d1,float d2)整理課件l若 return 語句中表達式類型與函數(shù)類型不一致,則轉換為函數(shù)類型。l若無return語句,遇時,自動返回調用函數(shù)。
13、可能返回一個不確定或無用的值 。l無返回值的函數(shù),定義為 void 類型。 C語言程序設計 第八章 函數(shù) printstar() printf(*);main() int a; a=printstar(); printf(%d,a);例:無return語句,函數(shù)帶回不確定值輸出:10void printstar() printf(*);main() int a; a=printstar(); printf(%d,a);編譯錯誤!整理課件 C語言程序設計 第八章 函數(shù) void swap(int x,int y ) int temp; temp=x; x=y; y=temp; 例:無返回值函數(shù)例
14、8.3: 函數(shù)返回值類型轉換#include void main() int max(float x,float y); float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);輸入:,輸出:Max is 2整理課件 函數(shù)的調用主調函數(shù):主動去調用其它函數(shù) 被調函數(shù):被其它函數(shù)所調用函數(shù)調用的一般形式函數(shù)名(實參表列)v說明:l實參表列:有確定值的數(shù)據(jù)或表達式l實參與形參個數(shù)相等,類型一致,按
15、順序一一對應,當有多個實參時,實參間用“ ,”分隔l實參表求值順序,因系統(tǒng)而定(Turbo C 自右向左)l調用無參函數(shù)時,實參表列為空,但( )不能省 C語言程序設計 第八章 函數(shù)整理課件 C語言程序設計 第八章 函數(shù)#include void main() int f(int a,int b); int i=2,p; p=f(i,+i); printf(%d,p);int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);例8.4 參數(shù)求值順序按自右向左求值函數(shù)調用等于f(3,3)運行結果:0
16、按自左向右求值函數(shù)調用等于f(2,3)運行結果:- 1為使程序有通用性:Printf(“%d,%d”,i,i+); /*同樣存在此情況*/整理課件函數(shù)調用的方式按函數(shù)在程序中出現(xiàn)的位置,有三種調用方式:v函數(shù)語句:以獨立的語句去調用函數(shù)。不要求有返回值,僅完成一定的操作。 例 printstar(); printf(“Hello,World!n”);v函數(shù)表達式: 函數(shù)返回一個確定值,以參加表達式的運算。不可用于void例 m=max(a,b)*2;v函數(shù)參數(shù):函數(shù)調用作為另一個函數(shù)的參數(shù)。 例 printf(“%d”,max(a,b); /*輸出大數(shù)*/ m=max(a,max(b,c);
17、/*三數(shù)比大小*/ C語言程序設計 第八章 函數(shù)整理課件對被調用函數(shù)的聲明和函數(shù)原型v對被調用函數(shù)要求:l必須是已存在的函數(shù)l庫函數(shù): #include l用戶自定義函數(shù):如果被調函數(shù)定義在主調函數(shù)之后,那么在主調函數(shù)中對被調函數(shù)作聲明。 C語言程序設計 第八章 函數(shù)整理課件 函數(shù)聲明一般形式:函數(shù)類型 函數(shù)名(形參類型 形參名,. ); 或 函數(shù)類型 函數(shù)名();作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便檢驗C語言中函數(shù)聲明稱為函數(shù)原型。函數(shù)定義與函數(shù)聲明不同,聲明只與函數(shù)定義的第一行相同。聲明可以不寫形參名,只寫形參類型。函數(shù)說明位置:程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外)整理課件 C語言
18、程序設計 第八章 函數(shù)#include void main() float add(float x,float y ); /*對被調用函數(shù)的聲明*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) /*函數(shù)首部*/ float z; /*函數(shù)體 z=x+y; return(z); float add(float,float);例8.5 對被調用的函數(shù)作聲明輸入:3.6 ,輸出:整理課件v說明:l舊版本C中函數(shù)聲明不采用函數(shù)原型,只聲明函數(shù)名和
19、函數(shù)類型。如: float add( )l函數(shù)調用之前,如果未對函數(shù)作聲明,則編譯系統(tǒng)把第一次遇到的函數(shù)形式作為函數(shù)聲明,并默認為int型。即:函數(shù)類型是int型可以不作函數(shù)聲明,最好作聲明。l被調用函數(shù)的定義(程序)在主調函數(shù)之前,可以不加函數(shù)聲明。l在所有函數(shù)定義前,已在函數(shù)外部做了函數(shù)聲明,則在各主調函數(shù)中可以不加函數(shù)聲明。 C語言程序設計 第八章 函數(shù)#include float add(float x, float y) float z; z=x+y; return(z);main() float a,b,c; scanf(%f,%f,&a,&b); c=add(a,
20、b); printf(sum is %f,c);void main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);char letter(char,char);float f(float,float);int I(float,float);main()char letter(char c1,char c2)float f(float x,float y)Int I(float j
21、,float k)整理課件 C語言程序設計 第八章 函數(shù)main()調fun()結束fun()返回保存:返回地址當前現(xiàn)場恢復:主調程序現(xiàn)場返回地址函數(shù)調用的執(zhí)行過程整理課件 函數(shù)的嵌套調用 C語言程序設計 第八章 函數(shù) 不允許嵌套定義,函數(shù)間的關系是平行的、獨立的。 C中的函數(shù): 允許嵌套調用,即在調用某函數(shù)過程中又調用另一函數(shù)。main( )調用函數(shù)a結束a函數(shù)b函數(shù)調用函數(shù)b整理課件 C語言程序設計 第八章 函數(shù)#include int fun1(int x,int y);void main(void) int a,b; scanf(“%d%d”,&a,&b); print
22、f(“The result is:%dn”,fun1(a,b) );int fun1(int x,int y) int fun2(int m); return ( fun2(x)+fun2(y) );int fun2(int m) return (m*m);例 輸入兩個整數(shù),求平方和輸入: 3 4輸出: The result is: 25整理課件 C語言程序設計 第八章 函數(shù)#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b
23、,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d);例 求三個數(shù)中最大數(shù)和最小數(shù)的差值int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z);int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z);main( )調用函數(shù)dif輸出結束dif函數(shù)max函數(shù)調用
24、函數(shù)max調用函數(shù)minmin函數(shù)skip整理課件 C語言程序設計 第八章 函數(shù)例8.6 用弦截法求方程 的根08016523xxxyxf(x)0 x1x2xf(x1)f(x2)1. 取x1,x2兩點,求得f(x1), f(x2) 。 異號:x1,x2之間必有一根。 同號:改變x1, x2,直到f(x1), f(x2)異號為止。 )()()()(121221xfxfxfxxfxx2. 連f(x1),f(x2)兩點(弦)交x軸于x。 X點的坐標求法: 求X點的x坐標 從x值得f(x)3. 若f(x)與f(x1)同號, 則根必在(x,x2)區(qū)間,此時將x1=x; 若f(x)與f(x2)同號, 則根
25、必在(x1,x)區(qū)間,此時將x2=x;4. 重復步驟2和3 ,直到| f(x) | 為止, 設 10-6 , 則 f(x)0整理課件用三個函數(shù)實現(xiàn)各部分的功能: 函數(shù)f(x): 求x的函數(shù):x3 - 5x2 +16x-80 函數(shù)xpoint(x1,x2): 求弦與x軸交點X的x坐標 函數(shù)root(x1, x2) : 求(x1, x2)區(qū)間的實根 C語言程序設計 第八章 函數(shù) 求弦與x軸的交點x輸入x1,x2,求f(x1),f(x2)直到f(x1)與f(x2)異號y=f(x),y1=f(x1)y與y1同號真假x1=xy1=yx2=x直到 |y|root=x 輸出 rootroot函數(shù)main(
26、)調用函數(shù)root輸出根 x結束root函數(shù)xpoint函數(shù)調用函數(shù)xpoint調用函數(shù)ff函數(shù)整理課件 C語言程序設計 第八章 函數(shù)#include #include float f(float x) float y; y=(x-5.0)*x+16.0)*x-80.0; return(y); float xpoint(float x1, float x2) float y; y=(x1*f(x2)-x2*f(x1)/(f(x2)-f(x1); return(y);float root(float x1,float x2) float x, y, y1; y1=f(x1); do x=xpoi
27、nt(x1, x2);y=f(x); if(y*y1 0) y1=y;x1=x; else x2=x; while(fabs(y) =0.0001); return(x); void main( ) float x1, x2, f1, f2, x; do printf(“input x1, x2: n”); scanf(“%f%f”,&x1,&x2); f1=f(x1); f2=f(x2); while(f1*f2 =0); x=root(x1, x2); printf(“A root of equation is %8.4f n”,x);運行情況:Input x1,x2:2,
28、6整理課件 函數(shù)的遞歸調用遞歸:在函數(shù)調用過程中,直接或間接的調用自身。遞歸調用方式v直接遞歸調用:在函數(shù)體內(nèi)又調用自身 C語言程序設計 第八章 函數(shù)f( )調fint f(int x) int y,z; z=f(y); . return(2*z);整理課件v間接遞歸調用:當函數(shù)1去調用另一函數(shù)2時,而另一函數(shù)2反過來又調用函數(shù)1自身。 C語言程序設計 第八章 函數(shù)調f2調f1f1( )f2( )int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1(a); . return(3+c);v解決無終止遞歸
29、調用的方法是:確定好結束遞歸的條件。 條件成立,進行遞歸 用if語句控制 條件不成立,結束遞歸整理課件 C語言程序設計 第八章 函數(shù)例8.7 有5個人,第5個人比第4個人大2歲,第4個人比第3個人大2歲,第2個人比第1個人大2歲,第1個人10歲,問第5個人多大? age(5) age(4) age(3) age(2) age(1) =2+age(4) =2+age(3) =2+age(2) =2+age(1) =10=18 =16 =14 =12 10 n=1數(shù)學模型:age(n)= age(n-1)+2 n1age(int n) int c; if(n=1) c=10; else c=2+a
30、ge(n-1); return(c); #include void main( ) printf(“%d n”, age(5);運行結果:18整理課件有些問題,可以用遞推,也可以用遞歸的方法解決。v遞推:從一個已知的事實出發(fā),按一定規(guī)律推出下一個事實,再從已知的新的事實,推出下一個新的事實. C語言程序設計 第八章 函數(shù)例 用遞推法求n! ,即從1開始, 乘2, 乘3.一直到n #include void main( ) int i, s=1; for(i=1;i=5;i+) s=s* i; printf(“s=%d n”,s); 運行結果:s=120整理課件v遞歸:在函數(shù)調用自身時,要給出結
31、束遞歸的條件。l先回推再遞推l如:n!, 5!=5 4! 4!=4 3! 3!=3 2! 2!=2 1! 1!=1 0!=1 C語言程序設計 第八章 函數(shù) 1 (n=0,1) n!= n*(n-1)! (n1)#include void main() float fac(int n); int n; float y; printf(Input a integer number:); scanf(%d,&n); y=fac(n); printf(%d! =%15d,n,y);float fac(int n) float f; if(n0) printf(n0,data error!);
32、else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f);運行:input a integer number:1010! = 3628800例 用遞歸方法求n!整理課件 C語言程序設計 第八章 函數(shù)例 Hanoi(漢諾)塔問題 BCA整理課件v方法與步驟l將A上n-1個盤子借助C移到B 。l把A上剩下一個盤子送到Cl將n-1個盤子從B借助A移到C C語言程序設計 第八章 函數(shù)BCAv簡化實例:將A上3個盤子移到C步驟:1. A上兩個盤子借助C移到B 2. A上最后一個盤子移到C (可直接完成) 3. B上兩個盤子借助A移到C 第一步進一步分解: 1.
33、1 A上一個盤子從AC 1.2 A上一個盤子從AB 1.3 C上一個盤子從CB 第三步進一步分解: 3.1 B上一個盤子從BA 3.2 B上一個盤子從BC3.3 A上一個盤子從AC整理課件v結論:上面三個步驟包含兩類操作l步驟1和3都是將n-1個盤子從一個針移到另一個針上(n1時),這是一個遞歸的過程;方法一樣,只是針的名稱不同而已,為使問題一般化,將步驟1和3表示為:將one 針上的n-1個盤子移到two針,借助 three針,只是對應關系不同。第一步對應關系:one A two B three C 第三步對應關系:one B two C three A l將1個盤子從一個針上移到另一針上。
34、v因此,可以用兩個函數(shù)分別實現(xiàn)上面兩類操作,用hanoi函數(shù)實現(xiàn)第一類操作,用move函數(shù)實現(xiàn)第2類操作。lhanoi(n,one,two,three) 將n個盤從 one three借助twolmove(x,y) 將1個盤從x y座,x、y根據(jù)情況取代ABC座中的1個。 C語言程序設計 第八章 函數(shù)整理課件 C語言程序設計 第八章 函數(shù)例 用遞歸方法解決Hanoi(漢諾)塔問題的程序 #include void main() void hanoi(int n,char one,char two,char three); int m; printf(Input the number of di
35、skes:); scanf(%d,&m); printf(The step to moving %3d diskes:n,m); hanoi(m,A,B,C);void hanoi(int n,char one,char two,char three)void move(char x, char y); if(n=1) move(one,three); else hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); void move(char x, char y) printf(%c-%cn,x, y
36、); 運行: input number of diskes: 3the step to moving 3 diskes: A C A B C B A C B A B C A C整理課件 數(shù)組作為函數(shù)參數(shù)數(shù)組元素作函數(shù)實參值傳遞 C語言程序設計 第八章 函數(shù)例 兩個數(shù)組比較大小 432105a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2n=0m=0k=1n=0m=1k=1n=1m=1k=1n=1m=1k=2n=2m=1k=2整理課件 C語言程
37、序設計 第八章 函數(shù)#include void main() int large(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); for(i=0;ibi%d timesn”,n); printf(“ai=bi%d timesn”,m); printf(“aik) printf(“ar
38、ray a is larger than array bn”); else if(ny) flag=1; else if(x bi 3 time ai = bi 1 time ai bi 1 time array a is large then array b整理課件數(shù)組名可作函數(shù)參數(shù)實參和形參都應用數(shù)組名 C語言程序設計 第八章 函數(shù)例 求學生的平均成績 float average(float array10) int i; float aver,sum=array0; for( i=1; i10; i+ ) sum=sum+arrayi; aver=sum/10; return (aver
39、);#include void main() float average(float array10); float score10, aver; int i; printf(Input 10 scores: n); for( i=0; i10; i+ ) scanf(%f, &scorei); printf(“n”); aver=average(score); printf(Average is: %5.2f, aver);.2109score562312.88array整理課件幾點說明: C語言程序設計 第八章 函數(shù)v地址傳遞l調用函數(shù)時,對形參數(shù)組元素的操作,實際上也是對實參數(shù)組
40、元素的操作。v在主調函數(shù)與被調函數(shù)分別定義數(shù)組,且類型應一致l如:array是形參數(shù)組名,score是實參數(shù)組名。整理課件 形參數(shù)組大小(多維數(shù)組第一維)可不指定在定義數(shù)組時在數(shù)組名后面跟一個空的方括弧C編譯對形參數(shù)組大小不檢查,即使定義了也不起作用。 形參數(shù)組名是地址變量 調用時,只是將實參數(shù)組的首地址傳給形參數(shù)組, 因此scoren和arrayn指的是同一單元整理課件 C語言程序設計 第八章 函數(shù)例 求兩組學生的平均成績,形參數(shù)組長度缺省 #include void main() float average(float array ,int n); float score_15=98.5,
41、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(“The average of clase A is %6.2fn”,average(score_1,5); printf(“The average of clase B is %6.2fn”,average(score_2,10);float average(float array ,int n) int i; float aver,sum=array0; for( i=1; in; i+ ) sum=sum+arrayi; ave
42、r=sum/n; return (aver);運行:整理課件v數(shù)組名作函數(shù)參數(shù)時,實參和形參兩個數(shù)組共占同一段內(nèi)存單元,形參數(shù)組的元素值改變會使實參數(shù)組元素的值同時變化。 C語言程序設計 第八章 函數(shù)例 用選擇法對數(shù)組中的10個整數(shù)按由小到大排序 整理課件#include void main() void sort(int array ,int n); int a10,i; printf(“enter the arrayn”); for(i=0;i10;i+) scanf(%d,&ai); sort(a,10); printf(“the sorted array: n”); for(i
43、=0;i10;i+) printf(%d ,ai); printf(n);整理課件 C語言程序設計 第八章 函數(shù)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=arrayi; arrayi=arrayk;arrayk=t; 0123456789a4968573299927137688arraykjjjkjkjjjjj949i=0整理課件 C語言程序設計 第八章 函數(shù)kjjkjkjjjjj0123456789a4968573299927137
44、688array949kk1368i=1void 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=arrayi; arrayi=arrayk;arrayk=t; 整理課件 C語言程序設計 第八章 函數(shù)0123456789a9132732495768768899arrayi=8void 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(arrayja
45、rrayk) k=j;t=arrayi; arrayi=arrayk;arrayk=t; 整理課件用多維數(shù)組名作函數(shù)參數(shù)v可以用多維數(shù)組名作實參和形參v形參數(shù)組定義時,只能省略第一維的大小說明。lC編譯不檢查第一維的大小,而且數(shù)組名作函數(shù)參數(shù)是地址傳送,所以形參數(shù)組第一維大小任意,可以和實參數(shù)組的維數(shù)不同。 實參數(shù)組定義:int score510 形參數(shù)組定義:int array310 或 int array810l合法的定義:int array310; 或 int array 10l錯誤的定義:int array ; int array3 ; C語言程序設計 第八章 函數(shù)整理課件 C語言程序
46、設計 第八章 函數(shù)例 求34矩陣中各元素的最大值 #include void main()int max_value(int array 4); int a34=1,3,5,7,2,4,6,8,15,17,34,12; printf(max value is %dn,max_value(a);int max_value(int array34) int i,j,k,max; max=array00; for(i=0;i3;i+) for(j=0;jmax) max=arrayij; return(max);多維形參數(shù)組第一維維數(shù)可省略,第二維必須相同 int array4整理課件 C語言程序設
47、計 第八章 函數(shù)例 求二維數(shù)組中各行元素之和get_sum_row(int x3, int result ,int row, int col) int i,j; for(i=0;irow;i+) resulti=0; for(j=0;jcol;j+) resulti+=xij;main() int a23=3,6,9,1,4,7; int sum_row2,row=2,col=3,i; get_sum_row(a,sum_row,row,col); for(i=0;irow;i+) printf(The sum of row%d=%dn,i+1,sum_rowi);314679asum_row
48、xresult1812整理課件 局部變量和全局變量變量按其作用域,可分為局部變量和全局變量。局部變量內(nèi)部變量v定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效v說明:lmain中定義的變量只在main中有效l不同函數(shù)中同名變量,占不同內(nèi)存單元l形參屬于局部變量l可定義在復合語句中有效的變量l局部變量可用存儲類型:auto register static (默認為auto) C語言程序設計 第八章 函數(shù)整理課件 C語言程序設計 第八章 函數(shù)float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,n; .a,b,c有效x,y,i
49、,j有效m,n有效例 不同函數(shù)中同名變量void main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);運行結果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4整理課件 C語言程序設計 第八章 函數(shù)運行結果:5 4 3 2 1例 復合語句中變量#define N 5void main() int i; int aN=1,2,3,4,5; for
50、(i=0;iN/2;i+) int temp; temp=ai; ai=aN-i-1; aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);main() int a, b; int c; c=a+b; a,b 范圍c 范圍整理課件全局變量外部變量v定義:在函數(shù)外定義,可為本文件所有函數(shù)共用,也叫外部變量。v有效范圍:從定義變量的位置開始到本源文件結束,及有extern說明的其它源文件v幾點說明:l全局變量的使用,增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道,同一文件中的所有函數(shù)都能引用全局變量的值,當某函數(shù)改變了全局變量的值時,便會影響其它的函數(shù)。 C語言程序設計 第八章 函數(shù)
51、整理課件習慣上,全局變量名的第一個字母用大寫。使用全局變量可以減少函數(shù)的實參和形參個數(shù)。不必要時不要使用全局變量全局變量在程序執(zhí)行的全過程都占用存儲單元。不利于程序的移植。程序的可讀性變差。全局與局部變量重名時,在函數(shù)內(nèi)部將屏蔽全局變量。整理課件 C語言程序設計 第八章 函數(shù)int p=1,q=5;float f1(a)int a; int b,c; .int f3().char c1,c2;char f2(int x,int y) int i,j; main() int m,n; .c1,c2的作用范圍p,q的作用范圍整理課件 C語言程序設計 第八章 函數(shù)例 全局變量的作用域及其使用情況in
52、t a=1; f1( ) int b; b=a+3; printf(“f1:a=%d, b=%d n”,a, b); f2( ) int a, b; a=5; b=a+3; printf(“f2: a=%d, b=%d n”,a, b); f3( ) int b; a=6; b=a+3; printf(“f3:a=%d, b=%d n”,a, b); void main( ) int b=3; printf(“1.main : a=%d, b=%d n”,a, b); f1( ); printf(“2.main : a=%d, b=%d n”,a, b); f2( ); printf(“3.m
53、ain : a=%d, b=%d n”,a, b); f3( ); printf(“4.main : a=%d, b=%d n”,a, b); 運行: 1.main:a=1, b=3 f1:a=1, b=4 2.main:a=1, b=3 f2:a=5, b=8 3.main:a=5, b=3 f3:a=6, b=94.main:a=6, b=3整理課件 C語言程序設計 第八章 函數(shù)例8.15 一維數(shù)組內(nèi)存放了10個學生成績,求平均分、最高分和最低分。#include float Max=0,Min=0;void main() float average(float array ,int n)
54、; int i; float ave,score10; for(i=0;i10;i+) scanf(%f,&scorei); ave=average(score,10); printf(max=%6.2fnmin=%6.2fn average=%6.2fn,Max,Min,ave);float average(float array, int n) int i; float aver, sum=array0; Max=Min=array0; for(i=1;iMax) Max=arrayi; else if(arrayiMin) Min=arrayi; sum=sum+arrayi;
55、aver=sum/n; return(aver);運行:input 10 numbers: 99 45 78 97 100 67.5 89 92 66 43max=100.00 min=43.00 ave score 10 Max Minaver array n Max Min全局變量Max Minmain函數(shù)average函數(shù)整理課件 C語言程序設計 第八章 函數(shù)例8.16 外部變量與局部變量同名#include int a=3,b=5;void main() int max(int a, int b); int a=8; printf(max=%d,max(a,b);int max(int
56、 a, int b) int c; c=ab?a:b; return(c);運行結果:max=8例 外部變量副作用int i;main() void prt(); for(i=0;i5;i+) prt();void prt() for(i=0;i5;i+) printf(“%c”,*); printf(“n”);運行結果:*整理課件 變量的存儲類別動態(tài)存儲方式與靜態(tài)存儲方式v變量分類:l按數(shù)據(jù)類型:整型、實型、字符型l按作用域:全局變量、局部變量l存儲方式:u靜態(tài)存儲:程序運行期間分配固定的存儲空間。u動態(tài)存儲:程序運行期間根據(jù)需要動態(tài)分配存儲空間。v內(nèi)存用戶區(qū) C語言程序設計 第八章 函數(shù)程
57、序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)全局變量、局部靜態(tài)變量形參變量局部動態(tài)變量(auto register)函數(shù)調用現(xiàn)場保護和返回地址等v生存期:l靜態(tài)變量:從程序開始執(zhí)行到程序結束l動態(tài)變量:從包含該變量定義的函數(shù)開始執(zhí)行至函數(shù)執(zhí)行結束整理課件auto變量v函數(shù)內(nèi)部無static聲明的局部變量均為動態(tài)存儲類別,被分配在動態(tài)區(qū) 。v存儲類別為自動時,聲明符auto可省;自動變量被 分配在動態(tài)區(qū),未賦初值時,其值未定義,每次調用重新賦值。 C語言程序設計 第八章 函數(shù)例如:int f(int a) /*定義f函數(shù),a為形參*/auto int b,c=3; /*定義b、c為自動變量*/ 又如:auto in
58、t b,c=3; int b,c=3; /*兩者等價*/ 整理課件 C語言程序設計 第八章 函數(shù)例 auto 變量的作用域main() int x=1; void prt(void); int x=3; prt(); printf(“2nd x=%dn”,x); printf(“1st x=%dn”,x);void prt(void) int x=5; printf(“3th x=%dn”,x);運行結果:3th x=52nd x=31st x=1x=1作用域x=1作用域x=3作用域x=5作用域整理課件用static聲明局部變量 若希望函數(shù)調用結束后,局部變量的值保留,則指定該變量為靜態(tài)局部變
59、量,用static對變量加以聲明。 C語言程序設計 第八章 函數(shù)例 局部靜態(tài)變量值具有可繼承性main() void increment(void); increment(); increment(); increment();void increment(void) int x=0; x+; printf(“%dn”,x);運行結果:1 1 1main() void increment(void); increment(); increment(); increment();void increment(void) static int x=0; x+; printf(“%dn”,x);運行
60、結果:1 2 3整理課件 C語言程序設計 第八章 函數(shù)例8.17 考察靜態(tài)局部變量的值#include void main( ) int f(int) ; int a=2, i; for(i=0; i3; i+) printf(“%d ”, f(a); int f(int a) auto b=0; static c=3; b=b+1; c=c+1; return(a + b + c); main( )i a f(a)0 2 f(2)1 2 f(2)2 2 f(2)f(a) a b c return(a+b+c)2 0 3 1 4 return(7)2 0 4 1 5 return(8)2 0 5 1 6 return(9)運行結果:7 8 9對靜態(tài)局部變量的說明:分配在靜態(tài)區(qū),程序運行結束釋放存儲單元。賦初值一次未賦初值時為0,前次結果保留。 局部動態(tài)變量若未賦初值,其值不確定,局部靜態(tài)變量未賦初值,其值為0或0(字符變量)。靜態(tài)局部變量在函數(shù)調用結束后雖存在,但其它函數(shù)不能引用它。整理課件使用局
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 給水工程維修協(xié)議書范本
- 汽車質押貸款信用評估協(xié)議
- 車庫租賃合同及車位分配管理協(xié)議
- 車位買賣合同補充協(xié)議(含車位租賃期限約定)
- 咖啡館門面房租賃管理服務合同
- 高端酒店客房管理承包經(jīng)營合同范本
- 廚房安全工作協(xié)議書范本
- 生態(tài)旅游項目投資建設合同
- 房屋裝修保修協(xié)議書范本
- 沿街商鋪租賃合同參考范本
- 2024北京海淀初一(上)期中數(shù)學試卷及答案解析
- 2023年貴州貴州貴安發(fā)展集團有限公司招聘筆試真題
- 七年級下冊古詩詞對比閱讀訓練-2025年中考語文復習之古代詩歌閱讀
- 配合、協(xié)調、服務方案
- 2025年中學教師綜合素質考點梳理
- 神經(jīng)內(nèi)科常見藥物及管理
- 2025版國家開放大學法學本科《國際私法》歷年期末紙質考試案例題題庫
- 【MOOC】中醫(yī)診斷學-福建中醫(yī)藥大學 中國大學慕課MOOC答案
- 物理-2025年中考終極押題猜想(廣州專用)(原卷版)
- 慢性乙型肝炎防治指南(2022年版)解讀
- 技師機械類選擇題及答案
評論
0/150
提交評論