




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、C C語言程序設(shè)計語言程序設(shè)計2第四章第四章 函數(shù)函數(shù)4.14.1庫函數(shù)庫函數(shù)4.24.2自定義函數(shù)自定義函數(shù)4.34.3函數(shù)的參數(shù)傳遞與返回值函數(shù)的參數(shù)傳遞與返回值4.44.4遞歸函數(shù)遞歸函數(shù)4.54.5局部變量、全局變量與變量作用域局部變量、全局變量與變量作用域4.64.6函數(shù)綜合應用函數(shù)綜合應用3學習目標:學習目標: 理解函數(shù)在程序設(shè)計中的作用和地位理解函數(shù)在程序設(shè)計中的作用和地位 掌握函數(shù)的定義、原型聲明和調(diào)用方法掌握函數(shù)的定義、原型聲明和調(diào)用方法 熟練掌握函數(shù)的參數(shù)傳遞與返回值熟練掌握函數(shù)的參數(shù)傳遞與返回值 理解局部變量、全局變量、靜態(tài)變量和變量的作用域理解局部變量、全局變量、靜態(tài)變
2、量和變量的作用域 掌握遞歸函數(shù)的編寫技術(shù)掌握遞歸函數(shù)的編寫技術(shù) 理解和掌握結(jié)構(gòu)設(shè)計和模塊化程序設(shè)計方法理解和掌握結(jié)構(gòu)設(shè)計和模塊化程序設(shè)計方法 了解地址和指針的概念,了解地址做函數(shù)參數(shù)的特點和作了解地址和指針的概念,了解地址做函數(shù)參數(shù)的特點和作用用4問題:問題:如果程序的功能比較多,規(guī)模比較大,把所有代碼都寫如果程序的功能比較多,規(guī)模比較大,把所有代碼都寫在在mainmain函數(shù)中,就會使主函數(shù)變得龐雜、頭緒不清,閱函數(shù)中,就會使主函數(shù)變得龐雜、頭緒不清,閱讀和維護變得困難讀和維護變得困難有時程序中要多次實現(xiàn)某一功能,就需要多次重復編寫有時程序中要多次實現(xiàn)某一功能,就需要多次重復編寫實現(xiàn)此功能的
3、程序代碼實現(xiàn)此功能的程序代碼,這使程序冗長,不精煉這使程序冗長,不精煉5解決的方法:用解決的方法:用模塊化程序設(shè)計的思路模塊化程序設(shè)計的思路 采用采用“組裝組裝”的辦法簡化程序設(shè)計的過程的辦法簡化程序設(shè)計的過程 可以使用庫函數(shù)可以使用庫函數(shù):事先編好一批實現(xiàn)各種不同功能的函數(shù)事先編好一批實現(xiàn)各種不同功能的函數(shù),把它們把它們保存在函數(shù)庫中保存在函數(shù)庫中,需要時需要時直接用直接用 可以使用自己編寫的函數(shù):可以使用自己編寫的函數(shù):在設(shè)計一個較大的程序時,往往把它分在設(shè)計一個較大的程序時,往往把它分為若干個程序模塊,每一個模塊包括一個或多個函數(shù),每個函數(shù)實為若干個程序模塊,每一個模塊包括一個或多個函數(shù)
4、,每個函數(shù)實現(xiàn)一個特定的功能現(xiàn)一個特定的功能,函數(shù)的名字應反映其代表的功能函數(shù)的名字應反映其代表的功能 程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成程序可由一個主函數(shù)和若干個其他函數(shù)構(gòu)成,主函數(shù)調(diào)用其他函主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用數(shù),其他函數(shù)也可以互相調(diào)用,同一個函數(shù)可以被一個或多個函數(shù)同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次調(diào)用任意多次 在程序設(shè)計中要善于利用函數(shù),可以減少重復編寫程序段的工作量,在程序設(shè)計中要善于利用函數(shù),可以減少重復編寫程序段的工作量,同時可以方便地實現(xiàn)模塊化的程序設(shè)計同時可以方便地實現(xiàn)模塊化的程序設(shè)計67導例:平方根表導例:平方根表1 1問題描述問題描述 輸
5、出輸出100100以內(nèi)整數(shù)的平方根表,要求每行輸出以內(nèi)整數(shù)的平方根表,要求每行輸出1010個。個。2 2問題分析問題分析C C 語言提供了一個庫函數(shù)語言提供了一個庫函數(shù)sqrt( ),使用時直接調(diào)用該,使用時直接調(diào)用該庫函數(shù)就可以計算出平方根值。庫函數(shù)就可以計算出平方根值。83 3算法描述算法描述(1 1)定義兩個整型變量)定義兩個整型變量m m,n n。(2 2)輸出平方根表時,要注意格式。首先輸出表頭,輸出)輸出平方根表時,要注意格式。首先輸出表頭,輸出0 09 9的整數(shù)。的整數(shù)。(3 3)然后按照格式要求輸出平方根表,)然后按照格式要求輸出平方根表,m m為行數(shù)為行數(shù)0 09 9,n n
6、為列為列數(shù)數(shù)0 09 9,則表內(nèi)對應第,則表內(nèi)對應第m m行第行第n n列的表值為列的表值為sqrt(msqrt(m* *10+n)10+n),每行每行1010個。個。91 11 110#include #include /數(shù)學類頭文件數(shù)學類頭文件int main() int m,n;for (n=0;n10;n+) printf(%7d, n); /輸出表頭輸出表頭 printf(n);for(m=0;m10;m+) printf(%d,m); for (n=0;n10;n+)printf(%7.4f ,sqrt(m*10+n); /調(diào)用庫函數(shù)調(diào)用庫函數(shù)sqrt()printf(n); 4
7、4程序?qū)崿F(xiàn)程序?qū)崿F(xiàn) return 0; 116.6.程序分析程序分析 庫函數(shù)庫函數(shù)sqrt()sqrt()原型放在文件原型放在文件math.hmath.h文件中,所在若在程序文件中,所在若在程序中使用該函數(shù),就需要在程序頭加上語句中使用該函數(shù),就需要在程序頭加上語句#include #include 。 程序中語句段程序中語句段for (n=0;n10;n+) for (n=0;n10;n+) 是輸出表頭,輸出列號是輸出表頭,輸出列號:0 09 9;表頭表示出;表頭表示出0-90-9列的列號。列的列號。 用輸出函數(shù)用輸出函數(shù)printf(“%7.4f”)printf(“%7.4f”)控制輸出的
8、值為保留控制輸出的值為保留4 4位小位小數(shù)的實數(shù)。數(shù)的實數(shù)。124.1.3庫函數(shù)使用方法庫函數(shù)使用方法庫函數(shù)的定義已經(jīng)在庫函數(shù)的定義已經(jīng)在C語言提供的標準函數(shù)庫中,所以調(diào)用時語言提供的標準函數(shù)庫中,所以調(diào)用時,需要在程序的前面利用編譯預處理命令,需要在程序的前面利用編譯預處理命令include將相應的函將相應的函數(shù)原型加入到程序中。數(shù)原型加入到程序中。#include指令的一般形式如下:指令的一般形式如下: #include 或或 #include“文件名文件名”例如:例如: #include13.4常用的庫函數(shù)常用的庫函數(shù)常用的函數(shù)頭文件,各自包含的函數(shù)類別如下:常用的函
9、數(shù)頭文件,各自包含的函數(shù)類別如下:math.h: 包含與數(shù)學相關(guān)的函數(shù)包含與數(shù)學相關(guān)的函數(shù) ctype.h:包含與字符處理有關(guān)的函數(shù)包含與字符處理有關(guān)的函數(shù)string.h:包含與字符串處理有關(guān)的函數(shù)包含與字符串處理有關(guān)的函數(shù)stdio.h : 包含與輸入輸出有關(guān)的函數(shù)包含與輸入輸出有關(guān)的函數(shù)stdlib.h : 包含與動態(tài)分配存儲空間和數(shù)值轉(zhuǎn)換有關(guān)的函數(shù)包含與動態(tài)分配存儲空間和數(shù)值轉(zhuǎn)換有關(guān)的函數(shù) process.h:包含與過程控制有關(guān)的函數(shù)包含與過程控制有關(guān)的函數(shù)154.24.2自定義函數(shù)自定義函數(shù).1導例:階乘累加和導例:階乘累加和.2導例:三色球問題導例:
10、三色球問題.3函數(shù)的定義、聲明和調(diào)用函數(shù)的定義、聲明和調(diào)用.4函數(shù)調(diào)用過程分析函數(shù)調(diào)用過程分析16導例:計算圓柱體積導例:計算圓柱體積 輸入圓柱輸入圓柱體體的高和半徑,求圓柱體積的高和半徑,求圓柱體積,volume=*r2*h。要求定義和調(diào)用函數(shù)要求定義和調(diào)用函數(shù)cylinder (r, h )計算圓柱體的計算圓柱體的體積。體積。 17/ /* * 計算圓柱體積計算圓柱體積 * */ /#include int main( void ) double height, radius, volume;double cylinder (double r, double
11、 h); /* 函數(shù)聲明函數(shù)聲明*/printf (Enter radius and height: );scanf (%lf%lf, &radius, &height); /* 調(diào)用函數(shù),返回值賦給調(diào)用函數(shù),返回值賦給volume */volume = cylinder (radius, height );printf (Volume = %.3fn, volume);return 0;18/* 定義求圓柱體積的函數(shù)定義求圓柱體積的函數(shù) */double cylinder (double r, double h)double result;result =3.1415926
12、* r * r * h; /* 計算體積計算體積 */return result; /* 返回結(jié)果返回結(jié)果 */ Enter radius and height: 3.0 10Volume = 282.74319#include int main( void ) double height, radius, volume;double cylinder (double r, double h); /* 函數(shù)聲明函數(shù)聲明*/printf (Enter radius and height: );scanf (%lf%lf, &radius, &height);volume = cy
13、linder (radius, height );printf (Volume = %.3fn, volume);return 0;double cylinder (double r, double h) double result;result =3.1415926 * r * r * h; return result;Enter radius and height: 3.0 10Volume = 282.743問題: 函數(shù)是如何運行的?.1導例:階乘累加和導例:階乘累加和1 1問題描述問題描述 從鍵盤輸入從鍵盤輸入1 1個整數(shù),計算個整數(shù),計算1 1n n的各個數(shù)的階乘
14、的的各個數(shù)的階乘的累加和,即累加和,即1+21+2!+3+3!+n!+n!。2 2問題分析問題分析 實現(xiàn)各個數(shù)的階乘的累加和,需要先計算每個數(shù)的實現(xiàn)各個數(shù)的階乘的累加和,需要先計算每個數(shù)的階乘,然后累加到一起。階乘,然后累加到一起。21sum=0; for ( i = 1; i = n; i+ ) item =i!; sum=sum+item; 可用一個函數(shù)可用一個函數(shù)factorial()factorial()專門來計算每個數(shù)的階乘,然后專門來計算每個數(shù)的階乘,然后用一個循環(huán)語句來計算用一個循環(huán)語句來計算1 1n n的各個階乘的累加的結(jié)果。的各個階乘的累加的結(jié)果。224 4程序?qū)崿F(xiàn)程序?qū)崿F(xiàn)#
15、include double factorial (int i); /函數(shù)聲明函數(shù)聲明int main(void) int i, n; double sum=0; printf(“Enter 1 integers:”); scanf(%d,&n); for(i = 1; i =n; i+ ) sum = sum + factorial (i); /函數(shù)調(diào)用函數(shù)調(diào)用 printf(1!+%d! = %.0fn, n,sum); return 0;double factorial (int i) /函數(shù)定義函數(shù)定義 int j; double result = 1; for (j = 1;
16、 j= i;j+) result = result *j ; return result ; /返回結(jié)果返回結(jié)果23一、函數(shù)的定義一、函數(shù)的定義函數(shù)定義的基本形式是:函數(shù)定義的基本形式是:函數(shù)類型函數(shù)類型 函數(shù)名(形參表)函數(shù)名(形參表) / /* *函數(shù)頭,沒有分號函數(shù)頭,沒有分號* */ / 函數(shù)實現(xiàn)過程函數(shù)實現(xiàn)過程 / /* *函數(shù)體函數(shù)體* */ / 形參表形參表 給出函數(shù)所有形參的名稱和類型,它的格式為:給出函數(shù)所有形參的名稱和類型,它的格式為: 類型類型1 1 形參形參1 1,類型,類型2 2 形參形參2 2,類型類型n n 形參形參n n.3函數(shù)的定義、聲明和調(diào)用
17、函數(shù)的定義、聲明和調(diào)用24函數(shù)類型函數(shù)類型 函數(shù)名(形參表)函數(shù)名(形參表)/ /* * 函數(shù)首部函數(shù)首部 * */ / / /* * 函數(shù)體函數(shù)體 * */ / 函數(shù)實現(xiàn)過程函數(shù)實現(xiàn)過程 return 表達式;表達式; 把函數(shù)運算的結(jié)果回送給主函數(shù)把函數(shù)運算的結(jié)果回送給主函數(shù)只能返回一個值只能返回一個值函數(shù)返回值的類型函數(shù)返回值的類型沒有分號沒有分號double cylinder (double r, double h) double result; result = 3.1415926 * r * r * h; return result;25double cylinder (double
18、 r, double h) /* 函數(shù)首部函數(shù)首部 */* 函數(shù)體,寫在一對大括號內(nèi)函數(shù)體,寫在一對大括號內(nèi) */ double result;result =3.1415926 * r * r * h; /* 計算圓柱體積計算圓柱體積 */return result; /* 返回運算結(jié)果返回運算結(jié)果*/1 1、分析函數(shù)的定義、分析函數(shù)的定義函數(shù)類型函數(shù)類型函數(shù)名函數(shù)名形參表形參表與函數(shù)類型一致與函數(shù)類型一致26形參形參類型類型1 1 參數(shù)參數(shù)1 1 ,類型,類型2 2 參數(shù)參數(shù)2 2 ,類型,類型n n 參數(shù)參數(shù)n n參數(shù)之間用逗號分隔,每個參數(shù)前面的類型都必須分別寫明參數(shù)之間用逗號分隔,每
19、個參數(shù)前面的類型都必須分別寫明函數(shù)類型函數(shù)類型 函數(shù)名(形參表)函數(shù)名(形參表) 函數(shù)實現(xiàn)過程函數(shù)實現(xiàn)過程 return 表達式;表達式;不能寫成不能寫成 double r, hdouble cylinder (double r, double h) double result; result =3.1415926 * r * r * h; return result;27double factorial (int i) /函數(shù)定義函數(shù)定義 int j;double result = 1; for (j = 1; j=d2) return d1; else return d2; 282.2.函
20、數(shù)原型聲明函數(shù)原型聲明函數(shù)類型函數(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ù)的后面,函數(shù)必須先定義后調(diào)用,將主調(diào)函數(shù)放在被調(diào)函數(shù)的后面,就像變量先定義后使用一樣。就像變量先定義后使用一樣。 如果自定義函數(shù)在主調(diào)函數(shù)的后面,就需要在函數(shù)調(diào)用前,如果自定義函數(shù)在主調(diào)函數(shù)的后面,就需要在函數(shù)調(diào)用前,加上函數(shù)原型聲明。加上函數(shù)原型聲明。 函數(shù)聲明:說明函數(shù)的類型和參數(shù)的情況,以保證程序編函
21、數(shù)聲明:說明函數(shù)的類型和參數(shù)的情況,以保證程序編譯時能判斷對該函數(shù)的調(diào)用是否正確。譯時能判斷對該函數(shù)的調(diào)用是否正確。只寫函數(shù)定義中的第只寫函數(shù)定義中的第1 1行(函數(shù)首部),并以分號結(jié)束。行(函數(shù)首部),并以分號結(jié)束。292、函數(shù)的聲明 函數(shù)類型函數(shù)類型 函數(shù)名(形參表);函數(shù)名(形參表); /以分號結(jié)束以分號結(jié)束 double factorial (int n); void ball(int x);303 3、函數(shù)的調(diào)用、函數(shù)的調(diào)用l 定義一個函數(shù)后,就可以通過程序來調(diào)用這個函數(shù)。定義一個函數(shù)后,就可以通過程序來調(diào)用這個函數(shù)。l 調(diào)用標準庫函數(shù)時,在程序的最前面用調(diào)用標準庫函數(shù)時,在程序的最
22、前面用#include#include命命令包含相應的頭文件。令包含相應的頭文件。l 調(diào)用自定義函數(shù)時,程序中必須有與調(diào)用函數(shù)相對調(diào)用自定義函數(shù)時,程序中必須有與調(diào)用函數(shù)相對應的函數(shù)定義。應的函數(shù)定義。31函數(shù)調(diào)用的一般形式為:函數(shù)調(diào)用的一般形式為: 函數(shù)名(實際參數(shù)表)函數(shù)名(實際參數(shù)表); factorial ( i );實際參數(shù)與形式參數(shù)的數(shù)據(jù)類型和個數(shù)一一對應,以分號結(jié)束實際參數(shù)與形式參數(shù)的數(shù)據(jù)類型和個數(shù)一一對應,以分號結(jié)束函數(shù)調(diào)用的形式函數(shù)調(diào)用的形式32for(i = 1; i =n; i+ ) sum = sum + factorial (i); /函數(shù)調(diào)用函數(shù)調(diào)用 函數(shù)的調(diào)用函數(shù)
23、的調(diào)用double factorial (int i) /函數(shù)定義函數(shù)定義 int j;double result = 1; for (j = 1; j= i;j+)result = result *j ; return result ; /返回結(jié)果返回結(jié)果33例例 求兩個數(shù)中的最大值求兩個數(shù)中的最大值#include void 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(
24、xy)z=x; else z=y; return(z); 形參形參實參實參定義函數(shù)時,形參定義函數(shù)時,形參調(diào)用函數(shù)時,實參調(diào)用函數(shù)時,實參 函數(shù)的調(diào)用函數(shù)的調(diào)用34函數(shù)調(diào)用的形式函數(shù)調(diào)用的形式 對于實現(xiàn)計算功能的函數(shù),函數(shù)調(diào)用通常出現(xiàn)在兩對于實現(xiàn)計算功能的函數(shù),函數(shù)調(diào)用通常出現(xiàn)在兩種情況:種情況:賦值語句賦值語句volume = cylinder(radius, height );輸出函數(shù)的實參輸出函數(shù)的實參printf(“%f”, cylinder(radius, height ) );35函數(shù)調(diào)用的過程函數(shù)調(diào)用的過程計算機在執(zhí)行程序時,從主函數(shù)計算機在執(zhí)行程序時,從主函數(shù)mainmain開
25、始執(zhí)行,開始執(zhí)行,如果遇到某個函數(shù)調(diào)用,主函數(shù)被暫停執(zhí)行,轉(zhuǎn)如果遇到某個函數(shù)調(diào)用,主函數(shù)被暫停執(zhí)行,轉(zhuǎn)而執(zhí)行相應的函數(shù),該函數(shù)執(zhí)行完后,將返回主而執(zhí)行相應的函數(shù),該函數(shù)執(zhí)行完后,將返回主函數(shù),然后再從原先暫停的位置繼續(xù)執(zhí)行。函數(shù),然后再從原先暫停的位置繼續(xù)執(zhí)行。函數(shù)遇函數(shù)遇returnreturn返回主函數(shù)返回主函數(shù)36分析函數(shù)調(diào)用的過程分析函數(shù)調(diào)用的過程#include int main( void ) double height, radius, volume;double cylinder (double r, double h); printf (Enter radius and he
26、ight: );scanf (%lf%lf, &radius, &height);volume = cylinder (radius, height );printf (Volume = %.3fn, volume);return 0; double cylinder (double r, double h) double result;result =3.1415926 * r * r * h; return result; 調(diào)用調(diào)用函數(shù)函數(shù)實參實參形參形參執(zhí)行函數(shù)中的語句執(zhí)行函數(shù)中的語句返回調(diào)用它的地方返回調(diào)用它的地方37參數(shù)傳遞參數(shù)傳遞函數(shù)函數(shù)定義定義時的參數(shù)被稱為時的參
27、數(shù)被稱為形式參數(shù)形式參數(shù)(簡稱(簡稱形參形參)double cylinder (double r, double h);函數(shù)函數(shù)調(diào)用調(diào)用時的參數(shù)被稱為時的參數(shù)被稱為實際參數(shù)實際參數(shù)(簡稱(簡稱實參實參)volume = cylinder (radius, height);參數(shù)傳遞:參數(shù)傳遞:實參實參形參形參在參數(shù)傳遞過程中,實參把值復制給形參。在參數(shù)傳遞過程中,實參把值復制給形參。形參和實參形參和實參一一對應一一對應:數(shù)量一致,類型一致,順序一致:數(shù)量一致,類型一致,順序一致形參形參:變量,用于接受實參傳遞過來的值:變量,用于接受實參傳遞過來的值實參實參:常量、變量或表達式:常量、變量或表達式
28、單向傳遞單向傳遞38函數(shù)結(jié)果返回函數(shù)結(jié)果返回完成確定的運算,將運算結(jié)果返回給主調(diào)函數(shù)。完成確定的運算,將運算結(jié)果返回給主調(diào)函數(shù)。函數(shù)結(jié)果返回的形式:函數(shù)結(jié)果返回的形式:return return 表達式;表達式;return (return (表達式表達式) );39在執(zhí)行函數(shù)調(diào)用時,實參把值計算出來,拷貝 給相應位置的形參;函數(shù)執(zhí)行完后,通過 return( ),可返回一個結(jié)果值。 實參與形參實參與形參 有多個實參時有多個實參時 形參的改變形參的改變個數(shù)相同、類型一致個數(shù)相同、類型一致 后面的先計算后面的先計算 不影響實參不影響實參 變量的值變量的值 只能返回一個結(jié)果,只能返回一個結(jié)果, 類
29、型與函數(shù)定義時一致類型與函數(shù)定義時一致 要調(diào)用函數(shù),要調(diào)用函數(shù),必須先要聲明!必須先要聲明!小結(jié):小結(jié):404.3 4.3 函數(shù)的參數(shù)傳遞與返回值函數(shù)的參數(shù)傳遞與返回值.1導例:爬動的蠕蟲導例:爬動的蠕蟲.2導例:日導例:日K K蠟燭圖蠟燭圖.3函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞.4函數(shù)的返回值函數(shù)的返回值41從函數(shù)是否有參數(shù)和返回值的角度,可以將函數(shù)分為從函數(shù)是否有參數(shù)和返回值的角度,可以將函數(shù)分為: :有參數(shù)有返回值函數(shù)有參數(shù)有返回值函數(shù)有參數(shù)無返回值函數(shù)有參數(shù)無返回值函數(shù) 無參數(shù)有返回值函數(shù)無參數(shù)有返回值函數(shù)無參數(shù)無返回值函數(shù)無參
30、數(shù)無返回值函數(shù)42導例:判斷素數(shù)的函數(shù)導例:判斷素數(shù)的函數(shù)求求100100以內(nèi)的全部素數(shù),每行輸出以內(nèi)的全部素數(shù),每行輸出1010個。素數(shù)就是只能被個。素數(shù)就是只能被1 1和自身整除的正整數(shù),和自身整除的正整數(shù),1 1不是素數(shù),不是素數(shù),2 2是素數(shù)。是素數(shù)。要求定義和調(diào)用函數(shù)要求定義和調(diào)用函數(shù)prime (m)prime (m)判斷判斷m m是否為素數(shù),當是否為素數(shù),當m m為為素數(shù)時返回素數(shù)時返回1 1,否則返回,否則返回0 0。 算法描述:算法描述:對對2 2100100之間的每個數(shù)進行判斷,若是素數(shù),之間的每個數(shù)進行判斷,若是素數(shù),則輸出該數(shù)。則輸出該數(shù)。for(m = 2; m =
31、100; m+) if (m是素數(shù)是素數(shù)) printf(%d , m); prime(m) != 0有參數(shù)有返回值函數(shù)有參數(shù)有返回值函數(shù)43例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 ); count+; if (count %10 = 0) printf (n); printf (n);int prime (int m) int i, n; if (
32、 m = 1 ) return 0; n = sqrt (m); for( i = 2; i = n; i+) if (m % i = 0) return 0; return 1; 44輸出輸出5 5之內(nèi)的數(shù)字金字塔。之內(nèi)的數(shù)字金字塔。/* 輸出數(shù)字金字塔輸出數(shù)字金字塔 */#include int main (void) void pyramid (int n);/* 函數(shù)聲明函數(shù)聲明 */pyramid(5);/* 調(diào)用函數(shù),輸出數(shù)字金字塔調(diào)用函數(shù),輸出數(shù)字金字塔 */return 0;void pyramid (int n) /* 函數(shù)定義函數(shù)定義 */int i, j;for (i =
33、 1; i = n; i+)/* 需要輸出的行數(shù)需要輸出的行數(shù) */ for (j = 1; j = n-i; j+) /* 輸出每行左邊的空格輸出每行左邊的空格 */printf( ); for (j = 1; j = i; j+) /* 輸出每行的數(shù)字輸出每行的數(shù)字 */ printf( %d , i); /* 每個數(shù)字的前后各有一個空格每個數(shù)字的前后各有一個空格 */ putchar (n); 1 2 2 3 3 3 4 4 4 45 5 5 5 5 for (i = 1; i = n; i+) for (j = 1; j = n-i; j+) printf(“ ”); 一行中的數(shù)字顯示
34、有參數(shù)無返回值函數(shù)有參數(shù)無返回值函數(shù) for (i = 1; i = n; i+) 一行的處理 一行中的空格處理; 一行中的數(shù)字顯示45不返回運算結(jié)果的函數(shù)定義voidvoid 函數(shù)名(參數(shù)表)函數(shù)名(參數(shù)表) / /* * 函數(shù)首部函數(shù)首部 * */ / / /* * 函數(shù)體函數(shù)體 * */ / 函數(shù)實現(xiàn)過程函數(shù)實現(xiàn)過程 returnreturn; / /* * 可以省略可以省略return return * */ / 這類函數(shù)通常用于屏幕輸出等這類函數(shù)通常用于屏幕輸出等表示不返回結(jié)果表示不返回結(jié)果不能省略不能省略, 否則否則函數(shù)類型被默認定義為函數(shù)類型被默認定義為int46#include
35、 int main (void) int in( ); int n;/* 函數(shù)聲明函數(shù)聲明 */n=in(); /* 函數(shù)調(diào)用函數(shù)調(diào)用 */ printf(“%d”,n);return 0;int in( ) int x; scanf(“%d”,&x); return x;無參數(shù)有返回值函數(shù)無參數(shù)有返回值函數(shù)47函數(shù)沒有返回值函數(shù)沒有返回值在聲明函數(shù)的時候,函數(shù)名前使用了保留字在聲明函數(shù)的時候,函數(shù)名前使用了保留字voidvoid。用函數(shù)調(diào)用語句調(diào)用。用函數(shù)調(diào)用語句調(diào)用。#include #include void main( )void main( ) void printstar(
36、 ); / void printstar( ); /* *函數(shù)聲明函數(shù)聲明* */ / void print_message( ); / void print_message( ); /* *函數(shù)聲明函數(shù)聲明* */ / printstar( ); printstar( ); print_message( ); print_message( ); printstar( ); printstar( ); void printstar( )void printstar( ) printf(“ printf(“* * * * * * * * * *n”);n”); void print_messag
37、e( )void print_message( ) printf(“ How do you do!n”); printf(“ How do you do!n”); 輸出:輸出:* * * * * * * * * * * * * * * * * * How do you do!How do you do!* * * * * * * * * * * * * * * * * *無參數(shù)無返回值函數(shù)無參數(shù)無返回值函數(shù)4.3函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞在調(diào)用函數(shù)時,實參與形參結(jié)合的具體過程是:在調(diào)用函數(shù)時,實參與形參結(jié)合的具體過程是: 計算實參表達式的值;計算實參表達式的值; 將實參的值
38、按賦值轉(zhuǎn)換規(guī)則轉(zhuǎn)換成對應形參的數(shù)據(jù)類型;將實參的值按賦值轉(zhuǎn)換規(guī)則轉(zhuǎn)換成對應形參的數(shù)據(jù)類型; 為形參分配存儲空間;為形參分配存儲空間; 將類型轉(zhuǎn)換后的實參的值傳遞給對應的形參變量,然后執(zhí)將類型轉(zhuǎn)換后的實參的值傳遞給對應的形參變量,然后執(zhí)行函數(shù)。行函數(shù)。49 C C語言中,函數(shù)的參數(shù)傳遞有兩種方式,即傳值和傳地址。語言中,函數(shù)的參數(shù)傳遞有兩種方式,即傳值和傳地址。 傳值傳值:簡單地將實參的值復制一份給形參,一旦復制完成,:簡單地將實參的值復制一份給形參,一旦復制完成,實參與其對應的形參便沒有任何關(guān)系,這時在函數(shù)內(nèi)對形實參與其對應的形參便沒有任何關(guān)系,這時在函數(shù)內(nèi)對形參的任何改變都不會影響到實參。參
39、的任何改變都不會影響到實參。 傳地址傳地址:將實參地址傳遞給形參,在函數(shù)內(nèi)對形參所對應數(shù):將實參地址傳遞給形參,在函數(shù)內(nèi)對形參所對應數(shù)據(jù)的處理實際上就是處理對應的實參。簡單地理解就是此據(jù)的處理實際上就是處理對應的實參。簡單地理解就是此時實參和形參同一的,對形參的處理就是對對應的實參的時實參和形參同一的,對形參的處理就是對對應的實參的處理。處理。 C C語言中,當函數(shù)的參數(shù)為指針類型或數(shù)組類型時語言中,當函數(shù)的參數(shù)為指針類型或數(shù)組類型時 采用傳地采用傳地址的方式,其他類型采用傳值方式。址的方式,其他類型采用傳值方式。50.4函數(shù)的返回值函數(shù)的返回值 函數(shù)的調(diào)用本質(zhì)上是一個表達式,
40、它將返回特定類型數(shù)據(jù)的函數(shù)的調(diào)用本質(zhì)上是一個表達式,它將返回特定類型數(shù)據(jù)的值(即返回值),因此只要該值能出現(xiàn)的位置,都可以使值(即返回值),因此只要該值能出現(xiàn)的位置,都可以使用該函數(shù)調(diào)用表達式。用該函數(shù)調(diào)用表達式。從函數(shù)返回值的類型看,有兩種類型:從函數(shù)返回值的類型看,有兩種類型:是完成確定的運算,并由運算結(jié)果返回給主調(diào)函數(shù),稱為是完成確定的運算,并由運算結(jié)果返回給主調(diào)函數(shù),稱為有有返回值的函數(shù)返回值的函數(shù);函數(shù)類型用返回值類型指定。;函數(shù)類型用返回值類型指定。是完成指定的工作,沒有確定的運算結(jié)果需返回給主調(diào)函數(shù)是完成指定的工作,沒有確定的運算結(jié)果需返回給主調(diào)函數(shù),稱為,稱為無返回值的函數(shù)無返
41、回值的函數(shù)。函數(shù)類型用。函數(shù)類型用voidvoid指定。指定。511 1、有返回值函數(shù)、有返回值函數(shù)有返回值函數(shù)在函數(shù)定義時必須說明返回值有返回值函數(shù)在函數(shù)定義時必須說明返回值的類型,在函數(shù)體中由的類型,在函數(shù)體中由returnreturn語句給出具體的返回值。語句給出具體的返回值。有返回值有返回值returnreturn語句的一般形式如下:語句的一般形式如下: return return 表達式;表達式; 或或 return return (表達式);(表達式); 先求解表達式的值,再返回其值。通常表達式的結(jié)果類型先求解表達式的值,再返回其值。通常表達式的結(jié)果類型與函數(shù)的返回值類型一致與函數(shù)
42、的返回值類型一致 returnreturn語句的作用有兩個:一是結(jié)束函數(shù)的運行;二是帶語句的作用有兩個:一是結(jié)束函數(shù)的運行;二是帶著運算結(jié)果(表達式的值)返回主調(diào)函數(shù)。著運算結(jié)果(表達式的值)返回主調(diào)函數(shù)。52函數(shù)有返回值:函數(shù)有返回值:函數(shù)執(zhí)行完畢后,返回一個相應類型的數(shù)值。函數(shù)執(zhí)行完畢后,返回一個相應類型的數(shù)值。用用returnreturn語句返回該值:語句返回該值:return return 表達式;表達式;用函數(shù)調(diào)用表達式調(diào)用。用函數(shù)調(diào)用表達式調(diào)用。如:如:printf(“The average is %6.2f”, average(dataArray, n);ave= average
43、(dataArray, n);532 2、無返回值函數(shù)、無返回值函數(shù) 無返回值函數(shù)只完成某種特定的處理,函數(shù)執(zhí)行后無須向調(diào)無返回值函數(shù)只完成某種特定的處理,函數(shù)執(zhí)行后無須向調(diào)用者返回計算結(jié)果。用者返回計算結(jié)果。 無返回值函數(shù)在函數(shù)定義時必須將返回值的類型說明為無返回值函數(shù)在函數(shù)定義時必須將返回值的類型說明為voidvoid(即空類型),函數(shù)體中的(即空類型),函數(shù)體中的returnreturn語句只結(jié)束函數(shù)的執(zhí)行語句只結(jié)束函數(shù)的執(zhí)行。如果函數(shù)類型為。如果函數(shù)類型為voidvoid,則函數(shù)返回直接用,則函數(shù)返回直接用returnreturn語句,語句,不必跟上一個表達式。不必跟上一個表達式。 無
44、返回值無返回值returnreturn語句的一般形式如下:語句的一般形式如下: return ; return ; 在函數(shù)定義中也可以沒有在函數(shù)定義中也可以沒有returnreturn語句,此時函數(shù)執(zhí)行到最后語句,此時函數(shù)執(zhí)行到最后一條語句。一條語句。544.44.4遞歸函數(shù)遞歸函數(shù).1導例:假幣問題(三分法)導例:假幣問題(三分法).2導例:導例:FibonacciFibonacci數(shù)列數(shù)列.3遞歸函數(shù)的執(zhí)行過程遞歸函數(shù)的執(zhí)行過程.4遞歸函數(shù)的效率分析遞歸函數(shù)的效率分析5.2導例:導例:FibonacciFib
45、onacci數(shù)列數(shù)列1 1問題描述問題描述從鍵盤輸入一個整數(shù)從鍵盤輸入一個整數(shù)n n,輸出斐波那契數(shù)列(,輸出斐波那契數(shù)列(fibonaccifibonacci)的前)的前n n項。要求每行打印項。要求每行打印1010個數(shù)后換行。個數(shù)后換行。2 2問題分析問題分析斐波那契數(shù)列為斐波那契數(shù)列為1 1,1 1,2 2,3 3,5 5,8 8,1313即從第三項開始,即從第三項開始,各項值都等于前兩項值之和。斐波那契數(shù)列的定義為各項值都等于前兩項值之和。斐波那契數(shù)列的定義為: : 1 n=0 1 n=0f(n)= 1 n=1f(n)= 1 n=1 f(n-1)+f(n-2) n1 f(n-1)+f(
46、n-2) n156采用非遞歸方法,程序片段如下:采用非遞歸方法,程序片段如下: first=1,second=1; scanf(%d,&n); for(i=0; in;i+) result=first+second; printf(%.0f,result); first=second; second=result; 57#include int fib(int k);main() int n,i,count=0; printf(Enter 1 integersn:); scanf(%d,&n); for(i=0;i1n1 fact(n)=n fact(n)=n* *fact(n
47、-1) fact(n-1) 遞歸公式遞歸公式 60實現(xiàn)階乘遞歸算法的遞歸函數(shù)實現(xiàn)階乘遞歸算法的遞歸函數(shù) long fact(int n) if (n=0) return 1;else return n* fact(n-1); 61y=fact(3) 3*fact(2)2*fact(1)1*fact(0)111*112*123*26 遞歸函數(shù)的調(diào)用過程遞歸函數(shù)的調(diào)用過程 62遞歸程序的內(nèi)部執(zhí)行過程遞歸程序的內(nèi)部執(zhí)行過程函數(shù)的遞歸調(diào)用類似于多個函數(shù)的嵌套調(diào)用,只不過調(diào)用函數(shù)函數(shù)的遞歸調(diào)用類似于多個函數(shù)的嵌套調(diào)用,只不過調(diào)用函數(shù)和被調(diào)用函數(shù)是同一個函數(shù)。遞歸調(diào)用的內(nèi)部執(zhí)行過程如下:和被調(diào)用函數(shù)是同一
48、個函數(shù)。遞歸調(diào)用的內(nèi)部執(zhí)行過程如下:運行開始時運行開始時,系統(tǒng)設(shè)立工作棧來保存每次調(diào)用的運行環(huán)境,系統(tǒng)設(shè)立工作棧來保存每次調(diào)用的運行環(huán)境,包括形參、局部變量和返回地址;包括形參、局部變量和返回地址;遞歸調(diào)用前遞歸調(diào)用前,將調(diào)用函數(shù)的形參、局部變量以及調(diào)用后的返,將調(diào)用函數(shù)的形參、局部變量以及調(diào)用后的返回地址進棧;回地址進棧;調(diào)用結(jié)束后調(diào)用結(jié)束后,將棧頂數(shù)據(jù)出棧,恢復調(diào)用前的運行環(huán)境,使,將棧頂數(shù)據(jù)出棧,恢復調(diào)用前的運行環(huán)境,使相應的形參和局部變量恢復為調(diào)用前的值,然后從返回地址相應的形參和局部變量恢復為調(diào)用前的值,然后從返回地址指定的位置繼續(xù)執(zhí)行調(diào)用函數(shù)。指定的位置繼續(xù)執(zhí)行調(diào)用函數(shù)。634.4
49、.44.4.4遞歸函數(shù)的效率分析遞歸函數(shù)的效率分析 遞歸函數(shù)如果很緩慢地逼近到遞歸結(jié)束條件,會使性能大遞歸函數(shù)如果很緩慢地逼近到遞歸結(jié)束條件,會使性能大大下降。大下降。 遞歸增加了系統(tǒng)開銷,遞歸增加了系統(tǒng)開銷,時間時間上,執(zhí)行調(diào)用與返回的額外工上,執(zhí)行調(diào)用與返回的額外工作要占用作要占用CPUCPU時間。時間。空間空間上,隨著每遞歸一次,棧內(nèi)存就多上,隨著每遞歸一次,棧內(nèi)存就多占一塊,即要分配相應的存儲空間,并完成參數(shù)的傳遞、占一塊,即要分配相應的存儲空間,并完成參數(shù)的傳遞、函數(shù)的返回等,在程序的執(zhí)行效率和所消耗的存儲空間上函數(shù)的返回等,在程序的執(zhí)行效率和所消耗的存儲空間上,和非遞歸相比沒有任何
50、優(yōu)勢。,和非遞歸相比沒有任何優(yōu)勢。 一般的遞歸都可以通過相應的方法轉(zhuǎn)化為非遞歸的,所以一般的遞歸都可以通過相應的方法轉(zhuǎn)化為非遞歸的,所以不推薦使用遞歸,特別是不推薦使用遞歸層次較多的遞歸不推薦使用遞歸,特別是不推薦使用遞歸層次較多的遞歸。644.5 C4.5 C局部變量、全局變量與變量作用域局部變量、全局變量與變量作用域.1導例:富翁與騙子導例:富翁與騙子.2導例:簡易庫存存取貨管理導例:簡易庫存存取貨管理.3局部變量和全局變量局部變量和全局變量.4變量的作用域和生存期變量的作用域和生存期65分別輸入分別輸入2 2個復數(shù)的實部與虛
51、部,用函數(shù)實現(xiàn)計個復數(shù)的實部與虛部,用函數(shù)實現(xiàn)計算算2 2個復數(shù)之和與之積。個復數(shù)之和與之積。 分析分析若若2個復數(shù)分別為:個復數(shù)分別為: c1=x1+y1i , c2=x2+y2i,則:則:c1+c2 = (x1+x2) + (y1+y2)ic1*c2 = (x1*x2-y1*y2) + (x1*y2+x2*y1)i 復數(shù)運算復數(shù)運算 66#include float result_real, result_imag;/* 全局變量,用于存放函數(shù)結(jié)果全局變量,用于存放函數(shù)結(jié)果 */int main(void) float imag1, imag2, real1, real2; /* 兩個復數(shù)
52、的實、虛部變量兩個復數(shù)的實、虛部變量 */* 函數(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 and imaginary): );scanf(%f%f, &real1, &imag1); /* 輸入第一個復數(shù)輸入第一個復數(shù) */printf(Enter 2n
53、d complex number(real and imaginary): );scanf(%f%f, &real2, &imag2); /* 輸入第兩個復數(shù)輸入第兩個復數(shù) */complex_add(real1, imag1, real2, imag2);/* 求復數(shù)之和求復數(shù)之和 */printf(addition of complex is %f+%fin, result_real, result_imag);complex_prod(real1, imag1, real2, imag2); /* 求復數(shù)之積求復數(shù)之積 */printf(product of comple
54、x is %f+%fin, result_real, result_imag);return 0;運行結(jié)果運行結(jié)果Enter 1st complex number(real and imaginary):1 1Enter 2nd complex number(real and imaginary):-2 3addition of complex is -1.000000+4.000000iproduct of complex is -5.000000+1.000000i67void complex_add(float real1, float imag1, float real2, float
55、 imag2)result_real = real1 + real2;result_imag = imag1 + imag2;void complex_prod(float real1, float imag1, float real2, float imag2)result_real = real1*real2 - imag1*imag2;result_imag = real1*imag2 + real2*imag1;68n 局部變量局部變量p在函數(shù)內(nèi)定義的變量(包括形參)在函數(shù)內(nèi)定義的變量(包括形參)作用范圍:作用范圍:本函數(shù)內(nèi)部本函數(shù)內(nèi)部p定義在復合語句內(nèi)的變量定義在復合語句內(nèi)的變量作用
56、范圍:作用范圍:復合語句內(nèi)部復合語句內(nèi)部n 全局變量全局變量p在函數(shù)以外定義的變量,不從屬于任一函數(shù)。在函數(shù)以外定義的變量,不從屬于任一函數(shù)。作用范圍:作用范圍:從定義處到源文件結(jié)束從定義處到源文件結(jié)束(包括各函數(shù))(包括各函數(shù)).3局部變量和全局變量局部變量和全局變量69在復合語句中定義局部變量在復合語句中定義局部變量#include int main (void) int a; a = 1; /* 復合語句開始復合語句開始 */ int b = 2; b = a + b; a = a + b; /* 復合語句結(jié)束復合語句結(jié)束 */ printf (%d , a ); ret
57、urn 0;b:b:小范圍內(nèi)的臨時變量小范圍內(nèi)的臨時變量 輸出:輸出:4改成b會如何?70 全局變量定義全局變量定義#include stdio.hint x; /* 定義全局變量定義全局變量x */int f( ) int x = 4; /* x為局部變量為局部變量 */ return x;int main(void) int a = 1; x = a; /* 對全局變量對全局變量 x 賦值賦值 */ a = f( ); /* a的值為的值為4 */ int b = 2; b = a + b; /* b的值為的值為6 */ x = x + b; /* 全局變量運算全局變量運算 */ prin
58、tf(%d %d , a, x); return 0;若局部變量與全局變量同若局部變量與全局變量同名,局部變量優(yōu)先名,局部變量優(yōu)先輸出:輸出:4, 771變量作用范圍示例變量作用范圍示例int x=1;void main( ) int a=2; . int b=3; . f( ); .int t=4 ;void f( ) int x=5, b=6; .int a=7; x=? a=? b=?b=? x=5 b=6 t=4 a沒定義沒定義 x=? b=? t=? a=?72 用函數(shù)實現(xiàn)財務現(xiàn)金記賬。先輸入操作類型用函數(shù)實現(xiàn)財務現(xiàn)金記賬。先輸入操作類型(1(1收入,收入,2 2支出,支出,0 0結(jié)
59、束結(jié)束) ),再輸入操作金額,計算現(xiàn)金剩余額,經(jīng)多次,再輸入操作金額,計算現(xiàn)金剩余額,經(jīng)多次操作直到輸入操作為操作直到輸入操作為0 0結(jié)束。要求定義并調(diào)用函數(shù),其中現(xiàn)結(jié)束。要求定義并調(diào)用函數(shù),其中現(xiàn)金收入與現(xiàn)金支出分別用不同函數(shù)實現(xiàn)。金收入與現(xiàn)金支出分別用不同函數(shù)實現(xiàn)。分析:分析: 設(shè)變量設(shè)變量cashcash保存現(xiàn)金余額值,由于它被主函數(shù)、現(xiàn)金保存現(xiàn)金余額值,由于它被主函數(shù)、現(xiàn)金收入與現(xiàn)金支出函數(shù)共用,任意使用場合其意義與數(shù)值都是收入與現(xiàn)金支出函數(shù)共用,任意使用場合其意義與數(shù)值都是明確和唯一的,因此令其為全局變量。明確和唯一的,因此令其為全局變量。 財務現(xiàn)金記賬財務現(xiàn)金記賬73#includ
60、e float cash;/* 定義全局變量,保存現(xiàn)金余額定義全局變量,保存現(xiàn)金余額 */int main(void) int choice;float value;void income(float number), expend(float number);/* 函數(shù)聲明函數(shù)聲明 */cash = 0;/* 初始金額初始金額=0 */printf(Enter operate choice(0-end, 1-income, 2-expend):);scanf(%d, &choice);/* 輸入操作類型輸入操作類型 */while (choice != 0)/* 若輸入類型為若輸入類型為0,循環(huán)結(jié)束,循環(huán)結(jié)束 */ if (choice = 1 | choice = 2) printf(Enter cash value:); /*
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年故都秋一等獎教案:探索教學的新境界
- 2025年紡織片梭織機合作協(xié)議書
- 《昆蟲記》讀后感
- 演講稿題目新穎范文
- DB31∕T 680.8-2019 城市公共用水定額及其計算方法 第8部分:公共管理和社會組織機關(guān)單位
- 寵物急救知識培訓班課件
- 慢性支氣管炎肺炎等修改課件
- 液壓知識培訓課件下載
- 2023年北京卷高考真題數(shù)學試卷-解析
- 工程入股合作合同協(xié)議書
- 跟著名著《小王子》學高考英語讀后續(xù)寫絕佳的續(xù)寫清單-高中英語作文復習專項
- 產(chǎn)教融合大學科技園建設(shè)項目實施方案
- 交通法律與交通事故處理培訓課程與法律解析
- 廣西版四年級下冊美術(shù)教案
- 《換熱器及換熱原理》課件
- 兒童權(quán)利公約演示文稿課件
- UPVC排水管技術(shù)標準
- MSA-測量系統(tǒng)分析模板
- 血透室公休座談水腫的護理
- 急診預檢分診專家共識課件
- 廣州市海珠區(qū)事業(yè)單位考試歷年真題
評論
0/150
提交評論