版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第六章VisualFoxPro程序設(shè)計(jì)入門6.1VFP程序--命令文件的建立和執(zhí)行6.2VFP常用編程命令及函數(shù)6.3VFP流程圖介紹6.4順序執(zhí)行6.5判斷分支6.6循環(huán)結(jié)構(gòu)6.7過(guò)程與用戶自定義函數(shù)習(xí)題六第六章VisualFoxPro程序設(shè)計(jì)入門6.1V16.1VFP程序--命令文件的建立和執(zhí)行6.1.1建立和編輯命令文件1.用MODIFYCOMMAND命令建立命令文件常用命令格式:MODIFYCOMMAND[<文件名>]文件名的默認(rèn)擴(kuò)展名為.PRG。系統(tǒng)首先在磁盤上尋找該文件,若未找到,則建立之,在屏幕上打開(kāi)一編輯窗口,供用戶輸入內(nèi)容;若找到,則把該文件內(nèi)容調(diào)至編輯窗口,由用戶進(jìn)行編輯,并在磁盤上復(fù)制一同名、同內(nèi)容的.BAK文件。編輯結(jié)束時(shí),可用^End或^W結(jié)束命令并存盤。也可用Esc鍵作廢編輯并結(jié)束命令。6.1VFP程序--命令文件的建立和執(zhí)行6.1.12
2.使用菜單操作建立命令文件操作過(guò)程:文件→新建→選擇“程序”單選按鈕→單擊“新建文件”,將打開(kāi)一編輯窗口,供用戶輸入程序。
3.使用項(xiàng)目管理器建立命令文件操作過(guò)程:首先打開(kāi)項(xiàng)目管理器→選擇“代碼”選項(xiàng)卡→選擇“程序”選項(xiàng)→單擊“新建”按鈕,也將打開(kāi)一編輯窗口供用戶輸入程序。2.使用菜單操作建立命令文件36.1.2執(zhí)行命令文件
命令文件的執(zhí)行可在VFP的命令窗口(COMMAND窗口)中進(jìn)行。命令格式:DO<命令文件名>此命令將首先打開(kāi)該命令文件,然后從其第一條語(yǔ)句開(kāi)始執(zhí)行。執(zhí)行完畢后,自動(dòng)關(guān)閉此命令文件,回到命令窗口。6.1.2執(zhí)行命令文件46.2VFP常用編程命令及函數(shù)1.SETTALK命令基本命令格式:SETTALKON/OFF命令功能:在VFP中,有很多SET命令,其中很大一部分是用以轉(zhuǎn)換狀態(tài)的。本命令就是用以轉(zhuǎn)換TALK的狀態(tài)的。TALK的初始狀態(tài)為ON,在這種狀態(tài)下,VFP在執(zhí)行一些非顯示命令時(shí),將把執(zhí)行結(jié)果等信息送到顯示器顯示。在調(diào)試程序時(shí),這種方式是極為有利的。但在執(zhí)行程序時(shí),一般都不希望如此。此時(shí),可用SETTALKOFF命令來(lái)改變TALK狀態(tài)。TALK處于OFF狀態(tài)時(shí),屏幕上只顯示命令要求輸出的結(jié)果。6.2VFP常用編程命令及函數(shù)1.SE5
2.SETPRINTER命令基本命令格式:SETPRINTEROFF/ON命令功能:PRINTER的初始狀態(tài)為OFF。當(dāng)PRINTER狀態(tài)為OFF時(shí),關(guān)閉向打印機(jī)的輸出。執(zhí)行SETPRINTERON命令后,PRINTER狀態(tài)為ON,此時(shí),輸出結(jié)果將傳送到打印機(jī)打印輸出。2.SETPRINTER命令6
3.系統(tǒng)初始化命令--CLEARALL命令格式:CLEARALL命令功能:該命令關(guān)閉所有打開(kāi)的庫(kù)文件、表文件及其有關(guān)文件(索引文件、備注文件等),清除所有內(nèi)存變量,清除所有用戶自定義下拉菜單、彈出式菜單和窗口,選擇1號(hào)工作區(qū)為當(dāng)前工作區(qū)。常用于應(yīng)用程序主控模塊的開(kāi)頭。3.系統(tǒng)初始化命令--CLEARALL7
4.清屏命令--CLEAR命令格式:CLEAR命令功能:本命令將清除VFP主窗口或當(dāng)前用戶自定義窗口。該命令常用于應(yīng)用程序某模塊的開(kāi)頭,或在各輸出命令前使用。4.清屏命令--CLEAR8
5.終止程序執(zhí)行語(yǔ)句——CANCEL命令格式:CANCEL命令功能:該語(yǔ)句將終止正在執(zhí)行的程序,把控制權(quán)返回給COMMAND窗口。CANCEL將釋放所有局部性內(nèi)存變量(見(jiàn)6.7.3節(jié))。在程序設(shè)計(jì)中,常用CANCEL語(yǔ)句在某種條件滿足時(shí)終止程序的執(zhí)行,因此它常與條件選擇語(yǔ)句一起使用。5.終止程序執(zhí)行語(yǔ)句——CANCEL96.程序注釋語(yǔ)句--NOTE/*格式1:NOTE<注釋字符>格式2:*<注釋字符>注釋語(yǔ)句的作用是對(duì)程序作注釋,不執(zhí)行任何操作。6.程序注釋語(yǔ)句--NOTE/*107.信息框函數(shù)——MESSAGEBOX命令格式:MESSAGEBOX(<字符串表達(dá)式1>[,<數(shù)值表達(dá)式>[,<字符串表達(dá)式2>]])命令功能:該函數(shù)將顯示一個(gè)用戶自定義對(duì)話框。<字符串表達(dá)式1>指定在對(duì)話框中顯示的文本。在該表達(dá)式中包含回車符(CHR(13))可以使信息內(nèi)容移到下一行顯示。對(duì)話框的高度和寬度會(huì)根據(jù)字符串適當(dāng)增大,以包含全部信息。<數(shù)值表達(dá)式>指定對(duì)話框中的按鈕和圖標(biāo)、顯示對(duì)話框時(shí)的默認(rèn)按鈕以及對(duì)話框的行為。7.信息框函數(shù)——MESSAGEBOX11表6-1對(duì)話框按鈕值與按鈕類型的對(duì)應(yīng)關(guān)系表6-1對(duì)話框按鈕值與按鈕類型的對(duì)應(yīng)關(guān)系12表6-2對(duì)話框圖標(biāo)值與圖標(biāo)類型的對(duì)應(yīng)關(guān)系表6-2對(duì)話框圖標(biāo)值與圖標(biāo)類型的對(duì)應(yīng)關(guān)系13表6-3對(duì)話框默認(rèn)按鈕值與默認(rèn)按鈕類型的對(duì)應(yīng)關(guān)系表6-3對(duì)話框默認(rèn)按鈕值與默認(rèn)按鈕類型的對(duì)應(yīng)關(guān)系14當(dāng)省略<數(shù)值表達(dá)式>時(shí),等同于指定<數(shù)值表達(dá)式>值為0。<數(shù)值表達(dá)式>值實(shí)際上是三個(gè)值的和,即從表6-1、6-2、6-3中各選一個(gè)值的和。例如,若<數(shù)值表達(dá)式>為35,即(3+32+0),則顯示的對(duì)話框含有如下特征:①“是”、“否”和“取消”按鈕。②信息框顯示問(wèn)號(hào)圖標(biāo)。③第一個(gè)按鈕,即“是”按鈕為默認(rèn)按鈕。<字符串表達(dá)式2>指定對(duì)話框標(biāo)題欄中的文本,若省略該字符串,標(biāo)題欄中將顯示“MicrosoftVisualFoxPro”。例如,執(zhí)行如下命令:MESSAGEBOX("現(xiàn)在了解MESSAGEBOX()函數(shù)的使用方法了嗎?",35,"MESSAGEBOX()使用示例")當(dāng)省略<數(shù)值表達(dá)式>時(shí),等同于指定<數(shù)值表達(dá)式15圖6-1MESSAGEBOX(?)使用示例對(duì)話框圖6-1MESSAGEBOX(?)使用示例對(duì)話框16表6-4函數(shù)返回值與選取按鈕的對(duì)應(yīng)關(guān)系表6-4函數(shù)返回值與選取按鈕的對(duì)應(yīng)關(guān)系176.3VFP流程圖介紹圖6-2流程圖常用基本圖形6.3VFP流程圖介紹圖6-2流程圖常用基本圖形186.4順序執(zhí)行6.4.1順序執(zhí)行程序入門
例1把表文件“職工.DBF”中李紅衛(wèi)的職稱改為“高工”。編程實(shí)現(xiàn)如下:SETTALKOFFOPENDATABASE雇員管理USE職工LOCAFOR姓名="李紅衛(wèi)"REPL職稱WITH"高工"DISPUSECLOSEDATABASESETTALKON6.4順序執(zhí)行6.4.1順序執(zhí)行程序入門196.4.2@命令的基本功能1.顯示器的坐標(biāo)圖6-3VFP主窗口坐標(biāo)系6.4.2@命令的基本功能1.顯示器的坐標(biāo)圖6-320
2.屏幕輸出格式設(shè)計(jì)命令的基本格式利用輸出格式設(shè)計(jì)命令,用戶可以在VFP主窗口的任何一個(gè)坐標(biāo)點(diǎn)上顯示有關(guān)內(nèi)容。命令基本格式:@<行,列>SAY<表達(dá)式>命令中的<行,列>為規(guī)定的坐標(biāo)。本命令在VFP主窗口上,由<行,列>規(guī)定的坐標(biāo)開(kāi)始,顯示命令中<表達(dá)式>的值。命令中的“行”和“列”,可以是具體的數(shù)值,也可以是數(shù)值型內(nèi)存變量或數(shù)值表達(dá)式。<表達(dá)式>的最常見(jiàn)形式是一個(gè)用引號(hào)括起的字符串常量,作為提示信息用。2.屏幕輸出格式設(shè)計(jì)命令的基本格式21例2G1.PRG程序如下:CLEAR@1,20SAY"職工號(hào)"@2,10SAY"3*5+2="@ROW(),COL()SAY3*5+2@ROW()+1,5SAY"這是一本書"執(zhí)行后,屏幕顯示如下:職工號(hào)3*5+2=17這是一本書例2G1.PRG程序如下:22第一條@命令在第1行第20列開(kāi)始顯示“職工號(hào)”。第二條@命令在第2行第10列開(kāi)始顯示“3*5+2=”。第三條@命令在光標(biāo)當(dāng)前位置開(kāi)始顯示表達(dá)式3*5+2的值“17”。第四條@命令在下一行第5列開(kāi)始顯示“這是一本書”。第一條@命令在第1行第20列開(kāi)始顯示“職工號(hào)”23
3.屏幕輸入格式設(shè)計(jì)命令的基本格式命令基本格式:@<行,列>[SAY<表達(dá)式1>]GET<變量名>[DEFAULT<表達(dá)式2>]格式中的<變量名>可以是一個(gè)內(nèi)存變量、下標(biāo)變量或當(dāng)前打開(kāi)表文件的一個(gè)字段名。該命令將從<行,列>規(guī)定的坐標(biāo)開(kāi)始,首先輸出SAY子句(若存在)<表達(dá)式1>的值,空一格后,再接著輸出GET子句中的<變量名>的值。DEFAULT<表達(dá)式2>:若GET子句中的<變量名>不存在,則命令中必須包含本子句。本子句將建立一個(gè)值為<表達(dá)式2>的變量。若<變量名>存在,本子句被忽略。3.屏幕輸入格式設(shè)計(jì)命令的基本格式24例3G2.PRG程序如下:USE職工CLEAR@3,5SAY"職工姓名為:"GET姓名@4,5SAY"月工資為:"GET工資執(zhí)行后,屏幕顯示如下:職工姓名為:胡一民月工資為:575.00例3G2.PRG程序如下:254.READ命令的基本功能READ命令有著豐富的功能,這里僅介紹它的基本功能。命令基本格式:READ執(zhí)行READ命令時(shí),光標(biāo)返回到屏幕上第一個(gè)GET子句的變量值處。若用戶鍵入新值,該變量值即被新值代替;若僅以回車鍵響應(yīng),則原變量值不變。用新數(shù)據(jù)取代舊數(shù)據(jù)時(shí),以回車鍵或達(dá)到原定義的變量長(zhǎng)度為結(jié)束。然后,光標(biāo)跳到下一個(gè)GET子句的變量值處。用戶重復(fù)上述修改過(guò)程,直至READ命令前所有GET子句的變量都修改后,結(jié)束此命令,并把各變量新值送回各變量。4.READ命令的基本功能26
例4G3.PRG程序如下:USE職工CLEAR@3,5SAY"職工姓名為:"GET姓名@4,5SAY"月工資為:"GET工資READ程序執(zhí)行后,屏幕上顯示:職工姓名為:胡一民月工資為:85.00這時(shí)光標(biāo)在“姓名”字段值“胡一民”的首字符處,用戶可修改兩字段值。例4G3.PRG程序如下:276.4.3其他鍵盤輸入語(yǔ)句1.鍵盤輸入單字符語(yǔ)句——WAIT語(yǔ)句格式:WAIT["提示信息"][TO<內(nèi)存變量名>]WAIT語(yǔ)句首先顯示“提示信息”(若語(yǔ)句中有提示信息項(xiàng),則顯示語(yǔ)句中給定提示信息;否則,顯示W(wǎng)AIT語(yǔ)句固有提示信息:按任一鍵繼續(xù)......),接著暫停程序的執(zhí)行,等待用戶鍵入另一鍵。用戶按下另一鍵后,這個(gè)鍵的值(若是回車鍵或不能打印鍵或組合鍵,值為空串)作為一個(gè)單字符字符串,送<內(nèi)存變量名>(若選擇了TO子句的話,它可以是一個(gè)內(nèi)存變量,也可以是一個(gè)下標(biāo)變量。如果內(nèi)存中不存在,則自動(dòng)生成之)。WAIT語(yǔ)句執(zhí)行完畢,程序繼續(xù)執(zhí)行。6.4.3其他鍵盤輸入語(yǔ)句28WAIT語(yǔ)句常用于兩種情況:(1)用于只需從鍵盤輸入單個(gè)字符的情況?,F(xiàn)舉例說(shuō)明。例5查看表文件“職工.DBF”中某一記錄情況。每查看完一個(gè),要求系統(tǒng)給出提示:"是否繼續(xù)查詢(Y/N)"。要求快速響應(yīng),以便根據(jù)輸入的數(shù)據(jù)控制查詢是結(jié)束還是繼續(xù)顯示另一個(gè)記錄。WAIT語(yǔ)句常用于兩種情況:29程序清單如下:SETTALKOFFCLEAROPENDATABASE雇員管理USE職工DOWHILE.T.XM=""@5,10SAY"請(qǐng)輸入待查姓名"GETXMREADLOCAFOR姓名=XMIFFOUND()DISP程序清單如下:30ELSE?"查無(wú)此人"ENDIFWAIT"是否繼續(xù)查詢(Y/N):"TOYNIFUPPE(YN)="N"EXITENDIFENDDOUSECLOSEDATABASESETTALKONELSE31在這個(gè)簡(jiǎn)單程序中用到了循環(huán)語(yǔ)句DOWHILE...ENDDO和退出循環(huán)語(yǔ)句EXIT,因?yàn)檫€未介紹過(guò)這兩條語(yǔ)句,所以在這里我們不涉及它們,而只關(guān)心WAIT語(yǔ)句。當(dāng)程序執(zhí)行到WAIT語(yǔ)句時(shí),暫停程序的執(zhí)行,屏幕上顯示:是否繼續(xù)查詢(Y/N):這時(shí)只要用戶鍵入“N”,則結(jié)束程序運(yùn)行。如果用戶鍵入的是其他任一鍵,則屏幕上又顯示:請(qǐng)輸入待查姓名:再重復(fù)執(zhí)行以上程序。在這個(gè)簡(jiǎn)單程序中用到了循環(huán)語(yǔ)句DOWHILE32(2)WAIT語(yǔ)句常用的第二種情況是:當(dāng)程序執(zhí)行的結(jié)果在屏幕上顯示出來(lái)后,為了讓用戶能看清所顯示的內(nèi)容(由于程序在不斷執(zhí)行,屏幕上顯示的結(jié)果會(huì)一閃而過(guò)),在程序的適當(dāng)位置可以用WAIT語(yǔ)句使屏幕顯示的結(jié)果停留下來(lái),當(dāng)你看清屏幕上的內(nèi)容之后,再按任一鍵讓程序繼續(xù)執(zhí)行。在這種情況下,WAIT語(yǔ)句具有獨(dú)特的優(yōu)越性。(2)WAIT語(yǔ)句常用的第二種情況是:當(dāng)程33
2.鍵盤輸入字符串語(yǔ)句——ACCEPT語(yǔ)句格式:ACCEPT["提示信息"]TO<內(nèi)存變量名>執(zhí)行本命令時(shí),首先輸出<提示信息>(若存在);然后等待用戶從鍵盤鍵入數(shù)據(jù)。用戶輸入完數(shù)據(jù),按回車鍵后,系統(tǒng)把用戶輸入的數(shù)據(jù)作為一個(gè)字符串(用戶不要輸入字符括號(hào)、單引號(hào)、雙引號(hào)或方括號(hào))送給<內(nèi)存變量名>指定的變量。用戶也可鍵入一個(gè)字符表達(dá)式,系統(tǒng)將其值送指定變量。2.鍵盤輸入字符串語(yǔ)句——ACCEPT34
3.鍵盤輸入語(yǔ)句——INPUT語(yǔ)句格式:INPUT["提示信息"]TO<內(nèi)存變量名>執(zhí)行本命令時(shí),首先在屏幕上輸出“提示信息”,并等待用戶鍵入數(shù)據(jù);用戶按回車鍵后,即把用戶鍵入的表達(dá)式求值,送<內(nèi)存變量名>。表達(dá)式是什么類型,<內(nèi)存變量名>即是什么類型。3.鍵盤輸入語(yǔ)句——INPUT356.4.4順序執(zhí)行程序舉例例6對(duì)于6.4.1節(jié)的例1,我們進(jìn)行一些修改如下:SETTALKOFFUSE職工XM=""XZC=""@10,10SAY"請(qǐng)輸入姓名:"GETXM@12,10SAY"請(qǐng)輸入新職稱:"GETXZCREADLOCAFOR姓名=XMREPL職稱WITHXZCDISPUSESETTALKON6.4.4順序執(zhí)行程序舉例366.5判斷分支6.5.1條件轉(zhuǎn)向語(yǔ)句——IF...ENDIF這是一種簡(jiǎn)單的分支語(yǔ)句,語(yǔ)句格式如下:IF<條件表達(dá)式><語(yǔ)句表達(dá)式>ENDIF<條件表達(dá)式>值為“真”時(shí),順序執(zhí)行IF和ENDIF間的語(yǔ)句行序列,然后再執(zhí)行ENDIF后的語(yǔ)句;若其值為“假”時(shí),則直接跳到ENDIF后面的語(yǔ)句繼續(xù)執(zhí)行。6.5判斷分支6.5.1條件轉(zhuǎn)向語(yǔ)句——IF37圖6-4條件轉(zhuǎn)向語(yǔ)句流程圖圖6-4條件轉(zhuǎn)向語(yǔ)句流程圖38例7對(duì)6.4.3中的例5引申一步,如果表文件中該指定人員的職稱與新定的職稱相符,則不作任何操作。流程圖如圖6-5所示。依據(jù)流程圖,編制程序如下:SETTALKOFFOPENDATABASE雇員管理USE職工XM=""XZC=""@10,10SAY"請(qǐng)輸入姓名:"GETXM例7對(duì)6.4.3中的例5引申一步,如果表39@12,10SAY"請(qǐng)輸入新職稱:"GETXZCREADLOCAFOR姓名=XMIF職稱 <>XZCREPL職稱WITHXZCENDIFDISPUSECLOSEDATABASESETTALKON@12,10SAY"請(qǐng)輸入新職稱:"GETXZC40圖6-5例7的流程圖圖6-5例7的流程圖416.5.2條件選擇轉(zhuǎn)向語(yǔ)句--IF...ELSE...ENDIF語(yǔ)句格式:IF<條件表達(dá)式><語(yǔ)句行序列1>ELSE<語(yǔ)句行序列2>ENDIF6.5.2條件選擇轉(zhuǎn)向語(yǔ)句--IF...ELSE...E42圖6-6條件選擇轉(zhuǎn)向語(yǔ)句流程圖圖6-6條件選擇轉(zhuǎn)向語(yǔ)句流程圖43
例8求出表文件“職工.DBF”中指定人員的年齡。如果年齡大于40歲,工資加10元;否則,工資加5元。依據(jù)流程圖,編制程序如下:SETTALKOFFCLEAROPENDATABASE雇員管理USE職工NF=0XM=""@5,10SAY"請(qǐng)輸入今年的年份:"GETNF@7,10SAY"請(qǐng)輸入姓名:"GETXM例8求出表文件“職工.DBF”中指定人員44READLOCAFOR姓名=XMNL=NF-YEAR(出生日期)IFNL>40REPL工資WITH工資+10ELSEREPL工資WITH工資+5ENDIFDISPUSECLOSEDATABASESETTALKONREAD45圖6-7例8的流程圖圖6-7例8的流程圖466.5.3IF語(yǔ)句的嵌套一個(gè)IF語(yǔ)句可以有兩個(gè)完整的分量:其一是從IF<條件表達(dá)式>到ELSE之間的<語(yǔ)句行序列1>;其二是從ELSE到ENDIF之間的<語(yǔ)句行序列2>(無(wú)ELSE時(shí),IF語(yǔ)句只有一個(gè)完整的分量,即從IF<條件表達(dá)式>到ENDIF之間的語(yǔ)句行序列)。所謂IF語(yǔ)句的嵌套,是指在一個(gè)IF語(yǔ)句的一個(gè)完整的分量中,包含了另一個(gè)完整的IF語(yǔ)句。
例9為鼓勵(lì)存款,對(duì)定期存款時(shí)間少于1年的,利率為3%;等于或大于1年而少于3年的,利率為5%;等于或大于3年而少于5年的,利率為7%;5年以上的,利率為9%。6.5.3IF語(yǔ)句的嵌套47圖6-8例9的流程圖圖6-8例9的流程圖48程序清單如下:SETTALKOFFCLEARNX=0@5,10SAY"輸入定期年限:"GETNXREADIFNX<1LL=0.03ELSEIFNX<3LL=0.05程序清單如下:49ELSEIFNX<5LL=0.07ELSELL=0.09ENDIFENDIFENDIF?"利率=",LLSETTALKONELSE506.5.4情況語(yǔ)句--DOCASE...ENDCASEDOCASECASE<條件表達(dá)式1><語(yǔ)句行序列1>CASE<條件表達(dá)式2><語(yǔ)句行序列2>...CASE<條件表達(dá)式n><語(yǔ)句行序列n>[OTHERWISE<語(yǔ)句行序列>]ENDCASE6.5.4情況語(yǔ)句--DOCASE...ENDCASE51在情況語(yǔ)句的格式中,各條件表達(dá)式的值必須是邏輯值“真”或“假”。OTHERWISE子句為可選項(xiàng)。有此可選項(xiàng)時(shí),它必須放在所有成分語(yǔ)句之后。執(zhí)行時(shí),系統(tǒng)依次查看每一個(gè)CASE的條件,碰到第一個(gè)條件成立者,則執(zhí)行該條件下的語(yǔ)句序列。執(zhí)行完后,直接跳轉(zhuǎn)ENDCASE后。如果所有的條件都不成立,若無(wú)OTHERWISE子句,則不執(zhí)行任何成分語(yǔ)句,立即跳出情況語(yǔ)句;有可選項(xiàng)OTHERWISE時(shí),執(zhí)行OTHERWISE子句的語(yǔ)句行序列,再跳轉(zhuǎn)ENDCASE后。在情況語(yǔ)句中,如果條件為真的情況多于一個(gè),則僅僅執(zhí)行第一個(gè)條件為真者。DOCASE和ENDCASE必須成對(duì)出現(xiàn)。在情況語(yǔ)句的格式中,各條件表達(dá)式的值必須是邏輯52圖6-9情況語(yǔ)句流程圖圖6-9情況語(yǔ)句流程圖53
例10用情況語(yǔ)句重新編制例9,比較情況語(yǔ)句與條件轉(zhuǎn)向語(yǔ)句的用法。圖6-10例10的流程圖例10用情況語(yǔ)句重新編制例9,比較情況語(yǔ)54程序清單如下:SETTALKOFFCLEARNX=0@5,10SAY"輸入定期年限:"GETNXREADDOCASECASENX<1LL=0.03CASENX<3LL=0.05程序清單如下:55CASENX<5LL=0.07OTHERWISELL=0.09ENDCASE?"利率=",LLSETTALKONCASENX<556可見(jiàn),同樣一個(gè)問(wèn)題,用DOCASE...ENDCASE語(yǔ)句比用IF...ENDIF語(yǔ)句要簡(jiǎn)潔明了得多。它格式整齊,簡(jiǎn)單清晰,便于分析和閱讀。DOCASE語(yǔ)句也可以嵌套。在DOCASE語(yǔ)句中,語(yǔ)句行序列1、語(yǔ)句行序列2、……都是完整的分量。所謂DOCASE語(yǔ)句的嵌套,是指在一個(gè)DOCASE語(yǔ)句的一個(gè)完整的分量中,包含了另一個(gè)完整的DOCASE語(yǔ)句。但在DOCASE與第一個(gè)CASE之間不能有任何語(yǔ)句。DOCASE語(yǔ)句和IF語(yǔ)句可以互相嵌套,即一個(gè)語(yǔ)句的一個(gè)完整分量中包含了另一個(gè)完整語(yǔ)句??梢?jiàn),同樣一個(gè)問(wèn)題,用DOCASE...E576.6循環(huán)結(jié)構(gòu)6.6.1三條循環(huán)語(yǔ)句1.循環(huán)語(yǔ)句DOWHILE(1)DOWHILE語(yǔ)句的語(yǔ)句格式:DOWHILE<條件表達(dá)式><循環(huán)體>ENDDO其中,DOWHILE為循環(huán)起始語(yǔ)句;ENDDO為循環(huán)結(jié)束語(yǔ)句;循環(huán)體是幾條語(yǔ)句組成的語(yǔ)句行序列,執(zhí)行循環(huán)體能完成的功能即為此循環(huán)的基本功能。6.6循環(huán)結(jié)構(gòu)6.6.1三條循環(huán)語(yǔ)句58(2)DOWHILE語(yǔ)句的執(zhí)行過(guò)程。圖6-11DOWHILE循環(huán)語(yǔ)句流程圖(2)DOWHILE語(yǔ)句的執(zhí)行過(guò)程。圖6-11D59①系統(tǒng)在執(zhí)行程序過(guò)程中,遇到了循環(huán)起始語(yǔ)句DOWHILE時(shí),首先計(jì)算<條件表達(dá)式>的值。此值為真時(shí),系統(tǒng)就順序往下執(zhí)行循環(huán)體中的語(yǔ)句,即執(zhí)行循環(huán)體;當(dāng)此值為假時(shí),系統(tǒng)不再執(zhí)行循環(huán)體,而跳到ENDDO的下面一句去執(zhí)行,即“跳出循環(huán)體”。②執(zhí)行到循環(huán)結(jié)束語(yǔ)句ENDDO時(shí),表示循環(huán)體已結(jié)束,系統(tǒng)“回跳”到循環(huán)起始語(yǔ)句去再一次執(zhí)行DOWHILE語(yǔ)句。ENDDO和DOWHILE語(yǔ)句必須成對(duì)出現(xiàn)。在循環(huán)體內(nèi)必須有使<條件表達(dá)式>逐漸為假的語(yǔ)句;否則,將進(jìn)入死循環(huán)。①系統(tǒng)在執(zhí)行程序過(guò)程中,遇到了循環(huán)起始語(yǔ)句60
2.循環(huán)語(yǔ)句SCAN(1)SCAN語(yǔ)句的語(yǔ)句格式:SCAN[<范圍>][FOR<條件1>][WHILE<條件2>][NOOPTIMIZE]<循環(huán)體>ENDSCAN其中,SCAN為循環(huán)起始語(yǔ)句,ENDSCAN為循環(huán)結(jié)束語(yǔ)句。本語(yǔ)句對(duì)范圍內(nèi)滿足條件的記錄執(zhí)行<循環(huán)體>。默認(rèn)范圍值為ALL。2.循環(huán)語(yǔ)句SCAN61(2)SCAN語(yǔ)句的執(zhí)行過(guò)程。在執(zhí)行程序時(shí),遇到SCAN語(yǔ)句,系統(tǒng)即在范圍內(nèi)順序查找第一條滿足條件的記錄(條件項(xiàng)以WHILE開(kāi)頭時(shí),情況與以FOR開(kāi)頭的有差別,見(jiàn)第三章中命令的一般形式)。找到后,即執(zhí)行循環(huán)體部分,然后再順次往下查找下一條滿足條件的記錄……搜索完范圍內(nèi)最后一條記錄后,SCAN語(yǔ)句執(zhí)行完畢。(2)SCAN語(yǔ)句的執(zhí)行過(guò)程。62
3.循環(huán)語(yǔ)句FOR(1)FOR語(yǔ)句的語(yǔ)句格式:FOR<循環(huán)變量名>=<數(shù)值表達(dá)式1>TO<數(shù)值表達(dá)式2>[STEP<數(shù)值表達(dá)式3>]<循環(huán)體>ENDFOR/NEXT語(yǔ)句格式中,<循環(huán)變量名>既可以是一個(gè)內(nèi)存變量,也可以是某數(shù)組的一個(gè)下標(biāo)變量。若不存在,則自動(dòng)建立之。3.循環(huán)語(yǔ)句FOR63(2)FOR語(yǔ)句的執(zhí)行過(guò)程。如圖6-12所示。圖6-12FOR循環(huán)的執(zhí)行流程(2)FOR語(yǔ)句的執(zhí)行過(guò)程。如圖6-12所示。圖6-164第一步,系統(tǒng)首先求出<數(shù)值表達(dá)式1>、<數(shù)值表達(dá)式2>、<數(shù)值表達(dá)式3>(若缺省,默認(rèn)為1)的值,并分別作為循環(huán)初值、循環(huán)界值、步長(zhǎng),存入內(nèi)存有關(guān)區(qū)域。第二步,系統(tǒng)給循環(huán)變量賦初值。第三步,判斷循環(huán)變量越界否。若越界,則FOR循環(huán)執(zhí)行完畢,轉(zhuǎn)去執(zhí)行ENDFOR(或NEXT)后的第一條語(yǔ)句;若不越界,則執(zhí)行循環(huán)體。第四步,遇到ENDFOR(或NEXT)時(shí),循環(huán)變量?jī)?nèi)容增加步長(zhǎng)值。然后,轉(zhuǎn)第三步。第一步,系統(tǒng)首先求出<數(shù)值表達(dá)式1>、<數(shù)值表達(dá)式265第一步,系統(tǒng)首先求出<數(shù)值表達(dá)式1>、<數(shù)值表達(dá)式2>、<數(shù)值表達(dá)式3>(若缺省,默認(rèn)為1)的值,并分別作為循環(huán)初值、循環(huán)界值、步長(zhǎng),存入內(nèi)存有關(guān)區(qū)域。第二步,系統(tǒng)給循環(huán)變量賦初值。第三步,判斷循環(huán)變量越界否。若越界,則FOR循環(huán)執(zhí)行完畢,轉(zhuǎn)去執(zhí)行ENDFOR(或NEXT)后的第一條語(yǔ)句;若不越界,則執(zhí)行循環(huán)體。第四步,遇到ENDFOR(或NEXT)時(shí),循環(huán)變量?jī)?nèi)容增加步長(zhǎng)值。然后,轉(zhuǎn)第三步。第一步,系統(tǒng)首先求出<數(shù)值表達(dá)式1>、<數(shù)值表66對(duì)于FOR語(yǔ)句的執(zhí)行流程,再作如下說(shuō)明:①三個(gè)表達(dá)式的值求出后,即送內(nèi)存有關(guān)區(qū)域存儲(chǔ)。以后,在執(zhí)行循環(huán)體時(shí),若對(duì)三個(gè)表達(dá)式中所含變量?jī)?nèi)容作了修改,也不會(huì)影響到循環(huán)初值、循環(huán)界值、步長(zhǎng)。②給循環(huán)變量賦初值后,若初值已經(jīng)越界,則一次也不執(zhí)行循環(huán)體,F(xiàn)OR語(yǔ)句就告結(jié)束,轉(zhuǎn)ENDFOR(或NEXT)后一語(yǔ)句。③當(dāng)步長(zhǎng)大于0時(shí),循環(huán)變量值大于循環(huán)界值時(shí)為越界;當(dāng)步長(zhǎng)小于0時(shí),循環(huán)變量值小于循環(huán)界值時(shí)為越界。④執(zhí)行循環(huán)體時(shí),若修改了循環(huán)變量值,將會(huì)影響到循環(huán)執(zhí)行次數(shù)。對(duì)于FOR語(yǔ)句的執(zhí)行流程,再作如下說(shuō)明:676.6.2對(duì)表文件記錄進(jìn)行操作時(shí)的循環(huán)控制方式1.對(duì)表文件記錄進(jìn)行逐條操作的循環(huán)控制方式格式1:SCAN <語(yǔ)句行序列> ENDSCAN格式2:DOWHILE.NOT.EOF()<語(yǔ)句行序列>SKIPENDDO6.6.2對(duì)表文件記錄進(jìn)行操作時(shí)的循環(huán)控制方式68格式1的循環(huán)起始語(yǔ)句SCAN不帶任何范圍和條件,因此,對(duì)所有記錄逐條進(jìn)行操作。格式2中,循環(huán)起始語(yǔ)句DOWHILE的條件為.NOT.EOF(),在循環(huán)體內(nèi)有執(zhí)行一條記錄指針下跳一條記錄的SKIP語(yǔ)句。因此,也能實(shí)現(xiàn)對(duì)所有記錄逐條進(jìn)行操作的目的。這里,SCAN語(yǔ)句顯然比DOWHILE語(yǔ)句簡(jiǎn)潔。格式1的循環(huán)起始語(yǔ)句SCAN不帶任何范圍和條69
例11用逐條記錄循環(huán)操作的方法,打印輸出表文件“職工.DBF”中每條記錄的姓名和工資。依題意,本例的流程圖如圖6-13所示。采用SCAN語(yǔ)句,則程序如下:SETTALKOFFCLEARSETPRINTERON?"姓名工資"OPENDATABASE雇員管理USE職工例11用逐條記錄循環(huán)操作的方法,打印輸出70SCAN?姓名+""??工資ENDSCANUSECLOSEDATABASESETPRINTEROFFSETTALKONSCAN712.選擇表文件中符合條件的記錄進(jìn)行循環(huán)操作格式1:SCAN[<范圍>][FOR<條件>]<語(yǔ)句行序列>ENDSCAN格式2:LOCATE[<范圍>][FOR<條件>]DOWHILEFOUND()<語(yǔ)句行序列>CONTINUEENDDO2.選擇表文件中符合條件的記錄進(jìn)行循環(huán)操作72
例12修改表文件“職工.DBF”中職工的工資,對(duì)工資不超過(guò)600元且不低于500元者加10元。依題意,畫流程圖如圖6-14所示。采用SCAN語(yǔ)句,程序如下:SETTALKOFFCLEAROPENDATABASE雇員管理USE職工SCANFOR工資<=600.AND.工資>=500REPL工資WITH工資+10ENDSCANUSECLOSEDATABASESETTALKON例12修改表文件“職工.DBF”中職工的73若采用DOWHILE語(yǔ)句,則程序其他部分不變,僅把循環(huán)部分改為:LOCAFOR工資<=600.AND.工資>=500DOWHILEFOUND()REPL工資WITH工資+10CONTENDDO由于在此例中,范圍為ALL,所以上面的FOUND可用.NOT.EOF()。若采用DOWHILE語(yǔ)句,則程序其他部分不變746.6.3循環(huán)結(jié)構(gòu)中兩條有用的語(yǔ)句1.退出循環(huán)語(yǔ)句——EXIT前面介紹的循環(huán)語(yǔ)句格式中,一旦進(jìn)入循環(huán),循環(huán)次數(shù)實(shí)際上已經(jīng)確定。但在實(shí)際應(yīng)用中,常希望在某種情況下,強(qiáng)迫循環(huán)語(yǔ)句結(jié)束,去繼續(xù)執(zhí)行循環(huán)語(yǔ)句后的其他語(yǔ)句。EXIT語(yǔ)句可實(shí)現(xiàn)這一要求。語(yǔ)句格式:EXITEXIT語(yǔ)句可放在循環(huán)體內(nèi)的任何位置。當(dāng)程序執(zhí)行到EXIT語(yǔ)句時(shí),立即強(qiáng)迫退出循環(huán),轉(zhuǎn)去執(zhí)行循環(huán)后的語(yǔ)句。6.6.3循環(huán)結(jié)構(gòu)中兩條有用的語(yǔ)句75EXIT語(yǔ)句通常包含在IF語(yǔ)句或DOCASE語(yǔ)句中,當(dāng)某條件出現(xiàn)時(shí),才被執(zhí)行。通常用于無(wú)限次循環(huán)的控制,其常用格式如下:格式1:DOWHILE.T.<語(yǔ)句行序列>IF<條件表達(dá)式>EXITENDIFENDDOEXIT語(yǔ)句通常包含在IF語(yǔ)句或DOCAS76格式2:DOWHILE.T.<語(yǔ)句行序列>DOCASECASE<條件表達(dá)式1>EXITCASE<條件表達(dá)式2>...ENDCASEENDDO在這里,循環(huán)條件永遠(yuǎn)為真。僅當(dāng)EXIT的控制條件成立時(shí),才能退出循環(huán)。格式2:DOWHILE.T.77
例13打印某種報(bào)表,每打印完一張,便提示用戶是否還要打印,由用戶輸入的信息來(lái)進(jìn)行控制,試編程序?qū)崿F(xiàn)這種功能。依題意,編寫的程序如下:CLEARALLDOWHILE.T.<打印報(bào)表程序段>CLEARANSWER=MESSAGEBOX("繼續(xù)打印嗎?",36,"打印提示")IFANSWER=7EXITENDIFENDDO例13打印某種報(bào)表,每打印完一張,便提示78圖6-15例13的流程圖圖6-15例13的流程圖792.短路循環(huán)語(yǔ)句--LOOP在實(shí)際應(yīng)用中,還常常會(huì)遇到根據(jù)某種條件需短路正在執(zhí)行的循環(huán)體,重新回到循環(huán)開(kāi)始處的要求。LOOP語(yǔ)句提供了這種功能。
語(yǔ)句格式:LOOPLOOP語(yǔ)句可出現(xiàn)在循環(huán)體內(nèi)任一位置。它的功能為,強(qiáng)迫結(jié)束本次執(zhí)行循環(huán)體的工作,就好像執(zhí)行循環(huán)體時(shí),遇到了循環(huán)結(jié)束語(yǔ)句ENDDO、ENDSCAN或ENDFOR。LOOP一般也應(yīng)受到某種條件的限制。通常用于遇到某個(gè)特殊條件時(shí),需阻止執(zhí)行循環(huán)體內(nèi)剩余語(yǔ)句的場(chǎng)合。2.短路循環(huán)語(yǔ)句--LOOP80
例14假設(shè)有一個(gè)表文件“工資.DBF”,其中包括有“姓名”、“實(shí)發(fā)工資”等字段,有20個(gè)記錄。現(xiàn)在要求顯示出此表中前10個(gè)記錄的“姓名”和“實(shí)發(fā)工資”,但是,如果遇到“姓名”為“王林”的則不顯示。編程序?qū)崿F(xiàn)。依題意繪制流程圖,如圖6-16所示。采用SCAN循環(huán)語(yǔ)句,程序如下:CLEAROPENDATABASE雇員管理USE工資例14假設(shè)有一個(gè)表文件“工資.DBF”,其81SCANFORRECNO()<=10IF姓名="王林"LOOPENDIF?姓名,實(shí)發(fā)工資ENDSCANUSECLOSEDATABASE若采用DOWHILE循環(huán)語(yǔ)句,程序較復(fù)雜:OPENDATABASE雇員管理USE工資DOWHILERECNO()<=10SCANFORRECNO()<=1082IF姓名="王林"SKIPLOOPENDIF?姓名,實(shí)發(fā)工資SKIPENDDOUSECLOSEDATABASEIF姓名="王林"83圖6-16例14的流程圖圖6-16例14的流程圖84
例15令計(jì)算機(jī)從零開(kāi)始計(jì)數(shù),并將奇數(shù)累加求和。當(dāng)奇數(shù)累加和大于300時(shí),結(jié)束計(jì)數(shù);否則,繼續(xù)計(jì)數(shù)。試編程序?qū)崿F(xiàn)之。依題意編程如下:SETTALKOFFX=0JSH=0DOWHILE.T.X=X+1DOCASECASEINT(X/2)=X/2LOOP例15令計(jì)算機(jī)從零開(kāi)始計(jì)數(shù),并將奇數(shù)累加85CASEINT(X/2)<>X/2JSH=JSH+XIFJSH>300EXITENDIFENDCASEENDDOSETTALKON?"奇數(shù)和="??JSHCASEINT(X/2)<>X/2866.6.4循環(huán)結(jié)構(gòu)應(yīng)用舉例1.循環(huán)語(yǔ)句與其他分支判斷語(yǔ)句的嵌套所謂嵌套,即為:在一個(gè)語(yǔ)句的一個(gè)完整的分量中,包含了另一個(gè)完整的語(yǔ)句。一個(gè)循環(huán)語(yǔ)句,有且僅有一個(gè)完整的分量,就是循環(huán)體。6.6.4循環(huán)結(jié)構(gòu)應(yīng)用舉例87圖6-17循環(huán)語(yǔ)句與其他分支判斷語(yǔ)句的互相嵌套圖6-17循環(huán)語(yǔ)句與其他分支判斷語(yǔ)句的互相嵌套88
例16建立一個(gè)命令文件修改表文件“職工.DBF”中的工資,對(duì)于工資在小于等于600元與大于等于500元之間的職工增加20元,而對(duì)于工資大于600元的職工增加100元。要求逐條記錄進(jìn)行操作。依題意編程如下:OPENDATABASE雇員管理USE職工SCANDOCASECASE工資<600.AND.工資>=500REPLACE工資WITH工資+20例16建立一個(gè)命令文件修改表文件“職工.89CASE工資>600REPLACE工資WITH工資+10ENDCASEENDSCANUSECLOSEDATABASECASE工資>60090圖6-18嵌套使用的錯(cuò)誤形式圖6-18嵌套使用的錯(cuò)誤形式91
例17假設(shè)某中學(xué)有一個(gè)管理記錄本校學(xué)生成績(jī)的表文件“XSCJ.DBF”,它的結(jié)構(gòu)如下:例17假設(shè)某中學(xué)有一個(gè)管理記錄本校學(xué)生成92要求編寫一個(gè)程序:根據(jù)表中錄入的各門課成績(jī),計(jì)算出每個(gè)學(xué)生的語(yǔ)文和數(shù)學(xué)兩門主課的平均成績(jī)與五門課的總平均成績(jī),然后根據(jù)學(xué)生的成績(jī)來(lái)決定學(xué)生是升級(jí)、留級(jí),還是補(bǔ)考。如果主課平均成績(jī)及格者,則升級(jí);主課平均成績(jī)不及格,但總平均成績(jī)及格的,則給予補(bǔ)考;主課平均成績(jī)不及格,且總平均成績(jī)也不及格者則留級(jí)。最后分別打印出升級(jí)學(xué)生名單,留級(jí)學(xué)生名單和補(bǔ)考學(xué)生名單。要求編寫一個(gè)程序:根據(jù)表中錄入的各門課成績(jī),計(jì)93圖6-19例17的流程圖圖6-19例17的流程圖94根據(jù)流程圖編制程序如下:SETTALKOFFUSEXSCJSCANREPLACE主平均WITH(語(yǔ)文+數(shù)學(xué))/2REPLACE總平均WITH(語(yǔ)文+數(shù)學(xué)+物理+化學(xué)+英語(yǔ))/5DOCASECASE主平均>=60REPLACE升留判定WITH"升級(jí)"CASE主平均<60.AND.總平均<60REPLACE升留判定WITH"留級(jí)"CASE主平均<60.AND.總平均>=60REPLACE升留判定WITH"補(bǔ)考"根據(jù)流程圖編制程序如下:95ENDCASEENDSCANLISTFOR升留判定="升級(jí)"TOPRINTLISTFOR升留判定="留級(jí)"TOPRINTLISTFOR升留判定="補(bǔ)考"TOPRINTUSESETTALKONENDCASE962.多重循環(huán)多重循環(huán)即循環(huán)的嵌套,是指在一個(gè)循環(huán)的循環(huán)體中,包含有另一個(gè)循環(huán)。我們稱外層循環(huán)為外循環(huán),被包含的循環(huán)稱為內(nèi)循環(huán)。以DOWHILE為例,多重循環(huán)的一般格式如圖6-20所示。2.多重循環(huán)97圖6-20多重循環(huán)的一般格式圖6-20多重循環(huán)的一般格式98例18編制一張九九乘法表,要求格式如下:例18編制一張九九乘法表,要求格式如下:99流程圖如圖6-21所示。圖6-21例18的流程圖流程圖如圖6-21所示。圖6-21例18的流程圖100SETTALKOFFCLEAR?"*"FORA=1TO9??A??""ENDFOR?FORA=1TO9?A??""[[[[[[[[[[[[SETTALKOFF[[[[[[[[[[[[101B=1DOWHILEB<=AP=A*B??P??""B=B+1ENDDO?ENDFORSETTALKON[[[[B=1[[[[102圖6-21例18的流程圖圖6-21例18的流程圖1036.7過(guò)程與用戶自定義函數(shù)6.7.1過(guò)程的使用1.創(chuàng)建過(guò)程通常,過(guò)程是為完成某個(gè)操作而編寫的代碼。在VFP中過(guò)程定義的語(yǔ)法格式如下:PROCEDURE<過(guò)程名>...&&命令語(yǔ)句塊[RETURN[<表達(dá)式>]]ENDPROC在定義過(guò)程時(shí),其中的命令語(yǔ)句塊是關(guān)鍵組成部分,每當(dāng)調(diào)用過(guò)程時(shí),就將其包含的命令語(yǔ)句塊執(zhí)行一遍。6.7過(guò)程與用戶自定義函數(shù)6.7.1過(guò)程的使用104可選項(xiàng)RETURN是返回語(yǔ)句,其常用格式為:RETURN[TOMASTER][<表達(dá)式>]格式中,選擇項(xiàng)[TOMASTER]是在過(guò)程嵌套調(diào)用時(shí)使用,表示返回到最高級(jí)調(diào)用者。若沒(méi)有此選擇項(xiàng),則當(dāng)程序執(zhí)行該語(yǔ)句時(shí),控制立即返回到其上級(jí)主程序,從調(diào)用該過(guò)程命令的下一條命令處繼續(xù)執(zhí)行。缺省時(shí),系統(tǒng)會(huì)在過(guò)程結(jié)束時(shí)執(zhí)行一條隱含的不帶任何選擇項(xiàng)的RETURN語(yǔ)句。可選項(xiàng)RETURN是返回語(yǔ)句,其常用格式為:105選擇項(xiàng)[<表達(dá)式>]用于將<表達(dá)式>的值返回給調(diào)用者,它主要用于用戶自定義函數(shù)中。在設(shè)計(jì)過(guò)程時(shí)可以把它們保存在主程序的結(jié)尾,但注意一定不能把過(guò)程定義代碼放在可執(zhí)行的主程序代碼之前。采用這種方式時(shí),只需用MODIFYCOMMAND命令打開(kāi)要放置過(guò)程的主程序,在其末尾添加過(guò)程的定義代碼即可。選擇項(xiàng)[<表達(dá)式>]用于將<表達(dá)式>的值返回106
例19建立一個(gè)命令文件,修改“職工.DBF”表中職工的工資。對(duì)于工資低于550元的職工增加50元,工資在550元(含550元)以上的增加20元。要求編程時(shí)將修改工資這一功能用過(guò)程來(lái)實(shí)現(xiàn)。為該命令文件取名為“GZ.PRG”,其內(nèi)容如下:USE職工SCANDOGZXGENDSCANUSE例19建立一個(gè)命令文件,修改“職工.DB107*以下是過(guò)程定義代碼,過(guò)程名為“GZXG”PROCEDUREGZXGIF工資<550REPLACE工資WITH工資+50ELSEREPLACE工資WITH工資+20ENDIFRETURNENDPROC*以下是過(guò)程定義代碼,過(guò)程名為“GZXG”108
2.調(diào)用過(guò)程1)常用格式VFP中調(diào)用過(guò)程最常用的命令是DO命令。命令格式:DO<過(guò)程名>這個(gè)語(yǔ)句出現(xiàn)在要調(diào)用某過(guò)程的主程序中。當(dāng)主程序執(zhí)行到該語(yǔ)句時(shí),立即轉(zhuǎn)去執(zhí)行指定過(guò)程中的命令語(yǔ)句塊;當(dāng)在過(guò)程中遇到RETURN語(yǔ)句或遇到ENDPROC語(yǔ)句時(shí),又轉(zhuǎn)回主程序,執(zhí)行調(diào)用過(guò)程DO<過(guò)程名>的下一條語(yǔ)句。其調(diào)用流程圖如圖6-22所示:2.調(diào)用過(guò)程109圖6-22過(guò)程調(diào)用流程圖圖6-22過(guò)程調(diào)用流程圖110例19中所建立的“GZ.PRG”命令文件的執(zhí)行過(guò)程:執(zhí)行主程序后,首先打開(kāi)表文件“職工.DBF”,然后執(zhí)行SCAN循環(huán)語(yǔ)句(由于缺省范圍和條件,將對(duì)每個(gè)記錄都執(zhí)行一次循環(huán)體)。循環(huán)體中DOGZXG語(yǔ)句是調(diào)用過(guò)程“GZXG”,它使系統(tǒng)立即轉(zhuǎn)去執(zhí)行過(guò)程中的第一條命令:“IF工資<550”,并依次執(zhí)行過(guò)程中的其余命令。當(dāng)執(zhí)行到RETURN時(shí),又轉(zhuǎn)回主程序,執(zhí)行DO<過(guò)程名>的下一條語(yǔ)句。遇到循環(huán)結(jié)束語(yǔ)句ENDSCAN,則又返回SCAN,查找下一條符合條件的記錄。每執(zhí)行一次過(guò)程調(diào)用語(yǔ)句,就將過(guò)程中的命令語(yǔ)句塊執(zhí)行一遍。例19中所建立的“GZ.PRG”命令文件的執(zhí)1112)其他格式VFP還提供了另外兩種調(diào)用過(guò)程的方法:(1)在過(guò)程名前面加上“=”號(hào),后面加上“()”號(hào)。命令格式:=<過(guò)程名>()(2)直接在過(guò)程名后面加上“()”號(hào)。命令格式:<過(guò)程名>()對(duì)例19中的“GZ.PRG”命令文件中的DOGZXG語(yǔ)句,可分別用下面兩條語(yǔ)句替換,程序執(zhí)行結(jié)果不變:語(yǔ)句1:=GZXG()語(yǔ)句2:GZXG()2)其他格式112
3.過(guò)程調(diào)用的嵌套與其他各種語(yǔ)句的嵌套一樣,在過(guò)程的調(diào)用中也可以嵌套。即主程序調(diào)用一個(gè)過(guò)程,這個(gè)過(guò)程又可以調(diào)用第二個(gè)過(guò)程,第二個(gè)過(guò)程又可以調(diào)用第三個(gè)過(guò)程,在系統(tǒng)允許的嵌套范圍內(nèi)這樣一個(gè)一個(gè)地調(diào)用下去,這種調(diào)用就稱為過(guò)程的嵌套。過(guò)程的嵌套形式如圖6-23所示。圖中所示為一個(gè)主程序和三個(gè)過(guò)程的嵌套。3.過(guò)程調(diào)用的嵌套113圖6-23過(guò)程的嵌套1圖6-23過(guò)程的嵌套1114圖6-24過(guò)程的嵌套2圖6-24過(guò)程的嵌套21156.7.2使用過(guò)程文件1.建立過(guò)程文件在設(shè)計(jì)過(guò)程時(shí)也可以把它們保存在單獨(dú)的程序文件中,我們把這種程序文件稱為過(guò)程文件。在一個(gè)過(guò)程文件中,可以包含某主程序所調(diào)用的全部過(guò)程。打開(kāi)一個(gè)過(guò)程文件就打開(kāi)了它所包含的所有過(guò)程。采用這種方式,既可以使主程序代碼顯得簡(jiǎn)練,也使程序結(jié)構(gòu)更加緊湊。過(guò)程文件的建立方法與一般命令文件一樣,使用MODIFYCOMMAND命令打開(kāi)代碼編輯窗口,在其中定義多個(gè)過(guò)程或函數(shù)。其默認(rèn)的擴(kuò)展名為.PRG。6.7.2使用過(guò)程文件116
例20對(duì)例19中的程序進(jìn)行修改,要求將過(guò)程GZXG保存在過(guò)程文件中。使用MODIFYCOMMAND命令打開(kāi)代碼編輯窗口,在其中輸入過(guò)程定義代碼,內(nèi)容如下: PROCEDUREGZXGIF工資<550REPLACE工資WITH工資+50ELSEREPLACE工資WITH工資+20ENDIFRETURNENDPROC例20對(duì)例19中的程序進(jìn)行修改,要求將過(guò)117
2.使用過(guò)程文件若將過(guò)程保存在過(guò)程文件中,則在應(yīng)用程序中應(yīng)首先使用SETPROCEDURETO命令打開(kāi)該過(guò)程文件。命令格式:SETPROCEDURETO<過(guò)程文件名>SETPROCEDURETO語(yǔ)句一般放在主程序的前面,且必須放在主程序循環(huán)語(yǔ)句的前面,因?yàn)樗粓?zhí)行一次。打開(kāi)過(guò)程文件后,就可在需要處用DO<過(guò)程名>或其他過(guò)程調(diào)用語(yǔ)句調(diào)用該過(guò)程文件中所包含的過(guò)程了。2.使用過(guò)程文件118
例21在例20中只創(chuàng)建了過(guò)程文件,下面是使用過(guò)程文件的主程序代碼:SETPROCEDURETOMYPROCFUNUSE職工SCANDOGZXGENDSCANUSE例21在例20中只創(chuàng)建了過(guò)程文件,下面是119
3.關(guān)閉過(guò)程文件(1)用SETPROCEDURETO<過(guò)程文件名>打開(kāi)一個(gè)過(guò)程文件時(shí),原已在內(nèi)存中打開(kāi)的過(guò)程文件即被關(guān)閉??梢?jiàn),內(nèi)存中最多只能存在一個(gè)過(guò)程文件。(2)在主程序末尾應(yīng)關(guān)閉過(guò)程文件。下面兩條命令都可關(guān)閉之:命令1:CLOSEPROCEDURE命令2:SETPROCEDURETO&&無(wú)任選項(xiàng)3.關(guān)閉過(guò)程文件1206.7.3設(shè)置內(nèi)存變量屬性的語(yǔ)句1.內(nèi)存變量的固有性質(zhì)——局部性①在一個(gè)程序中所定義的內(nèi)存變量,如果未加說(shuō)明,則在定義它的程序執(zhí)行完后,將被系統(tǒng)消除。②如果定義它的程序還要調(diào)用其他過(guò)程或函數(shù),那么它還可以在過(guò)程或函數(shù)中使用。③在過(guò)程或函數(shù)執(zhí)行的過(guò)程中,如果改變了該內(nèi)存變量的值,則在從過(guò)程或函數(shù)返回主程序時(shí),該變量仍然保留它在過(guò)程或函數(shù)中被改變了的值,主程序在此基礎(chǔ)上可繼續(xù)使用。6.7.3設(shè)置內(nèi)存變量屬性的語(yǔ)句1.內(nèi)121
例22由鍵盤輸入一個(gè)梯形的上底、下底和高的值,在主程序中定義它們,然后在函數(shù)中求這個(gè)梯形的面積,分別看看這些變量在主程序與函數(shù)中的情況。主程序“L812.PRG”程序清單如下:SETTALKOFFCLEARALLSTORE0TOMYA1,MYB1,MYH1,MYS@5,10SAY"輸入上底值"GETMYA1@7,10SAY"輸入下底值"GETMYB1@9,10SAY"輸入梯形高值"GETMYH1例22由鍵盤輸入一個(gè)梯形的上底、下底和高122READ?"內(nèi)存變量在主程序中定義的情況"LISTMEMOLIKEMY*&&顯示所有名稱以"MY"開(kāi)頭的內(nèi)存變量?DOBBB??"內(nèi)存變量由函數(shù)返回主程序后的情況:"LISTMEMOLIKEMY*READ123函數(shù)“BBB.PRG”清單如下:FUNCTIONBBB?"內(nèi)存變量由主程序進(jìn)入函數(shù)時(shí)的情況:"LISTMEMOLIKEMY*MYAR=(MYA1+MYB1)*MYH1/2MYS=MYAR??"函數(shù)中定義變量且改變主程序中變量值的情況:"LISTMEMOLIKEMY*RETUENDFUNC函數(shù)“BBB.PRG”清單如下:124這個(gè)程序運(yùn)行的情況如下:DOL812輸入上底值:4輸入下底值:8輸入梯形高值:7內(nèi)存變量在主程序中定義的情況:MYA1privN4(4.00000000)L812MYB1privN8(8.00000000)L812MYH1privN7(7.00000000)L812MYSprivN0(0.00000000)L812這個(gè)程序運(yùn)行的情況如下:125內(nèi)存變量由主程序進(jìn)入函數(shù)時(shí)的情況:MYA1privN4(4.00000000)L812MYB1privN8(8.00000000)L812MYH1privN7(7.00000000)L812MYSprivN0(0.00000000)L812函數(shù)中定義變量且改變主程序中變量值的情況:MYA1privN4(4.00000000)L812MYB1privN8(8.00000000)L812MYH1privN7(7.00000000)L812MYSprivN42.0000(42.00000000)L812MYARprivN42.0000(42.00000000)BBB內(nèi)存變量由主程序進(jìn)入函數(shù)時(shí)的情況:126內(nèi)存變量由函數(shù)返回主程序后的情況:MYA1privN4(4.00000000)L812MYB1privN8(8.00000000)L812MYH1privN7(7.00000000)L812MYSprivN42.0000(42.00000000)L812內(nèi)存變量由函數(shù)返回主程序后的情況:127從程序執(zhí)行結(jié)果中可以很清楚地看到:當(dāng)用戶鍵入上底、下底和高的值后,立即顯示出在調(diào)用函數(shù)以前主程序中的內(nèi)存變量的情況。這時(shí)只有4個(gè)內(nèi)存變量MYA1、MYB1、MYH1、MYS,其中MYS的值為零。當(dāng)系統(tǒng)調(diào)用函數(shù)時(shí),首先顯示內(nèi)存變量的情況,可以看出它與主程序中未調(diào)函數(shù)前的內(nèi)存變量情況一樣。這就是說(shuō),主程序中產(chǎn)生的內(nèi)存變量在函數(shù)中仍存在,可供函數(shù)使用。當(dāng)函數(shù)執(zhí)行完“MYAR=(MYA1+MYB1)*MYH1/2”和“MYS=MYAR”這兩條語(yǔ)句后,從顯示的內(nèi)存變量情況看,這時(shí)有5個(gè)內(nèi)存變量,其中MYA1、MYB1和MYH1的值未變,函數(shù)中定義的變量MYAR的值為42,主程序中定義的內(nèi)存變量MYS的值為42。從程序執(zhí)行結(jié)果中可以很清楚地看到:當(dāng)用戶鍵入128當(dāng)由函數(shù)返回主程序后,從顯示的內(nèi)存變量情況來(lái)看,這時(shí)仍然只有4個(gè)內(nèi)存變量MYA1、MYB1、MYH1、MYS,在函數(shù)中產(chǎn)生的內(nèi)存變量MYAR已經(jīng)不存在了。這說(shuō)明在較低一級(jí)程序中產(chǎn)生的內(nèi)存變量,如果未加任何說(shuō)明,則在該程序結(jié)束時(shí)被清除。另外,清單中MYS的值不是0,而是42。這說(shuō)明:當(dāng)過(guò)程或函數(shù)在執(zhí)行過(guò)程中改變了由主程序定義的內(nèi)存變量的值時(shí),在返回主程序后被改變了的值仍然保留在該變量之中。當(dāng)由函數(shù)返回主程序后,從顯示的內(nèi)存變量情況來(lái)129
2.設(shè)置全局性內(nèi)存變量語(yǔ)句--PUBLIC在程序設(shè)置中,對(duì)有些函數(shù)中定義的內(nèi)存變量,我們希望在主程序中仍能使用,或者希望它在整個(gè)的程序中均能使用,這時(shí),應(yīng)該使用全局性的內(nèi)存變量。全局性內(nèi)存變量定義格式如下:格式1:PUBLIC<內(nèi)存變量清單>格式2:PUBLIC[ARRAY]<內(nèi)存變量>(<數(shù)值表達(dá)式1>[,<數(shù)值表達(dá)式2>])[...]格式1用來(lái)對(duì)<內(nèi)存變量清單>中的內(nèi)存變量進(jìn)行全局性說(shuō)明,這個(gè)命令必須放在定義這些變量的語(yǔ)句之前。2.設(shè)置全局性內(nèi)存變量語(yǔ)句--PUBLIC130全局性內(nèi)存變量的性質(zhì):①用PUBLIC語(yǔ)句聲明過(guò)的內(nèi)存變量可以在整個(gè)的程序以及各過(guò)程或函數(shù)中使用。在任何過(guò)程或函數(shù)中改變了該變量的值,當(dāng)該變量進(jìn)入到其他過(guò)程或函數(shù)時(shí),仍然保留該改變了的變量值。②當(dāng)整個(gè)程序結(jié)束后,用PUBLIC語(yǔ)句聲明過(guò)的內(nèi)存變量依然存在,若要清除它們,必須借助于RELEASE命令。在VFP命令窗口下建立的內(nèi)存變量都是全局性內(nèi)存變量。在程序中,內(nèi)存變量用PUBLIC命令說(shuō)明為全局性變量之后,由定義值決定變量的類型。但在定義它之前,變量的值為邏輯非(.F.)。全局性內(nèi)存變量的性質(zhì):131
例23仍采用上一例,但將函數(shù)中定義的內(nèi)存變量MYAR用PUBLIC語(yǔ)句進(jìn)行說(shuō)明,看看變量MYAR在整個(gè)程序中的情況。主程序“L813.PRG”清單如下:SETTALKOFFCLEARALLSTORE0TOMYA1,MYB1,MYH1,MYS@5,10SAY"輸入上底值"GETMYA1@7,10SAY"輸入下底值"GETMYB1@9,10SAY"輸入梯形高值"GETMYH1例23仍采用上一例,但將函數(shù)中定義的內(nèi)132READ?"內(nèi)存變量在主程序中定義的情況"LISTMEMOLIKEMY*DOBBB1??"內(nèi)存變量由函數(shù)返回主程序后的情況:"LISTMEMOLIKEMY*READ133列函數(shù)清單:FUNCTIONBBB1?"內(nèi)存變量由主程序進(jìn)入函數(shù)時(shí)的情況:"LISTMEMOLIKEMY*PUBLICMYARMYAR=(MYA1+MYB1)*MYH1/2MYS=MYAR??"函數(shù)中定義變量且進(jìn)行全局說(shuō)明后變量值的情況:"LISTMEMOLIKEMY*RETUENDFUNC列函數(shù)清單:134這個(gè)程序比前一個(gè)例子中的程序僅多了一個(gè)“PUBLICMYAR”語(yǔ)句,這個(gè)語(yǔ)句將變量MYAR說(shuō)明為全局性的。在這里要注意的是這條語(yǔ)句的位置,它必須放在定義該變量的語(yǔ)句之前。這個(gè)程序執(zhí)行結(jié)果如下:輸入上底值:4輸入下底值:8輸入梯形高值:7內(nèi)存變量在主程序中定義的情況:MYA1privN4(4.00000000)L813MYB1privN8(8.00000000)L813MYH1privN7(7.00000000)L813MYSprivN0(0.00000000)L813這個(gè)程序比前一個(gè)例子中的程序僅多了一個(gè)“PUBLIC135內(nèi)存變量由主程序進(jìn)入函數(shù)時(shí)的情況:MYA1privN4(4.00000000)L813MYB1privN8(8.00000000)L813MYH1privN7(7.00000000)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 5年中考3年模擬試卷初中道德與法治八年級(jí)下冊(cè)04第4課時(shí)國(guó)家監(jiān)察機(jī)關(guān)
- 家具原料木材運(yùn)輸合同
- 化工品集裝箱運(yùn)輸合同范本
- 西餐廳裝修半包合同模板
- 住宅精裝修保修協(xié)議模板
- 光伏電站渣土運(yùn)輸協(xié)議模板
- 棋牌室裝修工程分包
- 無(wú)人機(jī)應(yīng)用服務(wù)
- 家具電商物流配送合同
- 化妝品快遞配送合同
- 臨床微生物檢驗(yàn)與臨床課件
- 帶平衡電抗器的雙反星形可控整流電路
- 有機(jī)合成工(初級(jí))技能理論考試題庫(kù)(匯總版)
- 小學(xué)數(shù)學(xué)課堂中有效提問(wèn)的教學(xué)策略課件
- 學(xué)校行政會(huì)議記錄范文(精選3篇)
- 小組合作學(xué)習(xí)積分實(shí)用表
- 《整理房間》-完整版課件
- 介紹泉州的英文PPT
- 河北單招第三大類復(fù)習(xí)題
- 第三單元單元教學(xué)設(shè)計(jì)+學(xué)年統(tǒng)編版高中語(yǔ)文選擇性必修上冊(cè)
- 六年級(jí)上冊(cè)音樂(lè)課件-第六單元 故鄉(xiāng) 藍(lán)色的雅德朗 蘇少版 (共16張PPT)
評(píng)論
0/150
提交評(píng)論