新編-C語言培訓(xùn)教材課件第5章_第1頁
新編-C語言培訓(xùn)教材課件第5章_第2頁
新編-C語言培訓(xùn)教材課件第5章_第3頁
新編-C語言培訓(xùn)教材課件第5章_第4頁
新編-C語言培訓(xùn)教材課件第5章_第5頁
已閱讀5頁,還剩97頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5章函數(shù)2019年3月1第5章函數(shù)2019年3月1主要內(nèi)容

5.1概述5.2函數(shù)的定義與調(diào)用5.3數(shù)組作函數(shù)參數(shù)5.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用5.5局部變量和全局變量及其作用域5.6變量的存儲(chǔ)類別及變量的生存期5.7函數(shù)的存儲(chǔ)分類2019年3月2主要內(nèi)容5.1概述2019年3月25.1概述①程序結(jié)構(gòu)清晰,可讀性好。②減少重復(fù)編碼的工作量。③可多人共同編制一個(gè)大程序,縮短程序設(shè)計(jì)周期,提高程序設(shè)計(jì)和調(diào)試的效率。使用函數(shù)的好處……C程序源程序文件n函數(shù)1函數(shù)m……源程序文件1函數(shù)1函數(shù)n2019年3月35.1概述①程序結(jié)構(gòu)清晰,可讀性好。使用函數(shù)的……C程序【例5.1】求一個(gè)整數(shù)的立方。intcube(intx)

/*函數(shù)定義*/{return(x*x*x);}main(){intf,a;printf("\nEnteranintegernumber:");scanf("%d",&a);f=cube(a);

printf("%d*%d*%d=%d\n",a,a,a,f);}程序運(yùn)行情況如下:Enteranintegernumber:22*2*2=8函數(shù)調(diào)用程序的執(zhí)行總是從main函數(shù)開始2019年3月4【例5.1】求一個(gè)整數(shù)的立方。intcube(intx⑴一個(gè)C源程序可以由一個(gè)或多個(gè)源程序文件組成。C編譯系統(tǒng)在對(duì)C源程序進(jìn)行編譯時(shí)是以文件為單位進(jìn)行的。⑵一個(gè)C源程序文件可以由一個(gè)或多個(gè)函數(shù)組成。所有函數(shù)都是獨(dú)立的。主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)可以相互調(diào)用。⑶在一個(gè)C程序中,有且僅有一個(gè)主函數(shù)main。C程序的執(zhí)行總是從main函數(shù)開始,調(diào)用其它函數(shù)后最終回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。說明2019年3月5⑴一個(gè)C源程序可以由一個(gè)或多個(gè)源程序文件組成。C編譯系統(tǒng)在⑷函數(shù)的種類從函數(shù)定義形式分:①有參函數(shù):在主調(diào)(用)函數(shù)和被調(diào)(用)函數(shù)之間通過參數(shù)進(jìn)行數(shù)據(jù)傳遞,如:

intcube(intx){…}

②無參函數(shù):如:getchar()在調(diào)用無參函數(shù)時(shí),主調(diào)函數(shù)不需要將數(shù)據(jù)傳遞給無參函數(shù)。從使用的角度看:①標(biāo)準(zhǔn)函數(shù)(庫函數(shù))庫函數(shù)是由系統(tǒng)提供的。如:getchar()、sin(x)等。在程序中可以直接調(diào)用它們。附錄3列出了C的部分庫函數(shù)。②用戶自定義函數(shù)。如:例5.1中的cube函數(shù)。2019年3月6⑷函數(shù)的種類從函數(shù)定義形式分:從使用的角度看:2019年3【例5.2】無參函數(shù)的定義與調(diào)用。voidwelcome(){printf("*********************************\n");printf("WelcometoChina\n");printf("*********************************\n");}main(){welcome();}程序的輸出結(jié)果如下:*********************************

WelcometoChina*********************************2019年3月7【例5.2】無參函數(shù)的定義與調(diào)用。voidwelcome5.2.1函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型函數(shù)名(類型名形式參數(shù)1,…

){說明語句

執(zhí)行語句}例如:求兩個(gè)數(shù)的最大值。

int

max(intx,inty){intz;z=x>y?x:y;return(z);}類型省略時(shí)默認(rèn)為int類型沒有形式參數(shù)為無參函數(shù)

2019年3月85.2.1函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型函數(shù)名(類intmax(x,y)intx,y;{intz;z=x>y?x:y;return(z);}intmax(x,y){intx,y;……}或intmax(intx,y){……}或intmax(x,y)intx,y,z;{z=x>y?x:y;return(z);}花括號(hào)中也可以為空,這種函數(shù)叫空函數(shù)。不能在函數(shù)體內(nèi)定義其他函數(shù),即函數(shù)不能嵌套定義。形參也可以這樣定義如下定義都是錯(cuò)誤的

√2019年3月9intmax(x,y)intmax(x,y)或花括號(hào)中也函數(shù)名(實(shí)參表列)在C語言中,把函數(shù)調(diào)用也作為一個(gè)表達(dá)式。因此凡是表達(dá)式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調(diào)用。例如:①welcome();

②if(iabs(a)>max)max=iabs(a);

③m=max(c,max(a,b));5.2.2函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式:2019年3月10函數(shù)名(實(shí)參表列)在C語言中,把函數(shù)調(diào)用也作為一個(gè)表達(dá)式。因intsum100(){inti,t=0;for(i=1;i<=100;i++)t+=i;return(t);}main(){ints;s=sum100();printf("%d\n",s);}程序輸出結(jié)果:5050intsum(intx){inti,t=0;for(i=1;i<=x;i++)t+=i;return(t);}main(){ints;s=sum(100);printf("%d\n",s);}【例5.3】求1~100的累加和。思考:兩個(gè)程序有何不同程序輸出結(jié)果:5050?2019年3月11intsum100()程序輸出結(jié)果:intsum(voidswap(intx,inty){intz;z=x;x=y;y=z; printf("\nx=%d,y=%d",x,y);}main(){inta=10,b=20;swap(a,b);printf("\na=%d,b=%d\n",a,b);}5.2.3函數(shù)參數(shù)與函數(shù)的返回值1.函數(shù)的形式參數(shù)與實(shí)際參數(shù)程序輸出結(jié)果:x=20,y=10a=10,b=20形式參數(shù)(形參)實(shí)際參數(shù)(實(shí)參)【例5.4】編一程序,將主函數(shù)中的兩個(gè)變量的值傳遞給swap函數(shù)中的兩個(gè)形參,交換兩個(gè)形參的值。單向值傳遞2019年3月12voidswap(intx,inty)5.2.3有關(guān)形參和實(shí)參的說明:

①當(dāng)函數(shù)被調(diào)用時(shí)才給形參分配內(nèi)存單元。調(diào)用結(jié)束,所占內(nèi)存被釋放。②實(shí)參可以是常量、變量或表達(dá)式,但要求它們有確定的值。③實(shí)參與形參類型要一致,字符型與整型可以兼容。④實(shí)參與形參的個(gè)數(shù)必須相等。在函數(shù)調(diào)用時(shí),實(shí)參的值賦給與之相對(duì)應(yīng)的形參?!皢蜗蛑祩鬟f”。注意:在TC中,實(shí)參的求值順序是從右到左。2019年3月13有關(guān)形參和實(shí)參的說明:①當(dāng)函數(shù)被調(diào)用時(shí)才給形參分配內(nèi)存單【例5.5】函數(shù)調(diào)用中實(shí)參的求值順序。voidfun(inta,intb){printf("a=%d,b=%d\n",a,b);}main(){intm=5;fun(3+m,m++);}程序輸出結(jié)果:a=9,b=52019年3月14【例5.5】函數(shù)調(diào)用中實(shí)參的求值順序。voidfun(i2.函數(shù)的類型與函數(shù)的返回值說明:①函數(shù)的類型決定了函數(shù)返回值的類型。若省略函數(shù)的類型,系統(tǒng)默認(rèn)其為int型。②無返回值的函數(shù)應(yīng)將其類型定義為void(空)類型。⑴函數(shù)的類型【例5.6】輸出兩個(gè)數(shù)中的大數(shù)。max(intx,inty){intz;z=x>y?x:y;return(z);/*返回z的值*/}main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("maxis%d\n",c);}2019年3月152.函數(shù)的類型與函數(shù)的返回值說明:⑴函數(shù)的類型【例5.6】函數(shù)的返回值是通過return語句帶回到主調(diào)函數(shù)的功能:終止函數(shù)的運(yùn)行,返回主調(diào)函數(shù),若有返回值,將返回值帶回主調(diào)函數(shù)。說明:①若函數(shù)沒有返回值,return語句可以省略。②return語句中的表達(dá)式類型一般應(yīng)和函數(shù)的類型一致,如果不一致,系統(tǒng)自動(dòng)將表達(dá)式類型轉(zhuǎn)換為函數(shù)類型。⑵函數(shù)的返回值return語句格式:return(表達(dá)式);

或return表達(dá)式;或return;2019年3月16函數(shù)的返回值是通過return語句帶回到主調(diào)函數(shù)的功能:終止【例5.8】計(jì)算并輸出圓的面積。s(intr){return3.14*r*r;}main(){intr,area;scanf("%d",&r);printf("%d\n",s(r));}自動(dòng)轉(zhuǎn)換為int型思考:若要得到單精度實(shí)型的圓面積,程序應(yīng)如何修改程序運(yùn)行情況如下:212?2019年3月17【例5.8】計(jì)算并輸出圓的面積。s(intr)自動(dòng)轉(zhuǎn)換為i

5.2.4對(duì)被調(diào)函數(shù)的聲明和函數(shù)原型變量要先定義后使用,函數(shù)也如此。即被調(diào)函數(shù)的定義要出現(xiàn)在主調(diào)函數(shù)的定義之前。如swap函數(shù):允許整型函數(shù)(且參數(shù)也是整型)的定義出現(xiàn)在主調(diào)函數(shù)之后。如max函數(shù):如果非整型函數(shù)在主調(diào)函數(shù)之后定義,則應(yīng)在主調(diào)函數(shù)中或主調(diào)函數(shù)之前對(duì)被調(diào)函數(shù)進(jìn)行聲明。voidswap(intx,inty){…}main(){…swap(a,b);}main(){…c=max(a,b);}max(intx,inty){…}2019年3月185.2.4對(duì)被調(diào)函數(shù)的聲明和函數(shù)原型變量要先定義后使用對(duì)被調(diào)函數(shù)進(jìn)行聲明的一般形式

函數(shù)類型函數(shù)名(參數(shù)類型1

參數(shù)名1,…);或函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2,…);思考:以下哪種情況需要在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)聲明被調(diào)函數(shù)定義在前,主調(diào)函數(shù)定義在后。主調(diào)函數(shù)定義在前,被調(diào)函數(shù)定義在后。第二種形式省略了參數(shù)名,此種形式也稱為函數(shù)的原型。?2019年3月19對(duì)被調(diào)函數(shù)進(jìn)行聲明的一般形式函數(shù)類型函數(shù)名(參main(){voidcalc(floatx,floaty,charopr);

floata,b;charopr;printf("\nInputexpression:");scanf("%f%c%f",&a,&opr,&b);calc(a,b,opr);}voidcalc(floatx,floaty,charopr){switch(opr){case'+':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x+y);return;case'-':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x-y);return;case'*':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x*y);return;case'/':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x/y);return;default:printf("Operatorerr!\n");}}對(duì)被調(diào)函數(shù)的聲明【例5.9】計(jì)算并輸出兩個(gè)數(shù)的和、差、積、商。2019年3月20main()對(duì)被調(diào)函數(shù)的聲明【例5.9】計(jì)算并輸出兩個(gè)數(shù)的5.3數(shù)組作函數(shù)參數(shù)5.3.1一維數(shù)組元素作函數(shù)參數(shù)main(){inta[5],i,m;for(i=0;i<5;i++)scanf("%d",&a[i]);m=a[0];for(i=1;i<5;i++)m=min(m,a[i]);printf("%d\n",m);}【例5.11】求5個(gè)數(shù)中的最小值。intmin(intx,inty){return(x<y?x:y);}用打擂臺(tái)方法求最小值。m相當(dāng)于擂主2019年3月215.3數(shù)組作函數(shù)參數(shù)5.3.1一維數(shù)組元素作函數(shù)參數(shù)ma5.3.2一維數(shù)組名作函數(shù)參數(shù)數(shù)組名表示數(shù)組在內(nèi)存中的起始地址。例如:數(shù)組a在內(nèi)存中從2000地址開始存放,則a的值為2000。2000是地址值,是指針類型的數(shù)據(jù)(后面將介紹指針類型),不能把它看成是整型或其他類型數(shù)據(jù)。實(shí)參是數(shù)組名,形參也應(yīng)定義為數(shù)組形式,形參數(shù)組的長(zhǎng)度可以省略,但[]不能省,否則就不是數(shù)組形式了。

【例5.12】用冒泡法將10個(gè)整數(shù)排序。2019年3月225.3.2一維數(shù)組名作函數(shù)參數(shù)數(shù)組名表示數(shù)組在內(nèi)存中的起始voidsort(intb[],intn);voidprintarr(intb[]);main(){inta[10]={11,22,63,97,58,80,45,32,73,36};printf("Beforesort:\n");

printarr(a);

sort(a,10);

printf("Aftersort:\n");

printarr(a);}voidprintarr(intb[10]){inti;for(i=0;i<10;i++)printf("%5d",b[i]);printf("\n");}voidsort(intb[],intn){inti,j,t;for(i=1;i<n;i++)for(j=0;j<n-i;j++)if(b[j]>b[j+1]){t=b[j];b[j]=b[j+1];b[j+1]=t;}}2019年3月23voidsort(intb[],intn);

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]

b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]11226397588045327336(a)排序前a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]11223236455863738097(b)排序后圖7.3調(diào)用sort函數(shù)2000b形參b實(shí)際是一個(gè)可以存放地址的變量a:2000實(shí)參賦給形參首地址:

2000首地址:

20002019年3月24a[0]a[1]a[2]a[3]a[4]#include"stdio.h"main(){voidscat(charstr1[],charstr2[]);chars1[50],s2[50];inti,k;printf("Inputs1:");gets(s1);printf("Inputs2:");gets(s2);

scat(s1,s2);printf("Outputs1:%s\n",s1);printf("Outputs2:%s\n",s2);}voidscat(charstr1[],charstr2[]){inti=0,k=0;while(str1[i]!='\0')i++;while(str2[k]!='\0'){str1[i]=str2[k];i++;k++;}str1[i]='\0';}scat函數(shù)還可簡(jiǎn)化為:voidscat(charstr1[],charstr2[]){inti=0,k=0;while(str1[i])i++;while(str1[i++]=str2[k++]);}【例5.13】編程序,實(shí)現(xiàn)字符串連接。2019年3月25voidscat(charstr1[],charst5.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用main函數(shù){

……

調(diào)用函數(shù)A;

……}函數(shù)A{……

調(diào)用函數(shù)B;

……}函數(shù)B{

……

……

……}5.4.1函數(shù)的嵌套調(diào)用2019年3月265.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用main函數(shù)函數(shù)A函數(shù)B【例5.15】函數(shù)的嵌套調(diào)用main(){intn=3;printf("%d\n",sub1(n));}sub1(intn){inti,a=0;for(i=n;i>0;i--)a+=sub2(i);returna;}sub2(intn){returnn+1;}程序輸出結(jié)果:92019年3月27【例5.15】函數(shù)的嵌套調(diào)用main()sub1(int5.4.2函數(shù)的遞歸調(diào)用1.遞歸的基本概念遞歸調(diào)用:一個(gè)函數(shù)直接或間接地調(diào)用了它本身,就稱為函數(shù)的遞歸調(diào)用。遞歸函數(shù):在函數(shù)體內(nèi)調(diào)用該函數(shù)本身。intsub(intx){inty,z;……if(……)z=sub(y);else{……}return;}例如:直接調(diào)用sub函數(shù)本身2019年3月285.4.2函數(shù)的遞歸調(diào)用1.遞歸的基本概念遞歸調(diào)用:一個(gè)函2.遞歸函數(shù)的執(zhí)行過程【例5.16】編一遞歸函數(shù)求n!。思路:以求4的階乘為例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。遞歸結(jié)束條件:當(dāng)n=1或n=0時(shí),n!=1。遞歸公式:n!=1(n=0,1)n×(n-1)!(n>1)2019年3月292.遞歸函數(shù)的執(zhí)行過程【例5.16】編一遞歸函數(shù)求n!。思路程序如下:floatfact(intn){floatf=0;if(n<0)printf("n<0,error!");elseif(n==0||n==1)f=1;elsef=fact(n-1)*n;return(f);}main(){intn;floaty;printf("\nInputn:");scanf("%d",&n);y=fact(n);printf("%d!=%-10.0f\n",n,y);}運(yùn)行情況如下:Inputaintegernumber:44!=242019年3月30程序如下:floatfact(intn)main()遞歸調(diào)用過程

回推main()fact(4)fact(3)fact(2)fact(1){{{{{……………

y=fact(4);f=4*fact(3);f=3*fact(2);f=2*fact(1);f=1;

……………return24return6return2return1}}}}}

遞推

2019年3月31遞歸調(diào)用過程3.編制遞歸函數(shù)的方法數(shù)值型問題遞歸函數(shù)的編程方法對(duì)于數(shù)值型問題,首先要找出解題的數(shù)學(xué)公式,這個(gè)公式必須是遞歸定義的,且所處理的對(duì)象要有規(guī)律地遞增或遞減,然后確定遞歸結(jié)束條件?!纠?.17】編一遞歸函數(shù)求xn

。思路:首先把xn轉(zhuǎn)化成遞歸定義的公式xn=1(n=0)x×xn-1

(n>0)再找出遞歸結(jié)束條件:當(dāng)n=0時(shí),xn=1。2019年3月323.編制遞歸函數(shù)的方法數(shù)值型問題遞歸函數(shù)的編程方法xn=1程序如下:longxn(intx,intn){longf=0;if(n<0)printf("n<0,dataerror!\n");elseif(n==0)f=1;elsef=x*xn(x,n-1);return(f);}main(){intn,x;longy;scanf("%d,%d",&x,&n);y=xn(x,n);printf("%ld\n",y);}程序運(yùn)行情況如下:2,1010242019年3月33程序如下:longxn(intx,intn)程序運(yùn)行情5.5局部變量和全局變量及其作用域5.5.1變量的作用域5.5.2局部變量及其作用域變量的作用域:變量在程序中可以被使用的范圍。根據(jù)變量的作用域可以將變量分為局部變量和全局變量。局部變量(內(nèi)部變量):在函數(shù)內(nèi)或復(fù)合語句內(nèi)定義的變量以及形參。作用域:函數(shù)內(nèi)或復(fù)合語句內(nèi)?!纠?.19】分析下面程序的運(yùn)行結(jié)果及變量的作用域。問題:一個(gè)變量在程序的哪個(gè)函數(shù)中都能使用嗎?2019年3月345.5局部變量和全局變量及其作用域5.5.1變量的作用域voidsub(inta,intb){intc;a=a+b;b=b+a;c=b-a;printf("sub:\ta=%db=%dc=%d\n",a,b,c);}局部變量main(){inta=1,b=1,c=1; printf("main:\ta=%db=%dc=%d\n",a,b,c);sub(a,b);printf("main:\ta=%db=%dc=%d\n",a,b,c);

{inta=2,b=2;printf("comp:\ta=%db=%dc=%d\n",a,b,c);}printf("main:\ta=%db=%dc=%d\n",a,b,c);}局部變量局部變量“分程序”或“程序塊”程序輸出結(jié)果:main: a=1b=1c=1sub: a=2b=3c=1main:a=1b=1c=1comp:a=2b=2c=1main: a=1b=1c=12019年3月35voidsub(inta,intb)局部5.5.3全局變量及其作用域全局變量(外部變量):在函數(shù)外部定義的變量。作用域:從定義變量的位置開始到本源文件結(jié)束。如在其作用域內(nèi)的函數(shù)或分程序中定義了同名局部變量,則在局部變量的作用域內(nèi),同名全局變量暫時(shí)不起作用?!纠?.20】全局變量和局部變量的作用域。2019年3月365.5.3全局變量及其作用域全局變量(外部變量):在函數(shù)外inta=5; voidf(intx,inty) {intb,c; b=a+x;c=a-y;printf("%d\t%d\t%d\n",a,b,c);}局部變量main(){intb=6,c=7; f(b,c);printf("%d\t%d\t%d\n",a,b,c);

{inta=9,b=8; printf("%d\t%d\t%d\n",a,b,c);

{

c=10; printf("%d\t%d\t%d\n",a,b,c);

}printf("%d\t%d\t%d\n",a,b,c);

}printf("%d\t%d\t%d\n",a,b,c);}局部變量局部變量程序輸出結(jié)果:511-2567987981098105610全局變量2019年3月37inta=5; 局部變量main()局部變量局部5.6變量的存儲(chǔ)類別及變量的生存期5.6.1變量的生存期與變量的存儲(chǔ)分類變量的生存期:變量在內(nèi)存中占據(jù)存儲(chǔ)空間的時(shí)間。思考:1.

何時(shí)為變量分配內(nèi)存單元?

2.

將變量分配在內(nèi)存的什么區(qū)域?

3.

變量占據(jù)內(nèi)存的時(shí)間(生存期)?程序代碼區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)存儲(chǔ)分配動(dòng)態(tài)存儲(chǔ)變量靜態(tài)存儲(chǔ)變量2019年3月385.6變量的存儲(chǔ)類別及變量的生存期5.6.1變量的生存期5.6.2變量的存儲(chǔ)類別變量的屬性數(shù)據(jù)類型:決定為變量分配內(nèi)存單元的長(zhǎng)度,數(shù)據(jù)的存放形式,數(shù)的范圍。存儲(chǔ)類別:決定了變量的生存期,給它分配在哪個(gè)存儲(chǔ)區(qū)。2019年3月395.6.2變量的存儲(chǔ)類別變量的屬性數(shù)據(jù)類型:存儲(chǔ)類別:20變量定義語句的一般形式存儲(chǔ)類別數(shù)據(jù)類型變量名1,…,變量名n;auto(自動(dòng)的)

register(寄存器的)static(靜態(tài)的)

extern(外部的)1.自動(dòng)變量(auto類別)局部變量可以定義為自動(dòng)變量。main()

{intx,y;…}main()

{autointx,y;…}自動(dòng)變量等價(jià)可省2019年3月40變量定義語句的一般形式存儲(chǔ)類別數(shù)據(jù)類型變量名1,⑴內(nèi)存分配調(diào)用函數(shù)或執(zhí)行分程序時(shí)在動(dòng)態(tài)存儲(chǔ)區(qū)為其分配存儲(chǔ)單元,函數(shù)或分程序執(zhí)行結(jié)束,所占內(nèi)存空間即刻釋放。⑵變量的初值定義變量時(shí)若沒賦初值,變量的初值不確定;如果賦初值則每次函數(shù)被調(diào)用時(shí)執(zhí)行一次賦值操作。⑶生存期

在函數(shù)或分程序執(zhí)行期間。⑷作用域自動(dòng)變量所在的函數(shù)內(nèi)或分程序內(nèi)。自動(dòng)變量2019年3月41⑴內(nèi)存分配自動(dòng)變量2019年3月412.靜態(tài)變量(static類別)除形參外,局部變量和全局變量都可以定義為靜態(tài)變量。局部靜態(tài)變量(或稱內(nèi)部靜態(tài)變量)全局靜態(tài)變量(或稱外部靜態(tài)變量)靜態(tài)變量靜態(tài)變量staticinta;main(){floatx,y;…}f(){staticintb=1;……}全局靜態(tài)變量局部靜態(tài)變量自動(dòng)變量不能省2019年3月422.靜態(tài)變量(static類別)除形參外,局部變量和全局變量⑴內(nèi)存分配編譯時(shí),將其分配在內(nèi)存的靜態(tài)存儲(chǔ)區(qū)中,程序運(yùn)行結(jié)束釋放該單元。⑵靜態(tài)變量的初值若定義時(shí)未賦初值,在編譯時(shí),系統(tǒng)自動(dòng)賦初值為0;若定義時(shí)賦初值,則僅在編譯時(shí)賦初值一次,程序運(yùn)行后不再給變量賦初值。⑶生存期整個(gè)程序的執(zhí)行期間。⑷作用域局部靜態(tài)變量的作用域是它所在的函數(shù)或分程序。全局靜態(tài)變量的作用域是從定義處開始到本源文件結(jié)束。靜態(tài)變量2019年3月43⑴內(nèi)存分配靜態(tài)變量2019年3月43intc;staticinta;main(){floatx,y;…}chars;f(){staticintb=1;……}3.外部變量(extern類別)在函數(shù)外定義的變量若沒有用static說明,則是外部變量。外部變量只能隱式定義為extern類別,不能顯式定義。全局靜態(tài)變量自動(dòng)變量局部靜態(tài)變量外部變量2019年3月44intc;3.外部變量(extern類別)在函數(shù)外定義的變⑴內(nèi)存分配編譯時(shí),將其分配在靜態(tài)存儲(chǔ)區(qū),程序運(yùn)行結(jié)束釋放該單元。⑵變量的初值若定義變量時(shí)未賦初值,在編譯時(shí),系統(tǒng)自動(dòng)賦初值為0。⑶生存期整個(gè)程序的執(zhí)行期間。⑷作用域從定義處開始到本源文件結(jié)束。外部變量問題:全局靜態(tài)變量的作用域可以擴(kuò)展到本程序的其它文件嗎?此外,還可以用extern進(jìn)行聲明,以使其作用域擴(kuò)大到該程序的其它文件中。2019年3月45⑴內(nèi)存分配外部變量問題:全局靜態(tài)變量的作用域可以擴(kuò)展到本程外部變量聲明的一般格式

extern

數(shù)據(jù)類型變量名1,…,變量名n;或

extern

變量名1,…,變量名n;注意:①外部變量聲明用關(guān)鍵字extern,而外部變量的定義不能用extern,只能隱式定義。②定義外部變量時(shí),系統(tǒng)要給變量分配存儲(chǔ)空間,而對(duì)外部變量聲明時(shí),系統(tǒng)不分配存儲(chǔ)空間,只是讓編譯系統(tǒng)知道該變量是一個(gè)已經(jīng)定義過的外部變量,與函數(shù)聲明的作用類似。2019年3月46外部變量聲明的一般格式externintp=1,q=5;floatf1(inta){externcharc1,c2;……}charc1,c2;charf2(intx,inty){……}main(){……}外部變量聲明定義外部變量定義外部變量思考:在f1函數(shù)中聲明c1、c2的作用是什么?如何修改程序使所有函數(shù)都可以使用外部變量而又不需要聲明?【例5.24】在一個(gè)文件內(nèi)聲明外部變量。2019年3月47intp=1,q=5;外部變量聲明定義外部變量定義外部變【例5.25】在多文件的程序中聲明外部變量。file1.c文件中程序如下:inti;main(){voidf1(),f2(),f3();i=1;f1();printf("\tmain:i=%d",i);f2();printf("\tmain:i=%d",i);f3();printf("\tmain:i=%d\n",i);}voidf1(){i++;printf("\nf1:i=%d",i);}file2.c文件中程序如下:externinti;

voidf2(){inti=3;printf("\nf2:i=%d",i);}voidf3(){i=3;printf("\nf3:i=%d",i);}程序輸出結(jié)果:f1:i=2main:i=2f2:i=3main:i=2f3:i=3main:i=3聲明外部變量定義外部變量2019年3月48【例5.25】在多文件的程序中聲明外部變量。file1.c文4.寄存器變量(register類別)只有函數(shù)內(nèi)定義的變量或形參可以定義為寄存器變量。寄存器變量的值保存在CPU的寄存器中。受寄存器長(zhǎng)度的限制,寄存器變量只能是char、int和指針類型的變量?!纠?.26】寄存器變量的使用。main(){longintsum=0;

registerinti;for(i=1;i<=1000;i++)sum+=i;printf("sum=%ld\n",sum);}程序輸出結(jié)果:sum=5005002019年3月494.寄存器變量(register類別)只有函數(shù)內(nèi)定義的變量或5.6.3歸納變量的分類1.按照變量的作用域?qū)ψ兞糠诸?⑴局部變量 ⑵全局變量2.按照變量的生存期對(duì)變量分類 ⑴靜態(tài)存儲(chǔ)變量 包括:局部靜態(tài)變量和

全局靜態(tài)變量 ⑵動(dòng)態(tài)存儲(chǔ)變量 包括:自動(dòng)變量2019年3月505.6.3歸納變量的分類1.按照變量的作用域?qū)ψ兞糠诸?05.7函數(shù)的存儲(chǔ)分類

外部函數(shù):extern

intfan(chara,charb){……}靜態(tài)函數(shù):static

intfunc(){……}外部函數(shù)和靜態(tài)函數(shù)區(qū)別:外部函數(shù)允許本程序其他文件中的函數(shù)調(diào)用(與外部變量類似)。靜態(tài)函數(shù)禁止本程序其他文件中的函數(shù)調(diào)用(與外部靜態(tài)變量類似)。

extern可以省略2019年3月515.7函數(shù)的存儲(chǔ)分類外部函數(shù):靜態(tài)函數(shù):外部函數(shù)和靜態(tài)函第5章函數(shù)2019年3月52第5章函數(shù)2019年3月1主要內(nèi)容

5.1概述5.2函數(shù)的定義與調(diào)用5.3數(shù)組作函數(shù)參數(shù)5.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用5.5局部變量和全局變量及其作用域5.6變量的存儲(chǔ)類別及變量的生存期5.7函數(shù)的存儲(chǔ)分類2019年3月53主要內(nèi)容5.1概述2019年3月25.1概述①程序結(jié)構(gòu)清晰,可讀性好。②減少重復(fù)編碼的工作量。③可多人共同編制一個(gè)大程序,縮短程序設(shè)計(jì)周期,提高程序設(shè)計(jì)和調(diào)試的效率。使用函數(shù)的好處……C程序源程序文件n函數(shù)1函數(shù)m……源程序文件1函數(shù)1函數(shù)n2019年3月545.1概述①程序結(jié)構(gòu)清晰,可讀性好。使用函數(shù)的……C程序【例5.1】求一個(gè)整數(shù)的立方。intcube(intx)

/*函數(shù)定義*/{return(x*x*x);}main(){intf,a;printf("\nEnteranintegernumber:");scanf("%d",&a);f=cube(a);

printf("%d*%d*%d=%d\n",a,a,a,f);}程序運(yùn)行情況如下:Enteranintegernumber:22*2*2=8函數(shù)調(diào)用程序的執(zhí)行總是從main函數(shù)開始2019年3月55【例5.1】求一個(gè)整數(shù)的立方。intcube(intx⑴一個(gè)C源程序可以由一個(gè)或多個(gè)源程序文件組成。C編譯系統(tǒng)在對(duì)C源程序進(jìn)行編譯時(shí)是以文件為單位進(jìn)行的。⑵一個(gè)C源程序文件可以由一個(gè)或多個(gè)函數(shù)組成。所有函數(shù)都是獨(dú)立的。主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)可以相互調(diào)用。⑶在一個(gè)C程序中,有且僅有一個(gè)主函數(shù)main。C程序的執(zhí)行總是從main函數(shù)開始,調(diào)用其它函數(shù)后最終回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。說明2019年3月56⑴一個(gè)C源程序可以由一個(gè)或多個(gè)源程序文件組成。C編譯系統(tǒng)在⑷函數(shù)的種類從函數(shù)定義形式分:①有參函數(shù):在主調(diào)(用)函數(shù)和被調(diào)(用)函數(shù)之間通過參數(shù)進(jìn)行數(shù)據(jù)傳遞,如:

intcube(intx){…}

②無參函數(shù):如:getchar()在調(diào)用無參函數(shù)時(shí),主調(diào)函數(shù)不需要將數(shù)據(jù)傳遞給無參函數(shù)。從使用的角度看:①標(biāo)準(zhǔn)函數(shù)(庫函數(shù))庫函數(shù)是由系統(tǒng)提供的。如:getchar()、sin(x)等。在程序中可以直接調(diào)用它們。附錄3列出了C的部分庫函數(shù)。②用戶自定義函數(shù)。如:例5.1中的cube函數(shù)。2019年3月57⑷函數(shù)的種類從函數(shù)定義形式分:從使用的角度看:2019年3【例5.2】無參函數(shù)的定義與調(diào)用。voidwelcome(){printf("*********************************\n");printf("WelcometoChina\n");printf("*********************************\n");}main(){welcome();}程序的輸出結(jié)果如下:*********************************

WelcometoChina*********************************2019年3月58【例5.2】無參函數(shù)的定義與調(diào)用。voidwelcome5.2.1函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型函數(shù)名(類型名形式參數(shù)1,…

){說明語句

執(zhí)行語句}例如:求兩個(gè)數(shù)的最大值。

int

max(intx,inty){intz;z=x>y?x:y;return(z);}類型省略時(shí)默認(rèn)為int類型沒有形式參數(shù)為無參函數(shù)

2019年3月595.2.1函數(shù)的定義函數(shù)定義的一般形式函數(shù)類型函數(shù)名(類intmax(x,y)intx,y;{intz;z=x>y?x:y;return(z);}intmax(x,y){intx,y;……}或intmax(intx,y){……}或intmax(x,y)intx,y,z;{z=x>y?x:y;return(z);}花括號(hào)中也可以為空,這種函數(shù)叫空函數(shù)。不能在函數(shù)體內(nèi)定義其他函數(shù),即函數(shù)不能嵌套定義。形參也可以這樣定義如下定義都是錯(cuò)誤的

√2019年3月60intmax(x,y)intmax(x,y)或花括號(hào)中也函數(shù)名(實(shí)參表列)在C語言中,把函數(shù)調(diào)用也作為一個(gè)表達(dá)式。因此凡是表達(dá)式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調(diào)用。例如:①welcome();

②if(iabs(a)>max)max=iabs(a);

③m=max(c,max(a,b));5.2.2函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式:2019年3月61函數(shù)名(實(shí)參表列)在C語言中,把函數(shù)調(diào)用也作為一個(gè)表達(dá)式。因intsum100(){inti,t=0;for(i=1;i<=100;i++)t+=i;return(t);}main(){ints;s=sum100();printf("%d\n",s);}程序輸出結(jié)果:5050intsum(intx){inti,t=0;for(i=1;i<=x;i++)t+=i;return(t);}main(){ints;s=sum(100);printf("%d\n",s);}【例5.3】求1~100的累加和。思考:兩個(gè)程序有何不同程序輸出結(jié)果:5050?2019年3月62intsum100()程序輸出結(jié)果:intsum(voidswap(intx,inty){intz;z=x;x=y;y=z; printf("\nx=%d,y=%d",x,y);}main(){inta=10,b=20;swap(a,b);printf("\na=%d,b=%d\n",a,b);}5.2.3函數(shù)參數(shù)與函數(shù)的返回值1.函數(shù)的形式參數(shù)與實(shí)際參數(shù)程序輸出結(jié)果:x=20,y=10a=10,b=20形式參數(shù)(形參)實(shí)際參數(shù)(實(shí)參)【例5.4】編一程序,將主函數(shù)中的兩個(gè)變量的值傳遞給swap函數(shù)中的兩個(gè)形參,交換兩個(gè)形參的值。單向值傳遞2019年3月63voidswap(intx,inty)5.2.3有關(guān)形參和實(shí)參的說明:

①當(dāng)函數(shù)被調(diào)用時(shí)才給形參分配內(nèi)存單元。調(diào)用結(jié)束,所占內(nèi)存被釋放。②實(shí)參可以是常量、變量或表達(dá)式,但要求它們有確定的值。③實(shí)參與形參類型要一致,字符型與整型可以兼容。④實(shí)參與形參的個(gè)數(shù)必須相等。在函數(shù)調(diào)用時(shí),實(shí)參的值賦給與之相對(duì)應(yīng)的形參?!皢蜗蛑祩鬟f”。注意:在TC中,實(shí)參的求值順序是從右到左。2019年3月64有關(guān)形參和實(shí)參的說明:①當(dāng)函數(shù)被調(diào)用時(shí)才給形參分配內(nèi)存單【例5.5】函數(shù)調(diào)用中實(shí)參的求值順序。voidfun(inta,intb){printf("a=%d,b=%d\n",a,b);}main(){intm=5;fun(3+m,m++);}程序輸出結(jié)果:a=9,b=52019年3月65【例5.5】函數(shù)調(diào)用中實(shí)參的求值順序。voidfun(i2.函數(shù)的類型與函數(shù)的返回值說明:①函數(shù)的類型決定了函數(shù)返回值的類型。若省略函數(shù)的類型,系統(tǒng)默認(rèn)其為int型。②無返回值的函數(shù)應(yīng)將其類型定義為void(空)類型。⑴函數(shù)的類型【例5.6】輸出兩個(gè)數(shù)中的大數(shù)。max(intx,inty){intz;z=x>y?x:y;return(z);/*返回z的值*/}main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("maxis%d\n",c);}2019年3月662.函數(shù)的類型與函數(shù)的返回值說明:⑴函數(shù)的類型【例5.6】函數(shù)的返回值是通過return語句帶回到主調(diào)函數(shù)的功能:終止函數(shù)的運(yùn)行,返回主調(diào)函數(shù),若有返回值,將返回值帶回主調(diào)函數(shù)。說明:①若函數(shù)沒有返回值,return語句可以省略。②return語句中的表達(dá)式類型一般應(yīng)和函數(shù)的類型一致,如果不一致,系統(tǒng)自動(dòng)將表達(dá)式類型轉(zhuǎn)換為函數(shù)類型。⑵函數(shù)的返回值return語句格式:return(表達(dá)式);

或return表達(dá)式;或return;2019年3月67函數(shù)的返回值是通過return語句帶回到主調(diào)函數(shù)的功能:終止【例5.8】計(jì)算并輸出圓的面積。s(intr){return3.14*r*r;}main(){intr,area;scanf("%d",&r);printf("%d\n",s(r));}自動(dòng)轉(zhuǎn)換為int型思考:若要得到單精度實(shí)型的圓面積,程序應(yīng)如何修改程序運(yùn)行情況如下:212?2019年3月68【例5.8】計(jì)算并輸出圓的面積。s(intr)自動(dòng)轉(zhuǎn)換為i

5.2.4對(duì)被調(diào)函數(shù)的聲明和函數(shù)原型變量要先定義后使用,函數(shù)也如此。即被調(diào)函數(shù)的定義要出現(xiàn)在主調(diào)函數(shù)的定義之前。如swap函數(shù):允許整型函數(shù)(且參數(shù)也是整型)的定義出現(xiàn)在主調(diào)函數(shù)之后。如max函數(shù):如果非整型函數(shù)在主調(diào)函數(shù)之后定義,則應(yīng)在主調(diào)函數(shù)中或主調(diào)函數(shù)之前對(duì)被調(diào)函數(shù)進(jìn)行聲明。voidswap(intx,inty){…}main(){…swap(a,b);}main(){…c=max(a,b);}max(intx,inty){…}2019年3月695.2.4對(duì)被調(diào)函數(shù)的聲明和函數(shù)原型變量要先定義后使用對(duì)被調(diào)函數(shù)進(jìn)行聲明的一般形式

函數(shù)類型函數(shù)名(參數(shù)類型1

參數(shù)名1,…);或函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2,…);思考:以下哪種情況需要在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)聲明被調(diào)函數(shù)定義在前,主調(diào)函數(shù)定義在后。主調(diào)函數(shù)定義在前,被調(diào)函數(shù)定義在后。第二種形式省略了參數(shù)名,此種形式也稱為函數(shù)的原型。?2019年3月70對(duì)被調(diào)函數(shù)進(jìn)行聲明的一般形式函數(shù)類型函數(shù)名(參main(){voidcalc(floatx,floaty,charopr);

floata,b;charopr;printf("\nInputexpression:");scanf("%f%c%f",&a,&opr,&b);calc(a,b,opr);}voidcalc(floatx,floaty,charopr){switch(opr){case'+':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x+y);return;case'-':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x-y);return;case'*':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x*y);return;case'/':printf("%5.2f%c%5.2f=%6.2f\n",x,opr,y,x/y);return;default:printf("Operatorerr!\n");}}對(duì)被調(diào)函數(shù)的聲明【例5.9】計(jì)算并輸出兩個(gè)數(shù)的和、差、積、商。2019年3月71main()對(duì)被調(diào)函數(shù)的聲明【例5.9】計(jì)算并輸出兩個(gè)數(shù)的5.3數(shù)組作函數(shù)參數(shù)5.3.1一維數(shù)組元素作函數(shù)參數(shù)main(){inta[5],i,m;for(i=0;i<5;i++)scanf("%d",&a[i]);m=a[0];for(i=1;i<5;i++)m=min(m,a[i]);printf("%d\n",m);}【例5.11】求5個(gè)數(shù)中的最小值。intmin(intx,inty){return(x<y?x:y);}用打擂臺(tái)方法求最小值。m相當(dāng)于擂主2019年3月725.3數(shù)組作函數(shù)參數(shù)5.3.1一維數(shù)組元素作函數(shù)參數(shù)ma5.3.2一維數(shù)組名作函數(shù)參數(shù)數(shù)組名表示數(shù)組在內(nèi)存中的起始地址。例如:數(shù)組a在內(nèi)存中從2000地址開始存放,則a的值為2000。2000是地址值,是指針類型的數(shù)據(jù)(后面將介紹指針類型),不能把它看成是整型或其他類型數(shù)據(jù)。實(shí)參是數(shù)組名,形參也應(yīng)定義為數(shù)組形式,形參數(shù)組的長(zhǎng)度可以省略,但[]不能省,否則就不是數(shù)組形式了。

【例5.12】用冒泡法將10個(gè)整數(shù)排序。2019年3月735.3.2一維數(shù)組名作函數(shù)參數(shù)數(shù)組名表示數(shù)組在內(nèi)存中的起始voidsort(intb[],intn);voidprintarr(intb[]);main(){inta[10]={11,22,63,97,58,80,45,32,73,36};printf("Beforesort:\n");

printarr(a);

sort(a,10);

printf("Aftersort:\n");

printarr(a);}voidprintarr(intb[10]){inti;for(i=0;i<10;i++)printf("%5d",b[i]);printf("\n");}voidsort(intb[],intn){inti,j,t;for(i=1;i<n;i++)for(j=0;j<n-i;j++)if(b[j]>b[j+1]){t=b[j];b[j]=b[j+1];b[j+1]=t;}}2019年3月74voidsort(intb[],intn);

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]

b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]11226397588045327336(a)排序前a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]11223236455863738097(b)排序后圖7.3調(diào)用sort函數(shù)2000b形參b實(shí)際是一個(gè)可以存放地址的變量a:2000實(shí)參賦給形參首地址:

2000首地址:

20002019年3月75a[0]a[1]a[2]a[3]a[4]#include"stdio.h"main(){voidscat(charstr1[],charstr2[]);chars1[50],s2[50];inti,k;printf("Inputs1:");gets(s1);printf("Inputs2:");gets(s2);

scat(s1,s2);printf("Outputs1:%s\n",s1);printf("Outputs2:%s\n",s2);}voidscat(charstr1[],charstr2[]){inti=0,k=0;while(str1[i]!='\0')i++;while(str2[k]!='\0'){str1[i]=str2[k];i++;k++;}str1[i]='\0';}scat函數(shù)還可簡(jiǎn)化為:voidscat(charstr1[],charstr2[]){inti=0,k=0;while(str1[i])i++;while(str1[i++]=str2[k++]);}【例5.13】編程序,實(shí)現(xiàn)字符串連接。2019年3月76voidscat(charstr1[],charst5.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用main函數(shù){

……

調(diào)用函數(shù)A;

……}函數(shù)A{……

調(diào)用函數(shù)B;

……}函數(shù)B{

……

……

……}5.4.1函數(shù)的嵌套調(diào)用2019年3月775.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用main函數(shù)函數(shù)A函數(shù)B【例5.15】函數(shù)的嵌套調(diào)用main(){intn=3;printf("%d\n",sub1(n));}sub1(intn){inti,a=0;for(i=n;i>0;i--)a+=sub2(i);returna;}sub2(intn){returnn+1;}程序輸出結(jié)果:92019年3月78【例5.15】函數(shù)的嵌套調(diào)用main()sub1(int5.4.2函數(shù)的遞歸調(diào)用1.遞歸的基本概念遞歸調(diào)用:一個(gè)函數(shù)直接或間接地調(diào)用了它本身,就稱為函數(shù)的遞歸調(diào)用。遞歸函數(shù):在函數(shù)體內(nèi)調(diào)用該函數(shù)本身。intsub(intx){inty,z;……if(……)z=sub(y);else{……}return;}例如:直接調(diào)用sub函數(shù)本身2019年3月795.4.2函數(shù)的遞歸調(diào)用1.遞歸的基本概念遞歸調(diào)用:一個(gè)函2.遞歸函數(shù)的執(zhí)行過程【例5.16】編一遞歸函數(shù)求n!。思路:以求4的階乘為例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。遞歸結(jié)束條件:當(dāng)n=1或n=0時(shí),n!=1。遞歸公式:n!=1(n=0,1)n×(n-1)!(n>1)2019年3月802.遞歸函數(shù)的執(zhí)行過程【例5.16】編一遞歸函數(shù)求n!。思路程序如下:floatfact(intn){floatf=0;if(n<0)printf("n<0,error!");elseif(n==0||n==1)f=1;elsef=fact(n-1)*n;return(f);}main(){intn;floaty;printf("\nInputn:");scanf("%d",&n);y=fact(n);printf("%d!=%-10.0f\n",n,y);}運(yùn)行情況如下:Inputaintegernumber:44!=242019年3月81程序如下:floatfact(intn)main()遞歸調(diào)用過程

回推main()fact(4)fact(3)fact(2)fact(1){{{{{……………

y=fact(4);f=4*fact(3);f=3*fact(2);f=2*fact(1);f=1;

……………return24return6return2return1}}}}}

遞推

2019年3月82遞歸調(diào)用過程3.編制遞歸函數(shù)的方法數(shù)值型問題遞歸函數(shù)的編程方法對(duì)于數(shù)值型問題,首先要找出解題的數(shù)學(xué)公式,這個(gè)公式必須是遞歸定義的,且所處理的對(duì)象要有規(guī)律地遞增或遞減,然后確定遞歸結(jié)束條件?!纠?.17】編一遞歸函數(shù)求xn

。思路:首先把xn轉(zhuǎn)化成遞歸定義的公式xn=1(n=0)x×xn-1

(n>0)再找出遞歸結(jié)束條件:當(dāng)n=0時(shí),xn=1。2019年3月833.編制遞歸函數(shù)的方法數(shù)值型問題遞歸函數(shù)的編程方法xn=1程序如下:longxn(intx,intn){longf=0;if(n<0)printf("n<0,dataerror!\n");elseif(n==0)f=1;elsef=x*xn(x,n-1);return(f);}main(){intn,x;longy;scanf("%d,%d",&x,&n);y=xn(x,n);printf("%ld\n",y);}程序運(yùn)行情況如下:2,1010242019年3月84程序如下:longxn(intx,intn)程序運(yùn)行情5.5局部變量和全局變量及其作用域5.5.1變量的作用域5.5.2局部變量及其作用域變量的作用域:變量在程序中可以被使用的范圍。根據(jù)變量的作用域可以將變量分為局部變量和全局變量。局部變量(內(nèi)部變量):在函數(shù)內(nèi)或復(fù)合語句內(nèi)定義的變量以及形參。作用域:函數(shù)內(nèi)或復(fù)合語句內(nèi)?!纠?.19】分析下面程序的運(yùn)行結(jié)果及變量的作用域。問題:一個(gè)變量在程序的哪個(gè)函數(shù)中都能使用嗎?2019年3月855.5局部變量和全局變量及其作用域5.5.1變量的作用域voidsub(inta,intb){intc;a=a+b;b=b+a;c=b-a;printf("sub:\ta=%db=%dc=%d\n",a,b,c);}局部變量main(){inta=1,b=1,c=1; printf("main:\ta=%db=%dc=%d\n",a,b,c);sub(a,b);printf("main:\ta=%db=%dc=%d\n",a,b,c);

{inta=2,b=2;printf("comp:\ta=%db=%dc=%d\n",a,b,c);}printf("main:\ta=%db=%dc=%d\n",a,b,c);}局部變量局部變量“分程序”或“程序塊”程序輸出結(jié)果:main: a=1b=1c=1sub: a=2b=3c=1main:a=1b=1c=1comp:a=2b=2c=1main: a=1b=1c=12019年3月86voidsub(inta,intb)局部5.5.3全局變量及其作用域全局變量(外部變量):在函數(shù)外部

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論