版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、C語言程序設(shè)計,第四章 函數(shù)4.1庫函數(shù)4.2自定義函數(shù)4.3函數(shù)的參數(shù)傳遞與返回值4.4遞歸函數(shù)4.5局部變量、全局變量與變量作用域4.6函數(shù)綜合應(yīng)用,學(xué)習(xí)目標(biāo):理解函數(shù)在程序設(shè)計中的作用和地位掌握函數(shù)的定義、原型聲明和調(diào)用方法熟練掌握函數(shù)的參數(shù)傳遞與返回值理解局部變量、全局變量、靜態(tài)變量和變量的作用域掌握遞歸函數(shù)的編寫技術(shù)理解和掌握結(jié)構(gòu)設(shè)計和模塊化程序設(shè)計方法了解地址和指針的概念,了解地址做函數(shù)參數(shù)的特點和
2、作用,為什么要用函數(shù)?,問題:如果程序的功能比較多,規(guī)模比較大,把所有代碼都寫在main函數(shù)中,就會使主函數(shù)變得龐雜、頭緒不清,閱讀和維護(hù)變得困難有時程序中要多次實現(xiàn)某一功能,就需要多次重復(fù)編寫實現(xiàn)此功能的程序代碼,這使程序冗長,不精煉,解決的方法:用模塊化程序設(shè)計的思路采用“組裝”的辦法簡化程序設(shè)計的過程可以使用庫函數(shù):事先編好一批實現(xiàn)各種不同功能的函數(shù),把它們保存在函數(shù)庫中,需要時直接用可以使用自己編寫的函數(shù):在設(shè)計一個較
3、大的程序時,往往把它分為若干個程序模塊,每一個模塊包括一個或多個函數(shù),每個函數(shù)實現(xiàn)一個特定的功能,函數(shù)的名字應(yīng)反映其代表的功能C程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成,主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用,同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次在程序設(shè)計中要善于利用函數(shù),可以減少重復(fù)編寫程序段的工作量,同時可以方便地實現(xiàn)模塊化的程序設(shè)計,,導(dǎo)例:平方根表1.問題描述 輸出100以內(nèi)整數(shù)的平方根表,要求每行輸出10個。
4、2.問題分析C 語言提供了一個庫函數(shù)sqrt( ),使用時直接調(diào)用該庫函數(shù)就可以計算出平方根值。,,3.算法描述(1)定義兩個整型變量m,n。(2)輸出平方根表時,要注意格式。首先輸出表頭,輸出0~9的整數(shù)。(3)然后按照格式要求輸出平方根表,m為行數(shù)0~9,n為列數(shù)0~9,則表內(nèi)對應(yīng)第m行第n列的表值為sqrt(m*10+n),每行10個。,1,1,#include #include //數(shù)學(xué)類頭文件int
5、 main(){ int m,n;,for (n=0;n<10;n++) printf("%7d", n); //輸出表頭 printf("\n");,for(m=0;m<10;m++){ printf("%d",m); for (n=0;n<10;n++)printf("%7.4
6、f" ,sqrt(m*10+n)); //調(diào)用庫函數(shù)sqrt()printf("\n"); },4.程序?qū)崿F(xiàn),return 0; },6.程序分析庫函數(shù)sqrt()原型放在文件math.h文件中,所在若在程序中使用該函數(shù),就需要在程序頭加上語句#include 。程序中語句段for (n=0;n<10;n++) 是輸出表頭,輸出列號:0~9;表頭表示出0-9列的列號
7、。用輸出函數(shù)printf(“%7.4f”)控制輸出的值為保留4位小數(shù)的實數(shù)。,,4.1.3庫函數(shù)使用方法庫函數(shù)的定義已經(jīng)在C語言提供的標(biāo)準(zhǔn)函數(shù)庫中,所以調(diào)用時,需要在程序的前面利用編譯預(yù)處理命令include將相應(yīng)的函數(shù)原型加入到程序中。#include指令的一般形式如下: #include 或 #include“文件名”例如: #include,,4.1.4常用的庫函數(shù)常用的函數(shù)頭文件,各自包
8、含的函數(shù)類別如下:math.h: 包含與數(shù)學(xué)相關(guān)的函數(shù) ctype.h:包含與字符處理有關(guān)的函數(shù)string.h:包含與字符串處理有關(guān)的函數(shù)stdio.h : 包含與輸入輸出有關(guān)的函數(shù)stdlib.h : 包含與動態(tài)分配存儲空間和數(shù)值轉(zhuǎn)換有關(guān)的函數(shù) process.h:包含與過程控制有關(guān)的函數(shù),4.2自定義函數(shù)4.2.1導(dǎo)例:階乘累加和4.2.2導(dǎo)例:三色球問題4.2.3函數(shù)的定義、聲明和調(diào)用4.2.4函數(shù)調(diào)用
9、過程分析,,,導(dǎo)例:計算圓柱體積,輸入圓柱體的高和半徑,求圓柱體積,volume=π*r2*h。要求定義和調(diào)用函數(shù)cylinder (r, h )計算圓柱體的體積。,/* 計算圓柱體積 */#include int main( void ){ double height, radius, volume;double cylinder (double r, double h); /* 函數(shù)聲明*/
10、printf ("Enter radius and height: ");scanf ("%lf%lf", &radius, &height); /* 調(diào)用函數(shù),返回值賦給volume */volume = cylinder (radius, height );printf ("Volume = %.3f\n", volume);
11、return 0;},/* 定義求圓柱體積的函數(shù) */double cylinder (double r, double h){double result;result =3.1415926 * r * r * h; /* 計算體積 */return result; /* 返回結(jié)果 */},Enter radius and height: 3.0 10Volume = 282.743,
12、#include int main( void ){ double height, radius, volume;double cylinder (double r, double h); /* 函數(shù)聲明*/printf ("Enter radius and height: ");scanf ("%lf%lf", &radius, &hei
13、ght);volume = cylinder (radius, height );printf ("Volume = %.3f\n", volume);return 0;},double cylinder (double r, double h) {double result;result =3.1415926 * r * r * h; return result;},,E
14、nter radius and height: 3.0 10Volume = 282.743,,問題: 函數(shù)是如何運行的?,,,,4.2.1導(dǎo)例:階乘累加和1.問題描述 從鍵盤輸入1個整數(shù),計算1~n的各個數(shù)的階乘的累加和,即1+2!+3!+…+n!。2.問題分析 實現(xiàn)各個數(shù)的階乘的累加和,需要先計算每個數(shù)的階乘,然后累加到一起。,sum=0; for ( i = 1; i <= n; i++ )
15、 { item =i!; sum=sum+item; } 可用一個函數(shù)factorial()專門來計算每個數(shù)的階乘,然后用一個循環(huán)語句來計算1~n的各個階乘的累加的結(jié)果。,4.程序?qū)崿F(xiàn)#include double factorial (int i); //函數(shù)聲明int main(void){ int i, n; double sum=0; printf(“
16、Enter 1 integers:”); scanf("%d",&n); for(i = 1; i <=n; i++ ) sum = sum + factorial (i); //函數(shù)調(diào)用 printf("1!+…+%d! = %.0f\n", n,sum); return 0;},double factorial (int i) //函數(shù)定義
17、{ int j; double result = 1; for (j = 1; j<= i;j++) result = result *j ; return result ; //返回結(jié)果},一、函數(shù)的定義函數(shù)定義的基本形式是:函數(shù)類型 函數(shù)名(形參表) /*函數(shù)頭,沒有分號*/{ 函數(shù)實現(xiàn)過程 /*函數(shù)體*/}形參表 給出函數(shù)所有形參
18、的名稱和類型,它的格式為: 類型1 形參1,類型2 形參2,……類型n 形參n,4.2.3函數(shù)的定義、聲明和調(diào)用,函數(shù)類型 函數(shù)名(形參表)/* 函數(shù)首部 */{ /* 函數(shù)體 */ 函數(shù)實現(xiàn)過程 return 表達(dá)式;},,,把函數(shù)運算的結(jié)果回送給主函數(shù),只能返回一個值,,函數(shù)返回值的類型,沒有分號,double
19、cylinder (double r, double h){ double result; result = 3.1415926 * r * r * h; return result;},,double cylinder (double r, double h) /* 函數(shù)首部 */{/* 函數(shù)體,寫在一對大括號內(nèi) */ double result;result =3.1
20、415926 * r * r * h; /* 計算圓柱體積 */return result; /* 返回運算結(jié)果*/},1、分析函數(shù)的定義,,函數(shù)類型,,,函數(shù)名,形參表,與函數(shù)類型一致,,形參,類型1 參數(shù)1 ,類型2 參數(shù)2 ,……,類型n 參數(shù)n參數(shù)之間用逗號分隔,每個參數(shù)前面的類型都必須分別寫明,函數(shù)類型 函數(shù)名(形參表){ 函數(shù)實現(xiàn)過程 ret
21、urn 表達(dá)式;},不能寫成 double r, h,double cylinder (double r, double h){ double result; result =3.1415926 * r * r * h; return result;},,,double factorial (int i) //函數(shù)定義{ int j;double result = 1; for
22、(j = 1; j=d2) return d1; else return d2; },2.函數(shù)原型聲明,函數(shù)類型 函數(shù)名(形參表);double cylinder (double r, double h); double factorial (int n);void pyramid (int n);函數(shù)必須先定義后調(diào)用,將主調(diào)函數(shù)放在被調(diào)函數(shù)的后面,就
23、像變量先定義后使用一樣。如果自定義函數(shù)在主調(diào)函數(shù)的后面,就需要在函數(shù)調(diào)用前,加上函數(shù)原型聲明。函數(shù)聲明:說明函數(shù)的類型和參數(shù)的情況,以保證程序編譯時能判斷對該函數(shù)的調(diào)用是否正確。,只寫函數(shù)定義中的第1行(函數(shù)首部),并以分號結(jié)束。,2、函數(shù)的聲明,函數(shù)類型 函數(shù)名(形參表); //以分號結(jié)束 double factorial (int n); void ball(int x);,,,3、函數(shù)的調(diào)用,定義一個
24、函數(shù)后,就可以通過程序來調(diào)用這個函數(shù)。調(diào)用標(biāo)準(zhǔn)庫函數(shù)時,在程序的最前面用#include命令包含相應(yīng)的頭文件。調(diào)用自定義函數(shù)時,程序中必須有與調(diào)用函數(shù)相對應(yīng)的函數(shù)定義。,函數(shù)調(diào)用的一般形式為: 函數(shù)名(實際參數(shù)表); factorial ( i );實際參數(shù)與形式參數(shù)的數(shù)據(jù)類型和個數(shù)一一對應(yīng),以分號結(jié)束,函數(shù)調(diào)用的形式,for(i = 1; i <=n; i++ )
25、sum = sum + factorial (i); //函數(shù)調(diào)用,函數(shù)的調(diào)用,double factorial (int i) //函數(shù)定義{ int j;double result = 1; for (j = 1; j<= i;j++)result = result *j ; return result ; //返回結(jié)果},例 求兩個數(shù)中的最大值#include v
26、oid main( ){ int a,b,c,max(int x, int y); scanf(“%d,%d”,&a,&b); c=max(a, b); printf(“Max is %d”,c);}int max(int x, int y){ int z; if(x>y)z=x; else z=y; return(z);},定義函數(shù)時,形參調(diào)用函數(shù)時,實參,函數(shù)的調(diào)用,函數(shù)調(diào)用的形
27、式,對于實現(xiàn)計算功能的函數(shù),函數(shù)調(diào)用通常出現(xiàn)在兩種情況:賦值語句volume = cylinder(radius, height );輸出函數(shù)的實參printf(“%f”, cylinder(radius, height ) );,函數(shù)調(diào)用的過程,計算機(jī)在執(zhí)行程序時,從主函數(shù)main開始執(zhí)行,如果遇到某個函數(shù)調(diào)用,主函數(shù)被暫停執(zhí)行,轉(zhuǎn)而執(zhí)行相應(yīng)的函數(shù),該函數(shù)執(zhí)行完后,將返回主函數(shù),然后再從原先暫停的位置繼續(xù)執(zhí)行。函數(shù)
28、遇return返回主函數(shù),分析函數(shù)調(diào)用的過程,#include int main( void ){ double height, radius, volume;double cylinder (double r, double h); printf ("Enter radius and height: ");scanf ("%lf%lf", &radius,
29、 &height);volume = cylinder (radius, height );printf ("Volume = %.3f\n", volume);return 0; }double cylinder (double r, double h){double result;result =3.1415926 * r * r * h; return result;
30、 },調(diào)用函數(shù),,,實參?形參,執(zhí)行函數(shù)中的語句,返回調(diào)用它的地方,,,,,參數(shù)傳遞,函數(shù)定義時的參數(shù)被稱為形式參數(shù)(簡稱形參)double cylinder (double r, double h);函數(shù)調(diào)用時的參數(shù)被稱為實際參數(shù)(簡稱實參)volume = cylinder (radius, height);參數(shù)傳遞:實參?形參在參數(shù)傳遞過程中,實參
31、把值復(fù)制給形參。形參和實參一一對應(yīng):數(shù)量一致,類型一致,順序一致形參:變量,用于接受實參傳遞過來的值實參:常量、變量或表達(dá)式,單向傳遞,函數(shù)結(jié)果返回,完成確定的運算,將運算結(jié)果返回給主調(diào)函數(shù)。函數(shù)結(jié)果返回的形式:return 表達(dá)式;return (表達(dá)式);,,,,,在執(zhí)行函數(shù)調(diào)用時,實參把值計算出來,拷貝 給相應(yīng)位置的形參;函數(shù)執(zhí)行完后,通過 return( ),可返回一個結(jié)果值。 實參與形參
32、 有多個實參時 形參的改變個數(shù)相同、類型一致 后面的先計算 不影響實參 變量的值 只能返回一個結(jié)果,
33、 類型與函數(shù)定義時一致,,,要調(diào)用函數(shù),必須先要聲明!,,,小結(jié):,4.3 函數(shù)的參數(shù)傳遞與返回值4.3.1導(dǎo)例:爬動的蠕蟲4.3.2導(dǎo)例:日K蠟燭圖4.3.3函數(shù)的參數(shù)傳遞4.3.4函數(shù)的返回值,從函數(shù)是否有參數(shù)和返回值的角度,可以將函數(shù)分為:①有參數(shù)有返回值函數(shù)②有參數(shù)無返回值函數(shù) ③無參數(shù)有返回值函數(shù)④無參數(shù)無返回值函數(shù),導(dǎo)例:判斷素數(shù)的函數(shù),求100以內(nèi)的全部
34、素數(shù),每行輸出10個。素數(shù)就是只能被1和自身整除的正整數(shù),1不是素數(shù),2是素數(shù)。要求定義和調(diào)用函數(shù)prime (m)判斷m是否為素數(shù),當(dāng)m為素數(shù)時返回1,否則返回0。 算法描述:對2~100之間的每個數(shù)進(jìn)行判斷,若是素數(shù),則輸出該數(shù)。for(m = 2; m <= 100; m++) if (m是素數(shù)) printf("%d ", m);,prime(m) != 0,①有
35、參數(shù)有返回值函數(shù),例5-4 源程序,#include #include int main(void){ int count, m; int prime (int m); count = 0; for(m = 2; m <= 100; m++){ if ( prime(m) != 0 ){ printf("%6d", m );
36、 count++; if (count %10 == 0) printf ("\n"); } } printf ("\n");},int prime (int m){ int i, n; if ( m == 1 ) return 0;
37、 n = sqrt (m); for( i = 2; i <= n; i++) if (m % i == 0){ return 0; } return 1; },輸出5之內(nèi)的數(shù)字金字塔。,/* 輸出數(shù)字金字塔 */#include int main (void){ void pyramid (int n);/* 函數(shù)聲明 *
38、/pyramid(5);/* 調(diào)用函數(shù),輸出數(shù)字金字塔 */return 0;}void pyramid (int n) /* 函數(shù)定義 */{int i, j;for (i = 1; i <= n; i++){/* 需要輸出的行數(shù) */ for (j = 1; j <= n-i; j++) /* 輸出每行左邊的空格 */printf(&qu
39、ot; "); for (j = 1; j <= i; j++) /* 輸出每行的數(shù)字 */ printf(" %d ", i); /* 每個數(shù)字的前后各有一個空格 */ putchar ('\n'); }},1 2 2 3 3 3 4 4 4 45 5
40、5 5 5,for (i = 1; i <= n; i++) { for (j = 1; j <= n-i; j++) printf(“ ”); 一行中的數(shù)字顯示},,②有參數(shù)無返回值函數(shù),for (i = 1; i <= n; i++) { 一行的處理},一行中的空格處理; 一行中的數(shù)字顯示},不返回運算結(jié)果的函數(shù)定義,void 函數(shù)名(參數(shù)表)
41、/* 函數(shù)首部 */{ /* 函數(shù)體 */ 函數(shù)實現(xiàn)過程 return; /* 可以省略return */},這類函數(shù)通常用于屏幕輸出等,,表示不返回結(jié)果,不能省略, 否則函數(shù)類型被默認(rèn)定義為int,,#include int main (void){ int in( ); int n;/* 函數(shù)聲明 */n=in();
42、 /* 函數(shù)調(diào)用 */ printf(“%d”,n);return 0;}int in( ){ int x; scanf(“%d”,&x); return x;},③無參數(shù)有返回值函數(shù),函數(shù)沒有返回值——在聲明函數(shù)的時候,函數(shù)名前使用了保留字void。用函數(shù)調(diào)用語句調(diào)用。,#include void main( ){ void printstar(
43、); /*函數(shù)聲明*/ void print_message( ); /*函數(shù)聲明*/ printstar( ); print_message( ); printstar( );}void printstar( ){ printf(“*********\n”);}void print_message( ){ printf(“ How do you do!\n”);},輸出:*
44、**************** How do you do!*****************,④無參數(shù)無返回值函數(shù),,4.3.3函數(shù)的參數(shù)傳遞在調(diào)用函數(shù)時,實參與形參結(jié)合的具體過程是:計算實參表達(dá)式的值;將實參的值按賦值轉(zhuǎn)換規(guī)則轉(zhuǎn)換成對應(yīng)形參的數(shù)據(jù)類型;為形參分配存儲空間;將類型轉(zhuǎn)換后的實參的值傳遞給對應(yīng)的形參變量,然后執(zhí)行函數(shù)。,C語言中,函數(shù)的參數(shù)傳遞有兩種方式,即傳值和傳地址。 傳值:簡單地將實參的值復(fù)制一
45、份給形參,一旦復(fù)制完成,實參與其對應(yīng)的形參便沒有任何關(guān)系,這時在函數(shù)內(nèi)對形參的任何改變都不會影響到實參。 傳地址:將實參地址傳遞給形參,在函數(shù)內(nèi)對形參所對應(yīng)數(shù)據(jù)的處理實際上就是處理對應(yīng)的實參。簡單地理解就是此時實參和形參同一的,對形參的處理就是對對應(yīng)的實參的處理。 C語言中,當(dāng)函數(shù)的參數(shù)為指針類型或數(shù)組類型時 采用傳地址的方式,其他類型采用傳值方式。,,4.3.4函數(shù)的返回值 函數(shù)的調(diào)用本質(zhì)上是一個表達(dá)式,它將返回特定類型數(shù)
46、據(jù)的值(即返回值),因此只要該值能出現(xiàn)的位置,都可以使用該函數(shù)調(diào)用表達(dá)式。從函數(shù)返回值的類型看,有兩種類型:①是完成確定的運算,并由運算結(jié)果返回給主調(diào)函數(shù),稱為有返回值的函數(shù);函數(shù)類型用返回值類型指定。②是完成指定的工作,沒有確定的運算結(jié)果需返回給主調(diào)函數(shù),稱為無返回值的函數(shù)。函數(shù)類型用void指定。,,1、有返回值函數(shù)有返回值函數(shù)在函數(shù)定義時必須說明返回值的類型,在函數(shù)體中由return語句給出具體的返回值。有返回值ret
47、urn語句的一般形式如下: return 表達(dá)式; 或 return (表達(dá)式);先求解表達(dá)式的值,再返回其值。通常表達(dá)式的結(jié)果類型與函數(shù)的返回值類型一致return語句的作用有兩個:一是結(jié)束函數(shù)的運行;二是帶著運算結(jié)果(表達(dá)式的值)返回主調(diào)函數(shù)。,函數(shù)有返回值:函數(shù)執(zhí)行完畢后,返回一個相應(yīng)類型的數(shù)值。用return語句返回該值:return 表達(dá)式;用函數(shù)調(diào)用表達(dá)式調(diào)用。,如:printf(“T
48、he average is %6.2f”, average(dataArray, n));ave= average(dataArray, n);,,2、無返回值函數(shù) 無返回值函數(shù)只完成某種特定的處理,函數(shù)執(zhí)行后無須向調(diào)用者返回計算結(jié)果。 無返回值函數(shù)在函數(shù)定義時必須將返回值的類型說明為void(即空類型),函數(shù)體中的return語句只結(jié)束函數(shù)的執(zhí)行。如果函數(shù)類型為void,則函數(shù)返回直接用return語句,不必跟上一個表達(dá)式。
49、 無返回值return語句的一般形式如下: return ; 在函數(shù)定義中也可以沒有return語句,此時函數(shù)執(zhí)行到最后一條語句。,4.4遞歸函數(shù)4.4.1導(dǎo)例:假幣問題(三分法)4.4.2導(dǎo)例:Fibonacci數(shù)列4.4.3遞歸函數(shù)的執(zhí)行過程4.4.4遞歸函數(shù)的效率分析,,4.4.2導(dǎo)例:Fibonacci數(shù)列1.問題描述從鍵盤輸入一個整數(shù)n,輸出斐波那契數(shù)列(fibonacci)的前n項。要求每
50、行打印10個數(shù)后換行。2.問題分析斐波那契數(shù)列為1,1,2,3,5,8,13……即從第三項開始,各項值都等于前兩項值之和。斐波那契數(shù)列的定義為: 1 n=0f(n)= 1 n=1 f(n-1)+f(n-2) n>1,,采用非遞歸方法,程序片段如下: first=1,second=1; scanf("%d&quo
51、t;,&n); for(i=0; i<n;i++) { result=first+second; printf("%.0f",result); first=second; second=result; },#include int fib(int k);main(){ int n,i,count=0; printf("E
52、nter 1 integers\n:"); scanf("%d",&n); for(i=0;i<n;i++) { printf("%10d",fib(i)); count++; if (count%5==0) printf("\n"); }},int fib(int n
53、){ int f; if (n==0) f= 1; else if (n==1) f=1; else f=fib(n-1)+fib(n-2); return f;},6.程序分析,,4.4.3遞歸函數(shù)的執(zhí)行過程遞歸函數(shù)要注意兩點: ①遞歸出口: 遞歸的結(jié)束條件,說明到何時不再遞歸調(diào)用;否則無限制遞歸,終將使棧空
54、間溢出 ; ②遞歸公式:當(dāng)前函數(shù)結(jié)果與準(zhǔn)備調(diào)用的函數(shù)結(jié)果之間的關(guān)系,即原問題是如何分解為子問題的。 1 n=0 fact(1)=1 遞歸出口n!= n×(n-1)! n>1 fact(n)=n*fact(n-1) 遞歸公式,,,,實現(xiàn)階乘遞歸算法的遞歸函數(shù) long fact(int n) {
55、if (n==0) return 1;else return n* fact(n-1); },y=fact(3),遞歸函數(shù)的調(diào)用過程,,遞歸程序的內(nèi)部執(zhí)行過程函數(shù)的遞歸調(diào)用類似于多個函數(shù)的嵌套調(diào)用,只不過調(diào)用函數(shù)和被調(diào)用函數(shù)是同一個函數(shù)。遞歸調(diào)用的內(nèi)部執(zhí)行過程如下:①運行開始時,系統(tǒng)設(shè)立工作棧來保存每次調(diào)用的運行環(huán)境,包括形參、局部變量和返回地址;②遞歸調(diào)用前,將調(diào)用函數(shù)的
56、形參、局部變量以及調(diào)用后的返回地址進(jìn)棧;③調(diào)用結(jié)束后,將棧頂數(shù)據(jù)出棧,恢復(fù)調(diào)用前的運行環(huán)境,使相應(yīng)的形參和局部變量恢復(fù)為調(diào)用前的值,然后從返回地址指定的位置繼續(xù)執(zhí)行調(diào)用函數(shù)。,,4.4.4遞歸函數(shù)的效率分析遞歸函數(shù)如果很緩慢地逼近到遞歸結(jié)束條件,會使性能大大下降。遞歸增加了系統(tǒng)開銷,時間上,執(zhí)行調(diào)用與返回的額外工作要占用CPU時間??臻g上,隨著每遞歸一次,棧內(nèi)存就多占一塊,即要分配相應(yīng)的存儲空間,并完成參數(shù)的傳遞、函數(shù)的返回等,在
57、程序的執(zhí)行效率和所消耗的存儲空間上,和非遞歸相比沒有任何優(yōu)勢。一般的遞歸都可以通過相應(yīng)的方法轉(zhuǎn)化為非遞歸的,所以不推薦使用遞歸,特別是不推薦使用遞歸層次較多的遞歸。,4.5 C局部變量、全局變量與變量作用域4.5.1導(dǎo)例:富翁與騙子4.5.2導(dǎo)例:簡易庫存存取貨管理4.5.3局部變量和全局變量4.5.4變量的作用域和生存期,分別輸入2個復(fù)數(shù)的實部與虛部,用函數(shù)實現(xiàn)計算2個復(fù)數(shù)之和與之積。,分析若2個復(fù)數(shù)分別為: c
58、1=x1+y1i , c2=x2+y2i,則:c1+c2 = (x1+x2) + (y1+y2)ic1*c2 = (x1*x2-y1*y2) + (x1*y2+x2*y1)i,復(fù)數(shù)運算,#include float result_real, result_imag;/* 全局變量,用于存放函數(shù)結(jié)果 */int main(void) { float imag1, imag2, real1, real2;
59、 /* 兩個復(fù)數(shù)的實、虛部變量 *//* 函數(shù)聲明 */void complex_prod(float real1, float imag1, float real2, float imag2);void complex_add(float real1, float imag1, float real2, float imag2);printf("Enter 1st complex number(real
60、 and imaginary): ");scanf("%f%f", &real1, &imag1); /* 輸入第一個復(fù)數(shù) */printf("Enter 2nd complex number(real and imaginary): ");scanf("%f%f", &real2, &imag2); /*
61、輸入第兩個復(fù)數(shù) */complex_add(real1, imag1, real2, imag2);/* 求復(fù)數(shù)之和 */printf("addition of complex is %f+%fi\n", result_real, result_imag);complex_prod(real1, imag1, real2, imag2); /* 求復(fù)數(shù)之積 */printf("
62、product of complex is %f+%fi\n", result_real, result_imag);return 0;},運行結(jié)果Enter 1st complex number(real and imaginary):1 1Enter 2nd complex number(real and imaginary):-2 3addition of complex is -1.000000+4.000
63、000iproduct of complex is -5.000000+1.000000i,void complex_add(float real1, float imag1, float real2, float imag2){result_real = real1 + real2;result_imag = imag1 + imag2;},void complex_prod(float real1, float i
64、mag1, float real2, float imag2){result_real = real1*real2 - imag1*imag2;result_imag = real1*imag2 + real2*imag1;},局部變量在函數(shù)內(nèi)定義的變量(包括形參)作用范圍:本函數(shù)內(nèi)部定義在復(fù)合語句內(nèi)的變量作用范圍:復(fù)合語句內(nèi)部全局變量在函數(shù)以外定義的變量,不從屬于任一函數(shù)。作用范圍:從定義處到源文件結(jié)束(
65、包括各函數(shù)),4.5.3局部變量和全局變量,在復(fù)合語句中定義局部變量,#include int main (void){ int a; a = 1; { /* 復(fù)合語句開始 */ int b = 2; b = a + b; a = a + b;}
66、/* 復(fù)合語句結(jié)束 */ printf ("%d " , a ); return 0;},b:小范圍內(nèi)的臨時變量,,,輸出:4,改成b會如何?,全局變量定義,#include "stdio.h"int x; /* 定義全局變量x */int f( ){ int x = 4; /* x為局部變量 */ return x;}int ma
67、in(void){ int a = 1; x = a; /* 對全局變量 x 賦值 */ a = f( ); /* a的值為4 */ { int b = 2; b = a + b; /* b的值為6 */ x = x + b; /* 全局變量運算 */ } printf(&quo
68、t;%d %d" , a, x); return 0;},若局部變量與全局變量同名,局部變量優(yōu)先,,,,,輸出:4, 7,變量作用范圍示例,int x=1;void main( ){ int a=2; …….. { int b=3; ….. } f( ); ………..}int t=4 ;void f( )
69、{ int x=5, b=6; …….}int a=7;,x=? a=? b=?,b=?,x=5 b=6 t=4 a沒定義,,,,,,,x=? b=? t=? a=?,用函數(shù)實現(xiàn)財務(wù)現(xiàn)金記賬。先輸入操作類型(1收入,2支出,0結(jié)束),再輸入操作金額,計算現(xiàn)金剩余額,經(jīng)多次操作直到輸入操作為0結(jié)束。要求定義并調(diào)用函數(shù),其中現(xiàn)金收入與現(xiàn)金支出分別用不同函數(shù)實現(xiàn)。分析: 設(shè)變量cash保存現(xiàn)金余額值,
70、由于它被主函數(shù)、現(xiàn)金收入與現(xiàn)金支出函數(shù)共用,任意使用場合其意義與數(shù)值都是明確和唯一的,因此令其為全局變量。,財務(wù)現(xiàn)金記賬,#include float cash;/* 定義全局變量,保存現(xiàn)金余額 */int main(void) { int choice;float value;void income(float number), expend(float number);/* 函數(shù)聲明 */cash = 0
71、;/* 初始金額=0 */printf("Enter operate choice(0--end, 1--income, 2--expend):");scanf("%d", &choice);/* 輸入操作類型 */while (choice != 0){/* 若輸入類型為0,循環(huán)結(jié)束 */ if (choice == 1 || choice == 2
72、) {printf("Enter cash value:"); /* 輸入操作現(xiàn)金額 */scanf("%f", &value); if (choice == 1) income(value); /* 函數(shù)調(diào)用,計算現(xiàn)金收入 */else expend(value); /* 函數(shù)調(diào)用,計算現(xiàn)金支出 */printf(&quo
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《c語言程序設(shè)計》
- c語言程序設(shè)計
- c語言程序設(shè)計
- c語言程序設(shè)計
- c語言程序設(shè)計
- [學(xué)習(xí)]樊媛媛c語言程序設(shè)計08-函數(shù)
- c語言程序設(shè)計(譚浩強)
- c語言程序設(shè)計教程
- c語言程序設(shè)計3
- c語言程序設(shè)計論文
- c語言程序設(shè)計論文
- c語言程序設(shè)計49295
- c語言程序設(shè)計論文
- c語言程序設(shè)計試題
- c語言程序設(shè)計譚浩強
- c語言程序設(shè)計答案
- c語言程序設(shè)計教案
- c語言程序設(shè)計-譚浩強
- c語言程序設(shè)計報告
- c語言程序設(shè)計課程
評論
0/150
提交評論