第8章 VFP的程序設(shè)計技術(shù)_第1頁
第8章 VFP的程序設(shè)計技術(shù)_第2頁
第8章 VFP的程序設(shè)計技術(shù)_第3頁
第8章 VFP的程序設(shè)計技術(shù)_第4頁
第8章 VFP的程序設(shè)計技術(shù)_第5頁
已閱讀5頁,還剩105頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

VisualFoxPro數(shù)據(jù)庫技術(shù)及應(yīng)用

第8章VFP的程序設(shè)計技術(shù)第8章VFP的程序設(shè)計技術(shù)8.1 程序設(shè)計概述8.2 程序文件的建立和執(zhí)行8.3 程序的基本結(jié)構(gòu)8.4 過程與過程調(diào)用8.5 數(shù)組8.1 程序設(shè)計概述程序是為了完成某項任務(wù)所需執(zhí)行的命令序列,這些命令按照一定的結(jié)構(gòu)有機地組合在一起,并以文件的形式存儲在磁盤上,它的擴展名為.PRG。VFP應(yīng)用程序一般由以下幾個部分組成:程序提示:指出程序的名稱、功能、作者等信息。程序設(shè)置:設(shè)置程序的運行環(huán)境。程序主體:包含實現(xiàn)某項功能的所有命令序列,一般包含數(shù)據(jù)的輸入輸出、數(shù)據(jù)的處理以及結(jié)果輸出等。程序整理:一些整理工作,如關(guān)閉各種文件,使系統(tǒng)狀態(tài)恢復(fù)到標(biāo)準(zhǔn)狀態(tài)。程序退出:返回到系統(tǒng)的命令窗口狀態(tài)或操作系統(tǒng)狀態(tài)。8.1 程序設(shè)計概述一個大型的程序設(shè)計的基本步驟可以描述為:對問題進行說明;對問題進行分解;編制各個分支模塊;測試以及完善各個分支模塊;組裝全部模塊;整體程序的測試。8.2 程序文件的建立和執(zhí)行8.2.1程序文件的建立與修改8.2.2程序文件的執(zhí)行8.2.3程序的常用命令8.2.1 程序文件的建立與修改程序文件的概念在VFP中,要實現(xiàn)對數(shù)據(jù)操作的某一種功能,總要通過執(zhí)行命令來完成。對于較為簡單的功能,執(zhí)行一個命令即可,但對于較復(fù)雜的功能,則往往需要執(zhí)行多條命令來加以實現(xiàn)。把多條命令組織起來,保存于一個文件中,便構(gòu)成了一個程序文件,它的擴展名為.PRG。8.2.1 程序文件的建立與修改常用的創(chuàng)建方法有兩種:1、使用菜單建立程序文件:1)第一步:選擇菜單[文件]–[新建]命令或單擊常用工具欄中的“新建”按鈕

2)第二步:從右圖的對話框中選中“程序”,并單擊“新建文件”按鈕進入編輯窗口,輸入程序的內(nèi)容,按<Ctrl>+W存盤退出。8.2.1 程序文件的建立與修改2、使用命令建立程序文件格式:MODIFYCOMMAND<程序文件名>實例:顯示“教師信息表”中所有信息,再按職稱分類匯總,然后顯示各類職稱的工資總和

MODIFYCOMMANDGZZH(建立文件)DOGZZH(執(zhí)行文件)程序文件內(nèi)容如下頁:8.2.1 程序文件的建立與修改clearUSE教師信息表LISTINDEXON職稱TOZCTOTALON職稱TOBUFUSEBUFCOPYTOGZZHFIELD職稱,基礎(chǔ)工資USEGZZHLISTFIELD職稱,基礎(chǔ)工資8.2.1 程序文件的建立與修改【例8.1】建立名為8-1.prg的應(yīng)用程序,使其能夠打開表文件“學(xué)生.dbf”,并且可以根據(jù)輸入的學(xué)生姓名在該表文件中查找并輸出該學(xué)生的基本情況,然后關(guān)閉該文件。在命令窗口中鍵入如下命令。MODIFYCOMMAND8-1打開程序編輯窗口,在其中輸入以下代碼。USE學(xué)生ACCEPT"請輸入要查詢的學(xué)生姓名:"TOXMLOCATEFOR姓名=XM?學(xué)號,姓名,性別,出生日期USERETURN輸入完畢后單擊“關(guān)閉”按鈕,在彈出的“保存”對話框中輸入“8-1.prg”即完成了應(yīng)用程序的建立。

8.2.1 程序文件的建立與修改在VisualFoxPro系統(tǒng)中,除了用上面介紹的建立、編輯程序文件方法外,還可以借助于“表單設(shè)計器”、“類設(shè)計器”、“菜單設(shè)計器”、“報表設(shè)計器”和“項目管理器”等代碼設(shè)計工具完成程序文件的建立與編輯。8.2.1 程序文件的建立與修改程序文件的修改1)用命令①MODIFYCOMMAND程序名②MODIFYFILE程序名.prg

注意:后者的文件擴展名不能省略2)利用菜單 [文件]-[打開] 選擇“程序”類型 選擇程序名

8.2.2 程序文件的執(zhí)行方法1:命令方式

DO<程序文件名>

運行一個程序文件(.prg)時,會先把它翻譯成一個目標(biāo)文件(.fxp),再運行該目標(biāo)文件。也可直接運行目標(biāo)文件:DO程序名.fxp方法2:菜單方式[程序]-[運行]或直接選擇最下面的執(zhí)行當(dāng)前程序的命令8.2.2 程序文件的執(zhí)行在程序運行過程中執(zhí)行到下述命令時將會中斷運行而退出:CANCEL:終止程序運行,消除所有的私有變量,返回命令窗口;DO:轉(zhuǎn)去執(zhí)行另一個程序;RETURN:結(jié)束當(dāng)前程序的運行,返回到調(diào)用它的上級程序,若沒有上級程序就返回命令窗口。QUIT:退出VFP程序,返回到操作系統(tǒng)。8.2.2 程序文件的執(zhí)行在程序運行過程中,若按下ESC鍵可使得運行強行中斷。系統(tǒng)將給予用戶3種選擇:①取消:中斷程序的運行,這是默認(rèn)選項;②繼續(xù)執(zhí)行:忽略ESC的中斷作用,繼續(xù)執(zhí)行程序;③掛起:暫時中斷程序的運行,返回命令窗口,當(dāng)再次運行時可以從中斷處繼續(xù)運行程序。8.2.3 程序的常用命令1. 交互輸入命令(1)ACCEPT——從鍵盤得到一字符串(2)WAIT——從鍵盤得到一個字符(3)INPUT——給內(nèi)存變量賦值(多種類型)8.2.3 程序的常用命令(1)ACCEPT命令格式:ACCEPT[<字符表達式>]TO<內(nèi)存變量>命令功能:暫停程序的運行,等待用戶鍵入字符型常量以賦給指定的內(nèi)存變量。說明:①<字符表達式>為可選項,它是一個用于提示說明的字符型表達式。當(dāng)程序執(zhí)行到可選項時,將會計算該表達式的值并將其顯示出來。②如果不鍵入任何字符而只按ENTER鍵,則賦給內(nèi)存變量的值將是一個空字符串。③該命令最多能接收254個字符。8.2.3 程序的常用命令【例8-2】從鍵盤輸入表文件名。ACCEPT"請輸入數(shù)據(jù)表文件名:"TOFILENUSE&FILENLIST8.2.3 程序的常用命令(2)WAIT命令WAIT[<提示符>][TO<內(nèi)存變量表>][WINDOW[AT<行>,<列>]][TIMEOUT<數(shù)值表達式>]功能:屏幕出現(xiàn)提示符的內(nèi)容,等待從鍵盤上接收輸入;或在指定時間或地點屏幕出現(xiàn)提示符;也可以不要提示,按任意鍵繼續(xù)。說明:內(nèi)存變量只能接受一個字符,不要加回車8.2.3 程序的常用命令【例】在屏幕第20行50列顯示信息框“請稍候…”2秒鐘WAIT"請稍候……"WINDOWAT20,50TIMEOUT2執(zhí)行時,屏幕出現(xiàn)小窗口:停留2秒鐘【例】等待輸入一個字符后,繼續(xù)往下WAIT"請回答(Y/N)"TOOPIFOP="Y"OROP=“y"?"YES"ELSE?"NO"ENDIF8.2.3 程序的常用命令【例】在信息框顯示提示內(nèi)容停留5秒鐘CLEARUSE教師信息表ACCEPT"請輸入職稱:"TOZCLISTFOR職稱=ZCWAIT“職稱為”+ZC+“的紀(jì)錄已顯示”;WINDOWAT20,30TIMEOUT5*注意:當(dāng)屏幕出現(xiàn)提示字符串時,*輸入:副教授8.2.3 程序的常用命令(3)Input命令格式:INPUT[<提示符>]TO<內(nèi)存變量表>功能:屏幕出現(xiàn)提示符的內(nèi)容,等待從鍵盤上接收輸入數(shù)據(jù)。注意:1)<提示符>兩端要加引號2)<內(nèi)存變量表>可以為字符、數(shù)值、日期等類型3)內(nèi)存變量的類型,取決于輸入的值8.2.3 程序的常用命令【例】將馬大大的出生日期改為83.4.2CLEARINPUT“請輸入馬大大的出生日期:"TODDUSEA班學(xué)生信息REPLACE出生日期WITHDDFOR姓名="馬大大"BROW*注意:當(dāng)屏幕出現(xiàn)提示字符串時,輸入:*CTOD(“04/02/83”)或{^1983-4-2}或date(1983,4,2)8.2.3 程序的常用命令【例8-4】輸入學(xué)生姓名,把“A班學(xué)生信息”表中該學(xué)生的信息顯示出來。USEA班學(xué)生信息INPUT"請輸入要查詢的學(xué)生姓名:"TOnameLOCATEFOR姓名=nameDISPLAYUSE程序運行時,根據(jù)提示輸入“馬大大”,顯示馬大大信息。(思考:接收字符型數(shù)據(jù),使用哪個命令更好?)

8.2.3 程序的常用命令2. 輔助命令(1)注釋命令(2)文本輸出命令(3)定位輸出命令(4)設(shè)置會話狀態(tài)命令(5)清除命令簡介8.2.3 程序的常用命令(1)注釋命令為了提高程序的可讀性或幫助讀者了解程序的結(jié)構(gòu),程序設(shè)計人員會對某些語句作一些解釋性的說明。命令格式一:NOTE<注釋內(nèi)容>命令格式二:*<注釋內(nèi)容>命令格式三:……&&<注釋內(nèi)容>如:LOCATEFOR姓名="馬大大“&&定位到“姓名”為“馬;大大”的記錄8.2.3 程序的常用命令(2)文本輸出命令格式: TEXT<文本內(nèi)容>ENDTEXT功能:在屏幕或打印機上按原樣輸出文本的內(nèi)容?!纠?-5】TEXT的使用示例。TEXT學(xué)生信息管理系統(tǒng)======================1、查詢2、修改2、添加4、刪除5、打印0、退出ENDTEXT8.2.3 程序的常用命令(3)定位輸出命令命令格式:@<行,列>SAY<表達式1>[GET<變量>[DEFAULT<表達式2>]](輸入語句)….READ功能:從指定的行、列坐標(biāo)位置開始顯示SAY子句中表達式的值。說明:①有GET時,<表達式1>起提示作用。②GET子句用來顯示待輸入數(shù)據(jù)的變量值,該變量必須事先定義。③DEFAULT子句用于給GET中的變量賦初值。④執(zhí)行READ語句時,系統(tǒng)允許用戶從鍵盤上輸入新的值,并將其賦給GET中的變量。8.2.3 程序的常用命令【例8-6】@...SAY…GET…READ的使用示例。CLEAR@5,10SAY"姓名:"GETxmDEFAULTSPACE(6)@6,10SAY"基本工資:"GETgzDEFAULT0READ要求用戶輸入姓名和基本工資,用戶輸入后,將結(jié)果賦給相應(yīng)變量8.2.3 程序的常用命令(4)設(shè)置會話狀態(tài)命令格式:SETTALKON|OFF功能:設(shè)置是否顯示命令執(zhí)行的響應(yīng)信息。(5)清除命令簡介格式一:CLEAR功能:清除當(dāng)前屏幕上的所有信息。格式二:CLEARALL功能:關(guān)閉所有文件,釋放所有內(nèi)存變量。格式三:CLEARMEMORY功能:釋放所有的內(nèi)存變量。格式四:CLEARTYPEAHEAD功能:清除鍵盤緩沖區(qū)。8.3 程序的基本結(jié)構(gòu)結(jié)構(gòu)化程序設(shè)計把程序的基本結(jié)構(gòu)分為三種:1、順序結(jié)構(gòu):語句按輸入的順序依次執(zhí)行。2、分支結(jié)構(gòu):語句按條件選擇執(zhí)行。3、循環(huán)結(jié)構(gòu):反復(fù)執(zhí)行循環(huán)體語句8.3 程序的基本結(jié)構(gòu)數(shù)據(jù)過程特定過程準(zhǔn)備判斷連接端點流線8.3 程序的基本結(jié)構(gòu)1.順序結(jié)構(gòu)(流程圖)順序結(jié)構(gòu)是在程序執(zhí)行時,根據(jù)程序中語句的物理順序依次執(zhí)行的命令序列。語句A語句B8.3 程序的基本結(jié)構(gòu)2、分支結(jié)構(gòu)(流程圖)雙分支

單分支表達式語句B后續(xù)語句語句A表達式后續(xù)語句語句AYNyn8.3 程序的基本結(jié)構(gòu)多路分支8.3 程序的基本結(jié)構(gòu)3、循環(huán)結(jié)構(gòu)(流程圖)當(dāng)滿足某條件時循環(huán),否則結(jié)束循環(huán)條件式語句A后續(xù)語句yn8.3.1 順序結(jié)構(gòu)順序結(jié)構(gòu)程序也稱直接程序或簡單程序。它自始至終嚴(yán)格按照程序中語句的先后順序逐條執(zhí)行。它是最基本、最普遍的結(jié)構(gòu)形式。【例8-7】在表文件中查看學(xué)號為“1161009”的學(xué)生的信息。CLEARUSE學(xué)生LOCATEFOR學(xué)號="1161009"DISPLAYUSE8.3.1 順序結(jié)構(gòu)【例8-8】請用戶為“課程”表輸入一條記錄。CLEARUSE課程?'錄入課程數(shù)據(jù)'?'================'ACCEPT'課程ID:'TOCIDACCEPT'課程名:'TOCACCEPT'類型id:'TOTIDACCEPT'學(xué)分:'TOCRACCEPT'類型:'TOT*把用戶輸入的數(shù)據(jù)插入數(shù)據(jù)庫APPENDBLANKREPLACE課程IDWITHCID,課程名WITHC,類型idWITHTID,學(xué)分WITHVAL(CR),類型WITHTUSE8.3.2 選擇結(jié)構(gòu)選擇結(jié)構(gòu)程序是按照一定條件由判斷語句或選擇語句構(gòu)成的雙重或多重走向的程序。選擇結(jié)構(gòu)可分為雙重選擇和多重選擇兩種不同的結(jié)構(gòu)形式,分別由IF語句和DOCASE語句實現(xiàn)。1. 雙重選擇結(jié)構(gòu)通常有一個入口和兩個出口,包括以下幾種情況。(1)簡單分支結(jié)構(gòu)命令格式: IF<條件表達式><語句序列>ENDIF8.3.2 選擇結(jié)構(gòu)【例8-9】詢問是否要顯示教師信息表?若是,顯示該表。CLEARUSE教師信息表WAIT"是否要顯示教師信息表?(Y/N)"TOOPIFOP$"Yy"&&或IFAT(OP,"Yy")<>0BROWENDIF8.3.2 選擇結(jié)構(gòu)(2)選擇分支結(jié)構(gòu)命令格式:IF<條件表達式><語句序列1>ELSE<語句序列2>ENDIF8.3.2 選擇結(jié)構(gòu)【例8-10】按姓名查找學(xué)生,找到則顯示該學(xué)生信息,否則顯示“查無此人!”。CLEARUSEA班學(xué)生信息ACCEPT"請輸入姓名:"TOXMLOCATEFOR姓名=XMIFFOUND() DISPELSE ?"查無此人!"ENDIF8.3.2 選擇結(jié)構(gòu)【例8-11】廣州向某地寄送特快專遞,計費標(biāo)準(zhǔn)為每克0.04元,當(dāng)郵件重量超過100克之后,超出的重量為每克0.02元,請根據(jù)郵件重量編寫程序計算郵費。CLEARINPUT"請輸入郵件的重量:"TOweightIFweight<=100f=weight*0.04ELSEf=100*0.04+(weight-100)*0.02ENDIF?"該郵件郵費為:",f8.3.2 選擇結(jié)構(gòu)(3)判斷語句嵌套在解決具體問題時,需要進行判斷的條件往往不止一個,要多次進行判斷,這就形成了條件判斷的嵌套,使得程序的結(jié)構(gòu)發(fā)生多重走向。8.3.2 選擇結(jié)構(gòu)【例8-12】根據(jù)學(xué)生的成績判定等級。當(dāng)分?jǐn)?shù)大于等于80分時輸出“優(yōu)”,分?jǐn)?shù)在80分以下且大于等于60分為“合格”,分?jǐn)?shù)小于60分時為“不合格”。SETTALKOFFCLEARINPUT"輸入學(xué)生姓名:"TOSnameINPUT"輸入學(xué)生性別:"TOSsexINPUT"輸入學(xué)生成績:"TOScore11IFScore11>=80?Sname,"",Ssex,"優(yōu)"ELSE

IFScore11<80ANDScore11>=60?Sname,"",Ssex,"合格"

ELSE?Sname,"",Ssex,"不合格"

ENDIFENDIFSETTALKON8.3.2 選擇結(jié)構(gòu)VFP允許多重嵌套。在使用嵌套時需要注意以下幾點:①在每一層嵌套中必須使用“IF---[ELSE]---ENDIF”一一對應(yīng),互相匹配;②使用嵌套語句時,層次必須清楚,“IF---ENDIF”好比一對括號,不得交叉;③為使嵌套層次清晰,便于查詢、修改,在編寫程序時,建議采用分層縮進的書寫方式。8.3.2 選擇結(jié)構(gòu)2. 多重選擇結(jié)構(gòu)命令格式:DOCASECASE<條件表達式1><語句序列1>CASE<條件表達式2><語句序列2>……CASE<條件表達式N><語句序列N>[OTHERWISE<語句序列N+1>]ENDCASE8.3.2 選擇結(jié)構(gòu)【例8-14】輸入身份代號,顯示不同的問候。CLEAR?"身份代號:1:經(jīng)理2:助理3:職員4:其他"INPUT"請輸入您的身份代號:"TOADOCASECASEA=1?"經(jīng)理,您好!"CASEA=2?"助理,您好!"CASEA=3?"女士/先生,您好!"OTHERWISE?"您好!"ENDCASE8.3.2 選擇結(jié)構(gòu)修改【例8-12】,用DOCASE…ENDCASE實現(xiàn)。SETTALKOFFCLEARINPUT"輸入學(xué)生姓名:"TOSnameINPUT"輸入學(xué)生性別:"TOSsexINPUT"輸入學(xué)生成績:"TOScore11DOCASECASEScore11>=80?Sname,"",Ssex,"優(yōu)"CASEScore11<80ANDScore11>=60?Sname,"",Ssex,"合格"CASEScore11<60?Sname,"",Ssex,"不合格"ENDCASESETTALKON

DOCASECASEScore11>=80?Sname,"",Ssex,"優(yōu)"CASEScore11<80ANDScore11>=60?Sname,"",Ssex,"合格"OTHERWISE?Sname,"",Ssex,"不合格"ENDCASE8.3.2 選擇結(jié)構(gòu)【例8-16】根據(jù)鍵入的自變量x的值,計算分段函數(shù)的函數(shù)值。SETTALKOFFCLEARINPUT"請輸入自變量x的值:"TOxDOCASE

CASEx<0y=2*x^2+1

CASEx<3y=3*x+5

CASEx<5y=x^2+5

CASEx<10y=5*x-6

OTHERWISEy=x^3-6*x^2ENDCASE?"分段函數(shù)值","f(",ALLTRIM(STR(x)),")=",ALLTRIM(STR(y))&&使用ALLTRIM()函數(shù)是為了輸出格式顯得美觀SETTALKON8.3.3 循環(huán)結(jié)構(gòu)三種類型的循環(huán)語句:1、WHILE循環(huán):(當(dāng)型) 循環(huán)的次數(shù)不確定的,用其他條件式控制2、FOR循環(huán):(步長型) 能確定循環(huán)的次數(shù)的情況3、SCAN循環(huán):(掃描型或指針型) 對數(shù)據(jù)表的記錄操作8.3.3 循環(huán)結(jié)構(gòu)1. 當(dāng)型循環(huán)根據(jù)條件表達式的值決定循環(huán)體內(nèi)語句的執(zhí)行次數(shù)。DOWHILE<條件表達式><語句序列1>[LOOP]<語句序列2>[EXIT]<語句序列3>ENDDO8.3.3 循環(huán)結(jié)構(gòu)【例8-17】編程求和S=1+2+3+…+100。CLEARJ=1sum=0DOWHILEJ<=100sum=sum+JJ=J+1ENDDO?"從1到100的和是:"+ALLTRIM(STR(sum))8.3.3 循環(huán)結(jié)構(gòu)【例8-18】輸出“學(xué)生”表中1982年出生的學(xué)生記錄。CLEARUSE學(xué)生LOCATEFORYEAR(出生日期)=1982DOWHILENOTEOF()DISPLAY*WAIT"請按任意鍵顯示下一條記錄!"

CONTINUEENDDO?"查詢結(jié)束。"8.3.3 循環(huán)結(jié)構(gòu)上例程序的另一寫法:CLEARUSE學(xué)生INDEXONYEAR(出生日期)TAGbirthdaySEEK1982DOWHILENOTEOF()DISPLAYWAIT"請按任意鍵顯示下一條記錄!"

SKIP

IFYEAR(出生日期)!=1982

EXIT

ENDIFENDDO?"查詢結(jié)束。"exit用法8.3.3 循環(huán)結(jié)構(gòu)【例8-19】輸出“教師信息表”中職稱為“副教授”的教師基本信息,并統(tǒng)計出“副教授”的人數(shù)。CLEARUSE教師信息表DOWHILENOTEOF()

IF職稱<>"副教授"

SKIP

LOOP

ENDIFDISPLAY

SKIPENDDOCOUNTFOR職稱="副教授"TOP_NO?"以上顯示的是副教授的基本信息,共計有:"+STR(P_NO)+"人"Loop用法Loop和exit用法找到了嗎?顯示“查無此人!顯示該人信息從鍵盤接收輸入姓名定位NY3次以上?NYloopexitClearI=0useA班學(xué)生信息dowhile.t.accept"請輸入姓名:"toxmI=I+1

locatefor姓名=xmifnotfound()?"查無此人!"

ifI<3loopendifelsedispendifexitenddo?"bye!"returnLoop和exit用法ClearuseA班學(xué)生信息fori=1to3accept"請輸入姓名:"toxmlocatefor姓名=xmifnotfound()?"查無此人!"

loopelsedispendif

exitendfor?"bye!"return……Loop……Exit……跳到循環(huán)開始處跳到循環(huán)的后繼語句限制最多3次8.3.3 循環(huán)結(jié)構(gòu)2. 步長型循環(huán)FOR<循環(huán)變量>=<初值>TO<終值>[STEP<步長>]

<語句序列1>[LOOP]<語句序列2>[EXIT]<語句序列3>ENDFOR(或NEXT)8.3.3 循環(huán)結(jié)構(gòu)【例8-20】有FOR…ENDFOR語句求出1~200之間的偶數(shù)的和。SETTALKOFFCLEARS=0FORI=1TO200STEP2S=S+I-1ENDFOR?"1到200之間的偶數(shù)和為:"+ALLTRIM(STR(S))SETTALKON

8.3.3 循環(huán)結(jié)構(gòu)3. 表掃描型循環(huán)SCAN[<范圍>][FOR<條件表達式1>][WHILE<條件表達式2>]

<語句序列1>[LOOP]<語句序列2>[EXIT]<語句序列3>ENDSCAN命令功能:在當(dāng)前表中從首記錄開始逐個移動記錄指針掃描全部記錄,對于符合條件的記錄執(zhí)行循環(huán)體規(guī)定的操作。

特點:“指針”自動移動(不需要SKIP)8.3.3 循環(huán)結(jié)構(gòu)【例8-22】統(tǒng)計“學(xué)生”表中男學(xué)生的人數(shù)CLEARN=0USE學(xué)生SCANFOR性別="男"N=N+1ENDSCAN?"學(xué)生表中男學(xué)生的人數(shù)是:",N

與當(dāng)循環(huán)比較:DOWHILE.NOT.EOF() IF性別="男" N=N+1 ENDIF

SKIP&&當(dāng)循環(huán)要使用SKIP來移去指針ENDDO

8.3.3 循環(huán)結(jié)構(gòu)【例8-23】用表掃描循環(huán)結(jié)構(gòu)將教師信息表中基礎(chǔ)工資小于1000的姓名、基礎(chǔ)工資兩個字段輸出,并統(tǒng)計這些職工的人數(shù)。SETTALKOFFCLEARUSE教師信息表n=0SCANFOR基礎(chǔ)工資<1000?姓名,基礎(chǔ)工資n=n+1ENDSCAN?"基礎(chǔ)工資在1000元以下的人數(shù)有:"+STR(N,2)+"人。"SETTALKON8.3.3 循環(huán)結(jié)構(gòu)【例8-24】統(tǒng)計“學(xué)生”表中各個專業(yè)的人數(shù)。(SCAN中套CASE)CLEARSTORE0TOA,B,C,DUSE學(xué)生SCAN

DOCASE

CASE專業(yè)="土木工程"A=A+1

CASE專業(yè)="計算機"B=B+1

CASE專業(yè)="電子"C=C+1

CASE專業(yè)="機電"D=D+1

ENDCASEENDSCAN?"土木工程專業(yè)的人數(shù)為:",ALLTRIM(STR(A))?"計算機專業(yè)的人數(shù)為:",ALLTRIM(STR(B))?"電子專業(yè)的人數(shù)為:",ALLTRIM(STR(C))?"機電專業(yè)的人數(shù)為:",ALLTRIM(STR(D))SETTALKON8.3.3 循環(huán)結(jié)構(gòu)4. 多重循環(huán)(循環(huán)嵌套)DOWHILE〈條件表達式1〉〈語句行序列11〉DOWHILE〈條件表達式2〉〈語句行序列21〉DOWHILE〈條件表達式3〉〈語句行序列31〉……ENDDO &&3〈語句序列22〉ENDDO &&2〈語句行序列12〉ENDDO &&18.3.3 循環(huán)結(jié)構(gòu)【例8-25】打印一個6行5列的自然數(shù)矩陣。SETTALKOFFCLEARDIMEA(6,5)FORI=1TO30A(I)=IENDFORFORI=1TO6

FORJ=1TO5??A(I,J)

ENDFOR?ENDFORSETTALKON二維數(shù)組可以當(dāng)作一維數(shù)組來處理8.3.3 循環(huán)結(jié)構(gòu)【例8-27】編寫程序,輸出九九乘法表。CLEARFORY=1TO9FORX=1TO9Z=Y*X*??Y,"*",X,"=",Z??STR(Y,1)+"*"+STR(X,1)+"="+STR(Z,2)+""

ENDFOR?ENDFOR

8.4 過程與過程調(diào)用在應(yīng)用程序系統(tǒng)中,一般是根據(jù)實際需要將整個系統(tǒng)劃分為若干個模塊,然后在主控模塊的控制下,調(diào)用各個功能模塊實現(xiàn)系統(tǒng)的各種功能操作。通常將這些可被調(diào)用的功能模塊或能完成某種特定功能的獨立程序稱作過程或子程序,而把調(diào)用其他程序而沒有被其他程序調(diào)用的程序段,稱為主程序。8.4.1 子程序結(jié)構(gòu)化程序的總體結(jié)構(gòu):主模塊子模塊子模塊子模塊……調(diào)用返回8.4.1 子程序子程序的建立方法與程序文件的建立方法相同,擴展名為.prg。調(diào)用子程序的命令格式為:DO<子程序名>[WITH<參數(shù)表>][WITH<參數(shù)表>]指定傳遞到子程序的參數(shù)【例8-28】編寫主程序調(diào)用子程序,計算Z=f(x1)+f(x2)+f(x3)的值,其中f(x)=x2+1。*主程序開始INPUT"x1="TOx1INPUT"x2="TOx2INPUT"x3="TOx3STORE0TOz,yx=x1DOSUB &&調(diào)用子程序SUB,求f(x1)z=z+y &&將結(jié)果y加入z,下同x=x2DOSUB &&調(diào)用子程序SUB,求f(x2)z=z+yx=x3DOSUB &&調(diào)用子程序SUB,求f(x3)z=z+y?"z=",zRETURN*子程序開始,文件名為:sub.prgy=x^2+1RETURN

8.4.2 過程的定義與調(diào)用過程定義的命令格式為:PROCEDURE<過程名>[PARAMETER<形式參數(shù)表>]<語句序列>RETURN[表達式][ENDPROC]過程調(diào)用的命令格式為:DO<過程名>[IN<文件名>][WITH<實際參數(shù)表>]

8.4.2 過程的定義與調(diào)用【例8-29】編寫過程求圓的面積并在主程序內(nèi)調(diào)用這個過程。SETTALKOFFCLEARDOAREA

&&調(diào)用過程SETTALKONPROCEDUREAREA &&過程開始STORE0TORINPUT"請輸入圓的半徑:"TORS=3.14156*R*R?"圓的面積為:"+STR(S,8,5)

為什么要使用過程

有時,在一個程序的執(zhí)行過程中,可能需要多次執(zhí)行到某個程序段。這時,用戶也可以把這個需要反復(fù)執(zhí)行的程序段編成為獨立的程序。當(dāng)需要執(zhí)行到這個程序段時,以合適的形式調(diào)用執(zhí)行這個程序段。[例如]編寫程序計算從m個元素中取n個的組合數(shù),即計算

該公式用到了三個階乘。為了避免重復(fù),可以把階乘的計算用一個子程序來實現(xiàn)。8.4.3 過程文件的建立與調(diào)用過程可以作為一個文件獨立地存儲在磁盤上,因此,每調(diào)用一次過程都要打開一個磁盤文件。(外部過程)所謂過程文件就是過程的集合。其中每個過程用PROCEDURE<過程名>來標(biāo)識過程文件中的過程又稱作內(nèi)部過程

過程文件的命令格式如下:[<主程序>…………]PROCEDURE

<過程名1><語句序列1>RETURNPROCEDURE

<過程名2><語句序列2>RETURN……PROCEDURE

<過程名n><語句序列n>RETURN過程文件的建立和修改命令的命令格式為:MODIFYCOMMAND<過程文件名>

1)過程文件的類型名:.PRG2)一個過程文件中最多可以有一個主程序,且必須放在最前。打開過程文件的命令格式為:SETPROCEDURETO<過程文件名>該命令打開指定的過程文件,并將過程文件中所包含的過程全部調(diào)入內(nèi)存。過程文件的調(diào)用命令格式為:DO<過程文件>[WITH<實際參數(shù)表>]系統(tǒng)同一時刻只能打開一個過程文件。若要修改過程文件內(nèi)容,則一定要先關(guān)閉該過程文件。關(guān)閉過程文件的命令格式為:格式1:CLOSEPROCEDURE格式2:SETPROCEDURETO當(dāng)退出VFP系統(tǒng)時,所有已打開的過程文件將會自動關(guān)閉?!纠?-30】一個過程定義和調(diào)用的示例

文件f1.prg的程序內(nèi)容為:*主程序:f1.prgCLEARSETPROCEDURETOf3&&打開過程文件f3DOf2 &&調(diào)用DOp1*過程p1PROCEDUREp1?"調(diào)用p3()"?"返回值:",p3()ENDPROC文件f2.prg的內(nèi)容為:*子程序f2.prg?"子程序f2開始"?"調(diào)用p2()"x=p2()?"子程序f2結(jié)束"RETURN*過程文件f3.prgPROCEDUREp2RETURNPROCEDUREp3RETURN1008.4.4 變量的作用域一、變量的作用域(內(nèi)存變量的作用范圍)有三種內(nèi)存變量:全局變量:在關(guān)閉VFP應(yīng)用程序之前一直有效。用PUBLIC語句來定義全局變量。局部變量:在定義它的程序段以及由它所調(diào)用到的子程序中保持有效。用PRIVATE語句來定義局部變量。私有變量:在定義它的程序段才有效。用LOCAL語句來定義私有變量。8.4.4 變量的作用域(1)全局變量程序執(zhí)行完畢,它們不會在內(nèi)存中自動釋放,必須使用RELEASE命令予以清除。在VFP的命令窗口中建立的內(nèi)存變量,系統(tǒng)默認(rèn)為全局變量,并賦初值邏輯假。定義方式有兩種:格式1:PUBLIC<內(nèi)存變量表>該命令是將<內(nèi)存變量表>中指定的內(nèi)存變量定義為全局變量。格式2:PUBLIC<數(shù)組名>(<數(shù)值表達式1>[,<數(shù)值表達式2>])[<數(shù)組名>(<數(shù)值表達式3>[,<數(shù)值表達式4>])…]該命令定義數(shù)組變量并將其元素定義為全局變量?!纠?-31】主程序和過程中的全局變量。SETTALKOFFCLEARPUBLICAA=1DOSUB_PROC?“主程序中:A,B,C,DRETURN*過程ProcSUB_PROCPUBLICB,CB=2D=3?"在過程中:A,B,C,DRETURNSETTALKON由于變量D不是全局變量,在主程序中不能被識別全局變量全局變量全局變量8.4.4 變量的作用域(2)局部變量局部變量只能在建立它的模塊中使用,不能在上層或下層模塊中使用。當(dāng)建立它的模塊程序運行結(jié)束時,局部變量將自動釋放。定義局部變量的命令格式為:LOCAL<內(nèi)存變量表>建立局部變量時,系統(tǒng)賦初值邏輯假。局部變量要建立后使用?!纠?-32】局部變量的使用。CLEARLOCALXX=10DOSUB?Y&&出錯:找不到變量Y(因為Y是過程中局部變量)RETURNPROCEDURESUBLOCALYY=20?X&&出錯:找不到變量X(因為X是主程序中局部變量)RETURN8.4.4 變量的作用域(3)私有變量沒有通過PUBLIC或者LOCAL命令事先聲明。作用域是建立它的模塊及其下屬的各層模塊命令格式為:PRIVATE[<內(nèi)存變量表>]|[ALL[LIKE/EXCEPT<通配符>]]此命令作用是隱藏在上層模塊中可能已經(jīng)存在的內(nèi)存變量,使得這些變量在當(dāng)前模塊程序中暫時無效。此時,這些變量名就可用來命名在當(dāng)前模塊中需要的私有變量或者局部變量。當(dāng)前模塊程序運行結(jié)束返回上層模塊時,被隱藏的內(nèi)存變量就自動恢復(fù)有效性,并保持原有的取值。【例8-33】私有變量的使用。CLEARA=1B=2D=0?"主程序中:A=",A,"B=",B,"D=",DDOSUB1&&調(diào)用過程?'返主程序后:A=',A,'B=',B,'C=',C,'D=',DRETURNPROCSUB1PRIVATEB,DPUBLICCA=10B=11C=12D=13?'在過程中:A=',A,'B=',B,'C=',C,'D=',DRETURN過程中變量主程序中的變量恢復(fù)為主程序中的變量【例8-34】局部變量和私有變量比較示例。CLEARPUBLICx,y &&定義全局變量x=5y=10DOSUB2?x,y&&顯示5,bbbRETURN*SUB3PROCEDURESUB3x=“aaa“&&x為SUB2中建立的私有變量&&其值上傳y="bbb“&&y為全局變量RETURN*SUB2PROCEDURESUB2PRIVATEx &&隱藏主程序中xx=50 &&建立私有變量LOCALy&&建立局部變量y&&僅在SUB2中使用DOSUB3?x,y&&x為SUB2中變量&&x的值在SUB3中被修改RETURN12348.4.5過程調(diào)用中的參數(shù)傳遞在VFP中把向過程發(fā)送消息稱為過程調(diào)用中的參數(shù)傳遞。方法是:在定義過程時,設(shè)置一個參數(shù)表,用來接收過程調(diào)用時傳遞來的參數(shù),稱為形式參數(shù)表;在調(diào)用過程時,通過一個參數(shù)表向被調(diào)用過程傳遞實際值,這個參數(shù)表稱為實際參數(shù)表。這兩個參數(shù)表中參數(shù)個數(shù)相同,數(shù)據(jù)類型一致且排序順序一一對應(yīng)。

8.4.5過程調(diào)用中的參數(shù)傳遞1.接收參數(shù)命令格式1:PARAMETERS<形式參數(shù)表>格式2:LPARAMETERS<形式參數(shù)表>說明:(1)該命令必須位于被調(diào)用過程的第一條可執(zhí)行語句處。(2)格式1聲明的形參變量被看作是建立的私有變量,格式2中聲明的形參變量看作是模塊程序中建立的局部變量,除此之外,二者沒有區(qū)別。(3)形式參數(shù)一般為內(nèi)存變量。8.4.5過程調(diào)用中的參數(shù)傳遞2.通過過程調(diào)用命令傳遞參數(shù)格式1:DO<文件名>|<過程名>WITH<實際參數(shù)表>格式2:<文件名>|<過程名>(<實際參數(shù)表>)說明:(1)實參可以是常量、變量,表達式。調(diào)用時,系統(tǒng)自動把實參傳遞給對應(yīng)的形參。形參的數(shù)目不能少于實參的數(shù)目,否則系統(tǒng)會產(chǎn)生運行錯誤。如果形參數(shù)目多于實參數(shù)目,多余的形參將取邏輯假.F.。(2)采用格式1時,由于實參形式的不同,參數(shù)傳遞有兩種方式:按值傳送按址傳送8.4.5過程調(diào)用中的參數(shù)傳遞(按值傳遞)當(dāng)實參是常量、函數(shù)、表達式或字段變量時,在實參與形參之間的參數(shù)傳遞是按值傳送的。這時在調(diào)用過程時,形參所得到的是實參的值,過程調(diào)用結(jié)束時,實參將得不到形參的值。按值傳送時,實參與形參之間的傳遞是單向的。只是實參向形參傳遞值。按值傳送例子CLEARSETPROCTOP3-4DIMEA(3),G(2)G(1)=20STORE3TOB,CA=5DOPWITHA(2),B+4,C,G?A(2),B,C,G(1)SETTALKONRETURNPROCEDUREPPARAX,Y,Z,UX=X+10Y=2*YZ=Y+ZU(1)=X+Y+Z?X,Y,Z,U(1)ENDPROC輸入、出參數(shù)傳值8.4.5過程調(diào)用中的參數(shù)傳遞(按址傳遞)當(dāng)實參是內(nèi)存變量或數(shù)組名時,在實參與形參之間的參數(shù)傳遞是按地址傳送的。這時在調(diào)用過程時,形參所得到的是實參的地址,過程調(diào)用結(jié)束時,實參將得到與形參相同的值。按址傳送時,實參與形參之間的傳遞是雙向的,即可以是輸入?yún)?shù),也可以是輸出參數(shù)(返回值)。按址傳送:用過程文件實現(xiàn)SETPROCTOP3-3STORE0TOA,B,CINPUT"M="TOMINPUT"N="TONDOSUBWITHM,ADOSUBWITHN,BDOSUBWITHM-N,CW=A/(B*C)?"W="+STR(W,7)RETURNPROCSUBPARAMETERK,TT=1FORI=1TOKT=T*IENDFORRETURN形式參數(shù)實際參數(shù)輸入?yún)?shù)輸出參數(shù)8.4.5過程調(diào)用中的參數(shù)傳遞2.通過過程調(diào)用命令傳遞參數(shù)格式1:DO<文件名>|<過程名>WITH<實際參數(shù)表>格式2:<文件名>|<過程名>(<實際參數(shù)表>)(3)采用格式2時,默認(rèn)以按值方式傳遞參數(shù)。如果實參是變量,可以通過命令重新設(shè)置參數(shù)傳遞方式。重新設(shè)置參數(shù)傳遞方式命令如下:

SETUDFPARMSTOREFERENCE|VALUE說明:TOVALUE:按值傳遞。TOREFERENCE:按址傳遞?!纠?-36】按值傳遞和按地址傳遞示例。CLEARSTORE100TOx1,x2SETUDFPARMSTOVALUE&&設(shè)置按值傳遞DOP1WITHx1,(x2)

&&x1按地址傳遞,(x2)按值傳遞?"第一次:",x1,x2STORE100TOx1,x2P1(x1,(x2))

&&x1,(x2)都按值傳遞?"第二次:",x1,x2SETUDFPARMSTOREFERENCE &&設(shè)置引用傳遞DOP1WITHx1,(x2)

&&x1按地址傳遞,(x2)按值傳遞?"第三次:",x1,x2STORE100TOx1,x2P1(x1,(x2))

&&x1按地址傳遞,(x2)按值傳遞?"第四次:",x1,x2RETURNPROCEDUREP1PARAMETERSx1,x2STOREx1+1TOx1STOREx2+1TOx2ENDPROC(x2)有一對圓括號,是一般形式的表達式,所以總是按值傳遞。8.5數(shù)組8.5.1數(shù)組的建立及使用數(shù)組是具有相同變量名并在內(nèi)存中占有連續(xù)存儲單元的一組數(shù)據(jù),數(shù)組中的各個變量稱為數(shù)組元素。每一個數(shù)組元素在內(nèi)存中獨占一個內(nèi)存單元。為了區(qū)分不同的數(shù)組元素,每一個數(shù)組元素都是通過數(shù)組名和下標(biāo)來訪問的。數(shù)組與變量具有相同的作用域原則,可以存儲任何類型的數(shù)據(jù),數(shù)組必須先定義后使用。8.5.1數(shù)組的建立及使用1.數(shù)組的定義格式:DIMENSION|DECLARE<數(shù)組名1>(<下標(biāo)1>[,<下標(biāo)2>])[,<數(shù)組名2>(<下標(biāo)1>[,<下標(biāo)2>])]……8.5.1數(shù)組的建立及使用在VFP中,規(guī)定數(shù)組下標(biāo)的下界為1,最大值將受內(nèi)存的限制。使用數(shù)組名及下標(biāo)為數(shù)組元素賦值。例如:DIMENSIONx(3),a(2,3)x為一維數(shù)組數(shù)組x有3個數(shù)組元素,分別為x(1)、x(2)和x(3)a為二維數(shù)組數(shù)組a有2行3列,共6個元素,分別表示為a(1,1)、a(1,2)、a(1,3)、a(2,1)、a(2,2)、a(2,3)8.5.1數(shù)組的建立及使用2.數(shù)組的賦值給數(shù)組賦值,就是分別給每個數(shù)組元素賦值,與給內(nèi)存變量賦值操作完全相同。格式1:

STORE<表達式>TO<數(shù)組名/數(shù)組元素>功能:將表達式的值賦給數(shù)組中所有元素或某一個元素。例如:

STORE0TOA&&將數(shù)值0賦給數(shù)組A的所有元素

STORE"陳紅"TOA(2,1)

&&將“李磊”賦給數(shù)組A的第2行第1列的元素格式2:

<數(shù)組名/數(shù)組元素>=<表達式>功能:可以用賦值語句直接賦值給數(shù)組。例如:

A=.T. &&將邏輯真值賦給數(shù)組A的所有元素8.5.1數(shù)組的建立及使用【例8-37】定義一維數(shù)組,給數(shù)組賦值并輸出結(jié)果。CLEARDIMENSIONx(3)x=5 &&賦值給數(shù)據(jù)所有元素DIMENSIONy(3)STORE3TOy(1),y(2) &&賦值給數(shù)組前兩個元素?"x:",x(1),x(2),x(3)?"y:",y(1),y(2),y(3) &&y(3)的值顯示為.F.8.5.1數(shù)組的建立及使用數(shù)組變量建立后,數(shù)組中的每一個元素的其性質(zhì)及其使用方法與普通內(nèi)存變量是類似的注意:(1)可用STORE命令或其他各種能對內(nèi)存變量賦值的命令對某個數(shù)組元素賦值;(2)可用LIST|DISPLAYMEMORY、RELEASE、CLEARMEMORY等命令查看、釋放或清除已建立的數(shù)組變量;(3)可用SAVE命令將數(shù)組存入內(nèi)存變量文件(.mem),或用RESTORE命令將其恢復(fù)到內(nèi)存中來。(4)在同一運行環(huán)境中,應(yīng)注意數(shù)組名與一般的內(nèi)存變量名不要重名。8.5.1數(shù)組的建立及使用【例8-38】定義二維數(shù)組,給數(shù)組賦值并輸出結(jié)果。CLEARMEMORYDIMENSIONaa(2,3)aa(1,1)="王楠"aa(2

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論