4講至8講第7章程序設(shè)計(jì)課件_第1頁
4講至8講第7章程序設(shè)計(jì)課件_第2頁
4講至8講第7章程序設(shè)計(jì)課件_第3頁
4講至8講第7章程序設(shè)計(jì)課件_第4頁
4講至8講第7章程序設(shè)計(jì)課件_第5頁
已閱讀5頁,還剩225頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第七章VisualFoxPro7.0程序設(shè)計(jì)7.1程序文件的建立、修改與運(yùn)行7.2簡(jiǎn)單的交互式輸入輸出命令7.3結(jié)構(gòu)化程序設(shè)計(jì)7.4過程與過程調(diào)用第七章7.1程序文件的建立、修改與運(yùn)行VisualFoxPro的工作方式所謂單命令方式,即輸入一條命令,完成一個(gè)操作的工作方式。所謂菜單方式,即通過打開不同的菜單選擇并完成不同的操作。所謂程序方式,即批命令方式,是把一系列有序的命令放到一個(gè)文件中,再執(zhí)行該文件整體。VisualFoxPro的工作方式所謂單命令方式,即輸入一建立程序文件有兩種方法:一是命令方式,二是菜單方式。1、命令方式命令格式:ModifyCommand[<程序文件名>]Modifyfile[<程序文件名.prg>]2、菜單方式選擇菜單【文件】|“新建”菜單項(xiàng),打開【新建】對(duì)話框。|選中“程序”單選按鈕。7.1.1建立程序文件

建立程序文件有兩種方法:一是命令方式,二是菜單方式。7.1.7.1.2修改程序文件

1、【文件】|【打開】,找到要修改的程序文件。2、命令方式:modifycommand[文件名]

程序文件編輯完后,選擇【文件】|【保存】選項(xiàng)按“CTRL+W”鍵,ctrl+S來保存程序,按ESC鍵放棄程序的編輯并返回命令窗口。7.1.2修改程序文件1、【文件】|【打開】,找到要修改7.1.3運(yùn)行程序文件

1、命令方式:DO<程序文件名>2、在菜單方式下運(yùn)行【程序】|【運(yùn)行】3、打開要運(yùn)行的程序文件,并單擊常用工具欄上的“運(yùn)行”命令按鈕(即),來運(yùn)行該程序文件。

4、快捷方式

Ctrl+E表示運(yùn)行打開的當(dāng)前程序。7.1.3運(yùn)行程序文件1、命令方式:DO1、非格式化的輸入命令FoxPro提供了如下三個(gè)非格式化輸入命令:(1)數(shù)據(jù)輸入命令(重點(diǎn))

命令格式:Input[<提示信息>]To〈內(nèi)存變量名〉

功能:顯示提示信息,暫停正在運(yùn)行的程序,等待用戶從鍵盤輸入數(shù)據(jù)或表達(dá)式并按回車鍵后,將數(shù)據(jù)或表達(dá)式的值存入指定的內(nèi)存變量中,再執(zhí)行中斷了的程序。

7.2.1交互式輸入命令

7.2簡(jiǎn)單的交互式輸入輸出命令

1、非格式化的輸入命令7.2.1交互式輸入命令7.2簡(jiǎn)例1:從鍵盤隨機(jī)輸入一個(gè)正數(shù),以該正數(shù)為半徑,求圓的周長(zhǎng)和面積。*L1.prgsettalkoffclearinput"半徑="torl=2*PI()*rs=PI()*r*r?"圓周長(zhǎng)=",l?"圓面積=",ssettalkonreturn

該程序可以無數(shù)次運(yùn)行,從而求出無數(shù)個(gè)半徑值不同的圓的周長(zhǎng)和面積。

例1:從鍵盤隨機(jī)輸入一個(gè)正數(shù),以該正數(shù)為半徑,求圓的周長(zhǎng)和面思考:從鍵盤輸入兩個(gè)任意正數(shù),編程求以兩數(shù)為邊長(zhǎng)的長(zhǎng)方形面積。SETTALKOFFCLEARINPUT“長(zhǎng)方形一邊的長(zhǎng)為:”TOAINPUT“長(zhǎng)方形另一邊的長(zhǎng)為:”TOBS=A*B?“長(zhǎng)方形的面積為:”,SSETTALKONRETURN思考:從鍵盤輸入兩個(gè)任意正數(shù),編程求以兩數(shù)為邊長(zhǎng)的長(zhǎng)方形面積(2)字符串輸入命令命令格式:Accept[<提示信息>]To〈內(nèi)存變量名〉功能:將用戶輸入的字符串賦值給指定的內(nèi)存變量。說明:①輸入的任何數(shù)據(jù)均被當(dāng)作字符型賦值給內(nèi)存變量。②如輸入字符串為非空格打頭,則不需要輸入定界符③輸入字符串長(zhǎng)度不超過254個(gè)字符④命令提示信息與INPUT相同。7.2.1交互式輸入命令

(2)字符串輸入命令7.2.1交互式輸入命令例2:重寫例1題程序。*L2.prgsettalkoffclearaccept"半徑="torl=2*PI()*val(r)s=PI()*val(r)*val(r)?"圓周長(zhǎng)=",l?"圓面積=",ssettalkonreturn程序運(yùn)行結(jié)果同例題2。7.2.1交互式輸入命令

例2:重寫例1題程序。7.2.1交互式輸入命令(3)輸入單字符命令命令格式:Wait[〈提示信息〉][To〈內(nèi)存變量名〉]功能:暫停程序執(zhí)行,等待鍵入一個(gè)字符,繼續(xù)執(zhí)行。說明:①只能接受一個(gè)字符,輸入完以后立即響應(yīng),不要按回車鍵。②如有TO語句,則輸入字符保存到指定變量,否則不保存。③若該語句不帶子句,則暫停程序運(yùn)行,屏幕顯示

Pressanykeytocontinue……

7.2.1交互式輸入命令

(3)輸入單字符命令7.2.1交互式輸入命令例3:重寫例1題程序。*L3.prgsettalkoffclearinput"半徑="torl=2*PI()*val(r)s=PI()*val(r)*val(r)?"圓周長(zhǎng)=",lwait?"圓面積=",ssettalkonreturn

7.2.1交互式輸入命令

例3:重寫例1題程序。7.2.1交互式輸入命令三條輸入命令的異同:

ACCEPT命令只能接受字符型數(shù)據(jù),不需定界符,輸入完畢按回車鍵結(jié)束。

WAIT命令只能輸入單個(gè)字符,且不需定界符,輸入完畢不需按回車鍵。

INPUT命令可接受數(shù)值型、字符型、邏輯型、日期型和日期時(shí)間型數(shù)據(jù),數(shù)據(jù)形式可以是常量、變量、函數(shù)和表達(dá)式,如果是字符串,需用定界符,輸入完畢按回車鍵結(jié)束。三條輸入命令的異同:

FoxPro系統(tǒng)把屏幕橫向分成70格,用0—79表示,每格能輸出一個(gè)英文字符(一個(gè)漢字占2格);縱向分成25行,用0—24表示,每行能輸出一行字符。命令格式:@<行坐標(biāo)>,<列坐標(biāo)>Say<表達(dá)式>Get<變量>Read功能:在指定位置輸出表達(dá)式的值并在其后的位置輸入變量的值。

2、格式化輸入命令2、格式化輸入命令Eg:建立程序文件,要求通過程序方式在“讀者”表中添加一條新記錄。

CLEAR USE讀者

APPENDBLANK @2,7SAY"讀者基本情況輸入界面:" @4,10SAY"讀者編號(hào):"GET讀者編號(hào)

@6,10SAY"讀者姓名:"GET姓名

@7,10SAY"讀者性別:"GET性別

@10,10SAY"出生日期:"GET出生日期

@12,10SAY"少數(shù)民族否:"GET少數(shù)民族否

@14,10SAY"籍貫"GET籍貫

READ USEEg:建立程序文件,要求通過程序方式在“讀者”表中添加一條新編寫程序文件,修改讀者表中第三條記錄的姓名和籍貫兩個(gè)字段。

SETTALKOFF USE讀者

GO3 @2,20SAY“姓名”

GET姓名

@4,20SAY"籍貫"GET籍貫

READ DISPLAY USE RETURN編寫程序文件,修改讀者表中第三條記錄的姓名和籍貫兩個(gè)字段。思考:若將上例中的要求改為對(duì)任意一條記錄進(jìn)行修改,程序該做何改動(dòng)?ClearUse讀者Input“要修改的記錄號(hào):”

tonGon@2,20SAY“姓名”

GET姓名@4,20SAY"籍貫"GET籍貫READDISPLAYUSERETURN思考:若將上例中的要求改為對(duì)任意一條記錄進(jìn)行修改,程序該做何

行輸出命令有兩種使用方式,一種是將表達(dá)式結(jié)果輸出到屏幕當(dāng)前的光標(biāo)位置,另一種方式則可以對(duì)表達(dá)式的輸出結(jié)果進(jìn)行格式化,而且可以輸出到屏幕的指定位置。但無論是那種方式都可以輸出表達(dá)式列表的結(jié)果。1、行輸出命令(?|??)

2、格式化輸出命令

@<行坐標(biāo)>,<列坐標(biāo)>SAY<表達(dá)式>

行列坐標(biāo)可以為數(shù)值型常量、變量、表達(dá)式,行坐標(biāo)的取值為0—24,列坐標(biāo)的取值為0—79;

7.2.2交互式輸出命令

行輸出命令有兩種使用方式,一種是將表達(dá)式結(jié)果輸出到7.2.3其它功能性命令

1、清屏命令命令格式:clear功能:清除屏幕或用戶自定義的窗口2、顯示文件內(nèi)容命令命令格式:type<文件名>功能:在屏幕或打印機(jī)上輸出指定文件的內(nèi)容3、文本輸出命令命令格式:text<文本信息>endtext功能:原樣輸出<文本信息>內(nèi)容。

7.2.3其它功能性命令1、清屏命令4、終止執(zhí)行命令 命令格式:cancel

功能:終止程序的執(zhí)行,釋放所有的內(nèi)存變量,系統(tǒng)返回到命令窗口狀態(tài)。5、注釋命令 命令格式1:note<注釋內(nèi)容>

命令格式2:*<注釋內(nèi)容>

命令格式3:&&<注釋內(nèi)容>

功能:三個(gè)命令的功能相同,都是對(duì)程序做注釋。

4、終止執(zhí)行命令7.3結(jié)構(gòu)化程序設(shè)計(jì)

結(jié)構(gòu)化程序設(shè)計(jì)由若干結(jié)構(gòu)組成,每一個(gè)基本結(jié)構(gòu)可以包含一個(gè)或多個(gè)命令,它主要包括順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)三種。使用結(jié)構(gòu)化程序設(shè)計(jì)有如下優(yōu)點(diǎn):1、可讀性強(qiáng):每個(gè)模塊功能明確、模塊間的關(guān)系簡(jiǎn)單、清晰。2、獨(dú)立性好:每個(gè)模塊內(nèi)部的修改盡可能不影響其它模塊。3、易驗(yàn)證:每個(gè)模塊的正確性容易驗(yàn)證,各個(gè)模塊連接起來后整個(gè)程序也就容易驗(yàn)證。7.3結(jié)構(gòu)化程序設(shè)計(jì)結(jié)構(gòu)化程序設(shè)計(jì)由若干結(jié)構(gòu)組成,7.3.1順序結(jié)構(gòu)程序設(shè)計(jì)

順序結(jié)構(gòu)指計(jì)算機(jī)按程序語句的先后順序依次逐條執(zhí)行程序中各個(gè)語句,是程序中最基本、最簡(jiǎn)單的一種結(jié)構(gòu)。順序結(jié)構(gòu)流程圖如圖7-5所示,該結(jié)構(gòu)先執(zhí)行A操作,再執(zhí)行B操作,兩者是順序執(zhí)行的關(guān)系。ABAB7.3.1順序結(jié)構(gòu)程序設(shè)計(jì)順序結(jié)構(gòu)指計(jì)算機(jī)按程序語句的先例10:從鍵盤輸入一個(gè)大寫字母,要求改用小寫字母輸出。*L10.PRGsettalkoffclearwait"請(qǐng)輸入一個(gè)大寫字母:"toax=asc(a)y=chr(x+32)?ysettalkonreturn

例10:從鍵盤輸入一個(gè)大寫字母,要求改用小寫字母輸出。思考:1、修改如下程序:clearS=0Input“請(qǐng)輸入第一個(gè)數(shù)”toxS=s+xInput“請(qǐng)輸入第二個(gè)數(shù)”toxS=s+xInput“請(qǐng)輸入第三個(gè)數(shù)”toxS=s+x?x2、參看下例,為什么可以用這種方法交換兩個(gè)變量的值。Input“a=”toaInput“b=”tob?“交換前a,b:”,a,bT=aA=bB=t?“交換后a,b:”,a,b思考:1、修改如下程序:7.3.2分支結(jié)構(gòu)程序設(shè)計(jì)1、單分支結(jié)構(gòu)語句格式:If〈條件表達(dá)式〉〈語句序列〉Endif功能:執(zhí)行if語句時(shí),首先判斷條件表達(dá)式的值,若為.T.,則執(zhí)行If到Endif之間的語句序列,再執(zhí)行Endif后面的語句,若為.F.,

則不執(zhí)行If到Endif之間的語句,直接執(zhí)行Endif后面的語句,程序執(zhí)行過程就發(fā)生了跳轉(zhuǎn)。If和Endif必須成對(duì)出現(xiàn),缺一不可,語句序列可以是一條或多條語句。

7.3.2分支結(jié)構(gòu)程序設(shè)計(jì)1、單分支結(jié)構(gòu)例13:輸入兩個(gè)實(shí)數(shù),依其值由大到小輸出這兩個(gè)數(shù)*L13.PRGsettalkoffinput"a="toainput"b="tobifa<bt=aa=bb=tendif?a,bsettalkonreturn例13:輸入兩個(gè)實(shí)數(shù),依其值由大到小輸出這兩個(gè)數(shù)思考2:用if…endif結(jié)構(gòu)判斷用戶輸入的數(shù)能否同時(shí)被4和6整除。思考3:如何求解一元二次方程的實(shí)數(shù)解。思考1:若輸入三個(gè)數(shù)由大小的順序輸出呢?思考2:用if…endif結(jié)構(gòu)判斷用戶輸入的數(shù)能否同時(shí)被4和2、選擇分支結(jié)構(gòu)語句格式:If〈條件表達(dá)式〉 〈語句序列1〉 Else〈語句序列2〉Endif

功能:如條件表達(dá)式的值為.T.,則執(zhí)行語句序列1,然后執(zhí)行Endif后面的語句,否則執(zhí)行語句序列2,然后執(zhí)行Endif后的語句。其中〈條件表達(dá)式〉可以是各種表達(dá)式的組合,其值必須是邏輯值,可以是邏輯常量或變量。If、Else、Endif語句應(yīng)單獨(dú)占一行。2、選擇分支結(jié)構(gòu)思考:若要輸出輸入的三個(gè)數(shù)中最大的數(shù)(最小的數(shù))?clearinput"數(shù)據(jù)1:"toainput"數(shù)據(jù)2:"tobinput"數(shù)據(jù)3:"tocifa>bt=aelset=bendifift>cs=telses=cendif?sreturn思考:若要輸出輸入的三個(gè)數(shù)中最大的數(shù)(最小的數(shù))?clear思考:1、用雙向分支結(jié)構(gòu)編程輸入一個(gè)數(shù)返回其絕對(duì)值。2、用雙向分支求一元二次方程的實(shí)數(shù)解,有,則輸出解的值,無解,輸出“此方程無實(shí)數(shù)解!”思考:1、用雙向分支結(jié)構(gòu)編程輸入一個(gè)數(shù)返回其絕對(duì)值。3、多分支結(jié)構(gòu)語句格式:DoCaseCase〈條件表達(dá)式1〉〈語句序列1〉Case〈條件表達(dá)式2〉〈語句序列2〉……Case〈條件表達(dá)式n〉〈語句序列n〉[Otherwise〈語句序列n+1〉]Endcase3、多分支結(jié)構(gòu)

功能:系統(tǒng)依次檢查每個(gè)Case的條件表達(dá)式,只要遇到第一個(gè)條件為.T.時(shí),則執(zhí)行該條件下的語句序列,之后不再判斷其他條件,也不再執(zhí)行其他語句序列,直接執(zhí)行Endcase后的語句。若所有條件均不成立,如有選擇項(xiàng)Otherwise語句,則執(zhí)行它后面的語句,否則執(zhí)行ENDCASE后面的語句。說明:(1)Docase結(jié)構(gòu)中至少有一個(gè)case語句(2)Docase與第一個(gè)case之間的語句不會(huì)被執(zhí)行。(3)如果有多個(gè)條件表達(dá)式為.T.,則只有第一個(gè)有效,其他case子句的條件不會(huì)被判斷,其對(duì)應(yīng)的語句序列也就不會(huì)被執(zhí)行。7.3.2分支結(jié)構(gòu)程序設(shè)計(jì)功能:系統(tǒng)依次檢查每個(gè)Case的條件表達(dá)式,只要遇到第一個(gè)例16:CJ.DBF(成績(jī)表)中,按學(xué)生XM(姓名)進(jìn)行查詢,如該生存在,判斷其英語成績(jī)ENGLISH是否為優(yōu)(70分以上),中(70分到70分),及格(60分到70分),不及格(小于60分)。

settalkoffclearusecjaccept"請(qǐng)輸入查看英語成績(jī)的學(xué)生姓名:"tonamelocateforxm=nameiffound()docase caseenglish>=70?"優(yōu)" caseenglish>=70?"中"

例16:CJ.DBF(成績(jī)表)中,按學(xué)生XM(姓名)進(jìn)行查詢caseenglish>=60?"及格" otherwise?"不及格"endcaseelse?"找不到該學(xué)生"endifusesettalkonreturncaseenglish>=60例如:

x=2.5Docasecasex>1y=1casex>2y=2endcase?y1例如:1例如:如何判定用戶輸入的分?jǐn)?shù)是哪個(gè)級(jí)別?clearinput"請(qǐng)輸入分?jǐn)?shù):"toscoreDocasecasescore>100?"輸入錯(cuò)誤!"casescore>=90?"優(yōu)秀!"casescore>=75?"良好!"casescore>=60?"及格!"casescore>=0?"不及格!"casescore<0?"輸入錯(cuò)誤!"Endcase例如:如何判定用戶輸入的分?jǐn)?shù)是哪個(gè)級(jí)別?casescorclearinput"請(qǐng)輸入分?jǐn)?shù):"toscoreDocasecasescore<0?"輸入錯(cuò)誤!"casescore<60?"不及格!"casescore<75?"及格!"casescore<90?"良好!"casescore=<100?"優(yōu)秀!"casescore>100?"輸入錯(cuò)誤!"Endcase思考:若將上例題的分?jǐn)?shù)由低到高顯示判斷,程序該做何改動(dòng)?clearcasescore<75思考:若將上例題的分?jǐn)?shù)由練習(xí):假設(shè)收入(P)與稅率(R)的關(guān)系如下表,編程求稅金。

0 P<700R=0.05 700≤P<20000.07 2000≤P<50000.1 P≥5000

練習(xí):假設(shè)收入(P)與稅率(R)的關(guān)系如CLEARINPUT“請(qǐng)輸入收入:”TOPDOCASECASEP<700tax=0CASEP<2000tax=0.05*(P-700)CASEP<5000tax=1400*0.05+(p-2000)*0.07OTHERWISEtax=1400*0.05+3000*0.07+(p-5000)*0.1ENDCASE?“你要繳納的稅金為:”,TAXRETURNCLEAR7.3.3循環(huán)結(jié)構(gòu)程序設(shè)計(jì)

1、條件循環(huán)語句格式:DoWhile〈條件表達(dá)式〉語句序列(又稱為循環(huán)體,其中可以使用Loop、Exit等強(qiáng)制退出語句)

Enddo功能:重復(fù)判斷〈條件表達(dá)式〉的值,其值為.T.時(shí),重復(fù)執(zhí)行DoWhile和Enddo之間的語句,直到〈條件表達(dá)式〉的值是.F.時(shí)結(jié)束。7.3.3循環(huán)結(jié)構(gòu)程序設(shè)計(jì)1、條件循環(huán)語句7.3.3循環(huán)結(jié)構(gòu)程序設(shè)計(jì)

1.DOWHILE循環(huán)語句(適用于任何循環(huán)情況)【格式1】DOWHILE<條件表達(dá)式><語句序列>

ENDDO

一個(gè)循環(huán)結(jié)構(gòu)一般應(yīng)具備如下的條件:(1)循環(huán)的初始條件:一般為給循環(huán)控制變量賦初值;(2)循環(huán)頭:循環(huán)語句的起始,設(shè)置、判斷循環(huán)條件;(3)循環(huán)尾:循環(huán)語句的結(jié)尾;(4)循環(huán)體:位于循環(huán)頭和循環(huán)尾之間、循環(huán)控制重復(fù)執(zhí)行的語句序列。

7.3.3循環(huán)結(jié)構(gòu)程序設(shè)計(jì)1.DOWHILE循環(huán)語句(適【格式2】DOWHILE<條件表達(dá)式><語句序列1>[LOOP]<語句序列2>[EXIT]<語句序列3>ENDDOLOOP語句:強(qiáng)行返回到循環(huán)開始語句。EXIT語句:強(qiáng)行跳出循環(huán),接著執(zhí)行ENDDO后的語句【格式2】DOWHILE<條件表達(dá)式>LOO編程求1+2+3+……+100之和。SETTALKOFFCLEARS=0j=1

&&循環(huán)變量的初值(循環(huán)的初始條件)DOWHILEj<=100

&&循環(huán)頭

S=S+jj=j+1

&&循環(huán)體ENDDO

&&循環(huán)尾?”1+2+3+……+100=”,SSETTALKONRETURN編程求1+2+3+……+100之和?!纠纭坑肈oWhile的第二種格式編程求1到100之內(nèi)所有奇數(shù)的和。CLEARS=0I=0DOWHILEI<100I=I+1ifint(I/2)=I/2loopelseS=S+IendifENDDO?"1+3+5+……+99=",SRETURN【例如】用DoWhile的第二種格式編程求1到100之內(nèi)思考將上例題用格式一完成程序,1到100之內(nèi)所有奇數(shù)的和。SETTALKOFFCLEARS=0

I=1DOWHILEI<=100

S=S+I

I=I+2ENDDO?"1+3+5+……+99=",SSETTALKONRETURN思考將上例題用格式一完成程序,1到100之內(nèi)所有奇數(shù)的和。S編程求出1*2*3*….,當(dāng)積大于720時(shí)退出。

cleari=1s=1dowhile.t.s=s*ii=i+1ifs>720exitendifenddo?s,ireturncleari=1s=1dowhiles<=720s=s*ii=i+1enddo?s,ireturn編程求出1*2*3*….,當(dāng)積大于720時(shí)退出。clear思考:用Dowhile循環(huán)編寫程序求100到999內(nèi)水仙花數(shù)的個(gè)數(shù)?n=0x=100dowhilex<=999a=int(x/100)b=int(mod(x,100)/10)c=mod(x,10)ifa^3+b^3+c^3=xn=n+1endifx=x+1enddo?nreturn思考:用Dowhile循環(huán)編寫程序求100到999內(nèi)水仙

2.FOR循環(huán)語句

(比較適用于已知循環(huán)次數(shù)的時(shí)候)【格式】

FOR<循環(huán)變量>=<初值>TO<終值>[STEP<步長(zhǎng)>]

<語句序列1>

[LOOP]

<語句序列2>

[EXIT]

<語句序列3>ENDFOR/NEXTFOR語句的執(zhí)行流程如右圖所示。

2.FOR循環(huán)語句(比較適用于已知循環(huán)次數(shù)的時(shí)候)使用FOR循環(huán)語句的有關(guān)說明:①省略STEP<步長(zhǎng)>,則〈步長(zhǎng)〉為默認(rèn)值1;②〈初值〉、〈終值〉和〈步長(zhǎng)〉都可以是數(shù)值表達(dá)式,但這些表達(dá)式僅在循環(huán)語句開始執(zhí)行時(shí)計(jì)算一次。循環(huán)語句執(zhí)行過程中,初值、終值和步長(zhǎng)是不會(huì)改變的,并由此確定循環(huán)的次數(shù);③可以在循環(huán)體內(nèi)改變循環(huán)變量的值,但會(huì)改變循環(huán)執(zhí)行次數(shù);④EXIT和LOOP命令可以出現(xiàn)在循環(huán)體內(nèi)。執(zhí)行LOOP命令時(shí),結(jié)束本次循環(huán),循環(huán)變量增加一個(gè)步長(zhǎng)值,返回FOR循環(huán)頭判斷循環(huán)條件是否成立。執(zhí)行EXIT命令時(shí),程序跳出循環(huán),執(zhí)行循環(huán)尾后面的語句。使用FOR循環(huán)語句的有關(guān)說明:【例如】從鍵盤輸入10個(gè)數(shù),編程找出其中的最大值和最小值。CLEARINPUT"請(qǐng)從鍵盤輸入一個(gè)數(shù)做為初始值:"TOBSTOREBTOMAX,MINFORI=2TO10&&或者寫成forI=1to9表示9次循環(huán)即可

INPUT"請(qǐng)從鍵盤輸入一個(gè)數(shù):"TOAIFMAX<AMAX=AENDIFIFMIN>AMIN=AENDIFENDFOR?"最大值為:",MAX?"最小值為:",MINSETTALKONRETURN【例如】從鍵盤輸入10個(gè)數(shù),編程找出其中的最大值和最小值。也可以用如下方法:CLEARMax=0Min=100000FORI=1TO10&&表示10次循環(huán)即可

INPUT"請(qǐng)從鍵盤輸入一個(gè)數(shù):"TOAIFMAX<AMAX=AENDIFIFMIN>AMIN=AENDIFENDFOR?"最大值為:",MAX?"最小值為:",MINSETTALKONRETURN&&給最大值的變量賦一個(gè)較小的初值&&給最小值的變量賦一個(gè)較大的初值也可以用如下方法:CLEAR&&給最大值的變量賦一個(gè)較小的初【例如】編程判斷一個(gè)數(shù)是否素?cái)?shù)。(非常重要)1)做什么2)怎樣做(算法問題):根據(jù)素?cái)?shù)的定義來做。方法一:SETTALKOFFCLEARINPUT"請(qǐng)輸入一個(gè)數(shù):"TOxFORi=2TOx-1IFMod(x,i)=0EXITENDIFENDFORIFi>=x?STR(X)+"是素?cái)?shù)"ELSE

?STR(X)+"不是素?cái)?shù)"ENDIF

【例如】編程判斷一個(gè)數(shù)是否素?cái)?shù)。(非常重要)方法一:方法二:ClearInput"請(qǐng)輸入數(shù):"toxFlag=1&&標(biāo)準(zhǔn)變量ForI=2tox-1ifmod(x,i)=0flag=2&&此處的flag只要不等于原來的1就可以

exit&&此程序中最有用的一條命令。

endifEndforIfflag=1?str(x)+"是素?cái)?shù)"Else?str(x)+"不是素?cái)?shù)"Endifreturn方法二:方法三:CLEARINPUT"請(qǐng)輸入數(shù):"TOxFORi=2TOINT(SQRT(x))IFMod(x,i)=0EXITENDIFENDFORIFi>=int(SQRT(x))+1?STR(X)+"是素?cái)?shù)"ELSE

?STR(X)+"不是素?cái)?shù)"ENDIFRETURN方法三:從鍵盤輸入任意的10個(gè)數(shù),按從大到小的順序依次輸出。

dimea(10)ForI=1to10INPUT"請(qǐng)輸入一個(gè)數(shù)"TOa(i)?a(i)ENDFORFORi=1TO9FORj=1TO10-iIFa(j)<a(j+1)t=a(j)a(j)=a(j+1)a(j+1)=tENDIFENDFORENDFORfori=1to10??a(i)endfor思考將最后一個(gè)輸出的For循環(huán)去掉可不可以,若可以,應(yīng)做何改動(dòng)?從鍵盤輸入任意的10個(gè)數(shù),按從大到小的順序依次輸出。思

3.“指針”型循環(huán)控制語句“指針”型循環(huán)控制語句,即根據(jù)用戶設(shè)置的表中的當(dāng)前記錄指針,決定循環(huán)的次數(shù)。[終止的條件]:記錄指針指向表尾時(shí)結(jié)束循環(huán)?!菊Z句格式】

SCAN[〈范圍〉][FOR〈條件表達(dá)式1〉[WHILE〈條件表達(dá)式2〉]]

〈命令行序列〉ENDSCAN【語句功能】

該語句在指定的范圍內(nèi),用數(shù)據(jù)記錄指針來控制循環(huán)次數(shù)。執(zhí)行語句時(shí),首先判斷函數(shù)EOF()的值,若其值為“真”,則結(jié)束循環(huán),否則,結(jié)合(條件表達(dá)式1)或(條件表達(dá)式2),執(zhí)行(命令行序列),記錄指針移到指定的范圍和條件內(nèi)的下一條記錄,重新判斷函數(shù)EOF()的值,直到函數(shù)EOF()的值為真時(shí)結(jié)束循環(huán)。3.“指針”型循環(huán)控制語句輸出STUDENT數(shù)據(jù)庫的STUD表中所有團(tuán)員的姓名和地址。SETTALKOFFCLEAROPENDATABASESTUDENTUSESTUDSCANFOR是否團(tuán)員

?姓名,地址ENDSCANCLOSEDATABASESETTALKONRETURN輸出STUDENT數(shù)據(jù)庫的STUD表中所有團(tuán)員的姓名和地址。

4.使用循環(huán)語句時(shí)應(yīng)注意的幾點(diǎn)(1)DOWHILE和ENDDO、FOR和ENDFOR、SCAN和ENDSCAN必須配對(duì)使用。(2)〈命令行序列〉可以是任何FoxPro命令或語句,也可以是循環(huán)語句,即可以為多重循環(huán)。(3)〈循環(huán)變量〉應(yīng)是數(shù)值型的內(nèi)存變量或數(shù)組元素。(4)EXIT和LOOP命令嵌入在循環(huán)體內(nèi),可以改變循環(huán)次數(shù),但是不能單獨(dú)使用。EXIT的功能是跳出循環(huán),轉(zhuǎn)去執(zhí)行ENDDO、ENDFOR、ENDSCAN后面的第一條命令;LOOP的功能是轉(zhuǎn)回到循環(huán)的開始處,重新對(duì)“條件”進(jìn)行判斷,相當(dāng)于執(zhí)行了一次ENDDO、ENDFOR、ENDSCAN命令,它可以改變〈命令行序列〉中部分命令的執(zhí)行次數(shù)。EXIT、LOOP可以出現(xiàn)在〈命令行序列〉的任意位置。4.使用循環(huán)語句時(shí)應(yīng)注意的幾點(diǎn)5.多重循環(huán)

多重循環(huán)即循環(huán)的嵌套,是在一個(gè)循環(huán)結(jié)構(gòu)的循環(huán)體中又包含另一個(gè)循環(huán)。我們稱外層循環(huán)為外循環(huán),被包含的循環(huán)為內(nèi)循環(huán)。嵌套層數(shù)一般沒有限制,但內(nèi)循環(huán)的循環(huán)體必須完全包含在外循環(huán)的循環(huán)體中,不能相互交叉。第一種正確的嵌套關(guān)系如:

DOWHILE<條件表達(dá)式1><語句序列11>DOWHILE<條件表達(dá)式2><語句序列21>DOWHILE<條件表達(dá)式3><語句序列31>ENDDO<語句行序列22>ENDDO<語句行序列12>ENDDO5.多重循環(huán)第二種正確的嵌套關(guān)系如:

for<循環(huán)條件1>&&外層循環(huán)

for<循環(huán)條件2>&&內(nèi)層循環(huán)

for<循環(huán)條件3>&&最內(nèi)層循環(huán)

<語句行序列1>endfor<語句行序列2>endfor<語句行序列3>endfor注意:1、不同的循環(huán)之間可以嵌套使用。

2、內(nèi)層循環(huán)變量的值的變化速度比外層循環(huán)變量的值的變化速度要快。第二種正確的嵌套關(guān)系如:【例6-19】編程輸出如下下三角形乘法口訣表。程序文件名為“乘法表.PRG”?!纠?-19】編程輸出如下下三角形乘法口訣表。程序文件名為“方法一:用DOwhile循環(huán)來做SETTALKOFFCLEARX=1DOWHILEX<=9Y=1DOWHILEY<=XS=X*Y??STR(Y,1)+"*"+STR(X,1)+"="+STR(S,2)+""Y=Y+1ENDDO?&&僅僅用于換行輸出

X=X+1ENDDOSETTALKONRETURN方法一:用DOwhile循環(huán)來做方法二:以for循環(huán)來解決SETTALKOFFCLEARforx=1to9fory=1toxS=X*Y??STR(Y,1)+"*"+STR(X,1)+"="+STR(S,2)+""next?&&僅僅用于換行輸出

nextSETTALKONRETURN方法二:以for循環(huán)來解決編程序求出2+4+7+16+32+…這樣的數(shù)之和。如果累加和大于500時(shí),則程序終止并輸出結(jié)果。clears=0n=2DOwhiles<=500s=s+nn=n*2enddo?sreturn

clears=0forj=1to500I=2^js=s+iifs>500exitendifendfor?sreturn5、兩種循環(huán)的比較使用:編程序求出2+4+7+16+32+…這樣的數(shù)之和。如果累加典型程序?qū)嵗龑?shí)例1、計(jì)算1!+2!+……+10!思路:先計(jì)算出n!,之后再求和。如先計(jì)算10!方法:10!=1*2*3*4……*10,實(shí)質(zhì)上就是求數(shù)的累乘。P=1&&變量p用來存放10!的結(jié)果。ForI=1to10p=p*IEndfor典型程序?qū)嵗龑?shí)例1、計(jì)算1!+2!+……+10!P=1再在原來的基礎(chǔ)上求和,方法有兩種:一、直接在循環(huán)內(nèi)進(jìn)行累加

P=1S=0ForI=1to10p=p*IS=s+pEndfor?sreturnP=1ForI=1to10p=p*IEndfor再在原來的基礎(chǔ)上求和,方法有兩種:P=1二、運(yùn)用兩重循環(huán),內(nèi)層執(zhí)行求某個(gè)數(shù)的階乘,外層執(zhí)行累加

S=0forn=1to10p=1forI=1tonp=p*IEndfors=s+pEndfor?sreturn二、運(yùn)用兩重循環(huán),內(nèi)層執(zhí)行求某個(gè)數(shù)的階乘,外層執(zhí)行累加S思考:編寫程序求出14!+15!+……17!clearS=0forn=14to17p=1forI=1tonp=p*IEndfors=s+pEndfor?sreturn思考:編寫程序求出14!+15!+……17!clear實(shí)例2:可以用數(shù)組來完成程序的例子方法一:settalkoffcleara=1b=1c=2dowhilec<10000000a=bb=cc=a+benddo?"10000000以內(nèi)最大的斐波那契數(shù)為:",bsettalkon斐波那契數(shù)列的前兩項(xiàng)是1,1,其后每一項(xiàng)都是前兩項(xiàng)之和,求10000000以內(nèi)最大的斐波那契數(shù)?實(shí)例2:可以用數(shù)組來完成程序的例子方法一:a=b斐波那方法2:用數(shù)組解決上例的程序:cleardimea(1000)a(1)=1a(2)=1forn=3to1000a(n)=a(n-1)+a(n-2)ifa(n)>=10000000exitendifendfor?a(n-1)方法2:用數(shù)組解決上例的程序:方法1:cleara=1b=1s=0&&s是表示個(gè)數(shù)的變量forn=3to1000c=(n-1)*b+(n-2)*aa=bb=c數(shù)列:e(1)=e(2)=1,e(n)=(n-1)*e(n-1)+(n-2)*e(n-2)n>2每個(gè)e(n)稱為E數(shù),求[1,30000]之內(nèi)E數(shù)的個(gè)數(shù)?ifc>=1andc<=30000s=s+1endifendfor?s+2Return方法1:數(shù)列:e(1)=e(2)=1,e(n)=(n-1)*方法2:cleardimensione(30000)s=0e(1)=1e(2)=1forn=3to30000e(n)=(n-1)*e(n-1)+(n-2)*e(n-2)ife(n)>=1ande(n)<=30000s=s+1endifendfor?s+2return

方法2:思考:f(0)=f(1)=1,f(2)=0,f(n)=f(n-1)-2*f(n-2)+f(n-3)(n>2),求f(0)到f(50)中最大值。597325思考:f(0)=f(1)=1,f(2)=0,f(n)=f(n思考:已知:f(n)=f(n-1)+2*f(n-2)-5*f(n-3),

f(0)=1,f(1)=2,f(2)=3,求f(0)+f(1)+……f(30)cleardimef(31)s=6f(1)=1f(2)=2f(3)=3forn=4to31f(n)=f(n-1)+2*f(n-2)-5*f(n-3)s=s+f(n)endfor?sreturn思考:已知:f(n)=f(n-1)+2*f(n-2)-5*f百馬馱百瓦問題(與此類似的還有百錢買百雞)大馬、小馬和馬駒共100匹,大馬一馱三,小馬一馱二,馬駒二馱一,共100片瓦一次馱完,三種馬都馱,共有多少種組合?clears=0dm=1dowhiledm<=100/3xm=1dowhilexm<=(100-dm*3)/2mj=100-dm-xm

ifdm*3+xm*2+mj*(1/2)=100s=s+1endifxm=xm+1enddodm=dm+1enddo?sreturn百馬馱百瓦問題(與此類似的還有百錢買百雞)大馬、小馬和馬駒共綜合練習(xí):1、用一元紙幣兌換一分、兩分和五分的硬幣,要求兌換硬幣的總數(shù)為60枚,問共有多少種換法?(注:在兌換中一分、兩分或五分的硬幣數(shù)可以為0枚) 11

settalkoffclearn=0foryi=0to100forer=0to50forwu=0to20ifyi+er+wu=60andyi+2*er+5*wu=100n=n+1endifendforendforendfor?nsettalkonreturn綜合練習(xí):1、用一元紙幣兌換一分、兩分和五分的硬幣,要求兌換2、編程序求出100到200之間同時(shí)滿足除3余2和除5余3條件的數(shù)的個(gè)數(shù)。6settalkoffclearn=0forx=100to200ifmod(x,3)=2andmod(x,5)=3n=n+1endifendfor?nsettalkonreturn2、編程序求出100到200之間同時(shí)滿足除3余2和除5余3條3、編寫程序,求四位數(shù)的奇數(shù)中,所有各位數(shù)字之積(且不為0)是125的倍數(shù)的數(shù)的和。 161095方法一:

settalkoffclearn=0fori=1000to9999a=int(i/1000)b=int((i-a*1000)/100)c=int((i-a*1000-b*100)/10)d=mod(i,10)ifmod(i,2)=1andmod(a*b*c*d,125)=0anda!=0andb!=0andc!=0andd!=0n=n+iendifendfor?nsettalkonreturn3、編寫程序,求四位數(shù)的奇數(shù)中,所有各位數(shù)字之積(且不為0)

方法二:settalkoffclearn=0fori=1001to9999step2a=int(i/1000)b=int((i-a*1000)/100)c=int((i-a*1000-b*100)/10)d=mod(i,10)ifmod(a*b*c*d,125)=0andat("0",str(i,4))=0n=n+iendifendfor?nsettalkonreturn方法二:方法三:settalkoffclearn=0fori=1001to9999step2a=int(i/1000)b=int((i-a*1000)/100)c=int((i-a*1000-b*100)/10)d=mod(i,10)ifmod(a*b*c*d,125)=0andat(“0”,str(i,4))=0或用occurs()函數(shù)

n=n+iendifendfor?nsettalkonreturn方法三:4、編程序求出2+4+6+7+10+…這樣的數(shù)之和。如果累加數(shù)大于500時(shí),則程序終止并輸出結(jié)果。510clears=0n=2DOwhiles<=500s=s+nn=n+2enddo?sreturn

clears=0fori=2to500step2s=s+iifs>500exitendifendfor?sreturn4、編程序求出2+4+6+7+10+…這樣的數(shù)之和。如果累7.4程序的模塊化

結(jié)構(gòu)化程序設(shè)計(jì)方法要求將一個(gè)大的系統(tǒng)分解成若干個(gè)子系統(tǒng),每個(gè)子系統(tǒng)就構(gòu)成一個(gè)程序模塊。模塊是一個(gè)相對(duì)獨(dú)立的程序段,它可以為其他模塊所調(diào)用,也可以去調(diào)用其他模塊。將一個(gè)應(yīng)用程序劃分成一個(gè)個(gè)功能相對(duì)簡(jiǎn)單、單一的模塊程序,不僅有利于程序的開發(fā),也有利于程序的閱讀和維護(hù)。VFP模塊化在具體實(shí)現(xiàn)上提供三種形式,它們是子程序、過程和函數(shù)。

主程序與子程序調(diào)用關(guān)系示意圖

7.4程序的模塊化結(jié)構(gòu)化程序設(shè)計(jì)方法要求將一個(gè)大的系一、子程序

子程序也叫外部過程,是以程序文件(.PRG)的形式單獨(dú)存儲(chǔ)在磁盤上。子程序只需錄入一次,就可反復(fù)被調(diào)用執(zhí)行。1.子程序的結(jié)構(gòu)在VFP中,子程序的結(jié)構(gòu)與一般的程序文件一樣,可以用MODIFYCOMMAND命令來建立、修改、和存盤,擴(kuò)展名也默認(rèn)為.PRG。子程序與其他程序文件的唯一區(qū)別是其末尾或返回處必須有返回語句RETURN。【語句格式】

RETURN[TOMASTER|TO程序文件名|表達(dá)式]【語句功能】該命令中止一個(gè)程序、過程、或用戶自定義函數(shù)的執(zhí)行,返回上一級(jí)調(diào)用程序、最高級(jí)調(diào)用程序、另外一個(gè)程序或命令窗口。一、子程序子程序也叫外部過程,是以程序文件(.PR【語句說明】(1)通常程序執(zhí)行到RETURN時(shí),會(huì)自動(dòng)返回到上級(jí)調(diào)用程序調(diào)用語句的下一條語句繼續(xù)執(zhí)行。如果是在最高一級(jí)主程序中,則返回命令窗口。(2)選用TOMASTER子句時(shí),則返回最高一級(jí)調(diào)用程序,即在命令窗口下,調(diào)用的第一個(gè)主程序。(3)TO程序文件名表示程序?qū)⑥D(zhuǎn)向到指定的程序。(4)如選用表達(dá)式,表示將表達(dá)式的值返回調(diào)用程序,通常用于自定義函數(shù)。(5)在程序最后,如果沒有RETURN命令,則程序運(yùn)行完畢后,將自動(dòng)默認(rèn)執(zhí)行一個(gè)RETURN命令,但過程文件除外?!菊Z句說明】2.子程序的調(diào)用:【語句格式】

DO<程序文件名>|<過程名>[WITH參數(shù)表]

【語句功能】執(zhí)行以<程序文件名>或<過程名>為名的過程。

【語句說明】WITH參數(shù)表子句用來指定傳遞到程序或過程的參數(shù),在參數(shù)表中列出的參數(shù)可以是表達(dá)式、內(nèi)存變量、常量、字段名或用戶自定義函數(shù),各參數(shù)間用逗號(hào)分隔。

【例6-20】分別建立如下程序文件。

*MAIN.PRGSETTALKOFF?”正在執(zhí)行主程序”DOSUB1SETTALKON

*SUB1.PRG?”正在執(zhí)行SUB1”RETURN2.子程序的調(diào)用:【例】利用子程序方法求M!/(N!*(M-N)!)(M>N)

*main.prg*子程序sub.prgclearinput"M:"tominput"N:"tons=0x=mdosubs2=sx=ndosubs3=sx=m-ndosubs4=ss1=s2/(s3*s4)?s1s=1fori=1toxs=s*iendforreturns【例】利用子程序方法求M!/(N!*(M-N)!)(M>N)二、過程(內(nèi)部過程)

內(nèi)部過程:把多個(gè)過程組織在一個(gè)文件中(這個(gè)文件稱之為過程文件),或者把過程放在調(diào)用它的程序文件的末尾。

VisualFoxPro為了識(shí)別過程文件或者程序文件中的不同過程,規(guī)定過程文件或者程序文件中的過程必需用PROCEDURE語句說明。其格式為:

PROCEDURE<過程名>[PARAMETER<參數(shù)表>]<命令序列>[RETURN[<表達(dá)式>]]

過程有兩種存放方式:(1)把所有的過程集中寫入一個(gè)被稱為過程文件(.prg文件)的磁盤文件中(2)直接把過程寫在調(diào)用它的主程序文件中,主程序被打開時(shí),過程同時(shí)被調(diào)入內(nèi)存。

二、過程(內(nèi)部過程)內(nèi)部過程:把多個(gè)過程組織在一1.過程與主程序?qū)懺谕粋€(gè)程序文件里 主程序與過程的相互關(guān)系如下圖所示。過程和子程序都是用DO<文件名>來調(diào)用,當(dāng)出現(xiàn)了同名的過程和子程序時(shí),調(diào)用的順序首先從過程與主程序在同一文件中調(diào)用,其次從過程文件中調(diào)用,最后從子程序中調(diào)用。1.過程與主程序?qū)懺谕粋€(gè)程序文件里2.過程寫在過程文件里主程序與過程的相互關(guān)系如下圖所示。調(diào)用過程之前,首先要打開存放該過程的過程文件,任何時(shí)候只能打開一個(gè)過程文件。打開過程文件的命令:

SET

PROCEDURE

TO

<過程文件名>關(guān)閉過程文件的命令:

SET

PROCEDURE

TO

或用:CLOSE

PROCEDURE

2.過程寫在過程文件里三、過程文件的建立

過程文件的建立方法與程序文件相同。可用MODIFYCOMMAND<過程文件名>命令或調(diào)用其他文字編輯軟件來建立。過程文件的結(jié)構(gòu)一般為:PROCEDURE<過程名1><命令序列1>RETURN

PROCEDURE<過程名2><命令序列2>RETURN…PROCEDURE<過程名N><命令序列N>RETURN三、過程文件的建立過程文件的建立方法與程序1.過程文件的調(diào)用

調(diào)用某過程文件中的過程時(shí),必須先打開該過程文件,打開過程文件命令為:【格式】SETPROCEDURETO<過程文件名>任何時(shí)候系統(tǒng)只能打開一個(gè)過程文件,當(dāng)打開一個(gè)新的過程文件時(shí),原已打開的過程文件自動(dòng)關(guān)閉。2.過程文件的關(guān)閉關(guān)閉過程文件可用下列命令:【格式一】SETPROCEDURETO【格式二】CLOSEPROCEDURE

1.過程文件的調(diào)用【例】請(qǐng)考察下述程序運(yùn)行流向,求出正確運(yùn)行結(jié)果。*prog2.prgCLEARSTORE2TOI,C,TDOWHILEI<=4DOPR?"F("+STR(I,1)+")="+STR(C,2)I=I+1ENDDO?"T="+STR(T,2)RETURNPROCEDUREPRC=C+2T=T+CRETURN【例】請(qǐng)考察下述程序運(yùn)行流向,求出正確運(yùn)行結(jié)果。四、自定義函數(shù)自定義函數(shù)和過程一樣,可以以獨(dú)立的程序文件形式單獨(dú)存儲(chǔ)在磁盤上,也可以放在過程文件或直接放在程序文件中。自定義函數(shù)具有如下語法結(jié)構(gòu):

FUNCTION<函數(shù)名>

PARAMETER<參數(shù)表><函數(shù)體命令序列>

RETURN<表達(dá)式>自定義函數(shù)的調(diào)用語法與系統(tǒng)函數(shù)的調(diào)用相同。和過程一樣,自定義函數(shù)可以是常規(guī)程序文件的一部分,也可以是獨(dú)立的程序文件。不同的是調(diào)用過程或子程序使用DO命令,調(diào)用函數(shù)名稱后面加上括號(hào)。注意:函數(shù)不是命令,函數(shù)調(diào)用只能出現(xiàn)在表達(dá)式中。四、自定義函數(shù)自定義函數(shù)和過程一樣,可以以獨(dú)立的程序文【例】計(jì)算圓面積*PROG24.PRGSETTALKOFFCLEARINPUT”請(qǐng)輸入圓的半徑:”TOR?”圓的面積為:”,AREA(R)SETTALKONFUNCTIONAREA &&計(jì)算面積的函數(shù)PARAMETERX &&形參說明RETURN(3.1416*X**2)【例】計(jì)算圓面積思考:使用自定義函數(shù)完成:用戶輸入矩形的長(zhǎng)和寬,求出對(duì)應(yīng)的面積。SETTALKOFFCLEARINPUT"請(qǐng)輸入矩形一邊的長(zhǎng):"TOaINPUT"請(qǐng)輸入矩形另外一邊的長(zhǎng):"TOb?"矩形的面積為:",AREA(a,b)SETTALKONFUNCTIONAREA &&計(jì)算面積的函數(shù)PARAMETERx,y &&形參說明RETURN(x*y)思考:使用自定義函數(shù)完成:用戶輸入矩形的長(zhǎng)和寬,求出對(duì)應(yīng)的面五、變量的作用域

1.公共(全局)變量公共變量是指在所有程序模塊中都有效的內(nèi)存變量。在程序或過程中定義公共變量的語句為:【格式】PUBLIC<內(nèi)存變量表>該命令的功能是建立公共變量,并為它們賦初值為邏輯假.F.例如,PUBLICa,b,c(5)建立了三個(gè)公共內(nèi)存變量,它們的初值都是.F.

在命令窗口直接使用的內(nèi)存變量(不必用PUBLIC定義)都是全局變量。五、變量的作用域1.公共(全局)變量【說明】(1)當(dāng)定義多個(gè)變量時(shí),各變量名之間用逗號(hào)隔開;(2)用PUBLIC語句定義過的內(nèi)存變量,在程序執(zhí)行期間可以在任何層次的程序模塊中使用;(3)變量定義語句要放在使用此變量的語句之前,否則會(huì)出錯(cuò);(4)任何已經(jīng)定義為全局變量的變量,可以用PUBLIC語句再定義,但不允許重新定義為局部變量;(5)使用全局變量可以增強(qiáng)模塊間的通信,但會(huì)降低模塊間的獨(dú)立性?!菊f明】2.私有變量

在程序中直接使用(沒有通過PUBLIC和LOCAL命令事先聲明)而由系統(tǒng)自動(dòng)隱含建立的變量都是私有變量。私有變量的作用域是建立它的模塊及其下屬各層模塊,一旦建立它的模塊運(yùn)行結(jié)束,這些私有變量將自動(dòng)清除。

3.局部變量

局部變量只能在定義它的模塊中使用,不能在上層或下層模塊中使用。當(dāng)定義它的模塊運(yùn)行結(jié)束時(shí),局部變量自動(dòng)釋放。局部變量用LOCAL命令建立:【格式】LOCAL<內(nèi)存變量表>【功能】該命令建立指定的局部?jī)?nèi)存變量,并為它們賦初值為邏輯假.F.。2.私有變量【例如】分析下面程序中變量的作用域*prog27.prgclearPUBLICx1&&建立公共變量X1LOCALx2&&建立局部變量X2STORE"f"TOx3&&建立私有變量X3DOproc1?"主程序中--"&&三個(gè)變量在主程序中都可使用?"x1=",x1?"x2=",x2?"x3=",x3RETURNPROCEDUREproc1 ?"子程序中--"&&公共變量和私有變量在子程序中可以使用?"x1=",x1?"x3=",x3RETURN【例如】分析下面程序中變量的作用域4.變量的隱藏根據(jù)結(jié)構(gòu)化程序設(shè)計(jì)方法,將應(yīng)用程序分成若干層不同的模塊,有可能在各層模塊中有變量同名的情況。為了解決此問題,可以在子程序中使用PRIVATE命令隱藏主程序中可能存在的變量,使得這些變量在子程序中暫時(shí)無效。其語法格式為:PRIVATE內(nèi)存變量表|ALL[LIKE通配符][EXCEPT通配符]該命令并不建立內(nèi)存變量,它的作用是:隱藏指定的上層模塊中可能已經(jīng)存在的內(nèi)存變量,使得這些變量在當(dāng)前模塊程序中暫時(shí)無效。于是這些變量名就可以用來命名在當(dāng)前模塊或其下屬模塊中需要的私有變量或局部變量,并且不會(huì)改變上層模塊中同名變量的取值。4.變量的隱藏【例】變量的隱藏示例。*prog29.prg*過程PSETTALKOFFPROCEDUREpx=10PRIVATExy=15x=50DOpy=100?x,y?x,yRETURN運(yùn)行結(jié)果:5010010100【例】變量的隱藏示例。Local與Private的比較:(

補(bǔ)充)Local只隱藏上層與所在模塊,而不影響下層。Private隱藏建立它的模塊及下層模塊。Local與Private的比較:(補(bǔ)充)【例】LOCAL和PRIVATE命令的比較示例*prog30.prgPUBLICx,yX=10Y=100DOp1?x,y&&顯示10bbb*過程P1PROCEDUREp1PRIVATEx&&隱藏上層模塊中的變量xx=5&&建立私有變量x,并賦值5LOCALy&&建立局部變量y,并隱藏同名變量DOp2?x,y&&顯示aaa.F.*過程P2PROCEDUREP2x="aaa"&&x是在P1中建立的內(nèi)存變量y="bbb"&&y是在主程序中建立的公共變量RETURN【例】LOCAL和PRIVATE命令的比較示例九、參數(shù)傳遞1、接收參數(shù)Parameters<形式參數(shù)表>(最常使用的方式)Lparameters<形式參數(shù)表>2、發(fā)送參數(shù)格式1:do<文件名>|<過程名>with<實(shí)參表>格式2:<文件名>|<過程名>(實(shí)參表)九、參數(shù)傳遞1、接收參數(shù)1、采用格式1調(diào)用時(shí):

a、如果實(shí)參是常量或表達(dá)式,傳遞的方式是按值傳遞。

b、如果實(shí)參是變量,傳遞的方式是按地址傳遞。(即引用傳遞)。

c、如果實(shí)參是用括號(hào)()括起來的,傳遞方式屬于按值傳遞。2、采用格式2調(diào)用時(shí):

a、默認(rèn)方式為按值傳遞。

b、可用setudfparmstovalue|reference來設(shè)置傳遞的方式。

1、采用格式1調(diào)用時(shí):例如:clearstore10tox1,x2setudfparmstovaluedopwithx1,(x2)?"第一次:",x1,x2store10tox1,x2p(x1,(x2))?"第二次:",x1,x2setudfparmstoreferencedopwithx1,(x2)?"第三次:",x1,x2store10tox1,x2p(x1,(x2))?"第四次:",x1,x2procpparax1,x2x1=x1+1x2=x2+1return例如:clearsetudfparmstorefere練習(xí):分析程序的結(jié)果。1、store0ton,sDowhile.t.n=n+1s=s+nIfn>=5exitEndifEnddo?”s=”+str(s,2)練習(xí):分析程序的結(jié)果。1、store0ton,s2、*main.prg

clear

s=0

dosub1with10,s

?s

return

*sub1.prg

procsub1

parametersd1,d2

d1=d1+d1

d2=d1*2

return2、*main.prg

clear

s=0

dosub13、store.t.toxStore0toyDowhilexY=y+1Ifint(y/5)=y/5??yElseLoopEndifIfy>15Store.f.toxEndifenddo3、store.t.tox4、clearDimensiona(6)Fork=1to6A(k)=20-2*kEndforK=5Dowhilek>=2a(k)=a(k)-a(k-1)K=k-1Enddo?a(1),a(3),a(5)4、clear5、x=9Y=13Z=fu(x,y)?zFunctionfuParametersa,bA=a*bReturn(a)5、x=96、x=15Y=7Dosubwithx,(y)?x,yReturnProceduresubParametera,bA=a+bB=a-breturn6、x=157、clearstore2tox1,x2,x3X1=x1+1Doz1?x1+x2+x3Return*z1.prgX2=x2+1Doz2X1=x1+1ReturnZ2.prgX3=x3+1Returntomaster7、clear8、填空完成:通過字符串操作豎向顯示“偉大祖國”,橫向顯示“祖國偉大”。ClearStore“偉大祖國”

溫馨提示

  • 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)論