第12講函數(shù)之二 -上課_第1頁(yè)
第12講函數(shù)之二 -上課_第2頁(yè)
第12講函數(shù)之二 -上課_第3頁(yè)
第12講函數(shù)之二 -上課_第4頁(yè)
第12講函數(shù)之二 -上課_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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ù)類型函數(shù)名(形參表){

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

return表達(dá)式;}函數(shù)名(實(shí)參表)可無(wú)返回值參數(shù)傳遞函數(shù)定義時(shí)的參數(shù)被稱為形式參數(shù),簡(jiǎn)稱形參doublecylinder(doubler,doubleh);函數(shù)調(diào)用時(shí)的參數(shù)被稱為實(shí)際參數(shù),簡(jiǎn)稱實(shí)參volume=cylinder(radius,height);實(shí)參形參(變量名稱隨意取,可相同或不同)在參數(shù)傳遞過(guò)程中,實(shí)參把值復(fù)制給形參。形參和實(shí)參一一對(duì)應(yīng):數(shù)量一致,類型一致,順序一致形參:變量,用于接受實(shí)參傳遞過(guò)來(lái)的值實(shí)參:常量、變量或表達(dá)式單向傳遞變量作用范圍程序閱讀1(作用域、不同函數(shù)變量關(guān)系example_11_3.c)程序閱讀2(交換數(shù)據(jù)、變量生命周期11-7.c)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ǔ)句開始*/

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=?程序閱讀2(變量生命周期11_7.c)自動(dòng)變量(auto):普通的局部變量intx,y;

autointx,y;charc1;

autocharc1;函數(shù)調(diào)用時(shí),定義變量,分配存儲(chǔ)單元。函數(shù)調(diào)用結(jié)束,收回存儲(chǔ)單元。全局變量:從程序執(zhí)行開始,到程序的結(jié)束,存儲(chǔ)單元始終保持。變量生命周期變量從定義開始分配存儲(chǔ)單元,到運(yùn)行結(jié)束存儲(chǔ)單元被回收的整個(gè)過(guò)程。5.3.2變量生命周期和靜態(tài)局部變量存儲(chǔ)類型:動(dòng)態(tài)存儲(chǔ):自動(dòng)變量靜態(tài)存儲(chǔ):全局變量、靜態(tài)局部變量用戶存儲(chǔ)空間存儲(chǔ)區(qū)數(shù)據(jù)區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)static類型名變量表作用范圍:局部變量生命周期:到整個(gè)程序結(jié)束(全局變量)(11_4.c)靜態(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)變量的初值為0程序指針學(xué)習(xí)Chap10函數(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)題寫程序時(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)演示降低程序的構(gòu)思、編寫、調(diào)試的復(fù)雜度可讀性好例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)它辨別圓形體的類型再調(diào)用計(jì)算球體、圓柱體、圓錐體體積的函數(shù)設(shè)計(jì)單獨(dú)的函數(shù)計(jì)算不同圓形體的體積10.1.1程序解析-計(jì)算常用圓形體體積3層結(jié)構(gòu),5個(gè)函數(shù)降低程序的構(gòu)思、編寫、調(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ù)的情況稱為函數(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)用自己稱為遞歸調(diào)用遞歸函數(shù):帶有遞歸調(diào)用的函數(shù)稱為遞歸函數(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;}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寫輸出結(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)題,滿足兩個(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è)盤從座A搬到座B(1)一次只能搬一個(gè)盤子(2)盤子只能插在A、B、C三個(gè)桿中(3)大盤不能壓在小盤上

A B C分析

A B C分析

A B C

A B Cnn-1分析

A B C

A B Cnn-1算法hanio(n個(gè)盤,A→B)//C為過(guò)渡{if(n==1)

直接把盤子A→Belse{hanio(n-1個(gè)盤,A→C)//B為過(guò)渡

把n號(hào)盤A→B hanio(n-1個(gè)盤,C→B)//A為過(guò)渡 }}

A B Cn-1函數(shù)

/*搬動(dòng)n個(gè)盤,從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è)盤,A→B)//C為過(guò)渡{if(n==1)直接把盤子A→Belse{hanio(n-1個(gè)盤,A→C)

把n號(hào)盤A→B hanio(n-1個(gè)盤,C→B) }}源程序

/*搬動(dòng)n個(gè)盤,從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;}本講要點(diǎn)怎樣把多個(gè)函數(shù)組織起來(lái)?如何使用宏?編譯預(yù)處理謝謝大家!練習(xí)編寫遞歸函數(shù)intpow_xn(intx,intn)求x^n,并調(diào)用它來(lái)求s=3^1+3^2+3^3+3^4+3^5.勤能補(bǔ)拙,熟能生巧10.1.4全局變量與程序文件模塊局部變量作用范圍:函數(shù)(復(fù)合語(yǔ)句)內(nèi)部生命周期:從函數(shù)調(diào)用開始-函數(shù)調(diào)用結(jié)束全局變量 作用范圍:從定義處到源文件結(jié)束生命周期:從程序執(zhí)行開始-程序運(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ù)類型函數(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ù)類型函數(shù)名(參數(shù)表說(shuō)明);文件名file1.c文件名file2.c無(wú)法調(diào)用10.3宏定義#define宏名標(biāo)識(shí)符宏定義字符串編譯時(shí),把程序中所有與宏名相同的字符串,用宏定義字符串替代#definePI3.14#definearr_size4說(shuō)明:宏名一般用大寫字母,以與變量名區(qū)別宏定義不是C語(yǔ)句,后面不得跟分號(hào)宏定義可以嵌套使用#definePI3.14#defineS2*PI*PI多用于符號(hào)常量宏定義可以寫在程序中任何位置,它的作用范圍從定義書寫處到文件尾??梢酝ㄟ^(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)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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)論