




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、(三)過程的應(yīng)用舉例 【例2】輸出以下一個(gè)圖形: * * * * * * 分析:我們前面學(xué)習(xí)可用的二重循環(huán)打印出上圖形,現(xiàn)我們設(shè)置一個(gè)過程打印出N個(gè)連續(xù)的"*"號(hào),源程序如下: program ex7_2; vari:integer; procedure draw_a_line(n:integer); 該過程打印出連續(xù)n 個(gè)星號(hào),并換行 varj:integer; begin for j:=1 to n do write('*'); writeln; end; begin for i:=1 to 6 do draw_a_line(i);調(diào)用過程,第I行打印i
2、個(gè)連續(xù)星號(hào) end. 三、過程、函數(shù)的數(shù)據(jù)傳遞 在主程序調(diào)用子程序時(shí),調(diào)用程序(主程序)將數(shù)據(jù)傳遞給被調(diào)用的過程或函數(shù) (子程序),而當(dāng)子程序運(yùn)行結(jié)束后,結(jié)果又可以通過函數(shù)名、變參傳給調(diào)用程序;當(dāng)然也可以用全局變量等形式實(shí)現(xiàn)數(shù)據(jù)的傳遞。這一節(jié)我們,就來研究參數(shù)傳遞與局部變量、全局變量等問題。 (一)數(shù)值參數(shù)和變量參數(shù) 前面已經(jīng)講過,pascal子程序中形式參數(shù)有數(shù)值形參(簡稱值參)和變量形參(變參)兩種。事實(shí)上,還有函數(shù)形參和過程形參兩種,只是應(yīng)用并不太多,我們不作深入地研究。 、值形參:值參的一般格式為變量名表:類型標(biāo)識(shí)符,應(yīng)該強(qiáng)調(diào)形參表中只能使用類型標(biāo)識(shí)符,而不能使用類型值形參和對(duì)應(yīng)的實(shí)參
3、必須一一對(duì)應(yīng),包括個(gè)數(shù)和類型實(shí)參和值形參之間數(shù)據(jù)傳遞是單向的,只能由實(shí)參傳送給形參,相當(dāng)賦值運(yùn)算一個(gè)特殊情況是,當(dāng)值形參是實(shí)型變量名時(shí),對(duì)應(yīng)的實(shí)參可以是整型表達(dá)式值形參作為子程序的局部量,當(dāng)控制返回程序后,值形參的存儲(chǔ)單元釋放、變量形參:變量形參的一般格式VAR變量名表:類型標(biāo)識(shí)符,必須在形參前加關(guān)鍵字var,應(yīng)該注意與變量形參對(duì)應(yīng)的實(shí)參只能是變量名,而不能是表達(dá)式與變量形參對(duì)應(yīng)的實(shí)參可以根據(jù)需要決定是否事先有值變量形參與對(duì)應(yīng)的實(shí)參的類型必須完全相同對(duì)變量形參,運(yùn)行時(shí)不另外開辟存儲(chǔ)單元,而是與對(duì)應(yīng)的實(shí)參使用相同的存儲(chǔ)單元。也就是說,調(diào)用子程序時(shí),是將實(shí)參的地址傳送給對(duì)應(yīng)的變量形參當(dāng)控制返回到調(diào)
4、用程序后,變量形參的存儲(chǔ)單元不釋放,但變量形參本身無定義,即不得再使用選用形式參時(shí),到底是使用值形參還是變量形參,應(yīng)慎重考慮。值形參需要另開辟存儲(chǔ)空間,而變量形參會(huì)帶來一些副作用。一般在函數(shù)中使用值形參,而在過程中才使用變量形參,但也有例外【例3】寫出下列兩個(gè)程序的運(yùn)行結(jié)果。program ex1;program ex2;varvara,b:integer;a,b:integer;procedure swap(x,y:integer);procedure swap(Var x,y:integer) ;var t:integer;var t:integer;beginbegint:=x;x:=y
5、;y:=t;t:=x;x:=y;y:=t;end;end;beginbegina:=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)
6、。 所以 ex1的運(yùn)行結(jié)果為: 1 2 1 2ex2的運(yùn)行結(jié)果為:1 22 1(二)全程變量、局部變量及它們的作用域 在主程序的說明部分和子程序的說明部分均可以說明變量,但它們的作用范圍是特定的。 、局部變量及其作用域:在介紹過程和函數(shù)的說明時(shí),我們曾指出,凡是在子程序內(nèi)部作用的變量,應(yīng)該在本子程序內(nèi)加以說明。這種在子程序內(nèi)部說明的變量稱為局部變量。形式參數(shù)也只是在該子程序中有效,因此也屬于局部變量。 一個(gè)變量的作用域是指在程序中能對(duì)此變量進(jìn)行存取的程序范圍。因此,局部變量的作用域就是其所在的子程序。實(shí)際上,局部變量只是當(dāng)其所在的子程序被調(diào)用時(shí)才具有確定的存儲(chǔ)單元,當(dāng)控制從子程序返回到調(diào)用程序
7、后,局部變量的存儲(chǔ)單元就被釋放,從而變得無定義。 事實(shí)上,在子程序內(nèi)定義的標(biāo)號(hào)、符號(hào)常量、類型、子程序也與局部變量具有相同的作用域。 、全程量及其作用域:全程量是指在主程序的說明部分中說明的量,全程量的作用域分兩種情況、當(dāng)全程量和局部量不同名時(shí),其作用域是整個(gè)程序范圍(自定義起直到主程序結(jié)束)、當(dāng)全程量和局部量同名時(shí),全程量的作用域不包含局部量的作用域【例4】寫出下列程序的運(yùn)行結(jié)果: program ex7_4; varx,y:integer; procedure a; varx:integer; begin x:=2; writeln('#',x,'#');
8、writeln('#',y,'#'); end;of a beginmain program x:=1;y:=2; writeln('*',x,'*',y); a; writeln('*',x,'*',y); end. 分析:程序中x、y是全局變量,但在過程a中也有變量x,故全程變量x的作用域?yàn)槌^程a外的任何地方 ;而y的作用域包含了子程序a(因?yàn)閍過程中沒有重名的局部y定義),即整個(gè)程序。 運(yùn)行結(jié)果如下: *1*2 #2# #2# *1*2 評(píng)注:變量作用域內(nèi)對(duì)變量的操作都是對(duì)同一存儲(chǔ)單元中的量
9、進(jìn)行的四、過程和函數(shù)的嵌套 Pascal語言中,使用過程和函數(shù),能使程序設(shè)計(jì)簡短,便于閱讀,節(jié)省存貯單元和編譯時(shí)間。程序往往設(shè)計(jì)成分層結(jié)構(gòu),由一個(gè)主程序和若干個(gè)過程及函數(shù)組成。在過程或函數(shù)中,還可以說明另一些過程或函數(shù),即過程或函數(shù)可以分層嵌套。在同一層中亦可說明幾個(gè)并列的過程或函數(shù)。例如: 上例過程的分層嵌套關(guān)系如下:0層主程序sample內(nèi)并列兩個(gè)1層過程P1a和P1b;過程P1a又嵌套兩個(gè)2層過程p2a和p2b,2層的第二過程p2b又嵌套過程p3,p3就是第3層。其中p1b,p2a和p3不再嵌套別的過程,稱為基本過程。這種分層結(jié)構(gòu)的程序設(shè)計(jì),特別要注意局部變量的使用范圍和過程調(diào)用的要求。
10、 在主程序sample中定義的變量,可以在所有的過程中使用,主程序可調(diào)用p1a和p1b兩個(gè)過程;過程p1a中定義的變量,只能在p2a,p2b 和p3中使用 ,它能調(diào)用p2a,p2b兩個(gè)過程,而不能調(diào)用p3和p1b;在過程p1b中定義的變量,只能在p1b中使用,它只能調(diào)用過程p1a;過程p2a不能調(diào)用任何過程 ;過程p2b可以調(diào)用并列過程p2a和p3,而過程p3可以調(diào)用p2a過程。(有點(diǎn)復(fù)雜哦) 過程調(diào)用是有條件的,過程定義在先,調(diào)用在后;同一層過程,后說明的過程可以調(diào)用先說明的過程;如果要調(diào)用在它后面定義的過程(或函數(shù)),可使用<向前引用>FORWARD這個(gè)擴(kuò)充標(biāo)識(shí)符。 要注意的是
11、<向前引用>過程(或函數(shù))首部中形式參數(shù)表寫一次即可 ,不必重復(fù)。如:procedure b(var a,b:integer); forward; 表示過程b要向前引用procedure a; beginb(2,3); 引用后面的過程bend;procedure b(var a,b:integer); begin : end;五、子程序(模塊化)結(jié)構(gòu)的程序設(shè)計(jì) 【例5】對(duì)6到60的偶數(shù)驗(yàn)證哥德巴赫猜想:不小于6的偶數(shù)可分解成兩個(gè)素?cái)?shù)之和。 分析:用布爾型函數(shù)prime(x)判斷x是否是素?cái)?shù)。若是,函數(shù)值為真 ;否則,函數(shù)值為
12、假。算法如下所示1t:=6 2while t60 do 3 t1:=1; 4 repeat 5 t1=t1+2; /* 找下一個(gè)素?cái)?shù)a */ 6 until prime(t1) and prime(t-t1); /*直到a,b都是素?cái)?shù)*/ 7 writeln(i,'=',t1,'+',t-t1); 8 t:=t+2; 9endwhile 源程序如下: program ex9_7; var t,t1:integer; fu
13、nction prime(x:integer):boolean; var i:integer; begin if x=1 then prime:=false else if x=2 then prime:=true else begin prime:=true; i:=2; while (i<=round(sqrt(x)and(x mod i<>0) do i:=i+1; if i<=round(sqrt(x) then prime:=false; end; en
14、d;of prime begin t:=6; while t<=60 do begin t1:=1; repeat t1:=t1+2; until prime(t1) and prime(t-t1); writeln(t,'=',t1,'+',t-t1); t:=t+2; end; end.【例6】編寫一個(gè)給一個(gè)分?jǐn)?shù)約分的程序。 源程序如下: program ex7_6; 變量參數(shù) var &
15、#160; | a,b:integer; procedure common(var x,y:integer); var i,j,k:integer; begin 求x,y的最大公約數(shù) i:=x;j:=y; repeat k:=i mod j; i:=j;j:=k; until k=0;對(duì)x,y進(jìn)行約分 x:=x div i;y:=y div i; end; begin write('Input a,b=');readln(a,b); c
16、ommon(a,b); writeln(a,b:5); end. 如輸入:Input a,b=12 8 則輸出:3 2練習(xí)1輸入N個(gè)數(shù),計(jì)算并顯示這些數(shù)的絕對(duì)值之和(要求調(diào)用自己編制的計(jì)算絕對(duì)的函數(shù),不允許使用ABS())2輸入5個(gè)小于10的正整數(shù),計(jì)算并顯示它們的階乘之和3編程計(jì)算23+34+45+56+674輸入5個(gè)正整數(shù)求它們的最大公約數(shù)。(提示:可用一個(gè)數(shù)組將個(gè)數(shù)存放起來,然后求第一個(gè)數(shù)和第二個(gè)數(shù)的公約數(shù),再求第三個(gè)數(shù)與前兩個(gè)數(shù)公約數(shù)的公約數(shù),這樣求得前三個(gè)整數(shù)最大公約數(shù)如此類推可求出個(gè)整數(shù)的最大公約數(shù)) 5編寫一個(gè)程序,它將輸入到維數(shù)組中的任意10個(gè)數(shù)按升序排列,再從鍵盤讀入一個(gè)待查
17、找的數(shù)X,用二分法查找X在數(shù)組中的位置(若找不到則顯示“NOT FOUND!”,否則顯示其位置);要求排序用過程實(shí)現(xiàn), 查找用函數(shù)實(shí)現(xiàn)6編寫求兩個(gè)數(shù)最大值MAX和最小值MIN的函數(shù),在程序中運(yùn)用這兩個(gè)函數(shù)找出由鍵盤盤輸入的N個(gè)數(shù)中的最大值和最小值7用函數(shù)和過程分別實(shí)現(xiàn)如下功能:當(dāng)輸入一正整數(shù)和一數(shù)字后,若該數(shù)字在正整數(shù)的某位上出現(xiàn)則顯示HAVE!,否則顯示NO!8給一維數(shù)組輸入任意6個(gè)整數(shù),假設(shè)為:7 4 8 9 1 5 請(qǐng)建立一個(gè)具有以下內(nèi)容的方陣: 7 4 8 9 1 5 4 8 9 1 5 7 8 9 1 5 7 4 9 1 5 7 4 8 1 5 7 4 8 9 5 7 4
18、 8 9 1 (請(qǐng)用子程序編寫)。 9求兩個(gè)正整數(shù)的最小公倍數(shù)10輸入一個(gè)任意位的正整數(shù),將其反向輸出11有五位同學(xué),其各科成績?nèi)缦? 學(xué)號(hào) 數(shù)學(xué) 語文 英語 總分 名次 1 10897 90 2 98 88 100 3 100 43 89 4 84 63 50 5 97 87 100 ()編寫一個(gè)過程enter,輸入每個(gè)學(xué)生成績并計(jì)算各人的總分()編寫過程minci,用以排出每個(gè)人的名次()按學(xué)號(hào)順序輸出子程序中的參數(shù)形參和實(shí)參 子程序調(diào)用(過程調(diào)用或函數(shù)調(diào)用)的執(zhí)行順序分為以下幾步: 實(shí)參和形參結(jié)合執(zhí)行子程序返回調(diào)用處繼續(xù)執(zhí)行 子
19、程序說明的形式參數(shù)表對(duì)子程序體直接引用的變量進(jìn)行說明,詳細(xì)指明這些參數(shù)的類別、數(shù)據(jù)類型要求和參數(shù)的個(gè)數(shù)。子程序被調(diào)用時(shí)必須為它的每個(gè)形參提供一個(gè)實(shí)參,按參數(shù)的位置順序一一對(duì)應(yīng),每個(gè)實(shí)參必須滿足對(duì)應(yīng)形參的要求 Turbo 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ù)必須是表達(dá)式,而且它的值不能使文件類型或包括文件類型的值。實(shí)參必須和形參賦值相容。 2.變量參數(shù) 形式參數(shù)表中前面有var后由類型的參數(shù)。如果需要子程序向調(diào)用程序
20、返回值時(shí),應(yīng)采用變量參數(shù)。變量參數(shù)要求它的實(shí)參是和它同一類型的變量。因?yàn)樵谧映绦驁?zhí)行時(shí),遇到對(duì)相應(yīng)形參的引用式定值,就是對(duì)相應(yīng)實(shí)參的引用式定值,即對(duì)形參的任何操作就是對(duì)實(shí)參本身的操作。 3.無類型變量參數(shù) 形式參數(shù)表中前面有var而后面沒有類型的參數(shù)。形參是無類型變量,對(duì)應(yīng)的實(shí)參允許為任意類型的變量,但要在子程序中設(shè)置的強(qiáng)制類型轉(zhuǎn)換(類型名(無類型變量參數(shù)名),將無類型變量參數(shù)改變?yōu)橄鄳?yīng)類型。 4.子程序參數(shù) 用過程首部或函數(shù)首部作為形式參數(shù)。 標(biāo)識(shí)符的作用域 1.全局變量和它的作用域 全局變量是指在程序開頭的說明部分定義和說明的量。它的作用域分為兩種情況: (1)在全局變量和局部變量不同名時(shí)
21、,其作用域是整個(gè)程序。 (2)在全局變量和局部變量同名時(shí),全局變量的作用域不包含同名局部變量的作用域。 2.局部變量和它的作用域 凡是在子程序內(nèi)部使用的變量,必須在子程序中加入說明。這種在子程序內(nèi)部說明的變量稱為局部變量。局部變量的作用域是其所在的子程序。形式參數(shù)也只能在子程序中有效。因此也屬于局部變量。局部變量的作用域分為兩種情況: (1)當(dāng)外層過程序的局部變量名和嵌套過程中的局部變量不同名時(shí),外層過程的局部變量作用域包含嵌套過琛。 (2)當(dāng)外層過程的局部變量名和嵌套過程內(nèi)的局部變量名同名時(shí),外層局部變量名的作用域不包含此過程。三、嵌套例:計(jì)算、program Cmn(input,outpu
22、t);function fax(x:integer):integer:vari:integer;beginfac:=1;for i:=1 to x do fac:=fac*i;end;function c(a,b:integer):real;beginc:=fac(a)/fac(b)*fac(a-b)end;beginwriteln('c(9,3)=',c(9,3);writeln('c(8,5=',c(8,5);end.四、遞歸函數(shù)或過程調(diào)用它本身,稱為遞歸。例1、用遞歸計(jì)算n! =m!/n!(m-n)!program fac_n(input,output);varn:integer;function fac(n:integer):integer;beginif n=1 then fac:=1else fac:=n*fac(n-1);end;例2、用遞歸計(jì)算1)、function power(a,b:integer):integer;beginif b=1 then power:=aelse power
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)語文教學(xué)提高學(xué)生閱讀理解能力的路徑研討
- 企業(yè)支付貨款合同范例
- 減水劑運(yùn)輸合同范例
- oem藥品合同范例
- 共同制作招牌合同范例
- 分期抵押車合同范例
- 中醫(yī)門診加盟合同范例
- 房屋壓頂施工方案范本
- 倉儲(chǔ)信息咨詢合同范例
- 樂隊(duì)商演合同范例
- 地鐵出入口雨棚施工工藝
- 掘金之旅:金融不良資產(chǎn)處置十八般武藝
- 雙機(jī)抬吊法吊運(yùn)箱梁安全控制要點(diǎn)課件
- 房建工程樣板節(jié)點(diǎn)參考照片圖文并茂
- 2023年高考語文全國乙卷《長出一地的好蕎麥》解析
- ICC國際冠軍杯傳播及招商方案
- 豐田車系卡羅拉(雙擎)轎車用戶使用手冊【含書簽】
- 商品價(jià)格表(全)
- 管理系統(tǒng)中計(jì)算機(jī)應(yīng)用詳細(xì)課件
- 危險(xiǎn)廢棄物管理培訓(xùn)資料
- 三月三主題班會(huì)課件
評(píng)論
0/150
提交評(píng)論