過程與函數(shù)省公開課一等獎(jiǎng)全國(guó)示范課微課金獎(jiǎng)_第1頁
過程與函數(shù)省公開課一等獎(jiǎng)全國(guó)示范課微課金獎(jiǎng)_第2頁
過程與函數(shù)省公開課一等獎(jiǎng)全國(guó)示范課微課金獎(jiǎng)_第3頁
過程與函數(shù)省公開課一等獎(jiǎng)全國(guó)示范課微課金獎(jiǎng)_第4頁
過程與函數(shù)省公開課一等獎(jiǎng)全國(guó)示范課微課金獎(jiǎng)_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

子程序——過程與函數(shù)第1頁提出函數(shù)與過程理由

計(jì)算機(jī)程序設(shè)計(jì)和問題求解最基本思想是:將一個(gè)大復(fù)雜問題分解成更小、更簡(jiǎn)單和更輕易處理子問題。在Pascal語言提供了函數(shù)和過程,使得問題分解和處理愈加方便。

函數(shù)或過程:將對(duì)應(yīng)于一個(gè)子問題求精語句寫在一起,作為一個(gè)單獨(dú)程序模塊。通常經(jīng)過子程序定義抽象操作,實(shí)現(xiàn)程序模塊化。第2頁一、函數(shù)

1。定義函數(shù)說明普通形式:FUNCTION<函數(shù)名>(<形式參數(shù)表>):<函數(shù)類型>;<說明部分>;

BEGIN<函數(shù)體>END;注意:(1)函數(shù)名由正當(dāng)標(biāo)識(shí)符指出;參數(shù)表由形式參數(shù)名表和說明參數(shù)類型標(biāo)識(shí)符組成;函數(shù)類型即結(jié)果類型,由類型標(biāo)識(shí)符指明。(2)形式參數(shù)類似于數(shù)學(xué)函數(shù)中自變量,為函數(shù)子程序提供初始量。在一個(gè)形式參數(shù)表中,能夠有多個(gè)參數(shù)。逗號(hào)用來分開同類型各個(gè)參數(shù)名,分號(hào)用來分開不一樣類型參數(shù)。比如:(x,y:real;m,n:integer)(3)說明部分對(duì)僅在函數(shù)中使用量加以說明,能夠包含函數(shù)所需要常量、說明類型、變量說明,也能夠包含其它函數(shù)或過程說明,普通稱之為局部變量。函數(shù)也能夠沒有說明。(4)函數(shù)體:(函數(shù)部分程序體)其中最少要有一個(gè)給函數(shù)名賦值語句,并以分號(hào)結(jié)束函數(shù)體。第3頁2.函數(shù)調(diào)用普通形式:<函數(shù)名>(<實(shí)在參數(shù)表>)解釋:函數(shù)調(diào)用必須出現(xiàn)在表示式中。函數(shù)每次調(diào)用,是將每個(gè)實(shí)在參數(shù)值賦給對(duì)應(yīng)形式參數(shù),然后由函數(shù)完成要求處理,并回送處理結(jié)果。注意:實(shí)在參數(shù)與形式參數(shù)個(gè)數(shù)要相同,一一對(duì)應(yīng),類型上賦值

相容。實(shí)在參數(shù)能夠是表示式。若沒有形式參數(shù),則略去實(shí)在參數(shù)和括號(hào)。第4頁例:編寫一個(gè)求K!函數(shù),調(diào)用此函數(shù)計(jì)算:(0<n<m<8)functionfac(k:integer):integer;vari,t:integer;begint:=1;fori:=2tokdot:=t*i;fac:=tend;beginwriteln(‘Pleaseinputm,n:’);read(m,n);if(n>=0)and(n<m)and(m<8)thenbegina:=fac(m);b:=fac(n);c:=fac(m-n);d:=adiv(b*c);writeln(‘d=’,d)endeleswriteln(‘Inputerror!’)end.在這個(gè)程序中,m,n,a,b,c,d在主程序說明部分被定義,稱為全程變量,即在主程序和子程序中都能夠被用到變量。i,t在子程序說明部分被定義,成為局部變量,即只能在被定義子程序中使用變量。K是函數(shù)形式參數(shù),其類型為整型。函數(shù)名稱為fac,函數(shù)值返回類型也為整型。Varm,n,a,b,c,d:integer;第5頁例:定義一個(gè)求三數(shù)中最大值函數(shù)functionlargest(f1,f2,f3:integer):integer;

{計(jì)算和返回f1,f2,f3最大值}varg:integer;functionlarger(n1,n2:integer):integer;

{計(jì)算和返回n1,n2最大值}beginifn1>n2thenlarger:=n1elselarger:=n2;end;

{larger}beginlargest:=larger(larger(f1,f2),f3);

{計(jì)算和返回f1,f2,f3最大值}end;

{largest}largest函數(shù)說明指明了largest函數(shù)和它子函數(shù)larger結(jié)果值類型都為整數(shù)。子函數(shù)larger結(jié)果值由賦值語句larger:=n1(或larger:=n2)確定;largest函數(shù)結(jié)果值由賦值語句largest:=larger(larger(f1,f2),f3)確定。第6頁例:

求正整數(shù)A和B之間完全數(shù)(A<B).分析:所謂完全數(shù)是指它小于該數(shù)本身因子之和等于它本身,如6=1+2+3,6即是一個(gè)完全數(shù)。所以我們可定義一個(gè)布爾型函數(shù)perfect(x),若x是完全數(shù),其值為TURE,不然為FALSE。整個(gè)程序算法以下:

1fori:=AtoBdo

2ifperfect(i)thenwriteln(i);

var

i,a,b:integer;

begin{主程序開始}

write('Inputa,b:');

repeat{輸入0<a<b}

readln(a,b);

until(a>0)and(b>0)and(a<b);

writeln('Listofallperfectnumbers:');

{從a到b逐一判斷,是完全數(shù)則打印出來

fori:=atobdo

ifperfect(i)thenwriteln(i);

end.functionperfect(x:integer):boolean;

var

k,sum:integer;

begin

{累加x全部小于本身因數(shù)}

sum:=1;

fork:=2toxdiv2do

ifxmodk=0thensum:=sum+k;

{判斷x是否是完全數(shù)}

perfect:=x=sum;{將結(jié)果賦值給函數(shù)名}

end;{endofperfect}

第7頁二、過程1。定義過程說明普通形式:PROCEDURE<過程名>(<形式參數(shù)表>);<說明部分>;

BEGIN<過程體>END;注意:(1)形式參數(shù)表有兩種格式:數(shù)值形參和以VAR開頭變量形參。(2)過程體中沒有也不能夠有給過程名賦值語句,返回值由變量形參提供。2.過程調(diào)用普通形式:<過程名>(<實(shí)在參數(shù)表>)解釋:與數(shù)值形參對(duì)應(yīng)實(shí)在參數(shù)能夠是表示式,與變量形參對(duì)應(yīng)實(shí)在參數(shù)必須是變量,而不能是普通表示式。第8頁例:定義一個(gè)求三數(shù)中最大值過程procedurelargest(f1,f2,f3:integer;varir:integer);{計(jì)算和返回f1,f2,f3最大值ir}varg:integer;procedurelarger(n1,n2:integer;varr:integer);{largest子過程,計(jì)算和返回n1,n2最大值r}beginifn1>n2thenr:=n1elser:=n2;

end;{larger}beginlarger(f1,f2,g);{求出f1,f2中最大值g}larger(g,f3,ir);{求出g,f3中最大值Ir,作為f1,f2,f3中最大值返回}end;{largest}Largest有四個(gè)類型為整型形式參數(shù):f1,f2,f3和Ir,前三個(gè)參數(shù)f1,f2,f3為調(diào)用者向被調(diào)用者傳入三個(gè)要求比較大小整數(shù),這三個(gè)參數(shù)僅用作傳入數(shù)據(jù),不傳出計(jì)算結(jié)果,所以稱為值參;第四個(gè)參數(shù)Ir用來向調(diào)用者傳送三數(shù)中最大值,這種用作傳出計(jì)算結(jié)果參數(shù)稱為變量參數(shù),由var標(biāo)志。Largest使用子過程larger有三個(gè)類型為整型形式參數(shù):n1,n2和r,前二個(gè)參數(shù)n1,n2為過程Largest向它傳入二個(gè)要求比較大小整數(shù),屬于值參;第三個(gè)參數(shù)r用來向過程Largest傳送n1和n2最大值,屬于變量參數(shù)。第9頁例:輸出以下一個(gè)圖形:

*

**

***

****

*****

******

分析:我們前面學(xué)習(xí)可用二重循環(huán)打印出上圖形,現(xiàn)我們?cè)O(shè)置一個(gè)過程打印出N個(gè)連續(xù)"*"號(hào)。

programex7_2;

vari:integer;

proceduredraw_a_line(n:integer);{該過程打印出連續(xù)n個(gè)星號(hào),并換行}

varj:integer;

begin

forj:=1tondo

write('*');

writeln;

end;

begin

fori:=1to6do

draw_a_line(i);{調(diào)用過程,第I行打印i個(gè)連續(xù)星號(hào)}

end.

第10頁例說明一個(gè)求兩個(gè)整數(shù)最大條約數(shù)和最小公倍數(shù)過程Proceduremab(a,b:integer;varmaxab,minab:integer);Varf:boolean;i:integer;Beginifa>bthenbegint:=a;a:=b;b:=t;end;f:=true;i:=a;whilefandi>0dobeginif(amodi=0)and(bmodi=0)thenbeginmaxab:=I;minab:=a*bdivI;f:=false;end;i:=i-1;end;End;第11頁過程與函數(shù)區(qū)分第12頁實(shí)參加形參子程序調(diào)用(過程調(diào)用或函數(shù)調(diào)用)執(zhí)行次序分以下幾步:實(shí)參加形參結(jié)合─→執(zhí)行子程序體─→返回調(diào)用處繼續(xù)執(zhí)行子程序說明形式參數(shù)表對(duì)過程或函數(shù)內(nèi)語句序列直接引用變量進(jìn)行說明,詳細(xì)指明這些參數(shù)類別、數(shù)據(jù)類型要求和參數(shù)個(gè)數(shù)。過程或函數(shù)被調(diào)用時(shí)必須為它每個(gè)形參提供一個(gè)實(shí)參,按參數(shù)位置次序一一對(duì)應(yīng),每個(gè)實(shí)參必須滿足對(duì)應(yīng)形參要求。Pascal子程序形參主要分類:

1.值參數(shù)

形式參數(shù)表中前面沒有var,后有類型參數(shù)。它類似過程和函數(shù)局部變量,僅為過程和函數(shù)執(zhí)行提供初值而不影響調(diào)用時(shí)實(shí)際參數(shù)值。在調(diào)用過程或應(yīng)用函數(shù)時(shí),值參數(shù)所對(duì)應(yīng)實(shí)際參數(shù)必須是表示式,而且它值不能使文件類型或包含文件類型值。實(shí)參必須和形參賦值相容。

2.變量參數(shù)

形式參數(shù)表中前面有var后由類型參數(shù)。假如需要子程序向調(diào)用程序返回值時(shí),應(yīng)采取變量參數(shù)。變量參數(shù)要求它實(shí)參是和它同一類型變量。因?yàn)樵谧映绦驁?zhí)行時(shí),碰到對(duì)對(duì)應(yīng)形參引用式定值,就是對(duì)對(duì)應(yīng)實(shí)參引用式定值,即對(duì)形參任何操作就是對(duì)實(shí)參本身操作。

第13頁例輸出兩個(gè)數(shù)中最大值過程Varx:y

:integerprocedure

largest(a,b:integer);

begin

if

a>b

then

writeln(a)

else

writeln(b);

end.beginReadln(x,y);Lagest(x,y);End.

實(shí)際引用時(shí)所用參數(shù)x,y,是主程序定義變量過程中定義形式參數(shù)a,b,在實(shí)際引用過程時(shí),將被實(shí)際參數(shù)代替第14頁過程、函數(shù)數(shù)據(jù)傳遞在程序調(diào)用子程序時(shí),調(diào)用程序?qū)?shù)據(jù)傳遞給被調(diào)用過程或函數(shù),而當(dāng)子程序運(yùn)行結(jié)束后,結(jié)果又能夠經(jīng)過函數(shù)名、變參。當(dāng)然也能夠用全局變量等形式實(shí)現(xiàn)數(shù)據(jù)傳遞。接下來我們,就來研究參數(shù)傳遞與局部變量、全局變量等問題。第15頁數(shù)值形參和變量形參Procedureshow(a:integer)值形參和對(duì)應(yīng)實(shí)參必須一一對(duì)應(yīng),包含個(gè)數(shù)和類型。對(duì)應(yīng)實(shí)在參數(shù)可為表示式與實(shí)在參數(shù)之間傳遞關(guān)系是傳值僅視作輸入?yún)?shù),它有入口值,而無出口值,故不能表示計(jì)算結(jié)果值形參作為子程序局部量,當(dāng)控制返回程序后,值形參存放單元釋放。實(shí)參和值形參之間數(shù)據(jù)傳遞是單向,只能由實(shí)參傳送給形參,相當(dāng)賦值運(yùn)算。Procedureshow(vara:integer)對(duì)應(yīng)實(shí)在參數(shù)必須為變量與實(shí)在參數(shù)之間傳遞關(guān)系是傳地址既可視作輸入?yún)?shù),又可視作輸出參數(shù),它可有入口值,也可無入口值,但普通應(yīng)有出口值,以表示調(diào)用過程返回結(jié)果變量形參加對(duì)應(yīng)實(shí)參類型必須完全相同。對(duì)變量形參,運(yùn)行時(shí)不另外開辟存放單元,而是與對(duì)應(yīng)實(shí)參使用相同存放單元。也就是說,調(diào)用子程序時(shí),是將實(shí)參地址傳送給對(duì)應(yīng)變量形參。當(dāng)控制返回到調(diào)用程序后,變量形參存放單元不釋放,但變量形參本身無定義,即不得再使用。

普通在函數(shù)中使用值形參,而在過程中才使用變量形參,但也有例外。

第16頁寫出以下兩個(gè)程序運(yùn)行結(jié)果。programex1;

programex2;

vara,b:integer;

vara,b:integer;

procedureswap(x,y:integer);

procedureswap(Varx,y:integer);

vart:integer;

vart:integer;

begin

begin

t:=x;x:=y;y:=t;

t:=x;x:=y;y:=t;

end;

end;

begin

begin

a:=1;b:=2;

a:=1;b:=2;

writeln(a:3,b:3);

writeln(a:3,b:3);

swap(a,b);

swap(a,b);

writeln(a:3,b:3);

writeln(a:3,b:3);

end.

end.

分析:這兩個(gè)程序唯一區(qū)分是ex1中將x,y作為值形參,而

ex2中將x,y作為變量形參,所以在ex2中對(duì)x,y修改實(shí)際上是對(duì)調(diào)用該過程時(shí)與它們對(duì)應(yīng)變量a,b修改,故最終,a,b值為2,1。而ex1中調(diào)用swap過程時(shí),只是將a,b值傳遞給x,y,之后在過程中操作與a,b無關(guān)。ex1運(yùn)行結(jié)果為:ex2運(yùn)行結(jié)果為:

12

12

12

21第17頁全局變量和局部變量局部變量:凡是在子程序內(nèi)部作用變量,應(yīng)該在本子程序內(nèi)加以說明。這種在子程序內(nèi)部說明變量稱為局部變量。形式參數(shù)也只是在該子程序中有效,所以也屬于局部變量。一個(gè)變量作用域是指在程序中能對(duì)此變量進(jìn)行存取程序范圍。所以,局部變量作用域就是其所在子程序。實(shí)際上,局部變量只是當(dāng)其所在子程序被調(diào)用時(shí)才含有確定存放單元,當(dāng)控制從子程序返回到調(diào)用程序后,局部變量存放單元就被釋放,從而變得無定義。全局變量:是指在主程序說明部分中說明量。全局變量作用域分兩種情況:

①當(dāng)全局變量和局部量不一樣名時(shí),其作用域是整個(gè)程序范圍(自定義起直到主程序結(jié)束)。

②當(dāng)全局變量和局部量同名時(shí),全局變量作用域不包含局部量作用域。在子程序執(zhí)行部分使用是與全局變量同名局部變量。

第18頁求程序輸出結(jié)果varx,y:integer;

procedurea;

varx:integer;

begin

x:=2;

writeln('#',x,'#');

writeln('#',y,'#');

end;{ofa}

begin{mainprogram}

x:=1;y:=2;

writeln('*',x,'*',y);

a;

writeln('***',x,'***',y);

end.

分析:程序中x,y是全局變量,但在過程a中也有變量x,故全程變量x作用域?yàn)槌^程a外任何地方。而y作用域包含了子程序a,即整個(gè)程序。

運(yùn)行結(jié)果以下:

*1*2

#2#

#2#

***1***2

第19頁求程序輸出結(jié)果programex(input,output);

var

x,y,z:integer;

procedures(x:integer;vary:integer);

var

z:integer

begin

x:=5;

y:=6;

z:=7;

end;

begin

x:=1;

y:=2;

z:=3;

s(x,y);

writeln(x,y,z);

end.

第20頁求程序輸出結(jié)果programrange(input,output);

var

x,y:integer;

procedurep1;

var

x,z:integer;

begin

x:=10;

y:=y+1;

z:=10;

writeln(x,y,z);

end;

begin

x:=1;

y:=1;

writeln(x,y);

p1;

writeln(x,y,z);

end.

輸出結(jié)果:1

1

10

2

10

1

2

(error)第21頁遞歸調(diào)用——直接遞歸子程序內(nèi)引用子程序本身。比如按遞歸定義形式寫出fac(n)函數(shù)說明以下:functionfac(n:integer):integer;

beginifn=0thenfac:=1elsefac:=n*fac(n-1);

end;{fac}第22頁例:骨牌鋪法有1*n一個(gè)長(zhǎng)方形,用一個(gè)1*1、1*2和1*3骨牌鋪滿方格。比如n=3時(shí)為1*3方格。此時(shí)用1*1、1*2和1*3骨牌鋪滿方格,共有四種鋪法。圖列出了四種鋪法。輸入n(0≤n≤30),輸出鋪法總數(shù)。題解varn:integer;

{格子數(shù)}functionf(i:integer):longint;

{輸入格子數(shù),計(jì)算和返回鋪法總數(shù)}beginifiin[1..2]{遞歸邊界}thenf:=ielseifi=3 thenf:=4 elsef:=f(i-1)+f(i-2)+f(i-3);

{遞歸}end;{f}begi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論