版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第四幸模塊也世本世計(jì)(&^)
莆田學(xué)院現(xiàn)代教育技術(shù)中心
2004年3月制作
一、模塊化設(shè)計(jì)與函數(shù)
?把大型軟件按照規(guī)定的原則劃分成一個(gè)個(gè)較小的、相
對獨(dú)立但又相互關(guān)聯(lián)的模塊,叫做模塊化設(shè)計(jì)。
?1965年,GAMiller在他的著名文章“奇妙的數(shù)字
7±2——人類信息處理能力的限度”中指出,普通
人分辨或記憶同一類信息的不同品種或等級的數(shù)量一
般不超過5?9項(xiàng)。這表明,要使人的智力能足以管
理好程序,應(yīng)該堅(jiān)持模塊化設(shè)計(jì)。正如不分段的長篇
文章可能使讀者感到頭痛一樣,大型的單模塊軟件不
僅可讀性差,可靠性也常常難以保證。
?C語言中,模塊化設(shè)計(jì)的重要工具是“自定義函數(shù)”。
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
???
一、模塊化設(shè)計(jì)與函數(shù)H:
???
【例一】參見P5例1.3intmax(intx,inty)/*被調(diào)函數(shù)*/
#include<stdio.h>(
#include<conio.h>intz;
main()/*主調(diào)函數(shù)*/
if(x>y)
{
inta,b,c;z=x;
intmax(intjnt);/*函數(shù)原型*/else
clrscr();z=y;
printf("lnputa,b=");returnz;
scanf("%d,%dH,&a,&b);}
c=max(a,b);
printf("max=%d\n",c);
}
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004WI
一、模塊化設(shè)計(jì)與函數(shù)
本章的學(xué)習(xí)首先要討論一
①什么是函數(shù)?
②為什么要使用函數(shù)?
③函數(shù)有哪些類型?
④如何自己定義一個(gè)函數(shù)?
⑤如何調(diào)用一個(gè)函數(shù)?
⑥函數(shù)學(xué)習(xí)的難點(diǎn)是什么?
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
、模塊化設(shè)計(jì)與函數(shù)
①什么是函數(shù)?
什么是函數(shù)?
②為什么要使用函數(shù)?
③函數(shù)有哪些類型?一個(gè)獨(dú)立的程序模塊,
④如何自己定義一個(gè)可以定義自己的變量
函數(shù)?(僅在本函數(shù)內(nèi)有效),
⑤如何調(diào)用一個(gè)函數(shù)?擁有自己的存儲空間。
可以被其他函數(shù)或自身
⑥函數(shù)學(xué)習(xí)的難點(diǎn)是調(diào)用(主函數(shù)除外)。
什么?
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
模塊化設(shè)計(jì)與函數(shù)
力旦X蜘2
如果把編程比做制造一臺為什么要使用函數(shù)?
機(jī)器,函數(shù)就好比其零部?便于實(shí)現(xiàn)模塊化設(shè)計(jì)
件。便于團(tuán)隊(duì)開發(fā)
?可謳這些“零部件”單獨(dú)?
?便于使用現(xiàn)有的或別人的
設(shè)計(jì)、調(diào)試、測試好,用程序模塊提高編程效能
時(shí)拿出來裝配,再總體調(diào)
試。在C程序設(shè)計(jì)中,通常:
>將一個(gè)大程序分成幾個(gè)子
?這些“零部件”可以是自
己設(shè)計(jì)制造/別人設(shè)計(jì)制造程序模塊(自定義函數(shù))
/現(xiàn)在的標(biāo)準(zhǔn)產(chǎn)品>將常用功能做成標(biāo)準(zhǔn)模塊
(標(biāo)準(zhǔn)函數(shù))放在函數(shù)庫
中供其他程序調(diào)用
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
一、模塊化設(shè)計(jì)與函數(shù)
【例二】編寫一個(gè)兒童算術(shù)能力測試軟件
一、模塊化設(shè)*Let*try…
【例二】編寫一個(gè)兒童餐宿
main()
/*定義所用函數(shù)*/
charans='y';cover(){}/*軟件封面顯示函數(shù)*/
clrscr();password(){}/*密碼檢查函數(shù)*/
cover();/*調(diào)用軟件封面顯示函數(shù)7question(){}/*產(chǎn)生題目函數(shù)*/
password();/*調(diào)用密碼檢查函數(shù)*/answers(){}/*接受回答函藪*/
=,
while(ans=='y'||ans=Y')marks(){}/*評分函數(shù)*/
/*調(diào)用產(chǎn)生題目函數(shù)*/
{question();results(){}/*結(jié)果顯示函數(shù)*/
answers();/*調(diào)用接受回答函數(shù)7
marks();/*調(diào)用評分函數(shù)7
/*調(diào)用結(jié)果顯示函數(shù)*/
results();■這些函數(shù)現(xiàn)在不編程或還不會
printf("是否繼續(xù)練習(xí)?(Y/N)\n)編程,可先放空。
ans=getch();■可以多人合作,每人完成若干
}個(gè)函數(shù)(模塊化)。
printf("謝謝使用,再見!)■可在另一個(gè)源程序文件中定義。
}
一、模塊化設(shè)計(jì)與函數(shù)
①什么是函數(shù)?函數(shù)有哪些類型?
根據(jù)函數(shù)的來源,可分為:
②為什么要使用函數(shù)??庫函數(shù)(標(biāo)準(zhǔn)函數(shù))
③函數(shù)有哪些類型?由系統(tǒng)提供,編程時(shí)可直接
使用之
④如何自己定義一個(gè)?自定義函數(shù)
函數(shù)?由編程者自己編寫,使用時(shí)
⑤如何調(diào)用一個(gè)函數(shù)?要“先定義后使用”
⑥函數(shù)學(xué)習(xí)的難點(diǎn)是根據(jù)使用的方式,可分為:
什么??無參函數(shù)
?有參函數(shù)(函數(shù)內(nèi)需要使
用主調(diào)函數(shù)中的數(shù)據(jù))
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
、模塊化設(shè)計(jì)與函數(shù)
①什么是函數(shù)?如何自己定義一個(gè)函數(shù)?
②為什么要使用函數(shù)?(見后)
③函數(shù)有哪些類型?如何調(diào)用一個(gè)函數(shù)?
④如何自己定義一個(gè)(見后)
函數(shù)?函數(shù)部分學(xué)習(xí)的難點(diǎn)是什么?
⑤如何調(diào)用一個(gè)函數(shù)?■函數(shù)的概念
⑥函數(shù)學(xué)習(xí)的難點(diǎn)是■形參/實(shí)參/返回值的概念
■遞歸算法
什么?■變量的作用域和生存期
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
一、模塊化設(shè)計(jì)與函數(shù)::
??
函數(shù)使用常識:P144
?一個(gè)源文件由一個(gè)或多個(gè)函數(shù)組成,可為多個(gè)C程序公用。
?C語言是以源文件為單位而不以函數(shù)為單位進(jìn)行編譯的。
?一個(gè)c程序由一個(gè)或多個(gè)源(程序)文件組成——可分別
編寫、編譯和調(diào)試。
?c程序執(zhí)行總是從main函數(shù)開始,一般情況下調(diào)用其它
函數(shù)后總是回到main函數(shù),最后在main函數(shù)中結(jié)束整個(gè)
程序的運(yùn)行。
?所有函數(shù)都是平行的、互相獨(dú)立的,即在一個(gè)函數(shù)內(nèi)只
能調(diào)用其他函數(shù),不能再定義一個(gè)函數(shù)(嵌套定義)。
?一個(gè)函數(shù)可以調(diào)用其他函數(shù)或其本身,但任何函數(shù)均不
可調(diào)用main函數(shù)。
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
二、函數(shù)的定義:::
???
函數(shù)定義——“制造自己的函數(shù)”。P144
1、函數(shù)定義的一般形式(參見例一)
函數(shù)返回值的數(shù)據(jù)類型函數(shù)名(類型名變量名1,類型名變量名2,…,
{聲明靦姻標(biāo)識符形參表
處理語句
)
【注意】無形參表的即無參函數(shù)。無函數(shù)體的為“空函
數(shù)”。如果函數(shù)返回值的數(shù)據(jù)類型為int,可以省略之。
傳統(tǒng)方式見P146。
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
二、函數(shù)的定義
?????
把程序控制權(quán)從函數(shù)返回函數(shù)調(diào)用點(diǎn)有三種方法:
?執(zhí)行到函數(shù)結(jié)束的右花括號時(shí)(如果函數(shù)沒有返回值);
?執(zhí)行到如下語句(如果函數(shù)沒有返回值):
return;
?把返回值返回調(diào)用處(見例一)
return表達(dá)式;
形式:return(x);return(x+y);return(x>y?x:y);
語句中圓括號亦可省略。
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
二、函數(shù)的定義
【注意】
如果函數(shù)值類型與return語句表達(dá)式值的類型
不一致,以函數(shù)類型為準(zhǔn)(數(shù)值型會自動(dòng)進(jìn)行
類型轉(zhuǎn)換)。
如果明確表示不需返回值,應(yīng)使用void作函
數(shù)返回值的數(shù)據(jù)類型,否則即使沒有return語句,
仍將帶回一個(gè)不確定的值(見P149說明)。
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
三、函數(shù)的調(diào)用
1、庫函數(shù)的調(diào)用
必須在源程序中用include命令將定義該庫函數(shù)的頭文件
“包含進(jìn)來”。
調(diào)用方式:
?獨(dú)立語句執(zhí)行某項(xiàng)操作,如
clrscr(),printf("lnputa,b=")等
?表達(dá)式中作運(yùn)算對象,如
a=sqrt(x)+pow(r,3),c=exp(a)等
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
三、函數(shù)的調(diào)用舉:
2、自定義函數(shù)
自定義函數(shù)和變量一樣,在其主調(diào)函數(shù)中也必須“先聲明,
后使用”。
如例一中的intmax(intjnt);/*函數(shù)原型*/
例一中的自定義函數(shù)聲明也可以用以下兩種形式:
intmax(intx,inty);(多余,因?yàn)榫幾g系統(tǒng)并不檢查參數(shù)名)
或intmax();(編譯系統(tǒng)將不檢查參數(shù)類型和參數(shù)個(gè)數(shù))
以下情況時(shí),被調(diào)函數(shù)在主調(diào)函數(shù)中可以不先聲明:0754
被調(diào)函數(shù)的返回值為整型時(shí)函數(shù)值是整型(int)或字符型
(char)時(shí)——系統(tǒng)自動(dòng)按整型說明;
被調(diào)函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前時(shí)
在所有函數(shù)定義之前,在函數(shù)的外部已做了函數(shù)聲明時(shí)
調(diào)用方式同庫函數(shù)。
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
三、函數(shù)的調(diào)用
4、函數(shù)的嵌套調(diào)用P155例8.6
floatf(floatx)
(main()
???(
???
}
f1=f(x1);
floatxpoint(floatx1,floatx2)f2=f(x2);
(???
調(diào)用、
y=…f(x1)f(x2)x=root(x1,x2);
}???
floatroot(floatx1,floatx2);}
(
y1=f(x1)
x=xpoint(x1,x2)例8.6嵌套調(diào)用關(guān)系(簡化)
y=f(x)
)莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
三、函數(shù)的調(diào)用
4、函數(shù)的嵌套調(diào)用P155
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
例8.6模塊劃劃分情況
f(x)
根據(jù)所給X值,求
y=x3-5x2+16x-80
返回y值,即與x對應(yīng)的
f(x)值
,代教育技術(shù)中心2004年3月
補(bǔ)充內(nèi)容:
計(jì)算方法與計(jì)算機(jī)數(shù)值求解
《計(jì)算方法》工程數(shù)學(xué)之一
一、計(jì)算方法研究內(nèi)容:
?高次方程求根
?矩陣運(yùn)算求解(通常歸到《線性代數(shù)》中)
?常微分方程數(shù)值求解
?線性方程組求解
?函數(shù)插值
計(jì)算方法研究求解的算法,通過計(jì)算機(jī)程序數(shù)值
求解。
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
計(jì)算方法與計(jì)算機(jī)數(shù)值求解
二、高次方程求根(近似解)
基本思路
方程千(X)=0處的X稱為該方程的根
解法步驟:
1、初始近似值(逐步掃描法——異號必有根)
2、逐步精確化(誤差小于某許可值時(shí),為所求近似根)
?二分法P121習(xí)題6.13]
?迭代法P121習(xí)題6.11I
?牛頓法「121習(xí)題6.12|考試內(nèi)容!!
?弦截法P155例8.6,
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
例8.6“弦截法”原理
甫田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
二分法:
設(shè)方程f(x)=O在區(qū)間(a,b)有
一個(gè)根,取其中點(diǎn)xo=(a+b)/2。
如果f(xo)與f(a)同號,則版在xoy
右側(cè),耳運(yùn)二xo,b不變,否則取
b=xo,a不變。這樣就得到一個(gè)新
的變小了的有根區(qū)間(a,b)。對
此新的有根區(qū)間進(jìn)行同樣的處
理,這樣就可得到更小的有根
區(qū)間……當(dāng)|a-b|"時(shí),對應(yīng)的
xo即為所求根之近似解。
e為允許的誤差
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
迭代法:例:::
設(shè)有方程f(x)=O求方程x3-X-1=0
先設(shè)法將它化為在x=1.5附近的一個(gè)根。
x=g(x)步驟:
于是得到“迭代公式”:將方程改造為迭代公式
Xn=g(Xn-1)
從給定的初始近似值X。出發(fā),反
復(fù)利用迭代公式求出
用xo=1.5代入,求得
X0,X1,X2,X3,...,Xn-15Xn
xi=1.35721
當(dāng)|Xn-Xn」|“時(shí),對應(yīng)的Xn即為
再代入,求得
所求根之近似解。
X2=1.33086
直至lJ|Xn-Xn-1"為止。
e為允許的誤差
e為允許的誤差
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
???
牛頓法:又稱“牛頓切線法”(求值速度更快)。
設(shè)有方程f(x)=O
若已知它在X0附近有根,
由其切線方程
y=f(xo)-fJ(xo)(x-xo)
可得到“迭代公式”:
Xn+1=Xn-f(Xn)/f((Xn)
從給定的初始近似值XO出發(fā),反復(fù)利用迭代公式求出
X0,X1,X2,X3,...,Xn-1JXn
當(dāng)|Xn-Xn-11"時(shí),對應(yīng)的Xn即為所求根之近似解。
e為允許的誤差f'(X)為方程f(x)的一階導(dǎo)數(shù)(斜率)
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
I、函數(shù)的遞歸調(diào)用
1、遞歸的概念P158
?直接遞歸調(diào)用調(diào)用函數(shù)的過程中又調(diào)用該函數(shù)本身
?間接遞歸調(diào)用調(diào)用fl函數(shù)的過程中調(diào)用f2函數(shù),而f2中又需要
調(diào)用fl°
以上均為無終止遞歸調(diào)用。
為此,一般要用if語句來控制使遞歸過程到某一條件滿足時(shí)結(jié)
O
Af函數(shù)
調(diào)用f函數(shù)
直接遞歸調(diào)用間接遞歸調(diào)用
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
I、函數(shù)的遞歸調(diào)用
2、遞歸算法
類似于數(shù)學(xué)證明中的反推法,從后一結(jié)果與前一結(jié)果的關(guān)
系中尋找其規(guī)律性。
歸納法可以分為:
■遞推法從初值出發(fā),歸納出新值與舊值間直到最后值為止存
在的關(guān)系。
要求通過分析得到:初值+遞推公式
編程:通過循環(huán)控制結(jié)構(gòu)實(shí)現(xiàn)(循環(huán)的終值是最后值)
■遞歸法從結(jié)果出發(fā),歸納出后一結(jié)果與前一結(jié)果直到初值為
止存在的關(guān)系。
要求通過分析得到:初值+遞歸函數(shù)
編程:設(shè)計(jì)一個(gè)函數(shù)(遞歸函數(shù)),這個(gè)函數(shù)不斷使用下
一級值調(diào)用自身,直到結(jié)果已知處——選擇控制結(jié)構(gòu)。
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
、函數(shù)的遞歸調(diào)用
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
【例一】小160例8.8)用遞歸法求口!
分析比較:
遞推法朝法
0I=1分析得Sn=n!的求解nl=(n—1)1Xn分析得f(n)=n!的求解
11=01X1「1(n=1,0)(n-1)l=(n-2)!x(n-1)r1(n=1.0)
2!=11X2Sn=v(n-2)l=(n-3)lx(n-2)f(n戶
ISn-1Xn^f(n-1)xn
3!=21X3(n—3)l=(n—4)!x(n—3)
(n>1)(n>1)
m=(n-l)!Xn其中Sn-1先求出21=1Ix2其中Un-1)未求出
實(shí)際上,遞歸程序分兩個(gè)階段執(zhí)行——
①回推(調(diào)用):欲求n!一先求(n-1)!—(n-2)!T…-1!若1!已知,回推結(jié)束。
②遞推(回代):知道1!72!可求出—3!―…—n!
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
???
程序如下:
main()
floatfac(intx)
intn;
floats;intf;
floatfac();if(x==0||x==1)
clrscr();f=1;
else
printf("lnputn=");
f=fac(x-1)*x;
scanf(H%d",&n);
returnf;
s=fac(n);)
printf("%d!=%.Of",n,s);
)
2004年3月
【例二】有5個(gè)人,第5個(gè)人說他比第4個(gè)人大2
歲,第4個(gè)人說他對第3個(gè)人大2歲,第3個(gè)人說
他對第2個(gè)人大2歲,第2個(gè)人說他比第1個(gè)人大2
歲,第1個(gè)人說他10歲。求第5個(gè)人多少歲。
(P158例8.7)
通過分析,設(shè)計(jì)遞歸函數(shù)如下:
10(n=1)
age(n)=,
age(n-1)+2(n>1)
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
程序如下:
age(intn)
{
intc;遞歸函數(shù):
if(n==1)c=10;10(n=1)
elsec=age(n-1)+2;age(n)=,
returnc;
age(n-1)+2(n>1)
}
main()
(
clrscr();請看看單步運(yùn)行的情況
printf("%d",age(5));
}
2004年3月
c=18C爭f皆院現(xiàn)代教育技術(shù)中心2004年3月c=14c=12
【例三】在屏幕上顯示楊輝三角形
分析:
若起始行為第1行
則:
第X行有X個(gè)值
對第X行第y列(不計(jì)左側(cè)空格時(shí))
其值可用以下遞歸函數(shù)表示:
15101051
1(y=1或y=x)
c(x,y尸
c(x-1,y-1)+c(x-1,y)
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
程序如下:遞歸函數(shù):
fl(y=1或y=x)
main()c(x,y)=[
{c(x-1,y-1)+c(x-1,y)
inti,j,n;
clrscr();intc(intx,inty)
printf("lnputn=");intz;
scanf("%d",&n);
if(y==1||y==x)
for(i=1;i<=n;i++)return1;
(else
for(j=O;j<=n-i;j++)
printff'");z=c(x-1,y-1)+c(x-1,y);
for(j=1;j<=i;j++)returnz;
n
printf("%3d,c(i,j));}
H
printf("\n);}
}
)
技術(shù)中心2004年3月
【例四】Fibonacci數(shù)列問題。
結(jié)果:
「1(n=1)
遞歸函數(shù):fib(n)=<1(n=2)n=12,s=376
〔fib(n-1)+fib(n-2)(n>1)
程序如下:
main()
fib(intn)
(
(inti,s=0;
intf;
clrscr();
if(n==1||n==2)
f=1;for(i=1;i<=12;i++)
elses=s+fib(i);
f=fib(n-1)+fib(n-2);
printf("n=12,s=%d",s);
return(f);
}}
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
???
【例五】運(yùn)行下列程序,當(dāng)輸入字符序列
AB$CDE并回車時(shí),程序的輸出結(jié)果是什么?
#include<stdio.h>
rev()
(
charc;
c=getchar();
if(c=='$')printf("%c",c);
else
{rev();
printf("%c",c);
}
)
main()
(
rev();
)院現(xiàn)代教育技術(shù)中心2004年3月
【例六】反向輸出一個(gè)整數(shù)(非數(shù)值問題)::
??
非數(shù)值問題的分析無法象數(shù)值問題那樣能得出一個(gè)初值和遞歸函數(shù)
式,但思路是相同的。
分析方法:
①簡化問題:設(shè)要輸出的正整數(shù)只有一位,則“反向輸出”問題可
簡化為輸出一位整數(shù)。
②對大于10的正整數(shù),邏輯上可分為兩部分:個(gè)位上的數(shù)字和個(gè)位
以前的全部數(shù)字。將個(gè)位以前的全部數(shù)字看成一個(gè)整體,則為了反向輸
出這個(gè)大于10的正整數(shù),可按以下步驟:
a、輸出個(gè)位上的數(shù)字;
b、將個(gè)位除外的其他數(shù)字作為一個(gè)新的整數(shù),重復(fù)a步驟的操作。
其中b問題只是對原問題在規(guī)模上進(jìn)行了縮小——遞歸。
所以,可將反向輸出一個(gè)正整數(shù)x的算法歸納為:
if(x為一位整數(shù))
輸出x;
else
{輸出x的個(gè)位數(shù)字;
對剩余數(shù)字組成的新整數(shù)重復(fù)“反向輸出”操作;
}
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
【例六】反向輸出一個(gè)整數(shù)(非數(shù)值問題)
程序如下:
I/*反向輸出整數(shù)X*/
#include<stdio.h>voidprintn(intx)
voidmain()(
/*若X為一位整數(shù)*/
(
voidprintn(intx);if(x>=0&&x<=9)
intn;printf("%d",x);
/*若x為多位整數(shù)*/
printf("lnputn=");else
scanf("%d",&n);(
/*輸出其個(gè)位,并形成新的X*/
if(n<0)
{n=-n;putchar('-');}printf("%d",x%10);
printn(x/10);
printn(n);)
)}_______________________________
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
【例七】漢諾塔(TowerofHanoi)問題。
也是一個(gè)非數(shù)值問題。P161例8.9
1
2
n-1
n-
a.0c(借助):
分析方法:
①簡化問題:設(shè)盤子只有一個(gè),則本問題可簡化為a-b。
②對于大于一個(gè)盤子的情況,邏輯上可分為兩部分:第n個(gè)盤子和除n
以外的n-1個(gè)盤子。如果將除n以外的n-1個(gè)盤子看成一個(gè)整體,則要
解決本問題,可按以下步驟:
a、將a桿上n?1個(gè)盤子借助于b先移到c桿;a—c(n-1,a,c,b)
b、將a桿上第n個(gè)盤子從a移到b桿;a-b
c、將c桿上n?1個(gè)盤子借助a移到b桿。c—b(n-1,c,b,a)
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
???
五、變量的存儲類型:懣
????
?模塊化設(shè)計(jì)要求研究不同模塊(函數(shù)、源文件)
間變量的關(guān)系。
?變量兩大屬性:?數(shù)據(jù)類型-存儲類別
[、數(shù)據(jù)類型(復(fù)習(xí))
通過變毒說明(定義)來規(guī)定其數(shù)據(jù)類型:
格式數(shù)據(jù)類型關(guān)鍵字變量名
如chara;
intb,c;
floatx,y;
為什么使用變量前要先對其數(shù)據(jù)類型進(jìn)行"說明”——好比
看電影前先買票訂座
?預(yù)留存袍空間(如char型為1個(gè)字節(jié),int型為2個(gè)字節(jié)…)
?確定存儲方式(如char型存放ASCII值,int型存放補(bǔ)碼值…)
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
一個(gè)變量的數(shù)據(jù)類型定義后,就規(guī)定了該變量只能存儲相應(yīng)
類型的數(shù)據(jù)。如定義intx,貝ijx只能存放整型數(shù),如果
x=3.14159,會被自動(dòng)轉(zhuǎn)為整型存放。
示意圖
字符型01100001(字符d)
用一個(gè)字節(jié)存放該字符的ASCII值(ASCII值表見P374)
整型0110000111001101(十進(jìn)制數(shù)25037)
用兩個(gè)字節(jié)存放該數(shù)值的補(bǔ)碼
實(shí)型01100001.......10100010101010|1!
尾數(shù)(補(bǔ)碼)指數(shù)(階碼)
注:第一位均為符號位
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
五、變量的存儲類型
?變量兩大屬性:?數(shù)據(jù)類型?存儲類別
2、存儲類另[J
規(guī)定了變量在計(jì)算機(jī)內(nèi)部的存放位置f決定變量的“壽命”
(何時(shí)“生”,何時(shí)“滅”)
一個(gè)完整的變量說明格式如下:
存儲類別數(shù)據(jù)類型變量名
如staticintx,y;
C程序的存儲類別有:
■register型(寄存器型)
■auto型(自動(dòng)變量型)
■static型(靜態(tài)變量型)
■extern型(外部變量型)
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
數(shù)據(jù)區(qū)
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
???
C程序的變量存儲類別
■register型(寄存器型)
CPU
變量值存放在運(yùn)算器的寄存
器中——存取速度快,一般運(yùn)算器隹制器
只允許2?3個(gè),且限于char寄存器
型和int型,通常用于循環(huán)變
用戶工作區(qū)
量(在微機(jī)的中實(shí)際
TurboC數(shù)據(jù)區(qū)
上自動(dòng)轉(zhuǎn)為auto型)。
■auto型(自動(dòng)變量型)
變量值存放在主存儲器的動(dòng)
態(tài)存儲區(qū)(堆棧方式);
優(yōu)點(diǎn)---同一內(nèi)存區(qū)可被不變量的生存期
同變量反復(fù)使用。靜態(tài)存儲區(qū)中的變量與程序“共存亡”
以上兩種變量均屬于“動(dòng)態(tài)動(dòng)態(tài)存儲區(qū)中的變量與函數(shù)“共存亡”
存儲型”,即調(diào)用函數(shù)時(shí)才寄存器中的變量同動(dòng)態(tài)存儲區(qū)
為這些變量分配單元,函數(shù)
調(diào)用結(jié)束其值自動(dòng)消失。
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
C程序的變量存儲類別
■static型(靜態(tài)變量型)
變量值存放在主存儲器的靜未說明存儲類別時(shí),
態(tài)存儲區(qū)函數(shù)內(nèi)定義的變量默認(rèn)為aut。型
程序執(zhí)行開始至結(jié)束,始終函數(shù)外定義的變量默認(rèn)為extern型。
占用該存儲空間
■extern型(外部變量型)動(dòng)態(tài)存儲區(qū)j數(shù)據(jù)區(qū)
同上,其值可供其他源文件
使用
以上兩種均屬于“靜態(tài)存儲”變量的生存期
性質(zhì),即從變量定義處開始,靜態(tài)存儲區(qū)中的變量與程序“共存亡”
在整個(gè)程序執(zhí)行期間其值都動(dòng)態(tài)存儲區(qū)中的變量與函數(shù)“共存亡”
存在(大都可用!!)寄存器中的變量同動(dòng)態(tài)存儲區(qū)
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
e
六、局部變量與全局變量P168::
I、局部變量一一函數(shù)內(nèi)部或復(fù)合語句內(nèi)定義的變量
rauto(默認(rèn))]所在函數(shù)調(diào)用結(jié)束時(shí),其值自動(dòng)消失
局部變量JregisterJ如不賦初值,取不確定值為初值
Lstatic所有函數(shù)調(diào)用結(jié)束,其值仍保留
如不賦初值,取初值為0(數(shù)值型)或空格(字符型)
所有形參都是局部變量;
局部變量只在本函數(shù)或本復(fù)合語句內(nèi)才能使用,
在此之外不能使用(視為不存在)main函數(shù)也
不例外。
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
【例一】求程序運(yùn)行結(jié)果
main()
變量跟蹤
(
inta=2,i;main()f函數(shù)
clrscr();。ibcf(Q)
for(i=0;i<3;i++)200->147
printf("%4d",f(a));1Of158
)2Of169
f(inta)
【結(jié)果】789
(
intb=0;
如果去掉static呢?
staticintc=3;
b++;c++;【結(jié)果】777
returna+b+c;
}技術(shù)中心2004年3月
【例二】求程序運(yùn)行結(jié)果
main()
變量跟蹤
(
intk=4,m=1,p;main()func函數(shù)
clrscr();kmabmi
p=func(k,m);41410-82一3
printf("%d,",p);41418-173—12
p=func(k,m);
printf("%d",p);【結(jié)果】8,17
)
func(inta,intb)
{staticintm=0,i=2;如果去掉static呢?
i+=m+1;
m=i+a+b;【結(jié)果】8,8
returnm;
)技術(shù)中心2004年3月
【例二】求程序運(yùn)行結(jié)果
#include<stdio.h>
main()
(
inta=3,b=2,c=1;
(
intb=5,c=12;
c-=b*2;
printf("a=%d,b=%d,c=%d\n",a,b,c);
a+=c;
)
printf("a=%d,b=%d,c=%d\n",a,b,c);
}
【結(jié)果】a=3,b=5,c=2
a=5,b=2,c=1
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
7\>局部變重與全局變至P169
2、全局變量一一在函數(shù)之外定義的變量
rextern(默認(rèn))允許本源文件中其他函數(shù)及其他源文件使用
全局變量《
static只限本源文件中使用
所有全局變量加不加static,都屬于靜態(tài)存儲,
如不賦初值,取初值為0(數(shù)值型)或空格(字符
型)(注意與函數(shù)內(nèi)部定義的static型局部變量的區(qū)
別)
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
2、全局變量----在函數(shù)之外定義的才去掉第一行試
A試..
?有效作用范圍:從定義變量
位置開始直到本源文件結(jié)束
?如果需要將全局變量的作用【例三】求程序運(yùn)行結(jié)果
范圍擴(kuò)展至整個(gè)源文件——externintx,y;
法1全部在源文件開頭處定main()
義(
法2在弓|用函數(shù)內(nèi),用externclrscr();
說明printf("x=%d,y=%d\n",x,y);
法3在源文件開頭處,用}
extern說明intx=100,y=200;
如果要將全局變量作用范圍擴(kuò)展結(jié)果:x=100,y=200
到其他源文件,只需在使用這些
變量的文件中對變量用extern加
以說明。莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
【例四】求程序運(yùn)行結(jié)果
inta=3,b=5;
max(inta,intb)
(
如果主函數(shù)中沒有inta=8,
intc;
結(jié)果?
c=a>b?a:b;
returnc;
【結(jié)果】5
}
main()如果讓主函數(shù)中inta=4或
(a=-l,結(jié)果?
inta=8;
printf("%d\n",max(a,b));【結(jié)果】均為5
}
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
【例五】求程序運(yùn)行結(jié)果
voidnum()
{externintx,y;
inta=15,b=10;
x=a-b;【結(jié)果】5,25
y=a+b;
}
intx,y;如果第二行不加上extern呢?
main()
{inta=7,b=5;
x=a+b;
【結(jié)果】12,2
y=a-b;
num();
printf("%d,%d\n",x,y);
}
2004年3月
【例六】求程序運(yùn)行結(jié)果
inta;
fun(inti)
(
a+=2*i;
returna;
}
main()
(
【結(jié)果】
inta=10;20,10
clrscr();
printf("%d,%d\n"Jfun(a),a);
}
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
七、編譯預(yù)處理::
?編譯預(yù)處理:P187
?宏定義?文件包含?條件編譯
【編譯】C編譯系統(tǒng)對源程序進(jìn)行:詞法和語法
分析,代碼生成,優(yōu)化T.OBJ文件
【編譯預(yù)處理】編譯前對源程序進(jìn)行一些預(yù)加工
(改善程序設(shè)計(jì)環(huán)境/模塊化設(shè)計(jì))
?編譯預(yù)處理命令均以#開頭,未尾不加分號
?可出現(xiàn)在程序的任何位置,其作用范圍:出現(xiàn)
點(diǎn)至所在源程序未尾。
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
C語言程序的加工過程
沒有預(yù)處理命令的目標(biāo)程序文件
C語言源程序文件
可執(zhí)行程序文件
exe
函數(shù)庫
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
七、編譯預(yù)處理:r
1、宏定義
格式#define宏名宏體
宏名和宏體均為字符串,前者必須符合標(biāo)識符
命名規(guī)則。預(yù)處理時(shí)在程序中用宏體替換宏名。
注意:可以用
#undef宏名
終止該宏名的作用范圍。P189
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
七、編譯預(yù)處理
①定義符號常量
【例一】
#defineM3結(jié)果:NN=85*NN=40
#defineN(M+1)5
#defineNNN*N/2
【討論】
main()
如果第二行改為:
(#defineNM+1
clrscr();
printf("NN=%d,",NN);
結(jié)果:NN=6,5*NN=18
printf("5*NN=%d\n",5*NN);
)
中心2004年3月
七、編譯預(yù)處理
①定義符號常量
【例二】
結(jié)果:
#defineOK10K=1
main()
(【討論】
printf("OK=%d\n",OK);程序中用雙括號括起來
}的字符串中的字符即使
與宏名相同,也不進(jìn)行
替換。
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
七、編譯預(yù)處理
②帶參數(shù)的宏定義
格式#define宏名(參數(shù)表)宏體
【例二】
#definePI3.14159
#defines(r)Pl*r*r結(jié)果:
main()r=1,s=3.141590
(
floata=1,sum;
sum=s(a);
n
printf(r=%.Of,s=%f\n",aJsum);
)
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
七、編譯預(yù)處理
②帶參數(shù)的宏定義
【例三】
結(jié)果:9.5
#definePT5.5
#defines(A)PT*A*As(a+b)=5.5X1+2X1+2=9.5
main()
【討論】注意s(a+b)
(不是函數(shù),它不做任
inta=1,b=2;何計(jì)算(如果是函數(shù),
則s(a+b)為s(3),結(jié)果
,H
printf('%4.1f\n,s(a+b));49.5)
)
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
七、編譯預(yù)處理
②帶參數(shù)的宏定義
【例四】選擇正確答案
include"stdio.h"
#defineSUM(y)1+y
main()
(
intx=2;結(jié)果:B
printf(,,%d\n,,,SUM(5)*x);
)
10111215
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
2、文件包含P194::
?include<>標(biāo)準(zhǔn)方式
只按標(biāo)準(zhǔn)方式(系統(tǒng)存放C庫函數(shù)頭文件所在目
錄)查找所要包含的文件
對TC,默認(rèn)只在\tc\include目錄下查找
?#include"“
先在源文件所在目錄找指定頭文件,若無再按
標(biāo)準(zhǔn)方式找(更保險(xiǎn))
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
文件包含命令的處理過程
?首先尋找所要求包含的文件,如果找到,就
用這個(gè)文件的全部內(nèi)容取代當(dāng)前文件里的這
個(gè)包含命令行。被替換進(jìn)來的文件里仍然可
以有文件包含等預(yù)處理命令行,這些預(yù)處理
也會被處理。
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
文件包含示意圖
stdarg.h
頭文件stdio.hstdio.h
#include<stdio.h(系統(tǒng)提供)stdarg.h
編譯/連接
#include<math.hmath.h
area.c
源程序area.c
頭文件math.harea.exe
(用戶編寫)
(系統(tǒng)提供)(可執(zhí)行程序)
第一章例一中,area.c文件本身只有12行,stdio.h有187行,
math.h有107行,實(shí)際上stdio.h本身還包括一個(gè)24行的頭文件stdarg.h。
“文件包含”是在編譯后連接時(shí)“包含”進(jìn)可執(zhí)行程序的。
比較:area.c1kb;area.obj1kb;area.exe26kb
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
3、條件編譯P196
?根據(jù)條件決定是否編譯某一組語句。常用形式:
①如果標(biāo)識符被定義過*如果標(biāo)識符未被定義過
#ifdef標(biāo)識符#ifndef標(biāo)識符
程序段1程序段1/*編譯此程序段*/
#else#else/*#else部分可省略*/
程序段2程序段2/*反之,編譯此程序段7
#endif#endif
*此處指標(biāo)識符等命令定義過。
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
3、條件編譯P196
②#if表達(dá)式/*如果表達(dá)式為真*/
程序段1/*編譯程序段1*/
#else
程序段2/否則*編譯程序段2*/
#endif
如果用:
亦可實(shí)現(xiàn)以上功能,但
if表達(dá)式程序段1,2均要編譯。
程序段1如果它們比較大,生成
else的exe文件就很大。
程序段2
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
3、條件編譯P196
【例一】結(jié)果:二西工3
#defineDEBUG0
main()a=10,b=2匕
(c=0C_只輸出
inta=10,b=20,c;【討論]:J弋?
clrscr();
如果#defineQ)EBUG呢?
c=a/b;
#ifdefDEBUG如果沒有#0加形行呢?
printf("a=%d,b=%d\n",a,b);
#endif
printf("c=%d\n",c);
)
年3月
課堂提問:
1、如何判斷一個(gè)變量是局部變量還是全局變量?
2、定義一個(gè)變量時(shí),如果沒有規(guī)定存儲類型,
其默認(rèn)的存儲類型是什么?
3、如果程序中有這樣一個(gè)語句
staticintx;
出現(xiàn)在程序的不同位置其含義是否相同?其
初值是多少?
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
課堂提問:
4、以下程序運(yùn)行時(shí)出錯(cuò)提示為:
undefinedsymbolYinfunctionmain
如何改正?
法將intx;放到王函數(shù)之內(nèi)
法
將intx;放到主函數(shù)之上
法
在主函數(shù)之內(nèi)加一語句
externx;或一xt一rnintx;
法4:在主函數(shù)之上加一語句
externx;或一xt一rnintx;
莆田學(xué)院現(xiàn)代教育技術(shù)中心2004年3月
課堂提問:5、以下程序運(yùn)行結(jié)果是o
fun3(intx)
sta
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 休完產(chǎn)假年終總結(jié)
- 數(shù)控車削加工技術(shù) 教案 項(xiàng)目五 數(shù)控車床的操作
- 15.5 串、并聯(lián)電路中電流的規(guī)律(4大題型)(含答案解析)
- 初中八年級語文上學(xué)期期中考前測試卷含答案解析
- 中國跨境雙向并購與招商引資案例報(bào)告
- T-YNRZ 021-2024 珠芽黃魔芋高產(chǎn)種植技術(shù)規(guī)程
- 【課件】Unit+3+SectionB+Writing+課件人教版英語七年級上冊
- 高效脫磷河鋼集團(tuán)李建新
- 高中物理第十八章原子結(jié)構(gòu)3氫原子光譜課件新人教版選修3-
- 信息技術(shù)(第2版)(拓展模塊)教案 拓展模塊5 5.5應(yīng)用開發(fā)實(shí)例2
- 內(nèi)鏡中心醫(yī)院感染管理共25張課件
- 2022-2023學(xué)年廣西南寧市第三中學(xué)化學(xué)九年級第一學(xué)期期中檢測模擬試題含解析
- 三年級上冊數(shù)學(xué)課件-8.3 長方形和正方形復(fù)習(xí)丨蘇教版 (共17張PPT)
- 兩家公司關(guān)系證明公函
- 胸部心臟創(chuàng)傷的急救流程圖
- 慢性腎衰竭患者護(hù)理查房課件
- 婦女保健科圍絕經(jīng)期保健門診工作制度
- 三寶四口五臨邊安全檢查重點(diǎn)
- 市中醫(yī)院雷火灸法操作評分標(biāo)準(zhǔn)
- 大隊(duì)委競選課件
- 胡援成《貨幣銀行學(xué)》(第4版)筆記和課后習(xí)題(含考研真題)詳解
評論
0/150
提交評論