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

下載本文檔

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

文檔簡介

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

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

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

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

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

相容。實在參數(shù)能夠是表示式。若沒有形式參數(shù),則略去實在參數(shù)和括號。第4頁例:編寫一個求K!函數(shù),調(diào)用此函數(shù)計算:(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.在這個程序中,m,n,a,b,c,d在主程序說明部分被定義,稱為全程變量,即在主程序和子程序中都能夠被用到變量。i,t在子程序說明部分被定義,成為局部變量,即只能在被定義子程序中使用變量。K是函數(shù)形式參數(shù),其類型為整型。函數(shù)名稱為fac,函數(shù)值返回類型也為整型。Varm,n,a,b,c,d:integer;第5頁例:定義一個求三數(shù)中最大值函數(shù)functionlargest(f1,f2,f3:integer):integer;

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

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

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

{計算和返回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即是一個完全數(shù)。所以我們可定義一個布爾型函數(shù)perfect(x),若x是完全數(shù),其值為TURE,不然為FALSE。整個程序算法以下:

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ù)值形參對應(yīng)實在參數(shù)能夠是表示式,與變量形參對應(yīng)實在參數(shù)必須是變量,而不能是普通表示式。第8頁例:定義一個求三數(shù)中最大值過程procedurelargest(f1,f2,f3:integer;varir:integer);{計算和返回f1,f2,f3最大值ir}varg:integer;procedurelarger(n1,n2:integer;varr:integer);{largest子過程,計算和返回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有四個類型為整型形式參數(shù):f1,f2,f3和Ir,前三個參數(shù)f1,f2,f3為調(diào)用者向被調(diào)用者傳入三個要求比較大小整數(shù),這三個參數(shù)僅用作傳入數(shù)據(jù),不傳出計算結(jié)果,所以稱為值參;第四個參數(shù)Ir用來向調(diào)用者傳送三數(shù)中最大值,這種用作傳出計算結(jié)果參數(shù)稱為變量參數(shù),由var標志。Largest使用子過程larger有三個類型為整型形式參數(shù):n1,n2和r,前二個參數(shù)n1,n2為過程Largest向它傳入二個要求比較大小整數(shù),屬于值參;第三個參數(shù)r用來向過程Largest傳送n1和n2最大值,屬于變量參數(shù)。第9頁例:輸出以下一個圖形:

*

**

***

****

*****

******

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

programex7_2;

vari:integer;

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

varj:integer;

begin

forj:=1tondo

write('*');

writeln;

end;

begin

fori:=1to6do

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

end.

第10頁例說明一個求兩個整數(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頁實參加形參子程序調(diào)用(過程調(diào)用或函數(shù)調(diào)用)執(zhí)行次序分以下幾步:實參加形參結(jié)合─→執(zhí)行子程序體─→返回調(diào)用處繼續(xù)執(zhí)行子程序說明形式參數(shù)表對過程或函數(shù)內(nèi)語句序列直接引用變量進行說明,詳細指明這些參數(shù)類別、數(shù)據(jù)類型要求和參數(shù)個數(shù)。過程或函數(shù)被調(diào)用時必須為它每個形參提供一個實參,按參數(shù)位置次序一一對應(yīng),每個實參必須滿足對應(yīng)形參要求。Pascal子程序形參主要分類:

1.值參數(shù)

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

2.變量參數(shù)

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

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

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

第16頁寫出以下兩個程序運行結(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.

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

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

12

12

12

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

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

②當全局變量和局部量同名時,全局變量作用域不包含局部量作用域。在子程序執(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作用域為除過程a外任何地方。而y作用域包含了子程序a,即整個程序。

運行結(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一個長方形,用一個1*1、1*2和1*3骨牌鋪滿方格。比如n=3時為1*3方格。此時用1*1、1*2和1*3骨牌鋪滿方格,共有四種鋪法。圖列出了四種鋪法。輸入n(0≤n≤30),輸出鋪法總數(shù)。題解varn:integer;

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

{輸入格子數(shù),計算和返回鋪法總數(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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論