第12講函數(shù)之二_第1頁
第12講函數(shù)之二_第2頁
第12講函數(shù)之二_第3頁
第12講函數(shù)之二_第4頁
第12講函數(shù)之二_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第十一講函數(shù)(二)溫故而知新為什么使用函數(shù)?什么叫函數(shù)?函數(shù)定義、調(diào)用函數(shù)形參、實參:一一對應(yīng),值傳遞減少重復代碼、實現(xiàn)模塊化設(shè)計、方便分工合作函數(shù)是指完成一個特定工作的獨立程序模塊函數(shù)類型函數(shù)名(形參表){

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

return表達式;}函數(shù)名(實參表)可無返回值作業(yè)問題prime(intn)中為何要討論1,題目中范圍是100-200呢?程序max(a,b)如何和c有關(guān)系?程序調(diào)用函數(shù)fn(a,n),求a+aa+aaa…..值先寫函數(shù)定義,再寫main()函數(shù),相互獨立程序改錯5.3變量與函數(shù)5.3.1變量作用域:局部變量和全局變量5.3.2變量生命周期和靜態(tài)局部變量5.3.1局部變量和全局變量局部變量在函數(shù)內(nèi)定義的變量(包括形參)作用范圍:本函數(shù)內(nèi)部定義在復合語句內(nèi)的變量作用范圍:復合語句內(nèi)部全局變量 在函數(shù)以外定義的變量,不從屬于任一函數(shù)。作用范圍:從定義處到源文件結(jié)束(包括各函數(shù))例5-6在復合語句中定義局部變量。#include<stdio.h>intmain(void){

int a;a=1;

{ /*復合語句開始*/

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

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

4程序例5-7全局變量定義#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; /*全局變量運算*/}printf("%d%d",a,x);return0;}4,7若局部變量與全局變量同名,局部變量優(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沒定義

x=?b=?t=?a=?自動變量(auto):普通的局部變量intx,y;

autointx,y;charc1;

autocharc1;函數(shù)調(diào)用時,定義變量,分配存儲單元。函數(shù)調(diào)用結(jié)束,收回存儲單元。全局變量:從程序執(zhí)行開始,到程序的結(jié)束,存儲單元始終保持。變量生命周期變量從定義開始分配存儲單元,到運行結(jié)束存儲單元被回收的整個過程。5.3.2變量生命周期和靜態(tài)局部變量存儲類型:動態(tài)存儲:自動變量靜態(tài)存儲:全局變量、靜態(tài)局部變量用戶存儲空間存儲區(qū)數(shù)據(jù)區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)static

類型名變量表作用范圍:局部變量生命周期:到整個程序結(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)變量會記住前一次調(diào)用時留下來的值靜態(tài)變量的初值為0Chap10函數(shù)與程序結(jié)構(gòu)10.1函數(shù)的組織10.2遞歸函數(shù)10.3宏定義(機房講解)10.4編譯預(yù)處理(機房講解)使用結(jié)構(gòu)化程序設(shè)計方法解決復雜的問題把大問題分解成若干小問題,小問題再進一步分解成若干更小的問題寫程序時,用main()解決整個問題,它調(diào)用解決小問題的函數(shù)這些函數(shù)又進一步調(diào)用解決更小問題的函數(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è)計一個常用圓形體體積計算器,采用命令方式輸入1、2、3,分別選擇計算球體、圓柱體、圓錐體的體積,并輸入計算所需相應(yīng)參數(shù)。分析:main函數(shù)輸入1、2、3選擇計算3種體積,其他輸入結(jié)束計算設(shè)計一個控制函數(shù)cal(),經(jīng)它辨別圓形體的類型再調(diào)用計算球體、圓柱體、圓錐體體積的函數(shù)設(shè)計單獨的函數(shù)計算不同圓形體的體積10.1.1程序解析-計算常用圓形體體積3層結(jié)構(gòu),5個函數(shù)降低程序的構(gòu)思、編寫、調(diào)試的復雜度可讀性好程序結(jié)構(gòu)main()cal()vol_ball()vol_cylind()vol_cone()例10-1源程序#definePI3.141592654voidcal(intsel);

intmain(void){intsel;

while(1){printf("1-計算球體體積\n");

printf("2-計算圓柱體積\n"); printf("3-計算圓錐體積\n"); printf("其他-退出程序運行\(zhòng)n"); printf(“請輸入計算命令:”);

scanf("%d",&sel); if(sel<1||sel>3)

break; /*輸入非1~3,循環(huán)結(jié)束*/

else

cal(sel); /*輸入1~3,調(diào)用cal()*/ }return0;}/*常用圓形體體積計算器的主控函數(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; }}/*計算球體體積V=4/3*PI*r*r*r*/doublevol_ball(){doubler;printf("請輸入球的半徑:");scanf("%lf",&r);return(4.0/3.0*PI*r*r*r);}/*計算圓柱體積V=PI*r*r*h*/doublevol_cylind(){doubler,h;printf("請輸入圓柱的底圓半徑和高:");scanf("%lf%lf",&r,&h);return(PI*r*r*h);}/*計算圓錐體積V=h/3*PI*r*r*/doublevol_cone(){doubler,h;printf("請輸入圓錐的底圓半徑和高:");

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)用在一個函數(shù)中再調(diào)用其它函數(shù)的情況稱為函數(shù)的嵌套調(diào)用。如果函數(shù)A調(diào)用函數(shù)B,函數(shù)B再調(diào)用函數(shù)C,一個調(diào)用一個地嵌套下去,構(gòu)成了函數(shù)的嵌套調(diào)用。具有嵌套調(diào)用函數(shù)的程序,需要分別定義多個不同的函數(shù)體,每個函數(shù)體完成不同的功能,它們合起來解決復雜的問題遞歸函數(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;}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)的實現(xiàn)過程fact(3)=3*fact(2)=

2*fact(1)=

fact(1)=12*1=23*2=6同時有4個函數(shù)在運行,且都未完成例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è)計用遞歸實現(xiàn)的問題,滿足兩個條件:問題可以逐步簡化成自身較簡單的形式(遞歸式)n!=n*(n-1)!nn-1Σi=n+Σi

i=1i=1遞歸最終能結(jié)束(遞歸出口)兩個條件缺一不可解決遞歸問題的兩個著眼點n!=1(n=0,1)世界末日問題印度有一個傳說,梵天(相當于印度最高的神)在創(chuàng)造世界時,來到印度佛教圣地貝那勒斯圣廟,在圣廟里安放著一塊黃銅板,上面插著三根寶石針,其中一根針從下到上疊放著由大到小排列的64片金葉,這個塔形的金片堆就是著名的“梵塔”。圣廟里每時每刻都有僧侶值班,按照梵天的旨意,一刻不停地把這些金葉在三根針上搬來搬去,要求:第一:每閃次只能動一片金葉第二:小金葉永遠在大金葉上面當64片葉子都搬到另一根針上時,梵天認為:此刻世界將在一聲霹靂中化為灰燼,這就是世界末日。例10-5漢諾(Hanoi)塔將64個盤從座A搬到座B(1)一次只能搬一個盤子(2)盤子只能插在A、B、C三個桿中(3)大盤不能壓在小盤上

A B C分析

A B C分析

A B C

A B Cnn-1分析

A B C

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

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

把n號盤A→B hanio(n-1個盤,C→B)//A為過渡 }}

A B Cn-1函數(shù)

/*搬動n個盤,從a到b,c為中間過渡*/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個盤,A→B)//C為過渡{if(n==1)直接把盤子A→Belse{hanio(n-1個盤,A→C)

把n號盤A→B hanio(n-1個盤,C→B) }}

源程序

/*搬動n個盤,從a到b,c為中間過渡*/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;}練習編寫遞歸函數(shù)intpow_xn(intx,intn)求x^n,并調(diào)用它來求s=3^1+3^2+3^3+3^4+3^5.

勤能補拙,熟能生巧本講要點怎樣把多個函數(shù)組織起來?如何使用宏?編譯預(yù)處理10.1.4全局變量與程序文件模塊局部變量作用范圍:函數(shù)(復合語句)內(nèi)部生命周期:從函數(shù)調(diào)用開始-函數(shù)調(diào)用結(jié)束全局變量 作用范圍:從定義處到源文件結(jié)束生命周期:從程序執(zhí)行開始-程序運行結(jié)束靜態(tài)局部變量作用范圍:局部變量生命周期:全局變量外部變量(extern)在某個程序文件模塊中定義了全局變量該全局變量可以在整個程序的所有文件模塊中起作用在其他文件模塊中如果要使用該全局變量,必須將它聲明為外部變量說明這是一個在其他模塊中定義的全局變量intx;voidmain(){………}

文件名file1.cexternx;/*使用file1.c中的全局變量x*/f1(){………}

文件名file2.c擴大全局變量的作用域staticintx;voidmain(){………}使全局變量只限于本文件引用,而不能被其他文件引用

文件名file1.cexternx;/*使用file1.c中的全局變量x*/intf1(){………}

文件名file2.c無法引用靜態(tài)全局變量10.1.5寄存器變量和外部變量寄存器變量register

int

變量表;外部變量extern

變量名表;只起說明作用,不分配存儲單元,對應(yīng)的存儲單元在全局變量定義處分配。10.1.6函數(shù)與程序文件模塊外部函數(shù)函數(shù)能夠被程序中的其他程序文件模塊調(diào)用在其他文件模塊中調(diào)用該函數(shù)前,聲明為外部函數(shù)extern

函數(shù)類型函數(shù)名(參數(shù)表說明);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ù)表說明);

文件名file1.c

文件名file2.c無法調(diào)用10.3宏定義#define宏名標識符宏定義字符串編譯時,把程序中所有與宏名相同的字符串,用宏定義字符串替代#definePI3.14#definearr_size4說明:宏名一般用大寫字母,以與變量名區(qū)別宏定義不是C語句,后面不得跟分號宏定義可以嵌套使用#definePI3.14#defineS2*PI*PI多用于符號常量宏定義可以寫在程序中任何位置,它的作用范圍從定義書寫處到文件尾??梢酝ㄟ^“#undef”強制指定宏的結(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ù)的宏定義實現(xiàn)簡單的函數(shù)功能例10-7簡單的帶參數(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論