C語言程序設(shè)計(jì)函數(shù)劉課件_第1頁
C語言程序設(shè)計(jì)函數(shù)劉課件_第2頁
C語言程序設(shè)計(jì)函數(shù)劉課件_第3頁
C語言程序設(shè)計(jì)函數(shù)劉課件_第4頁
C語言程序設(shè)計(jì)函數(shù)劉課件_第5頁
已閱讀5頁,還剩90頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C語言程序設(shè)計(jì)C語言程序設(shè)計(jì)第四章函數(shù)4.1庫函數(shù)4.2自定義函數(shù)4.3函數(shù)的參數(shù)傳遞與返回值4.4遞歸函數(shù)4.5局部變量、全局變量與變量作用域4.6函數(shù)綜合應(yīng)用第四章函數(shù)學(xué)習(xí)目標(biāo):理解函數(shù)在程序設(shè)計(jì)中的作用和地位掌握函數(shù)的定義、原型聲明和調(diào)用方法熟練掌握函數(shù)的參數(shù)傳遞與返回值理解局部變量、全局變量、靜態(tài)變量和變量的作用域掌握遞歸函數(shù)的編寫技術(shù)理解和掌握結(jié)構(gòu)設(shè)計(jì)和模塊化程序設(shè)計(jì)方法了解地址和指針的概念,了解地址做函數(shù)參數(shù)的特點(diǎn)和作用學(xué)習(xí)目標(biāo):為什么要用函數(shù)?問題:如果程序的功能比較多,規(guī)模比較大,把所有代碼都寫在main函數(shù)中,就會使主函數(shù)變得龐雜、頭緒不清,閱讀和維護(hù)變得困難有時(shí)程序中要多次實(shí)現(xiàn)某一功能,就需要多次重復(fù)編寫實(shí)現(xiàn)此功能的程序代碼,這使程序冗長,不精煉為什么要用函數(shù)?問題:解決的方法:用模塊化程序設(shè)計(jì)的思路采用“組裝”的辦法簡化程序設(shè)計(jì)的過程可以使用庫函數(shù):事先編好一批實(shí)現(xiàn)各種不同功能的函數(shù),把它們保存在函數(shù)庫中,需要時(shí)直接用可以使用自己編寫的函數(shù):在設(shè)計(jì)一個(gè)較大的程序時(shí),往往把它分為若干個(gè)程序模塊,每一個(gè)模塊包括一個(gè)或多個(gè)函數(shù),每個(gè)函數(shù)實(shí)現(xiàn)一個(gè)特定的功能,函數(shù)的名字應(yīng)反映其代表的功能C程序可由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成,主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用,同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次在程序設(shè)計(jì)中要善于利用函數(shù),可以減少重復(fù)編寫程序段的工作量,同時(shí)可以方便地實(shí)現(xiàn)模塊化的程序設(shè)計(jì)解決的方法:用模塊化程序設(shè)計(jì)的思路C語言程序設(shè)計(jì)函數(shù)劉課件導(dǎo)例:平方根表1.問題描述輸出100以內(nèi)整數(shù)的平方根表,要求每行輸出10個(gè)。2.問題分析C語言提供了一個(gè)庫函數(shù)sqrt(),使用時(shí)直接調(diào)用該庫函數(shù)就可以計(jì)算出平方根值。導(dǎo)例:平方根表3.算法描述(1)定義兩個(gè)整型變量m,n。(2)輸出平方根表時(shí),要注意格式。首先輸出表頭,輸出0~9的整數(shù)。(3)然后按照格式要求輸出平方根表,m為行數(shù)0~9,n為列數(shù)0~9,則表內(nèi)對應(yīng)第m行第n列的表值為sqrt(m*10+n),每行10個(gè)。3.算法描述1111#include<stdio.h>#include<math.h>//數(shù)學(xué)類頭文件intmain(){ intm,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.4f",sqrt(m*10+n));//調(diào)用庫函數(shù)sqrt() printf("\n");}4.程序?qū)崿F(xiàn)return0;}#include<stdio.h>for(n=0;n<16.程序分析庫函數(shù)sqrt()原型放在文件math.h文件中,所在若在程序中使用該函數(shù),就需要在程序頭加上語句#include<math.h>。程序中語句段for(n=0;n<10;n++)是輸出表頭,輸出列號:0~9;表頭表示出0-9列的列號。用輸出函數(shù)printf(“%7.4f”)控制輸出的值為保留4位小數(shù)的實(shí)數(shù)。6.程序分析4.1.3庫函數(shù)使用方法庫函數(shù)的定義已經(jīng)在C語言提供的標(biāo)準(zhǔn)函數(shù)庫中,所以調(diào)用時(shí),需要在程序的前面利用編譯預(yù)處理命令include將相應(yīng)的函數(shù)原型加入到程序中。#include指令的一般形式如下:

#include<文件名>或

#include“文件名”例如:#include<math.h>4.1.3庫函數(shù)使用方法C語言程序設(shè)計(jì)函數(shù)劉課件4.1.4常用的庫函數(shù)常用的函數(shù)頭文件,各自包含的函數(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.1.4常用的庫函數(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)用過程分析

4.2自定義函數(shù) 導(dǎo)例:計(jì)算圓柱體積

輸入圓柱體的高和半徑,求圓柱體積,volume=π*r2*h。要求定義和調(diào)用函數(shù)cylinder(r,h)計(jì)算圓柱體的體積。導(dǎo)例:計(jì)算圓柱體積輸入圓柱體的高和半徑,求圓柱體積,/*計(jì)算圓柱體積*/#include<stdio.h>intmain(void){doubleheight,radius,volume;

doublecylinder(doubler,doubleh);/*函數(shù)聲明*/ printf("Enterradiusandheight:"); scanf("%lf%lf",&radius,&height); /*調(diào)用函數(shù),返回值賦給volume*/ volume=cylinder(radius,height); printf("Volume=%.3f\n",volume); return0;}/*計(jì)算圓柱體積*//*定義求圓柱體積的函數(shù)*/doublecylinder(doubler,doubleh)

{ doubleresult; result=3.1415926*r*r*h;/*計(jì)算體積*/

returnresult; /*返回結(jié)果*/}Enterradiusandheight:3.010Volume=282.743/*定義求圓柱體積的函數(shù)*/Enterradiusa#include<stdio.h>intmain(void){doubleheight,radius,volume;

doublecylinder(doubler,doubleh);/*函數(shù)聲明*/ printf("Enterradiusandheight:"); scanf("%lf%lf",&radius,&height); volume=cylinder(radius,height); printf("Volume=%.3f\n",volume); return0;}doublecylinder(doubler,doubleh)

{ doubleresult; result=3.1415926*r*r*h;

returnresult;

}Enterradiusandheight:3.010Volume=282.743問題:函數(shù)是如何運(yùn)行的?#include<stdio.h>doublecylin4.2.1導(dǎo)例:階乘累加和1.問題描述

從鍵盤輸入1個(gè)整數(shù),計(jì)算1~n的各個(gè)數(shù)的階乘的累加和,即1+2!+3!+…+n!。2.問題分析

實(shí)現(xiàn)各個(gè)數(shù)的階乘的累加和,需要先計(jì)算每個(gè)數(shù)的階乘,然后累加到一起。4.2.1導(dǎo)例:階乘累加和sum=0;for(i=1;i<=n;i++){item=i!;sum=sum+item;}可用一個(gè)函數(shù)factorial()專門來計(jì)算每個(gè)數(shù)的階乘,然后用一個(gè)循環(huán)語句來計(jì)算1~n的各個(gè)階乘的累加的結(jié)果。sum=0;4.程序?qū)崿F(xiàn)#include<stdio.h>doublefactorial(inti);//函數(shù)聲明intmain(void){inti,n;doublesum=0;printf(“Enter1integers:”);scanf("%d",&n);for(i=1;i<=n;i++) sum=sum+factorial(i);//函數(shù)調(diào)用printf("1!+…+%d!=%.0f\n",n,sum);return0;}doublefactorial(inti)//函數(shù)定義{intj;doubleresult=1;for(j=1;j<=i;j++)result=result*j;

returnresult;

//返回結(jié)果}4.程序?qū)崿F(xiàn)doublefactorial(inti)一、函數(shù)的定義函數(shù)定義的基本形式是:函數(shù)類型函數(shù)名(形參表)

/*函數(shù)頭,沒有分號*/{函數(shù)實(shí)現(xiàn)過程/*函數(shù)體*/}形參表給出函數(shù)所有形參的名稱和類型,它的格式為:

類型1形參1,類型2形參2,……類型n形參n4.2.3函數(shù)的定義、聲明和調(diào)用一、函數(shù)的定義4.2.3函數(shù)的定義、聲明和調(diào)用函數(shù)類型函數(shù)名(形參表)

/*函數(shù)首部*/{ /*函數(shù)體*/

函數(shù)實(shí)現(xiàn)過程

return表達(dá)式;}把函數(shù)運(yùn)算的結(jié)果回送給主函數(shù)只能返回一個(gè)值函數(shù)返回值的類型沒有分號doublecylinder(doubler,doubleh){doubleresult;result=3.1415926*r*r*h;returnresult;}函數(shù)類型函數(shù)名(形參表) /*函數(shù)首部*/把函數(shù)運(yùn)算的doublecylinder(doubler,doubleh)

/*函數(shù)首部*/{

/*函數(shù)體,寫在一對大括號內(nèi)*/doubleresult; result=3.1415926*r*r*h;/*計(jì)算圓柱體積*/

returnresult; /*返回運(yùn)算結(jié)果*/ }1、分析函數(shù)的定義函數(shù)類型函數(shù)名形參表與函數(shù)類型一致doublecylinder(doubler,dou形參類型1參數(shù)1,類型2參數(shù)2,……,類型n參數(shù)n參數(shù)之間用逗號分隔,每個(gè)參數(shù)前面的類型都必須分別寫明函數(shù)類型函數(shù)名(形參表){

函數(shù)實(shí)現(xiàn)過程

return表達(dá)式;}不能寫成doubler,hdoublecylinder(doubler,doubleh){doubleresult;result=3.1415926*r*r*h;returnresult;}形參類型1參數(shù)1,類型2參數(shù)2,……,類型ndoublefactorial(inti)//函數(shù)定義{

intj;doubleresult=1;for(j=1;j<=i;j++) result=result*j;

return

result;//返回結(jié)果}例:intmaxValue(intd1,intd2){if(d1>=d2)returnd1;elsereturnd2;}doublefactorial(inti)/2.函數(shù)原型聲明函數(shù)類型函數(shù)名(形參表);doublecylinder(doubler,doubleh);doublefactorial(intn);voidpyramid(intn);函數(shù)必須先定義后調(diào)用,將主調(diào)函數(shù)放在被調(diào)函數(shù)的后面,就像變量先定義后使用一樣。如果自定義函數(shù)在主調(diào)函數(shù)的后面,就需要在函數(shù)調(diào)用前,加上函數(shù)原型聲明。函數(shù)聲明:說明函數(shù)的類型和參數(shù)的情況,以保證程序編譯時(shí)能判斷對該函數(shù)的調(diào)用是否正確。只寫函數(shù)定義中的第1行(函數(shù)首部),并以分號結(jié)束。2.函數(shù)原型聲明函數(shù)類型函數(shù)名(形參表);只寫函數(shù)定義中的2、函數(shù)的聲明函數(shù)類型函數(shù)名(形參表);

//以分號結(jié)束doublefactorial(intn);voidball(intx);2、函數(shù)的聲明3、函數(shù)的調(diào)用定義一個(gè)函數(shù)后,就可以通過程序來調(diào)用這個(gè)函數(shù)。調(diào)用標(biāo)準(zhǔn)庫函數(shù)時(shí),在程序的最前面用#include命令包含相應(yīng)的頭文件。調(diào)用自定義函數(shù)時(shí),程序中必須有與調(diào)用函數(shù)相對應(yīng)的函數(shù)定義。3、函數(shù)的調(diào)用定義一個(gè)函數(shù)后,就可以通過程序來調(diào)用這個(gè)函數(shù)。函數(shù)調(diào)用的一般形式為:

函數(shù)名(實(shí)際參數(shù)表);

factorial(i);實(shí)際參數(shù)與形式參數(shù)的數(shù)據(jù)類型和個(gè)數(shù)一一對應(yīng),以分號結(jié)束函數(shù)調(diào)用的形式函數(shù)調(diào)用的一般形式為:函數(shù)調(diào)用的形式for(i=1;i<=n;i++) sum=sum+factorial(i);//函數(shù)調(diào)用

函數(shù)的調(diào)用doublefactorial(inti)//函數(shù)定義{

intj;doubleresult=1;for(j=1;j<=i;j++) result=result*j;

return

result;//返回結(jié)果}for(i=1;i<=n;i++)函數(shù)的調(diào)用例求兩個(gè)數(shù)中的最大值#include<stdio.h>voidmain(){inta,b,c,max(intx,inty);scanf(“%d,%d”,&a,&b);

c=max(a,b);printf(“Maxis%d”,c);}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}形參實(shí)參定義函數(shù)時(shí),形參調(diào)用函數(shù)時(shí),實(shí)參

函數(shù)的調(diào)用例求兩個(gè)數(shù)中的最大值形參實(shí)參定義函數(shù)時(shí),形參函數(shù)的調(diào)用函數(shù)調(diào)用的形式對于實(shí)現(xiàn)計(jì)算功能的函數(shù),函數(shù)調(diào)用通常出現(xiàn)在兩種情況:賦值語句

volume=cylinder(radius,height);輸出函數(shù)的實(shí)參

printf(“%f”,cylinder(radius,height));函數(shù)調(diào)用的形式對于實(shí)現(xiàn)計(jì)算功能的函數(shù),函數(shù)調(diào)用通常出現(xiàn)在函數(shù)調(diào)用的過程計(jì)算機(jī)在執(zhí)行程序時(shí),從主函數(shù)main開始執(zhí)行,如果遇到某個(gè)函數(shù)調(diào)用,主函數(shù)被暫停執(zhí)行,轉(zhuǎn)而執(zhí)行相應(yīng)的函數(shù),該函數(shù)執(zhí)行完后,將返回主函數(shù),然后再從原先暫停的位置繼續(xù)執(zhí)行。函數(shù)遇return返回主函數(shù)函數(shù)調(diào)用的過程計(jì)算機(jī)在執(zhí)行程序時(shí),從主函數(shù)main開始執(zhí)行,分析函數(shù)調(diào)用的過程#include<stdio.h>intmain(void){doubleheight,radius,volume;

doublecylinder(doubler,doubleh);

printf("Enterradiusandheight:"); scanf("%lf%lf",&radius,&height); volume=cylinder(radius,height); printf("Volume=%.3f\n",volume); return0;}doublecylinder(doubler,doubleh)

{ doubleresult; result=3.1415926*r*r*h;

returnresult;}調(diào)用函數(shù)實(shí)參

形參執(zhí)行函數(shù)中的語句返回調(diào)用它的地方分析函數(shù)調(diào)用的過程#include<stdio.h>調(diào)用函參數(shù)傳遞函數(shù)定義時(shí)的參數(shù)被稱為形式參數(shù)(簡稱形參)doublecylinder(doubler,doubleh);函數(shù)調(diào)用時(shí)的參數(shù)被稱為實(shí)際參數(shù)(簡稱實(shí)參)volume=cylinder(radius,height);參數(shù)傳遞:實(shí)參

形參在參數(shù)傳遞過程中,實(shí)參把值復(fù)制給形參。形參和實(shí)參一一對應(yīng):數(shù)量一致,類型一致,順序一致形參:變量,用于接受實(shí)參傳遞過來的值實(shí)參:常量、變量或表達(dá)式單向傳遞參數(shù)傳遞函數(shù)定義時(shí)的參數(shù)被稱為形式參數(shù)(簡稱形參)單向傳遞函數(shù)結(jié)果返回完成確定的運(yùn)算,將運(yùn)算結(jié)果返回給主調(diào)函數(shù)。函數(shù)結(jié)果返回的形式:return表達(dá)式;return(表達(dá)式);函數(shù)結(jié)果返回完成確定的運(yùn)算,將運(yùn)算結(jié)果返回給主調(diào)函數(shù)。在執(zhí)行函數(shù)調(diào)用時(shí),實(shí)參把值計(jì)算出來,拷貝給相應(yīng)位置的形參;函數(shù)執(zhí)行完后,通過

return(),可返回一個(gè)結(jié)果值。

實(shí)參與形參有多個(gè)實(shí)參時(shí)形參的改變個(gè)數(shù)相同、類型一致后面的先計(jì)算不影響實(shí)參變量的值只能返回一個(gè)結(jié)果,類型與函數(shù)定義時(shí)一致要調(diào)用函數(shù),必須先要聲明!小結(jié):要調(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ù)的返回值4.3函數(shù)的參數(shù)傳遞與返回值從函數(shù)是否有參數(shù)和返回值的角度,可以將函數(shù)分為:①有參數(shù)有返回值函數(shù)②有參數(shù)無返回值函數(shù)

③無參數(shù)有返回值函數(shù)④無參數(shù)無返回值函數(shù)從函數(shù)是否有參數(shù)和返回值的角度,可以將函數(shù)分為:導(dǎo)例:判斷素?cái)?shù)的函數(shù)求100以內(nèi)的全部素?cái)?shù),每行輸出10個(gè)。素?cái)?shù)就是只能被1和自身整除的正整數(shù),1不是素?cái)?shù),2是素?cái)?shù)。要求定義和調(diào)用函數(shù)prime(m)判斷m是否為素?cái)?shù),當(dāng)m為素?cái)?shù)時(shí)返回1,否則返回0。

算法描述:對2~100之間的每個(gè)數(shù)進(jìn)行判斷,若是素?cái)?shù),則輸出該數(shù)。for(m=2;m<=100;m++)if(m是素?cái)?shù))printf("%d",m);prime(m)!=0①有參數(shù)有返回值函數(shù)導(dǎo)例:判斷素?cái)?shù)的函數(shù)求100以內(nèi)的全部素?cái)?shù),每行輸出10個(gè)。例5-4源程序#include<stdio.h>#include<math.h>intmain(void){ intcount,m;

intprime(intm); count=0; for(m=2;m<=100;m++){ if(prime(m)!=0){ printf("%6d",m); count++; if(count%10==0) printf("\n");} } printf("\n");}intprime(intm){inti,n;if(m==1)return

0;

n=sqrt(m);for(i=2;i<=n;i++)if(m%i==0){

return

0; }

return

1;}例5-4源程序#include<stdio.h>int輸出5之內(nèi)的數(shù)字金字塔。/*輸出數(shù)字金字塔*/#include<stdio.h>intmain(void){

voidpyramid(intn); /*函數(shù)聲明*/

pyramid(5); /*調(diào)用函數(shù),輸出數(shù)字金字塔*/ return0;}voidpyramid(intn) /*函數(shù)定義*/{ inti,j; for(i=1;i<=n;i++){ /*需要輸出的行數(shù)*/ for(j=1;j<=n-i;j++) /*輸出每行左邊的空格*/ printf(""); for(j=1;j<=i;j++) /*輸出每行的數(shù)字*/ printf("%d",i); /*每個(gè)數(shù)字的前后各有一個(gè)空格*/ putchar('\n'); }}

122333444455555

for(i=1;i<=n;i++){

for(j=1;j<=n-i;j++) printf(“”);

一行中的數(shù)字顯示}②有參數(shù)無返回值函數(shù)for(i=1;i<=n;i++){

一行的處理}一行中的空格處理;一行中的數(shù)字顯示}輸出5之內(nèi)的數(shù)字金字塔。/*輸出數(shù)字金字塔*/不返回運(yùn)算結(jié)果的函數(shù)定義void

函數(shù)名(參數(shù)表) /*函數(shù)首部*/{ /*函數(shù)體*/

函數(shù)實(shí)現(xiàn)過程

return;

/*可以省略return*/}這類函數(shù)通常用于屏幕輸出等表示不返回結(jié)果不能省略,否則函數(shù)類型被默認(rèn)定義為int不返回運(yùn)算結(jié)果的函數(shù)定義void函數(shù)名(參數(shù)表) /*#include<stdio.h>intmain(void){

intin();intn; /*函數(shù)聲明*/

n=in();/*函數(shù)調(diào)用*/printf(“%d”,n); return0;}intin(){intx;scanf(“%d”,&x);returnx;}③無參數(shù)有返回值函數(shù)#include<stdio.h>③無參數(shù)有返回值函數(shù)函數(shù)沒有返回值——在聲明函數(shù)的時(shí)候,函數(shù)名前使用了保留字void。用函數(shù)調(diào)用語句調(diào)用。#include<stdio.h>voidmain(){voidprintstar();/*函數(shù)聲明*/voidprint_message();/*函數(shù)聲明*/printstar();print_message();printstar();}voidprintstar()

{printf(“*********\n”);

}

voidprint_message(){printf(“Howdoyoudo!\n”);}輸出:*****************

Howdoyoudo!*****************④無參數(shù)無返回值函數(shù)函數(shù)沒有返回值——在聲明函數(shù)的時(shí)候,函數(shù)名前使用了保留字vo4.3.3函數(shù)的參數(shù)傳遞在調(diào)用函數(shù)時(shí),實(shí)參與形參結(jié)合的具體過程是:計(jì)算實(shí)參表達(dá)式的值;將實(shí)參的值按賦值轉(zhuǎn)換規(guī)則轉(zhuǎn)換成對應(yīng)形參的數(shù)據(jù)類型;為形參分配存儲空間;將類型轉(zhuǎn)換后的實(shí)參的值傳遞給對應(yīng)的形參變量,然后執(zhí)行函數(shù)。4.3.3函數(shù)的參數(shù)傳遞

C語言中,函數(shù)的參數(shù)傳遞有兩種方式,即傳值和傳地址。

傳值:簡單地將實(shí)參的值復(fù)制一份給形參,一旦復(fù)制完成,實(shí)參與其對應(yīng)的形參便沒有任何關(guān)系,這時(shí)在函數(shù)內(nèi)對形參的任何改變都不會影響到實(shí)參。

傳地址:將實(shí)參地址傳遞給形參,在函數(shù)內(nèi)對形參所對應(yīng)數(shù)據(jù)的處理實(shí)際上就是處理對應(yīng)的實(shí)參。簡單地理解就是此時(shí)實(shí)參和形參同一的,對形參的處理就是對對應(yīng)的實(shí)參的處理。

C語言中,當(dāng)函數(shù)的參數(shù)為指針類型或數(shù)組類型時(shí)采用傳地址的方式,其他類型采用傳值方式。C語言中,函數(shù)的參數(shù)傳遞有兩種方式,即傳值和傳地址。4.3.4函數(shù)的返回值

函數(shù)的調(diào)用本質(zhì)上是一個(gè)表達(dá)式,它將返回特定類型數(shù)據(jù)的值(即返回值),因此只要該值能出現(xiàn)的位置,都可以使用該函數(shù)調(diào)用表達(dá)式。從函數(shù)返回值的類型看,有兩種類型:①是完成確定的運(yùn)算,并由運(yùn)算結(jié)果返回給主調(diào)函數(shù),稱為有返回值的函數(shù);函數(shù)類型用返回值類型指定。②是完成指定的工作,沒有確定的運(yùn)算結(jié)果需返回給主調(diào)函數(shù),稱為無返回值的函數(shù)。函數(shù)類型用void指定。4.3.4函數(shù)的返回值1、有返回值函數(shù)有返回值函數(shù)在函數(shù)定義時(shí)必須說明返回值的類型,在函數(shù)體中由return語句給出具體的返回值。有返回值return語句的一般形式如下:return表達(dá)式;

return(表達(dá)式);先求解表達(dá)式的值,再返回其值。通常表達(dá)式的結(jié)果類型與函數(shù)的返回值類型一致return語句的作用有兩個(gè):一是結(jié)束函數(shù)的運(yùn)行;二是帶著運(yùn)算結(jié)果(表達(dá)式的值)返回主調(diào)函數(shù)。1、有返回值函數(shù)函數(shù)有返回值:函數(shù)執(zhí)行完畢后,返回一個(gè)相應(yīng)類型的數(shù)值。用return語句返回該值:return表達(dá)式;用函數(shù)調(diào)用表達(dá)式調(diào)用。如:printf(“Theaverageis%6.2f”,average(dataArray,n));ave=average(dataArray,n);函數(shù)有返回值:函數(shù)執(zhí)行完畢后,返回一個(gè)相應(yīng)類型的數(shù)值。如:2、無返回值函數(shù)無返回值函數(shù)只完成某種特定的處理,函數(shù)執(zhí)行后無須向調(diào)用者返回計(jì)算結(jié)果。

無返回值函數(shù)在函數(shù)定義時(shí)必須將返回值的類型說明為void(即空類型),函數(shù)體中的return語句只結(jié)束函數(shù)的執(zhí)行。如果函數(shù)類型為void,則函數(shù)返回直接用return語句,不必跟上一個(gè)表達(dá)式。

無返回值return語句的一般形式如下:return;在函數(shù)定義中也可以沒有return語句,此時(shí)函數(shù)執(zhí)行到最后一條語句。2、無返回值函數(shù)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遞歸函數(shù)4.4.2導(dǎo)例:Fibonacci數(shù)列1.問題描述從鍵盤輸入一個(gè)整數(shù)n,輸出斐波那契數(shù)列(fibonacci)的前n項(xiàng)。要求每行打印10個(gè)數(shù)后換行。2.問題分析斐波那契數(shù)列為1,1,2,3,5,8,13……即從第三項(xiàng)開始,各項(xiàng)值都等于前兩項(xiàng)值之和。斐波那契數(shù)列的定義為:1n=0f(n)=1n=1f(n-1)+f(n-2)n>14.4.2導(dǎo)例:Fibonacci數(shù)列采用非遞歸方法,程序片段如下:

first=1,second=1;scanf("%d",&n);for(i=0;i<n;i++){result=first+second; printf("%.0f",result);first=second;

second=result;

}采用非遞歸方法,程序片段如下:#include<stdio.h>intfib(intk);main(){intn,i,count=0;printf("Enter1integers\n:");scanf("%d",&n);for(i=0;i<n;i++){printf("%10d",fib(i));count++;if(count%5==0)printf("\n");}}intfib(intn){intf;if(n==0)f=1;elseif(n==1)f=1;else

f=fib(n-1)+fib(n-2);returnf;}#include<stdio.h>intfib(int6.程序分析6.程序分析4.4.3遞歸函數(shù)的執(zhí)行過程遞歸函數(shù)要注意兩點(diǎn):

①遞歸出口:遞歸的結(jié)束條件,說明到何時(shí)不再遞歸調(diào)用;否則無限制遞歸,終將使??臻g溢出;

②遞歸公式:當(dāng)前函數(shù)結(jié)果與準(zhǔn)備調(diào)用的函數(shù)結(jié)果之間的關(guān)系,即原問題是如何分解為子問題的。

1n=0fact(1)=1遞歸出口n!=n×(n-1)!n>1fact(n)=n*fact(n-1)遞歸公式

4.4.3遞歸函數(shù)的執(zhí)行過程實(shí)現(xiàn)階乘遞歸算法的遞歸函數(shù)

longfact(intn){ if(n==0)return1; elsereturnn*fact(n-1);}

實(shí)現(xiàn)階乘遞歸算法的遞歸函數(shù)y=fact(3)

3*fact(2)2*fact(1)1*fact(0)111*112*123*26遞歸函數(shù)的調(diào)用過程y=fact(3)3*fact(2)2*fact(1)1*遞歸程序的內(nèi)部執(zhí)行過程函數(shù)的遞歸調(diào)用類似于多個(gè)函數(shù)的嵌套調(diào)用,只不過調(diào)用函數(shù)和被調(diào)用函數(shù)是同一個(gè)函數(shù)。遞歸調(diào)用的內(nèi)部執(zhí)行過程如下:①運(yùn)行開始時(shí),系統(tǒng)設(shè)立工作棧來保存每次調(diào)用的運(yùn)行環(huán)境,包括形參、局部變量和返回地址;②遞歸調(diào)用前,將調(diào)用函數(shù)的形參、局部變量以及調(diào)用后的返回地址進(jìn)棧;③調(diào)用結(jié)束后,將棧頂數(shù)據(jù)出棧,恢復(fù)調(diào)用前的運(yùn)行環(huán)境,使相應(yīng)的形參和局部變量恢復(fù)為調(diào)用前的值,然后從返回地址指定的位置繼續(xù)執(zhí)行調(diào)用函數(shù)。遞歸程序的內(nèi)部執(zhí)行過程4.4.4遞歸函數(shù)的效率分析遞歸函數(shù)如果很緩慢地逼近到遞歸結(jié)束條件,會使性能大大下降。遞歸增加了系統(tǒng)開銷,時(shí)間上,執(zhí)行調(diào)用與返回的額外工作要占用CPU時(shí)間??臻g上,隨著每遞歸一次,棧內(nèi)存就多占一塊,即要分配相應(yīng)的存儲空間,并完成參數(shù)的傳遞、函數(shù)的返回等,在程序的執(zhí)行效率和所消耗的存儲空間上,和非遞歸相比沒有任何優(yōu)勢。一般的遞歸都可以通過相應(yīng)的方法轉(zhuǎn)化為非遞歸的,所以不推薦使用遞歸,特別是不推薦使用遞歸層次較多的遞歸。4.4.4遞歸函數(shù)的效率分析4.5C局部變量、全局變量與變量作用域4.5.1導(dǎo)例:富翁與騙子 4.5.2導(dǎo)例:簡易庫存存取貨管理 4.5.3局部變量和全局變量 4.5.4變量的作用域和生存期4.5C局部變量、全局變量與變量作用域分別輸入2個(gè)復(fù)數(shù)的實(shí)部與虛部,用函數(shù)實(shí)現(xiàn)計(jì)算2個(gè)復(fù)數(shù)之和與之積。分析若2個(gè)復(fù)數(shù)分別為: c1=x1+y1i,c2=x2+y2i,則:

c1+c2=(x1+x2)+(y1+y2)i

c1*c2=(x1*x2-y1*y2)+(x1*y2+x2*y1)i

復(fù)數(shù)運(yùn)算分別輸入2個(gè)復(fù)數(shù)的實(shí)部與虛部,用函數(shù)實(shí)現(xiàn)計(jì)算2個(gè)復(fù)數(shù)之和與之#include<stdio.h>floatresult_real,result_imag; /*全局變量,用于存放函數(shù)結(jié)果*/intmain(void){ floatimag1,imag2,real1,real2;/*兩個(gè)復(fù)數(shù)的實(shí)、虛部變量*/

/*函數(shù)聲明*/ voidcomplex_prod(floatreal1,floatimag1,floatreal2,floatimag2); voidcomplex_add(floatreal1,floatimag1,floatreal2,floatimag2); printf("Enter1stcomplexnumber(realandimaginary):"); scanf("%f%f",&real1,&imag1); /*輸入第一個(gè)復(fù)數(shù)*/ printf("Enter2ndcomplexnumber(realandimaginary):"); scanf("%f%f",&real2,&imag2); /*輸入第兩個(gè)復(fù)數(shù)*/

complex_add(real1,imag1,real2,imag2); /*求復(fù)數(shù)之和*/

printf("additionofcomplexis%f+%fi\n",result_real,result_imag);

complex_prod(real1,imag1,real2,imag2);/*求復(fù)數(shù)之積*/

printf("productofcomplexis%f+%fi\n",result_real,result_imag); return0;}運(yùn)行結(jié)果Enter1stcomplexnumber(realandimaginary):11Enter2ndcomplexnumber(realandimaginary):-23additionofcomplexis-1.000000+4.000000iproductofcomplexis-5.000000+1.000000i#include<stdio.h>運(yùn)行結(jié)果voidcomplex_add(floatreal1,floatimag1,floatreal2,floatimag2){ result_real=real1+real2; result_imag=imag1+imag2;}voidcomplex_prod(floatreal1,floatimag1,floatreal2,floatimag2){ result_real=real1*real2-imag1*imag2; result_imag=real1*imag2+real2*imag1;}voidcomplex_add(floatreal1,局部變量在函數(shù)內(nèi)定義的變量(包括形參)作用范圍:本函數(shù)內(nèi)部定義在復(fù)合語句內(nèi)的變量作用范圍:復(fù)合語句內(nèi)部全局變量 在函數(shù)以外定義的變量,不從屬于任一函數(shù)。作用范圍:從定義處到源文件結(jié)束(包括各函數(shù))4.5.3局部變量和全局變量局部變量4.5.3局部變量和全局變量在復(fù)合語句中定義局部變量#include<stdio.h>intmain(void){

int a;a=1;

{ /*復(fù)合語句開始*/

intb=2;b=a+b;a=a+b;

} /*復(fù)合語句結(jié)束*/ printf("%d",a); return0;}b:小范圍內(nèi)的臨時(shí)變量

輸出:4改成b會如何?在復(fù)合語句中定義局部變量#include<stdio.h>

全局變量定義#include"stdio.h"intx; /*定義全局變量x*/intf(){

intx=4;/*x為局部變量*/returnx;}intmain(void){inta=1;

x=a; /*對全局變量x賦值*/a=f(); /*a的值為4*/{

intb=2;

b=a+b; /*b的值為6*/

x=x+b; /*全局變量運(yùn)算*/}printf("%d%d",a,x);return0;}若局部變量與全局變量同名,局部變量優(yōu)先輸出:4,7全局變量定義#include"stdio.h"若局部變量變量作用范圍示例intx=1;voidmain(){inta=2;……..{intb=3;…..}f();………..}intt=4;voidf(){intx=5,b=6;…….}inta=7;

x=?a=?b=?b=?

x=5b=6t=4a沒定義

x=?b=?t=?a=?變量作用范圍示例intx=1;x=?a=?b用函數(shù)實(shí)現(xiàn)財(cái)務(wù)現(xiàn)金記賬。先輸入操作類型(1收入,2支出,0結(jié)束),再輸入操作金額,計(jì)算現(xiàn)金剩余額,經(jīng)多次操作直到輸入操作為0結(jié)束。要求定義并調(diào)用函數(shù),其中現(xiàn)金收入與現(xiàn)金支出分別用不同函數(shù)實(shí)現(xiàn)。分析:設(shè)變量cash保存現(xiàn)金余額值,由于它被主函數(shù)、現(xiàn)金收入與現(xiàn)金支出函數(shù)共用,任意使用場合其意義與數(shù)值都是明確和唯一的,因此令其為全局變量。財(cái)務(wù)現(xiàn)金記賬用函數(shù)實(shí)現(xiàn)財(cái)務(wù)現(xiàn)金記賬。先輸入操作類型(1收入,2支出,#include<stdio.h>floatcash; /*定義全局變量,保存現(xiàn)金余額*/intmain(void){ intchoice; floatvalue; voidincome(floatnumber),expend(floatnumber); /*函數(shù)聲明*/

cash=0; /*初始金額=0*/ printf("Enteroperatechoice(0--end,1--income,2--expend):"); scanf("%d",&choice); /*輸入操作類型*/ while(choice!=0){ /*若輸入類型為0,循環(huán)結(jié)束*/ if(choice==1||choice==2){ printf("Entercashvalue:"); /*輸入操作現(xiàn)金額*/ scanf("%f",&value); if(choice==1)income(value);/*函數(shù)調(diào)用,計(jì)算現(xiàn)金收入*/ else expend(value); /*函數(shù)調(diào)用,計(jì)算現(xiàn)金支出*/ printf("currentcash:%.2f\n",cash); } printf("Enteroperatechoice(0--end,1--income,2--expend):"); scanf("%d",&choice); /*繼續(xù)輸入操作類型*/ } return0;}

/*定義計(jì)算現(xiàn)金收入函數(shù)*/voidincome(floatnumber){cash=cash+number; /*改變?nèi)肿兞縞ash*/} /*定義計(jì)算現(xiàn)金支出函數(shù)*/voidexpend(floatnumber){cash=cash-number; /*改變?nèi)肿兞縞ash*/}Enteroperatechoice(0--end,1--income,2--expend):1Entercashvalue:1000currentcash:1000.000000Enteroperatechoice(0--end,1--income,2--expend):2Entercashvalue:456currentcash:544.000000Enteroperatechoice(0--end,1--income,2--expend):0#include<stdio.h> /*定義計(jì)算現(xiàn)金收入4.5.3局部變量和全局變量全局變量:定義在函數(shù)(包括main函數(shù))外而不屬于任意函數(shù)的變量。作用范圍是從定義開始到程序所在文件的結(jié)束,其對作用范圍內(nèi)的所有函數(shù)都起作用。局部變量:是指在某個(gè)函數(shù)之內(nèi)或語句塊內(nèi)定義的變量;函數(shù)的形參列表中的變量也是局部變量;只能在某個(gè)函數(shù)內(nèi)部使用。塊變量(局部變量):在復(fù)合語句中定義的變量。4.5.3局部變量和全局變量4.5.4變量的作用域和生存期變量是存儲空間在程序中的一種表示對變量的操作就是對變量所對應(yīng)的存儲空間中所存放的數(shù)據(jù)的操作。生存期:變量占據(jù)存儲空間的時(shí)間,即變量在什么時(shí)間段內(nèi)存在作用域:變量可以引用的區(qū)域,即變量在哪些代碼塊中能夠訪問4.5.4變量的作用域和生存期塊變量:在復(fù)合語句中定義的變量,其生存期為所在的復(fù)合語句塊中。例:if(x>y){inttemp;temp=x;x=y;y=temp;}塊變量:在復(fù)合語句中定義的變量,其生存期為所在的復(fù)合語句塊中局部變量:在函數(shù)內(nèi)部和形式參數(shù)表中定義的變量都屬于局部變量。作用域是定義這些變量的函數(shù)。計(jì)算兩個(gè)整數(shù)的最小公倍數(shù)#include<stdio.h>intlcm(intx,inty);main(){intm,n,common;scanf(“%d%d”,&m,&n);common=lcm(m,n);printf(“\n%d,%dleasecommonmultipleis%d”,m,n,common);}intlcm(intx,inty){inttemp,multiple;if(x>=y)temp=x;elsetemp=y;multiple=temp;while(temp%x!=0||temp%y!=0){temp+=multip;}returntemp;}局部變量:在函數(shù)內(nèi)部和形式參數(shù)表中定義的變量都屬于局部變量。全局變量全局變量的生存期是定義這個(gè)變量的程序文件作用域是從定義處開始到程序文件的結(jié)束處為止如果程序文件中的某些局部變量與之同名,則全局變量的作用域應(yīng)該去除這部分區(qū)域。靜態(tài)存儲:在程序開始運(yùn)行時(shí)系統(tǒng)就為之分配存儲空間,等到程序結(jié)束時(shí)才將為其分配的存儲空間回收。變量的生存期是由存儲類別控制的自動變量和靜態(tài)變量全局變量全局變量的生存期是定義這個(gè)變量的程序文件靜態(tài)存儲:在自動存儲:在函數(shù)開始執(zhí)行時(shí)為之分配存儲空間,函數(shù)執(zhí)行完畢后,立即回收這些存儲空間。在默認(rèn)情況下,局部變量都屬于自動變量。靜態(tài)局部變量(static變量)格式:static數(shù)據(jù)類型變量名;在局部變量說明前加上static構(gòu)成靜態(tài)局部變量。靜態(tài)存儲,在整個(gè)程序運(yùn)行期間存儲空間都不釋放。 局部靜態(tài)變量局部于定義它的函數(shù)。出了函數(shù),靜態(tài)變量的值仍然保存,但不能引用。自動存儲:在函數(shù)開始執(zhí)行時(shí)為之分配存儲空間,函數(shù)執(zhí)行完畢后,全局變量是靜態(tài)存儲。函數(shù)的形式參數(shù)必須是自動變量。采用下面的語句段調(diào)用上面的函數(shù)

for(i=1;i<=10;i++){fun();}將會再屏幕上看到12345678910voidfun(){staticcount=0;count++;printf(“%4d”,count);}全局變量是靜態(tài)存儲。采用下面的語句段調(diào)用上面的函數(shù)將會再屏4.6函數(shù)綜合應(yīng)用4.6.1導(dǎo)例:模擬銀行ATM機(jī)存取款 4.6.2導(dǎo)例:貸款計(jì)算器 4.6.3程序主體框架的設(shè)計(jì)與實(shí)現(xiàn) 4.6.4模塊化程序設(shè)計(jì)的基本特征4.6函數(shù)綜合應(yīng)用4.6.1導(dǎo)例:模擬銀行ATM機(jī)存取款1.問題描述模擬銀行ATM機(jī)存取款,實(shí)現(xiàn)單個(gè)帳戶的查詢、存款、取款、轉(zhuǎn)帳、修改密碼等功能。4.6.1導(dǎo)例:模擬銀行ATM機(jī)存取款2.問題分析

進(jìn)行模塊化設(shè)計(jì),上述各項(xiàng)需求:查詢、存款、取款、轉(zhuǎn)帳、修改密碼分別用不同函數(shù)實(shí)現(xiàn)。由main()函數(shù)調(diào)用各函數(shù)來實(shí)現(xiàn)上述需求。首先輸入密碼進(jìn)行判斷,密碼正確后輸出一個(gè)簡單菜單顯示項(xiàng),

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論