版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十一講函數(shù)(二)溫故而知新為什么使用函數(shù)?什么叫函數(shù)?函數(shù)定義、調(diào)用函數(shù)形參、實(shí)參:一一對(duì)應(yīng),值傳遞減少重復(fù)代碼、實(shí)現(xiàn)模塊化設(shè)計(jì)、方便分工合作函數(shù)是指完成一個(gè)特定工作的獨(dú)立程序模塊函數(shù)類(lèi)型函數(shù)名(形參表){
函數(shù)實(shí)現(xiàn)過(guò)
return表達(dá)式;}函數(shù)名(實(shí)參表)可無(wú)返回值作業(yè)問(wèn)題prime(intn)中為何要討論1,題目中范圍是100-200呢?程序max(a,b)如何和c有關(guān)系?程序調(diào)用函數(shù)fn(a,n),求a+aa+aaa…..值先寫(xiě)函數(shù)定義,再寫(xiě)main()函數(shù),相互獨(dú)立程序改錯(cuò)5.3變量與函數(shù)5.3.1變量作用域:局部變量和全局變量5.3.2變量生命周期和靜態(tài)局部變量5.3.1局部變量和全局變量局部變量在函數(shù)內(nèi)定義的變量(包括形參)作用范圍:本函數(shù)內(nèi)部定義在復(fù)合語(yǔ)句內(nèi)的變量作用范圍:復(fù)合語(yǔ)句內(nèi)部全局變量 在函數(shù)以外定義的變量,不從屬于任一函數(shù)。作用范圍:從定義處到源文件結(jié)束(包括各函數(shù))例5-6在復(fù)合語(yǔ)句中定義局部變量。#include<stdio.h>intmain(void){
int a;a=1;
{ /*復(fù)合語(yǔ)句開(kāi)始*/
intb=2;b=a+b;a=a+b;
} /*復(fù)合語(yǔ)句結(jié)束*/ printf("%d",a); return0;}b:小范圍內(nèi)的臨時(shí)變量
4程序例5-7全局變量定義#include"stdio.h"intx; /*定義全局變量x*/intf(){
intx=4;/*x為局部變量*/returnx;}intmain(void){
inta=1;
x=a; /*對(duì)全局變量x賦值*/a=f(); /*a的值為4*/{
intb=2;
b=a+b; /*b的值為6*/
x=x+b; /*全局變量運(yùn)算*/}printf("%d%d",a,x);return0;}4,7若局部變量與全局變量同名,局部變量?jī)?yōu)先程序變量作用范圍示例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沒(méi)定義
x=?b=?t=?a=?自動(dòng)變量(auto):普通的局部變量intx,y;
autointx,y;charc1;
autocharc1;函數(shù)調(diào)用時(shí),定義變量,分配存儲(chǔ)單元。函數(shù)調(diào)用結(jié)束,收回存儲(chǔ)單元。全局變量:從程序執(zhí)行開(kāi)始,到程序的結(jié)束,存儲(chǔ)單元始終保持。變量生命周期變量從定義開(kāi)始分配存儲(chǔ)單元,到運(yùn)行結(jié)束存儲(chǔ)單元被回收的整個(gè)過(guò)程。5.3.2變量生命周期和靜態(tài)局部變量存儲(chǔ)類(lèi)型:動(dòng)態(tài)存儲(chǔ):自動(dòng)變量靜態(tài)存儲(chǔ):全局變量、靜態(tài)局部變量用戶(hù)存儲(chǔ)空間存儲(chǔ)區(qū)數(shù)據(jù)區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)static
類(lèi)型名變量表作用范圍:局部變量生命周期:到整個(gè)程序結(jié)束(全局變量)靜態(tài)局部變量例5-9靜態(tài)局部變量示例#include<stdio.h>voidfun(intk);intmain(void){intk;for(k=1;k<=3;k++)fun(k);return0;}voidfun(intk){
staticinta;printf("%d,",a);a+=k; }0,1,3,靜態(tài)變量會(huì)記住前一次調(diào)用時(shí)留下來(lái)的值靜態(tài)變量的初值為0Chap10函數(shù)與程序結(jié)構(gòu)10.1函數(shù)的組織10.2遞歸函數(shù)10.3宏定義(機(jī)房講解)10.4編譯預(yù)處理(機(jī)房講解)使用結(jié)構(gòu)化程序設(shè)計(jì)方法解決復(fù)雜的問(wèn)題把大問(wèn)題分解成若干小問(wèn)題,小問(wèn)題再進(jìn)一步分解成若干更小的問(wèn)題寫(xiě)程序時(shí),用main()解決整個(gè)問(wèn)題,它調(diào)用解決小問(wèn)題的函數(shù)這些函數(shù)又進(jìn)一步調(diào)用解決更小問(wèn)題的函數(shù),從而形成函數(shù)的嵌套調(diào)用10.1函數(shù)的組織main()函數(shù)1函數(shù)2……函數(shù)m函數(shù)1_1函數(shù)1_2函數(shù)m_1函數(shù)m_n……程序結(jié)構(gòu)例10-1設(shè)計(jì)一個(gè)常用圓形體體積計(jì)算器,采用命令方式輸入1、2、3,分別選擇計(jì)算球體、圓柱體、圓錐體的體積,并輸入計(jì)算所需相應(yīng)參數(shù)。分析:main函數(shù)輸入1、2、3選擇計(jì)算3種體積,其他輸入結(jié)束計(jì)算設(shè)計(jì)一個(gè)控制函數(shù)cal(),經(jīng)它辨別圓形體的類(lèi)型再調(diào)用計(jì)算球體、圓柱體、圓錐體體積的函數(shù)設(shè)計(jì)單獨(dú)的函數(shù)計(jì)算不同圓形體的體積10.1.1程序解析-計(jì)算常用圓形體體積3層結(jié)構(gòu),5個(gè)函數(shù)降低程序的構(gòu)思、編寫(xiě)、調(diào)試的復(fù)雜度可讀性好程序結(jié)構(gòu)main()cal()vol_ball()vol_cylind()vol_cone()例10-1源程序#definePI3.141592654voidcal(intsel);
intmain(void){intsel;
while(1){printf("1-計(jì)算球體體積\n");
printf("2-計(jì)算圓柱體積\n"); printf("3-計(jì)算圓錐體積\n"); printf("其他-退出程序運(yùn)行\(zhòng)n"); printf(“請(qǐng)輸入計(jì)算命令:”);
scanf("%d",&sel); if(sel<1||sel>3)
break; /*輸入非1~3,循環(huán)結(jié)束*/
else
cal(sel); /*輸入1~3,調(diào)用cal()*/ }return0;}/*常用圓形體體積計(jì)算器的主控函數(shù)*/voidcal(intsel){doublevol_ball(void);
doublevol_cylind(void);
doublevol_cone(void);switch(sel){ case1: printf("球體積為:%.2f\n",vol_ball()); break;case2:
printf("圓柱體積為:%.2f\n",vol_cylind()); break;case3:
printf("圓錐體積為:%.2f\n",vol_cone()); break; }}/*計(jì)算球體體積V=4/3*PI*r*r*r*/doublevol_ball(){doubler;printf("請(qǐng)輸入球的半徑:");scanf("%lf",&r);return(4.0/3.0*PI*r*r*r);}/*計(jì)算圓柱體積V=PI*r*r*h*/doublevol_cylind(){doubler,h;printf("請(qǐng)輸入圓柱的底圓半徑和高:");scanf("%lf%lf",&r,&h);return(PI*r*r*h);}/*計(jì)算圓錐體積V=h/3*PI*r*r*/doublevol_cone(){doubler,h;printf("請(qǐng)輸入圓錐的底圓半徑和高:");
scanf("%lf%lf",&r,&h);return(PI*r*r*h/3.0);}10.1.2函數(shù)的嵌套調(diào)用順序調(diào)用intmain(void){……y=fact(3);……z=mypow(3.5,2);
……}doublefact(intn){……}doublemypow(doublex,inn){……}mainfactmypowmainfactmypow函數(shù)的嵌套調(diào)用嵌套調(diào)用intmain(void){……cal(sel);
……}voidcal(intsel){ ……
vol_ball()……}doublevol_ball(){ ……}maincalvol_ballmaincalvol_ball例9-1分析intmain(void){
……
cal(sel);}voidcal(intsel){ ……
vol_ball();
vol_cylind();
vol_cone();}doublevol_ball(){ ……}doublevol_cylind(){ ……}doublevol_cone(){……}main()cal()vol_ball()vol_cylind()vol_cone()函數(shù)的嵌套調(diào)用在一個(gè)函數(shù)中再調(diào)用其它函數(shù)的情況稱(chēng)為函數(shù)的嵌套調(diào)用。如果函數(shù)A調(diào)用函數(shù)B,函數(shù)B再調(diào)用函數(shù)C,一個(gè)調(diào)用一個(gè)地嵌套下去,構(gòu)成了函數(shù)的嵌套調(diào)用。具有嵌套調(diào)用函數(shù)的程序,需要分別定義多個(gè)不同的函數(shù)體,每個(gè)函數(shù)體完成不同的功能,它們合起來(lái)解決復(fù)雜的問(wèn)題遞歸函數(shù)遞歸調(diào)用:函數(shù)直接或間接調(diào)用自己稱(chēng)為遞歸調(diào)用遞歸函數(shù):帶有遞歸調(diào)用的函數(shù)稱(chēng)為遞歸函數(shù)遞推法與遞歸法求階乘遞推法n!=1*2*3*....*nfor(result=1,i=1;i<=n;i++)result=result*i;遞歸法遞歸定義n!=n*(n-1)!(n>1)n!=1(n=0,1)遞歸函數(shù)fact(n)程序遞歸式遞歸出口例10-3分析求n!遞歸定義n!=n*(n-1)!(n>1)n!=1(n=0,1)#include<stdio.h>doublefact(intn);intmain(void){intn;scanf("%d",&n);printf("%f",fact(n));return0;}doublefact(intn){doubleresult;
if(n==1||n==0)result=1;elseresult=n*fact(n-1);
returnresult;}fact(n)=n*fact(n-1);main()fact(3)fact(2)fact(1){....{....{....{....printf(fact(3))f=3*fact(2)f=2*fact(1)f=1}return(f)return(f)return(f)}}}遞歸函數(shù)fact(n)的實(shí)現(xiàn)過(guò)程fact(3)=3*fact(2)=
2*fact(1)=
fact(1)=12*1=23*2=6同時(shí)有4個(gè)函數(shù)在運(yùn)行,且都未完成例10-4寫(xiě)輸出結(jié)果#include<stdio.h>longfib(intg){switch(g){case0:return(0);case1:case2:return(2);}printf("g=%d,",g);return(fib(g-1)+fib(g-2));}voidmain(){longk;k=fib(4);printf("k=%ld\n",k);}fib(g)=0g=0fib(g)=2g=1,2fib(g)=fib(g-1)+fib(g-2)g>=3g=4,g=3,k=6如何求Fibonacci數(shù)列?遞歸式遞歸出口10.2.3遞歸程序設(shè)計(jì)用遞歸實(shí)現(xiàn)的問(wèn)題,滿(mǎn)足兩個(gè)條件:?jiǎn)栴}可以逐步簡(jiǎn)化成自身較簡(jiǎn)單的形式(遞歸式)n!=n*(n-1)!nn-1Σi=n+Σi
i=1i=1遞歸最終能結(jié)束(遞歸出口)兩個(gè)條件缺一不可解決遞歸問(wèn)題的兩個(gè)著眼點(diǎn)n!=1(n=0,1)世界末日問(wèn)題印度有一個(gè)傳說(shuō),梵天(相當(dāng)于印度最高的神)在創(chuàng)造世界時(shí),來(lái)到印度佛教圣地貝那勒斯圣廟,在圣廟里安放著一塊黃銅板,上面插著三根寶石針,其中一根針從下到上疊放著由大到小排列的64片金葉,這個(gè)塔形的金片堆就是著名的“梵塔”。圣廟里每時(shí)每刻都有僧侶值班,按照梵天的旨意,一刻不停地把這些金葉在三根針上搬來(lái)搬去,要求:第一:每閃次只能動(dòng)一片金葉第二:小金葉永遠(yuǎn)在大金葉上面當(dāng)64片葉子都搬到另一根針上時(shí),梵天認(rèn)為:此刻世界將在一聲霹靂中化為灰燼,這就是世界末日。例10-5漢諾(Hanoi)塔將64個(gè)盤(pán)從座A搬到座B(1)一次只能搬一個(gè)盤(pán)子(2)盤(pán)子只能插在A、B、C三個(gè)桿中(3)大盤(pán)不能壓在小盤(pán)上
A B C分析
A B C分析
A B C
A B Cnn-1分析
A B C
A B Cnn-1算法hanio(n個(gè)盤(pán),A→B)//C為過(guò)渡{if(n==1)
直接把盤(pán)子A→Belse{hanio(n-1個(gè)盤(pán),A→C)//B為過(guò)渡
把n號(hào)盤(pán)A→B hanio(n-1個(gè)盤(pán),C→B)//A為過(guò)渡 }}
A B Cn-1函數(shù)
/*搬動(dòng)n個(gè)盤(pán),從a到b,c為中間過(guò)渡*/voidhanio(intn,chara,charb,charc){if(n==1)printf("%c-->%c\n",a,b);else{hanio(n-1,a,c,b);printf("%c-->%c\n",a,b);hanio(n-1,c,b,a);}}hanio(n個(gè)盤(pán),A→B)//C為過(guò)渡{if(n==1)直接把盤(pán)子A→Belse{hanio(n-1個(gè)盤(pán),A→C)
把n號(hào)盤(pán)A→B hanio(n-1個(gè)盤(pán),C→B) }}
源程序
/*搬動(dòng)n個(gè)盤(pán),從a到b,c為中間過(guò)渡*/voidhanio(intn,chara,charb,charc){if(n==1)printf("%c-->%c\n",a,b);else{hanio(n-1,a,c,b);printf("%c-->%c\n",a,b);hanio(n-1,c,b,a);}}intmain(void){intn;printf("inputthenumberofdisk:");scanf("%d",&n);printf("thestepsfor%ddiskare:\n",n);hanio(n,'a',‘b',‘c');return0;}練習(xí)編寫(xiě)遞歸函數(shù)intpow_xn(intx,intn)求x^n,并調(diào)用它來(lái)求s=3^1+3^2+3^3+3^4+3^5.
勤能補(bǔ)拙,熟能生巧本講要點(diǎn)怎樣把多個(gè)函數(shù)組織起來(lái)?如何使用宏?編譯預(yù)處理10.1.4全局變量與程序文件模塊局部變量作用范圍:函數(shù)(復(fù)合語(yǔ)句)內(nèi)部生命周期:從函數(shù)調(diào)用開(kāi)始-函數(shù)調(diào)用結(jié)束全局變量 作用范圍:從定義處到源文件結(jié)束生命周期:從程序執(zhí)行開(kāi)始-程序運(yùn)行結(jié)束靜態(tài)局部變量作用范圍:局部變量生命周期:全局變量外部變量(extern)在某個(gè)程序文件模塊中定義了全局變量該全局變量可以在整個(gè)程序的所有文件模塊中起作用在其他文件模塊中如果要使用該全局變量,必須將它聲明為外部變量說(shuō)明這是一個(gè)在其他模塊中定義的全局變量intx;voidmain(){………}
文件名file1.cexternx;/*使用file1.c中的全局變量x*/f1(){………}
文件名file2.c擴(kuò)大全局變量的作用域staticintx;voidmain(){………}使全局變量只限于本文件引用,而不能被其他文件引用
文件名file1.cexternx;/*使用file1.c中的全局變量x*/intf1(){………}
文件名file2.c無(wú)法引用靜態(tài)全局變量10.1.5寄存器變量和外部變量寄存器變量register
int
變量表;外部變量extern
變量名表;只起說(shuō)明作用,不分配存儲(chǔ)單元,對(duì)應(yīng)的存儲(chǔ)單元在全局變量定義處分配。10.1.6函數(shù)與程序文件模塊外部函數(shù)函數(shù)能夠被程序中的其他程序文件模塊調(diào)用在其他文件模塊中調(diào)用該函數(shù)前,聲明為外部函數(shù)extern
函數(shù)類(lèi)型函數(shù)名(參數(shù)表說(shuō)明);externintf1();intmain(void){………f1();………}
文件名file1.cintf1(){………}
文件名file2.c調(diào)用另一模塊中的函數(shù)externintf1();intmain(void){………f1();………}staticintf1(){………}內(nèi)部函數(shù)使函數(shù)只能在本程序文件模塊中被調(diào)用static
函數(shù)類(lèi)型函數(shù)名(參數(shù)表說(shuō)明);
文件名file1.c
文件名file2.c無(wú)法調(diào)用10.3宏定義#define宏名標(biāo)識(shí)符宏定義字符串編譯時(shí),把程序中所有與宏名相同的字符串,用宏定義字符串替代#definePI3.14#definearr_size4說(shuō)明:宏名一般用大寫(xiě)字母,以與變量名區(qū)別宏定義不是C語(yǔ)句,后面不得跟分號(hào)宏定義可以嵌套使用#definePI3.14#defineS2*PI*PI多用于符號(hào)常量宏定義可以寫(xiě)在程序中任何位置,它的作用范圍從定義書(shū)寫(xiě)處到文件尾。可以通過(guò)“#undef”強(qiáng)制指定宏的結(jié)束范圍。10.3.1宏基本定義#defineA“Thisisthefirstmacro”voidf1(){printf(“A\n”);}#defineB“Thisisthesecondmacro”
A的有效范圍voidf2(){printf(B); B的有效范圍}#undefBintmain(void){f1();f2();return0;}例10-6宏的作用范圍10.3.2帶參數(shù)的宏定義例:#definef(a)a*a*aint main(void)/*水仙花數(shù)*/{inti,x,y,z;for(i=1;i<1000;i++){x=i%10;y=i/10%10;z=i/100;if(x*x*x+y*y*y+z*z*z==i) printf(“%d\n”,i);} return0;}#definef(a)(a)*(a)*(a)各位數(shù)字的立方和等于它本身的數(shù)。例如153的各位數(shù)字的立方和是13+53+33=153=x+y*x+y*x+y(f(x)+f(y)+f(z)==i)f(x+y)=(x+y)3?帶參數(shù)的宏定義實(shí)現(xiàn)簡(jiǎn)單的函數(shù)功能例10-7簡(jiǎn)單的帶參數(shù)的宏定義。#include<stdio.h>#defineMAX(a,b)(a)>(b)?(a):(b)#defineSQR(x)(x)*(x)intmain(void){ intx,y; scanf(“%d%d”,&x,&y); x=MAX(x,y); /*引用宏定義*/ y=SQR(x); /*引用宏定義*/ printf(“%d%d\n”,x,y); return0;}
#definef(a,b,t)t=a;a=b;b=t;intmain(){ intx,y,t; scanf(“%d%d”,&x,&y); f(x,y,t) printf(“%d%d\n”,x,y); return0;}t=x;x=y;y=t;編譯
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度安全合規(guī)塔吊銷(xiāo)售與安全監(jiān)管服務(wù)合同3篇
- 2025泥工砌磚合同范文
- 2025關(guān)于企業(yè)臨時(shí)工勞動(dòng)合同的范本是怎樣的
- 2025防雷工程承包合同
- 適度寒冷暴露通過(guò)激活的棕色脂肪來(lái)源小細(xì)胞外囊泡調(diào)控病理性心肌肥厚的作用及機(jī)制研究
- 二零二五版門(mén)窗行業(yè)產(chǎn)品質(zhì)量檢測(cè)與認(rèn)證合同4篇
- 2025年度苗木種植與水資源利用保護(hù)合同范本4篇
- 2025年度企業(yè)形象展示活動(dòng)承辦協(xié)議書(shū)4篇
- 2025年度門(mén)樓智能鎖具集成安裝服務(wù)合同4篇
- 基于YOLOv5的輕量化交通標(biāo)志檢測(cè)算法研究
- 2024年住院醫(yī)師規(guī)范化培訓(xùn)師資培訓(xùn)理論考試試題
- 期末綜合測(cè)試卷(試題)-2024-2025學(xué)年五年級(jí)上冊(cè)數(shù)學(xué)人教版
- 2024年廣東省公務(wù)員錄用考試《行測(cè)》試題及答案解析
- 結(jié)構(gòu)力學(xué)本構(gòu)模型:斷裂力學(xué)模型:斷裂力學(xué)實(shí)驗(yàn)技術(shù)教程
- 黑色素的合成與美白產(chǎn)品的研究進(jìn)展
- 金蓉顆粒-臨床用藥解讀
- 法治副校長(zhǎng)專(zhuān)題培訓(xùn)課件
- 《幼兒園健康》課件精1
- 汽車(chē)、電動(dòng)車(chē)電池火災(zāi)應(yīng)對(duì)
- 中醫(yī)藥適宜培訓(xùn)-刮痧療法教學(xué)課件
- 免疫組化he染色fishish
評(píng)論
0/150
提交評(píng)論