版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第十一講函數(二)溫故而知新為什么使用函數?什么叫函數?函數定義、調用函數形參、實參:一一對應,值傳遞減少重復代碼、實現模塊化設計、方便分工合作函數是指完成一個特定工作的獨立程序模塊函數類型函數名(形參表){
函數實現過
return表達式;}函數名(實參表)可無返回值作業(yè)問題prime(intn)中為何要討論1,題目中范圍是100-200呢?程序max(a,b)如何和c有關系?程序調用函數fn(a,n),求a+aa+aaa…..值先寫函數定義,再寫main()函數,相互獨立程序改錯5.3變量與函數5.3.1變量作用域:局部變量和全局變量5.3.2變量生命周期和靜態(tài)局部變量5.3.1局部變量和全局變量局部變量在函數內定義的變量(包括形參)作用范圍:本函數內部定義在復合語句內的變量作用范圍:復合語句內部全局變量 在函數以外定義的變量,不從屬于任一函數。作用范圍:從定義處到源文件結束(包括各函數)例5-6在復合語句中定義局部變量。#include<stdio.h>intmain(void){
int a;a=1;
{ /*復合語句開始*/
intb=2;b=a+b;a=a+b;
} /*復合語句結束*/ printf("%d",a); return0;}b:小范圍內的臨時變量
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;函數調用時,定義變量,分配存儲單元。函數調用結束,收回存儲單元。全局變量:從程序執(zhí)行開始,到程序的結束,存儲單元始終保持。變量生命周期變量從定義開始分配存儲單元,到運行結束存儲單元被回收的整個過程。5.3.2變量生命周期和靜態(tài)局部變量存儲類型:動態(tài)存儲:自動變量靜態(tài)存儲:全局變量、靜態(tài)局部變量用戶存儲空間存儲區(qū)數據區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)static
類型名變量表作用范圍:局部變量生命周期:到整個程序結束(全局變量)靜態(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)變量會記住前一次調用時留下來的值靜態(tài)變量的初值為0Chap10函數與程序結構10.1函數的組織10.2遞歸函數10.3宏定義(機房講解)10.4編譯預處理(機房講解)使用結構化程序設計方法解決復雜的問題把大問題分解成若干小問題,小問題再進一步分解成若干更小的問題寫程序時,用main()解決整個問題,它調用解決小問題的函數這些函數又進一步調用解決更小問題的函數,從而形成函數的嵌套調用10.1函數的組織main()函數1函數2……函數m函數1_1函數1_2函數m_1函數m_n……程序結構例10-1設計一個常用圓形體體積計算器,采用命令方式輸入1、2、3,分別選擇計算球體、圓柱體、圓錐體的體積,并輸入計算所需相應參數。分析:main函數輸入1、2、3選擇計算3種體積,其他輸入結束計算設計一個控制函數cal(),經它辨別圓形體的類型再調用計算球體、圓柱體、圓錐體體積的函數設計單獨的函數計算不同圓形體的體積10.1.1程序解析-計算常用圓形體體積3層結構,5個函數降低程序的構思、編寫、調試的復雜度可讀性好程序結構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)結束*/
else
cal(sel); /*輸入1~3,調用cal()*/ }return0;}/*常用圓形體體積計算器的主控函數*/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函數的嵌套調用順序調用intmain(void){……y=fact(3);……z=mypow(3.5,2);
……}doublefact(intn){……}doublemypow(doublex,inn){……}mainfactmypowmainfactmypow函數的嵌套調用嵌套調用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()函數的嵌套調用在一個函數中再調用其它函數的情況稱為函數的嵌套調用。如果函數A調用函數B,函數B再調用函數C,一個調用一個地嵌套下去,構成了函數的嵌套調用。具有嵌套調用函數的程序,需要分別定義多個不同的函數體,每個函數體完成不同的功能,它們合起來解決復雜的問題遞歸函數遞歸調用:函數直接或間接調用自己稱為遞歸調用遞歸函數:帶有遞歸調用的函數稱為遞歸函數遞推法與遞歸法求階乘遞推法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)遞歸函數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)}}}遞歸函數fact(n)的實現過程fact(3)=3*fact(2)=
2*fact(1)=
fact(1)=12*1=23*2=6同時有4個函數在運行,且都未完成例10-4寫輸出結果#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數列?遞歸式遞歸出口10.2.3遞歸程序設計用遞歸實現的問題,滿足兩個條件:問題可以逐步簡化成自身較簡單的形式(遞歸式)n!=n*(n-1)!nn-1Σi=n+Σi
i=1i=1遞歸最終能結束(遞歸出口)兩個條件缺一不可解決遞歸問題的兩個著眼點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函數
/*搬動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;}練習編寫遞歸函數intpow_xn(intx,intn)求x^n,并調用它來求s=3^1+3^2+3^3+3^4+3^5.
勤能補拙,熟能生巧本講要點怎樣把多個函數組織起來?如何使用宏?編譯預處理10.1.4全局變量與程序文件模塊局部變量作用范圍:函數(復合語句)內部生命周期:從函數調用開始-函數調用結束全局變量 作用范圍:從定義處到源文件結束生命周期:從程序執(zhí)行開始-程序運行結束靜態(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
變量名表;只起說明作用,不分配存儲單元,對應的存儲單元在全局變量定義處分配。10.1.6函數與程序文件模塊外部函數函數能夠被程序中的其他程序文件模塊調用在其他文件模塊中調用該函數前,聲明為外部函數extern
函數類型函數名(參數表說明);externintf1();intmain(void){………f1();………}
文件名file1.cintf1(){………}
文件名file2.c調用另一模塊中的函數externintf1();intmain(void){………f1();………}staticintf1(){………}內部函數使函數只能在本程序文件模塊中被調用static
函數類型函數名(參數表說明);
文件名file1.c
文件名file2.c無法調用10.3宏定義#define宏名標識符宏定義字符串編譯時,把程序中所有與宏名相同的字符串,用宏定義字符串替代#definePI3.14#definearr_size4說明:宏名一般用大寫字母,以與變量名區(qū)別宏定義不是C語句,后面不得跟分號宏定義可以嵌套使用#definePI3.14#defineS2*PI*PI多用于符號常量宏定義可以寫在程序中任何位置,它的作用范圍從定義書寫處到文件尾??梢酝ㄟ^“#undef”強制指定宏的結束范圍。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帶參數的宏定義例:#definef(a)a*a*aint main(void)/*水仙花數*/{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)各位數字的立方和等于它本身的數。例如153的各位數字的立方和是13+53+33=153=x+y*x+y*x+y(f(x)+f(y)+f(z)==i)f(x+y)=(x+y)3?帶參數的宏定義實現簡單的函數功能例10-7簡單的帶參數的宏定義。#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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物材料編程調控腫瘤血管生成的策略
- 生物打印技術在神經干細胞移植中的應用
- 生物化學虛擬實驗與交叉學科融合
- 生物制品穩(wěn)定性試驗強制降解試驗設計
- 生物制劑聯(lián)合免疫抑制劑治療的MDT協(xié)同方案
- 生物制劑失應答的炎癥性腸病免疫調節(jié)治療
- 生物3D打?。浩鞴僖浦查L期功能維持方案設計
- 數據面試題及業(yè)務理解能力含答案
- 圖書出版采購編輯面試題及答案
- 深度解析(2026)《GBT 19396-2025鋱鏑鐵磁致伸縮材料》
- 2025年高考數學立體幾何檢測卷(立體幾何中的三角函數應用)
- 2025年綜合類-衛(wèi)生系統(tǒng)招聘考試-護士招聘考試歷年真題摘選帶答案(5卷100題)
- 駐外銷售人員管理辦法
- 醫(yī)療反歧視培訓
- GB/T 45701-2025校園配餐服務企業(yè)管理指南
- 2025-2030中國高效節(jié)能電機行業(yè)競爭力優(yōu)勢與發(fā)展行情監(jiān)測研究報告
- 健身房合伙協(xié)議書
- 美甲師聘用合同協(xié)議
- 《儲能電站技術監(jiān)督導則》2580
- 保安人員安全知識培訓內容
- 垃圾池維修合同范例
評論
0/150
提交評論