VF程序文件的建立與設(shè)計
程序文件的建立與設(shè)計:
Visual FoxPro程序文件,是一個以(.PRG)為擴展名的文本文件。任何可以建立、編輯文本文件的工具,都可以創(chuàng)建和編輯Visual FoxPro程序文件。這些文本編輯工具,可以是Visual FoxPro系統(tǒng)提供的內(nèi)部編輯器,也可以是其它常用文本編輯軟件。在文本編輯環(huán)境下,不僅可以對程序文件進行輸入和修改,還可以實現(xiàn)字符串查找、替換、刪除和編輯功能。
建立、編輯程序文件有兩種方式: ??????
1.命令方式: MODIFY ?COMMAND ?〈程序文件名〉
2.菜單方式 : 打開“文件”菜單,選擇“新建”;在“新建”窗口,選擇“程序”,再選擇“新建文件”;在“程序文件”編輯窗口,輸入程序文件并保存,此時建立程序文件的操作結(jié)束。
程序文件的調(diào)用:即運行程序文件,是程序文件建立的最終目的。在Visual FoxPro系統(tǒng)中,調(diào)用程序文件有很多方法,在這里僅介紹其中兩種方法。
1.命令方式:在Command 窗口中,輸入如下命令,則程序文件被調(diào)用。
???????????命令格式: DO ?〈程序文件名〉
2.菜單方式
以菜單方式調(diào)用程序文件,操作方法如下:
?????(1)在Visual FoxPro系統(tǒng)主菜單下,打開“程序”菜單,選擇“運行”。
????(2)在“運行”窗口,輸入被調(diào)用的程序文件名即可。
程序的基本結(jié)構(gòu):
Visual FoxPro系統(tǒng)提供的命令豐富,且功能強大,把這些命令和程序設(shè)計語句有效地組織在一起,就形成了實現(xiàn)某一特定功能的程序。
Visual FoxPro系統(tǒng)的程序有兩個特點:一是程序控制流模式,由順序、分支、循環(huán)三種基本結(jié)構(gòu)構(gòu)成。二是面向?qū)ο罂梢暬慕Y(jié)構(gòu)程序模塊,在每個模塊的內(nèi)部也是由程序控制流組成。
常見的控制結(jié)構(gòu)如下: ??????????????
1.順序結(jié)構(gòu)(第35套)
???????順序結(jié)構(gòu)是在程序執(zhí)行時,根據(jù)程序中語句的書寫順序依次執(zhí)行的命令序列。Visual FoxPro系統(tǒng)中的大多數(shù)命令都可以作為順序結(jié)構(gòu)中的語句。
?2.分支結(jié)構(gòu):分支結(jié)構(gòu)是在程序執(zhí)行時,根據(jù)不同的條件,選擇執(zhí)行不同的程序語句,用來解決有選擇、有轉(zhuǎn)移的諸多問題。
3.循環(huán)結(jié)構(gòu)
????循環(huán)結(jié)構(gòu)則能夠使某些語句或程序段重復(fù)執(zhí)行若干次。如果某些語句或程序段需要在一個固定的位置上重復(fù)操作,使用循環(huán)是最好的選擇。
4.過程結(jié)構(gòu)
?在許多應(yīng)用程序中,有一些程序段需要反復(fù)執(zhí)行多次,這些程序段不在一個固定的位置上,而是分散在程序的許多位置上重復(fù)執(zhí)行,可將其與嵌入它的程序分開,形成獨立的程序序列,待使用時再調(diào)入程序中,以實現(xiàn)不同位置上的重復(fù)操作。這樣做增強了程序的可讀性和模塊化。我們稱這種具有獨立功能而且可以被其它程序調(diào)用的程序序列為過程。
分支結(jié)構(gòu)-單向分支
分支結(jié)構(gòu)形式有如下三種:
1.單向分支:即根據(jù)用戶設(shè)置的條件表達式的值,決定某一操作是否執(zhí)行。
(1)語句格式:
???????????IF〈條件表達式〉
????????????〈命令行序列〉 ????
???????????ENDIF
(2)語句功能:
??????該語句首先計算〈條件表達式〉的值,當〈條件表達式〉的值為真時,執(zhí)行〈命令行序列〉;否則,執(zhí)行ENDIF后面的第一條命令。
2.雙向分支:即根據(jù)用戶設(shè)置的條件表達式的值,選擇兩個操作中的一個來執(zhí)行。
(1)語句格式:
??????????IF〈條件表達式〉
?????????〈命令行序列1〉
???????ELSE
????????????〈命令行序列2〉
???????ENDIF
(2)語句功能:
???????該語句首先計算〈條件表達式〉的值,當〈條件表達式〉的值為真時,執(zhí)行〈命令行序列1〉中的命令;否則,執(zhí)行〈命令行序列2〉中的命令;執(zhí)行完〈命令行序列1〉或〈命令行序列2〉后都將執(zhí)行ENDIF后面的第一條命令。
3.多向分支:,即根據(jù)多個條件表達式的值,選擇執(zhí)行多個操作中的一個對應(yīng)執(zhí)行 。
(1)語句格式:
???????DO CASE
?????????CASE〈條件表達式1〉
???????????〈命令行序列1〉
????????[CASE〈條件表達式2〉
???????????〈命令行序列2〉
?????????????… …
???????????CASE〈條件表達式N〉
???????????〈命令行序列N〉]
???????????[OTHERWISE
????????????〈命令行序列N+1〉]
???????ENDCASE
(2)語句功能:該語句根據(jù)給出的N個〈條件表達式〉的值,選擇N+1個〈命令行序列〉中的一個執(zhí)行。當所有CASE中〈條件表達式〉的值都是假時,如果有OTHERWISE項,則執(zhí)行〈命令行序列N+1〉,再執(zhí)行ENDCASE后面的第一條命令;否則,直接執(zhí)行ENDCASE后面的第一條命令。
使用分支語句應(yīng)注意的幾點:
(1)IF… … ENDIF和DO CASE… … ENDCASE 必須配對使用,DO CASE與第一個CASE〈條件表達式〉之間不應(yīng)有任何命令。
(2)〈條件表達式〉可以是各種表達式或函數(shù)的組合,其值必須是邏輯值。
(3)〈命令行序列〉可以由一個或多個命令組成,可以是條件控制語句組成的嵌套結(jié)構(gòu)。
(4)DO CASE… … ENDCASE 命令,每次最多只能執(zhí)行一個〈命令行序列〉。在多個CASE項的〈條件表達式〉值為真時,只執(zhí)行第一個〈條件表達式〉值為真的〈命令行序列〉,然后執(zhí)行ENDCASE的后面的第一條命令。
?循環(huán)結(jié)構(gòu)- “當”型循環(huán) ??常用的循環(huán)語句有以下三種形式:
?1.“當”型循環(huán)控制語句,即根據(jù)條件表達式的值,決定循環(huán)體內(nèi)語句的執(zhí)行次數(shù)。
(1)語句格式:
????????DO WHILE 〈條件表達式〉
???????〈命令行序列〉
[LOOP/EXIT]
????????ENDDO
(2)語句功能:該語句通過〈條件表達式〉的值來控制循環(huán)。執(zhí)行語句時,反復(fù)判斷〈條件表達式〉的值,當〈條件表達式〉的值為“真”時,執(zhí)行〈命令行序列〉;否則,結(jié)束循環(huán),并執(zhí)行ENDDO 后面的第一條命令。
循環(huán)結(jié)構(gòu)- “計數(shù)”型循環(huán)
2.“計數(shù)”型循環(huán)控制語句,即根據(jù)用戶設(shè)置的循環(huán)變量的初值、終值和步長,決定循環(huán)體內(nèi)語句的執(zhí)行次數(shù)據(jù)。
(1)語句格式:
FOR〈循環(huán)變量〉=〈循環(huán)變量初值〉TO〈循環(huán) ?? 變量 終值〉[STEP〈循環(huán)變量步長〉]
? 〈命令行序列〉
? [LOOP/EXIT]
???ENDFOR|NEXT
(2)語句功能:該語句用〈循環(huán)變量〉來控制〈命令行序列〉的執(zhí)行次數(shù)。執(zhí)行語句時,首先將〈循環(huán)變量初值〉賦給〈循環(huán)變量〉,然后判斷〈循環(huán)變量〉是否大于或小于〈循環(huán)變量終值〉,若結(jié)果為“真”,則結(jié)束循環(huán),執(zhí)行ENDFOR 后面的第一條命令;否則,執(zhí)行〈命令行序列〉,〈循環(huán)變量〉自動按〈循環(huán)變量步長〉增加或減少,再重新判斷〈循環(huán)變量〉當前的值是否大于或小于〈循環(huán)變量終值〉,直到其結(jié)果為真。
循環(huán)結(jié)構(gòu)- “指針”型循環(huán)
3.“指針”型循環(huán)控制語句,即根據(jù)用戶設(shè)置的表中的當前記錄指針,決定循環(huán)體內(nèi)語句的執(zhí)行次數(shù)據(jù)。
(1)語句格式:
???????SCAN[〈范圍〉][FOR〈條件表達式〉
〈命令行序列〉
[LOOP/EXIT]
???????ENDSCAN
(2)語句功能: 該語句在指定的范圍內(nèi),用數(shù)據(jù)記錄指針來控制循環(huán)次數(shù)。執(zhí)行語句時,首先判斷函數(shù)EOF()的值,若其值為“真”,則結(jié)束循環(huán),否則,結(jié)合〈條件表達式1〉或〈條件表達式2〉,執(zhí)行〈命令行序列〉,記錄指針移到指定的范圍和條件內(nèi)的下一條記錄,重新判斷函數(shù)EOF()的值,直到函數(shù)EOF()的值為真時結(jié)束循環(huán)。
使用循環(huán)語句時應(yīng)注意的幾點
(1)DO WHILE和ENDDO、FOR和ENDFOR、SCAN和ENDSCAN必須配對使用。
(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ù),但是不能單獨使用。EXIT的功能是跳出循環(huán),轉(zhuǎn)去執(zhí)行ENDDO、ENDFOR、ENDSCAN后面的第一條命令;LOOP的功能是轉(zhuǎn)回到循環(huán)的開始處,重新對“條件”進行判斷,相當于執(zhí)行了一次ENDDO、ENDFOR、ENDSCAN命令,它可以改變〈命令行序列〉中部分命令的執(zhí)行次數(shù)。EXIT、LOOP可以出現(xiàn)在〈命令行序列〉的任意位置。
過程
在Visual FoxPro系統(tǒng)中,程序是獨立存放在磁盤上的程序文件,使用時用戶通過文件名調(diào)用并執(zhí)行。為了實現(xiàn)用戶的某種目的,很可能需要由多個程序完成。
1.調(diào)用過程語句,即執(zhí)行已有的過程。
(1)語句格式: DO 〈過程名〉
(2)語句功能:執(zhí)行以〈過程名〉為名的過程。
2.過程返回語句,即返回過程的調(diào)用處。
(1)語句格式:RETURN[TO MASTER|TO〈過程名〉]
(2)語句功能:將控制返回到調(diào)用程序中調(diào)用命令的下一語句。
簡單的輸入輸出命令
1.ACCEPT命令
【格式】:ACCEPT ?[<提示信息>] ?TO ?<內(nèi)存變量>
【功能】在程序執(zhí)行過程中,將用戶交互式輸入的內(nèi)容作為字符串賦值給指定內(nèi)存變量。
該命令只接受字符型數(shù)據(jù),輸入的字符串不需要加定界符
2.INPUT命令
【格式】: INPUT ?[<提示信息>] ?TO ?<內(nèi)存變量>
【功能】在程序執(zhí)行過程中,將用戶交互式輸入的內(nèi)容賦值給指定內(nèi)存變量
可以輸入字符型、數(shù)值型、邏輯型、日期型和日期時間型等類型數(shù)據(jù),而且可以是常量、變量、函數(shù)或表達式等形式,按回車鍵結(jié)束輸入,系統(tǒng)將輸入的數(shù)據(jù)賦值給<內(nèi)存變量>。
3.WAIT命令
【格式】: WAIT [<提示信息>][TO<內(nèi)存變量>]
【功能】顯示提示信息,暫停程序執(zhí)行,直到用戶按任意鍵或單擊鼠標時繼續(xù)執(zhí)行程序。
若選擇可選項[TO <內(nèi)存變量>],將輸入的單個字符作為字符型數(shù)據(jù)賦給指定的<內(nèi)存變量>;若用戶是按Enter鍵或單擊鼠標,<內(nèi)存變量>的值為空串。若省略所有可選項,屏幕顯示“鍵入任意鍵繼續(xù)……”默認提示信息
三條輸入命令的異同:ACCEPT命令只能接受字符型數(shù)據(jù),不需定界符,輸入完畢按回車鍵結(jié)束;WAIT命令只能輸入單個字符,且不需定界符,輸入完畢不需按回車鍵; INPUT命令可接受數(shù)值型、字符型、邏輯型、日期型和日期時間型數(shù)據(jù),數(shù)據(jù)形式可以是常量、變量、函數(shù)和表達式,如果是字符串,需用定界符,輸入完畢按回車鍵結(jié)束。
4.定位輸入命令
【命令】:@<行,列>SAY<提示信息>| GET <變量>READ
【功能】在屏幕指定的行列位置輸入數(shù)據(jù)。
【說明】命令中的各選項說明如下:
<行,列>是指屏幕窗口的位置。
SAY<提示信息>給出提示信息。
GET <變量>取得變量的值。
GET子句必須使用命令READ激活。
GET <變量>必須先定義再使用。比如先申請為多個寬度的空格
內(nèi)存變量的作用域-全局變量
1.全局變量,指在所有程序模塊中都有效的內(nèi)存變量
在程序或過程中定義全局變量的語句為:
【格式】PUBLIC <內(nèi)存變量表>
例:Public X,Y ??????&& X、Y被顯示定義為全局變量
????Z=0 ?????????????&&Z變量被隱式定義
?????Y,Z ?????????&& Y=.F. ?Z=0,變量的初始值為.F.
【說明】(1)當定義多個變量時,各變量名之間用逗號隔開;
(2)用PUBLIC語句定義過的內(nèi)存變量,在程序執(zhí)行期可以在任何層次的程序模塊中使用;
(3)變量定義語句要放在使用此變量的語句之前,否則會出錯;
2.局部變量,指在建立它的程序以及被此程序調(diào)用的子程序中有效的內(nèi)存變量 。在程序中沒有被顯示定義為全局變量的內(nèi)存變量都被看作局部變量。局部變量可以用PRIVATE說明.
命令格式為:
【格式】PRIVATE <內(nèi)存變量表>
【說明】(1)用PRIVATE語句說明的內(nèi)存變量,只能在本程序及其下屬過程中使用,退出程序時,變量自動釋放;
(2)用PRIVATE語句在過程中說明的局部變量,可以與上層調(diào)用程序出現(xiàn)的內(nèi)存變量同名,但它們是不同的變量,在執(zhí)行被調(diào)用過程期間,上層過程中的同名變量將被隱藏。即:在下級程序中再使用PRIVATE顯示定義,就為同名變量, 該變量的值不能返回到主程序。
重要提示:凡是過程中未經(jīng)說明的內(nèi)存變量,系統(tǒng)一律認為是局部變量,這種方式叫做隱式定義方式。也可以使用專門命令來定義局部變量,即顯式定義方式。在同一過程中,用隱式或顯式定義的局部變量的作用域完全相同。在主程序或上級過程中未經(jīng)Private語句定義的局部變量,在下級過程中也未經(jīng)顯式定義,它的新值可以返回主程序或上級過程;若在下級過程中進行了顯式定義,即定義為同名變量,則其新值不能返回主程序。
過程的帶參數(shù)調(diào)用
1.帶參數(shù)調(diào)用:調(diào)用過程語句,即執(zhí)行已有的過程,并為調(diào)用過程提供過程參數(shù)。
【格式】: DO 〈子程序名〉 WITH ?<參數(shù)表>
語句功能:執(zhí)行以〈過程名〉為名的過程。該處的參數(shù)表又稱為實參表。其中的參數(shù)為常量、已賦值的變量或數(shù)值表達式。
2.接收參數(shù)
3.【格式】PARAMETERS <參數(shù)表>
語句功能:該命令必須位于被調(diào)用過程的第一條可執(zhí)行語句處。此處的參數(shù)表稱為形參表,其中的參數(shù)一般為內(nèi)類變量。形參與實參的個數(shù)應(yīng)相等、數(shù)據(jù)類型和個數(shù)要對應(yīng)相同。
重要提示
1.值傳遞方式分為:變量傳遞與參數(shù)傳遞。
2.在參數(shù)傳遞過程中,如果實參是常量或是表達式,稱為按值傳遞,即把實參的值傳給形參,形參不能返回到實參;如果實參是變量,稱為按引用傳遞,即把實參的地址傳給形參,形參可以將值返回給實參;
3.在參數(shù)傳遞過程中,如果實參不是變量,它將作為變量傳遞到它的下級過程中。
4. 若形參被顯示定義為局部變量,仍然可以返回到上級程序。帶參數(shù)的過程傳遞是利用參數(shù)將值傳遞到主程序,不是通過變量來傳遞值。
讀程序第7題(答案見課件)
X1=1
X2=2
DO P1 WITH X1,X2
?X1,X2
X1=1
X2=2
DO P1 WITH X1,X1+X2
?X1,X2
RETURN
自定義函數(shù)
自定義函數(shù)和過程一樣,可以以獨立的程序文件形式單獨存儲在磁盤上,也可以放在過程文件或直接放在程序文件中
自定義函數(shù)具有如下語法結(jié)構(gòu):
????????FUNCTION <函數(shù)名>
????????PARAMETER <參數(shù)表>
????????????<函數(shù)體命令序列>
????????RETURN <表達式>
自定義函數(shù)的調(diào)用語法與系統(tǒng)函數(shù)的調(diào)用相同。
例題:計算圓面積(example.prg)
INPUT ”請輸入圓的半徑:” TO R
? ”圓的面積為:”,AREA(R)
SET TALK ON
FUNCTION ?AREA ? ?&& 計算面積的函數(shù)
PARAMETER ??X ? && 形參說明
RETURN (3.1416*X**2) ?
內(nèi)部過程:把多個過程組織在一個文件中(這個文件稱之為過程文件),或者把過程放在調(diào)用它的程序文件的末尾。
Visual FoxPro為了識別過程文件或者程序文件中的不同過程,規(guī)定過程文件或者程序文件中的過程必需用PROCEDURE語句說明。其格式為:
PROCEDURE <過程名>
????<命令序列>
[RETURN [<表達式>]]
過程文件的建立:過程文件的建立方法與程序文件相同??捎肕ODIFY COMMAND <過程文件名>命令來建立。
過程文件的結(jié)構(gòu)一般為:
PROCEDURE <過程名1>
???<命令序列1>
RETURN?
PROCEDURE <過程名2>
???<命令序列2>
RETURN
過程文件的調(diào)用:調(diào)用某過程文件中的過程時,必須先打開該過程文件打開過程文件命令為:
【格式】:\SET PROCEDURE ?TO <過程文件名>
任何時候系統(tǒng)只能打開一過程文件,當打開一新過程文件時,原已打開的過程文件自動關(guān)閉。
過程文件的關(guān)閉:【格式一】SET PROCEDURE TO【格式二】CLOSE ?PROCEDURE
外部過程:也叫子程序,和主程序一樣是以程序文件(.PRG)的形式單獨存儲在磁盤上
【例】分別建立如下程序文件,
* MAIN.PRG
SET TALK OFF
? ”正在執(zhí)行主程序”
DO SUB1
SET TALK ON
?*SUB1.PRG
? ”正在執(zhí)行SUB1”
RETURN