上課夏6周函數(shù)和程序結(jié)構(gòu)_第1頁(yè)
上課夏6周函數(shù)和程序結(jié)構(gòu)_第2頁(yè)
上課夏6周函數(shù)和程序結(jié)構(gòu)_第3頁(yè)
上課夏6周函數(shù)和程序結(jié)構(gòu)_第4頁(yè)
上課夏6周函數(shù)和程序結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩43頁(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)介

第10章函數(shù)與程序結(jié)構(gòu)函數(shù)的調(diào)用方式編譯預(yù)處理main()函數(shù)1函數(shù)2……函數(shù)m函數(shù)1_1函數(shù)1_2函數(shù)m_1函數(shù)m_n……1.程序結(jié)構(gòu)例10-1設(shè)計(jì)一個(gè)常用圓形體體積計(jì)算器,采用命令方式輸入1、2、3,分別選擇計(jì)算球體、圓柱體、圓錐體的體積,并輸入計(jì)算所需相應(yīng)參數(shù)。10.1.1程序解析-計(jì)算常用圓形體體積分析:①主函數(shù)設(shè)計(jì)一個(gè)功能選擇菜單,輸入1、2、3進(jìn)行選擇計(jì)算3種體積,其他輸入結(jié)束計(jì)算②設(shè)計(jì)一個(gè)控制函數(shù)cal(intselect),經(jīng)它辨別圓形體的類型再調(diào)用計(jì)算球體、圓柱體、圓錐體體積的函數(shù)③設(shè)計(jì)單獨(dú)的函數(shù)計(jì)算不同形體的體積3層結(jié)構(gòu),5個(gè)函數(shù)降低程序的編寫、調(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;default:break; }}doublevol_cylind()/*計(jì)算圓柱體積V=PI*r*r*h*/{doubler,h;printf("請(qǐng)輸入圓柱的底圓半徑和高:");scanf("%lf%lf",&r,&h);return(PI*r*r*h);}doublevol_cone()/*計(jì)算圓錐體積V=h/3*PI*r*r*/{doubler,h;printf("請(qǐng)輸入圓錐的底圓半徑和高:");

scanf("%lf%lf",&r,&h);return(PI*r*r*h/3.0);}doublevol_ball()/*計(jì)算球體體積V=4/3*PI*r*r*r*/{doubler;printf("請(qǐng)輸入球的半徑:");scanf("%lf",&r);return(4.0/3.0*PI*r*r*r);}2.函數(shù)的調(diào)用方式1)順序調(diào)用2)嵌套調(diào)用3)遞歸調(diào)用2.函數(shù)的調(diào)用方式intmain(void){……y=f1(3);……z=f2(3.5,2);

……}doublefunc1(intn){……}doublef2(doublex,inn){……}mainf1

f2mainf1f2順序調(diào)用函數(shù)的調(diào)用方式intmain(void){……cal(sel);……}voidcal(intsel){ ……vol_ball()……}doublevol_ball(){ ……}maincalvol_ballmaincalvol_ball在函數(shù)中調(diào)用其它函數(shù),被稱為函數(shù)嵌套嵌套調(diào)用函數(shù)的調(diào)用方式求n!=1*2*3…*(n-1)*n遞歸調(diào)用result=1;for(result=1,i=1;i<=n;i++)result=result*i;遞推法n!=(n-1)!*n(n-1)!=(n-2)!*(n-1)3!=2!*32!=1!*21!=10!=1遞歸定義n!=n*(n-1)!(n>1)n!=1(n=0,1)函數(shù)的調(diào)用方式voidmain(){doublefact(intn);printf("%f\n",fact(5));}求n!=1*2*3…*(n-1)*ndoublefact(intn){doubleres;if(n==0||n==1)res=1;elseres=n*fact(n-1);returnres;}遞歸定義n!=n*(n-1)!(n>1)n!=1(n=0,1)遞歸調(diào)用函數(shù)自己調(diào)用自己遞歸出口遞歸式計(jì)算fact(3)3*fact(2)2*fact(1)fact(1)=12*1=23*2=64*6=24printf("%f\n",fact(3));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í)有4個(gè)函數(shù)在運(yùn)行,且都未完成函數(shù)的調(diào)用方式遞歸調(diào)用函數(shù)的調(diào)用方式遞歸調(diào)用遞歸解決問(wèn)題必須滿足如下兩個(gè)條件1)問(wèn)題可以遞歸表達(dá)(遞歸式)2)遞歸最終能結(jié)束

(遞歸出口)n!=n*(n-1)!nn-1Σi=n+Σii=1i=1例10-5漢諾(Hanoi)塔將64個(gè)盤從座A搬到座B(1)一次只能搬一個(gè)盤子(2)盤子只能插在A、B、C三個(gè)桿中(3)大盤不能壓在小盤上

A BC例10-5漢諾(Hanoi)塔難于找到重復(fù)的規(guī)律?無(wú)法用循環(huán)模擬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á)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);/*從塔a->c,以塔b為過(guò)渡*/printf("%c-->%c\n",a,b);hanio(n-1,c,b,a);/*從塔c->b,以塔a為過(guò)渡*/}}

源程序

/*搬動(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;}對(duì)于遞歸定義的問(wèn)題我們采用了遞歸調(diào)用編程來(lái)解決C語(yǔ)言的函數(shù)本身是不能遞歸定義的。intfunction(….){}P199函數(shù)的直接遞歸調(diào)用函數(shù)的間接遞歸調(diào)用C編譯預(yù)處理(p207)

增強(qiáng)C語(yǔ)言的編程功能,改進(jìn)C語(yǔ)言設(shè)計(jì)環(huán)境,提高編程效率#include<stdio.h>scanf(),printf()#definePI3.1416#開(kāi)頭,無(wú)分號(hào),不屬于C語(yǔ)言的編程語(yǔ)句。在真正編程之前,做一個(gè)預(yù)處理現(xiàn)有的C編譯器實(shí)際上都包含了:預(yù)處理、編譯和連接C語(yǔ)言的編譯預(yù)處理功能

文件包含宏定義條件編譯1)文件包含(P195)當(dāng)任務(wù)變得復(fù)雜,需要:多任務(wù)分解=>多人合作,多個(gè)文件單個(gè)文件太大=>多個(gè)文件把包含一部分程序的文件稱為文件模塊如何將多個(gè)文件模塊連接成一個(gè)完整的可執(zhí)行程序?只有一個(gè)main()函數(shù)由main()調(diào)用本文件的其它函數(shù)

或其它文件模塊的函數(shù)1)文件包含(P195)格式

#include<需包含的文件名>#include“需包含的文件名”<……>

在系統(tǒng)環(huán)境中所指定的路徑下查找,“……“先到當(dāng)前工作夾尋找,若找不到再到系統(tǒng)下尋找作用把指定的文件模塊內(nèi)容插入到程序中#include所在的位置,當(dāng)程序編譯連接時(shí),系統(tǒng)會(huì)把所有#include指定的文件拼接生成可執(zhí)行代碼。#include“prog2.c”voidcal(intsel){……}intmain(void){intsel;while(1){scanf("%d",&sel);……cal(sel);}}程序模塊prog1.cdoublevol_ball(){ ……}doublevol_cylind(){ ……}doublevol_cone(){……}

程序模塊prog2.c編譯連接后包含的內(nèi)容doublevol_ball(){ ……}doublevol_cylind(){……}doublevol_cone(){ ……}voidcal(intsel){……}

intmain(void){intsel;while(1){scanf("%d",&sel);……cal(sel);}}10.1.3文件包含文件包含說(shuō)明:1)編譯預(yù)處理命令,以#開(kāi)頭。2)在程序編譯時(shí)起作用,不是真正的C語(yǔ)句,行尾沒(méi)有分號(hào)。3)“.h”文件與“.c”性質(zhì)相同,都是C程序文件,“.h”文件突出了頭文件(head)的性質(zhì)。4)被包含文件與其所在的文件,在預(yù)編譯后就成為了同一個(gè)文件(而不是兩個(gè)文件)。使用工程文件創(chuàng)建一個(gè)工程文件intcount=0;main(){

externintfunc2();func2();}intcount;intfunc2(){…count++;}externcount;全局變量只能在一個(gè)模塊中定義。若其它模塊要使用該全局變量,需要通過(guò)外部變量聲明

文件f1.c

文件f2.cmain(){

externintfunc2();func2();}intcount;intfunc2(){…count++;}全局變量作用范圍是整個(gè)程序staticintcount;若要限制全局變量在一個(gè)程序模塊內(nèi)其作用使用靜態(tài)全局變量一般全局變量靜態(tài)全局變量函數(shù)的局部變量復(fù)合語(yǔ)句內(nèi)的局部變量

文件名f2.c

文件名f1.c寄存器變量和外部變量(p197)寄存器變量register

int

變量表;寄存器是指CPU內(nèi)部的數(shù)據(jù)單元。外部變量extern

變量名表;只起說(shuō)明作用,不分配存儲(chǔ)單元,對(duì)應(yīng)的存儲(chǔ)單元在全局變量定義處分配。變量的存儲(chǔ)類別:auto,staticexterncount;main(){

func2();}intcount;intfunc2(){…count++;}externintfunc2();外部函數(shù)函數(shù)能夠被程序中的其他程序文件模塊調(diào)用在其他文件模塊中調(diào)用該函數(shù)前,聲明為外部函數(shù)extern

函數(shù)類型函數(shù)名(參數(shù)表說(shuō)明);

文件名f1.c

文件名f2.cintf1(){………}externintf1();intmain(void){………f1();………}內(nèi)部函數(shù)使函數(shù)只能在本程序文件模塊中被調(diào)用static

函數(shù)類型函數(shù)名(參數(shù)表說(shuō)明);

文件名f1.c

文件名f2.cstaticintf1()無(wú)法調(diào)用2)宏定義形式1:不帶參數(shù)的宏定義#define宏名標(biāo)識(shí)符宏定義字符串形式2:帶參數(shù)的宏定義#define宏名標(biāo)識(shí)符(參數(shù)表)

宏定義字符串

#definePI3.1416#defineMAX1000#defineAREA(r)PI*(r)*(r)2)宏定義形式1:不帶參數(shù)的宏定義#define宏名標(biāo)識(shí)符宏定義字符串編譯時(shí),把程序中所有與宏名相同的字符串,用宏定義字符串替代。形式2:帶參數(shù)的宏定義#define宏名標(biāo)識(shí)符(參數(shù)表)宏定義字符串

#definePI3.1416#defineMAX10002)宏定義宏定義可以寫在程序中任何位置,它的作用范圍從定義書寫處到文件尾??梢酝ㄟ^(guò)“#undef”強(qiáng)制指定宏的結(jié)束范圍#defineA"Thisisthefirstmacro"voidf1(){printf("A\n");}#defineB"Thisisthesecondmacro\n"/*A的有效范圍*/voidf2(){printf(B);/*B的有效范圍*/}#undefBintmain(void){f1();f2();return0;}例10-6宏的作用范圍#defineF(x)x-2#defineD(x)x*F(x)intmain(){printf("%d,%d",D(3),D(D(3))); return0;}帶參數(shù)的宏定義宏定義字符串僅僅是一種機(jī)械的替換串如何閱讀帶宏定義的程序?

先全部替換好,最后再統(tǒng)一計(jì)算不可以一邊替換一邊計(jì)算,更不可以人為添加括號(hào)#defineF(x)x-2#defineD(x)x*F(x)printf("%d,%d",D(3),D(D(3)));D(3)=>x*F(x) =>x*x-2=>3*3-2=7用D(x)的宏替換,展開(kāi)參數(shù)x用F(x)的宏替換,這里不能加括號(hào)最后把x=3代進(jìn)去計(jì)算如何閱讀帶宏定義的程序?

先全部替換好,最后再統(tǒng)一計(jì)算不可以一邊替換一邊計(jì)算,更不可以人為添加括號(hào)#defineF(x)x-2#defineD(x)x*F(x)printf("%d,%d",D(3),D(D(3)));D(D(3))=>D(x*F(x))=>D(x*x-2)=>x*x-2*F(x*x-2)=>x*x-2*x*x-2-2 =>3*3-2*3*3-2-2=-13

對(duì)D(3)宏展開(kāi)對(duì)F(x)宏展開(kāi)對(duì)D(…)宏展開(kāi)對(duì)F(…)進(jìn)一步進(jìn)行宏替換最后把x=3代進(jìn)去計(jì)算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#include<stdio.h>#defineM(a,b)(a)>(b)?(a):(b)#defineS(x)(x)*(x)intmain(void){ intx,y; scanf(“%d%d”,&x,&y); x=M(x,y); /*引用宏定義*/ y=S(x); /*引用宏定義*/ printf(“%d%d\n”,x,y); return0;}宏定義使用注意事項(xiàng)#defineS1(r)PI*(r)*(r)#defineS2(r)PI*r*rvoidmain(){floata=1.0,b=2.0;area1=S1(a);are12=S2(a);}area1=PI*(a)*(a);area2=PI*a*a;宏定義使用注意事項(xiàng)#defineS1(r)PI*(r)*(r)#defineS2(r)PI*r*rvoidmain(){floata=1.0,b=2.0;area1=S1(a+b);area2=S2(a+b);}area1=PI*(a+b)*(a+b);area2=PI*a+b*a+b;在行參是表達(dá)式時(shí),注意宏展開(kāi)時(shí)可能出現(xiàn)的問(wèn)題區(qū)別()對(duì)宏展開(kāi)的影響宏定義使用注意事項(xiàng)在宏名與帶參數(shù)的括號(hào)之間不應(yīng)有空格#defineS(r)PI*(r)*(r)voidmain(){floata=1.0;floatarea;area=S(a);}area=(r)PI*(r)*(r)(a);一定要注意嚴(yán)格的宏替換格式帶參數(shù)的宏定義與帶參數(shù)的函數(shù)是兩個(gè)不同的概念宏定義使用注意事項(xiàng)①宏定義中的參數(shù)只是一種字符替代#defineS2(r)PI*r*rarea2=PI*a+b*a+b;are12=S2(a+b);函數(shù)調(diào)用時(shí),將實(shí)參表達(dá)式計(jì)算值傳遞給行參,涉及參數(shù)的數(shù)據(jù)類型,內(nèi)存分配,實(shí)參值的傳遞以及函數(shù)值的返回等

溫馨提示

  • 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)論