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