版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
封面程序設(shè)計基礎(chǔ)程序文件程序的基本結(jié)構(gòu)過程及其調(diào)用人機(jī)交互方式交互式方式是通過在命令窗口中輸入命令或通過選擇菜單項來實現(xiàn)各種操作,適用于解決一些較為簡單的問題。程序方式要處理復(fù)雜的問題,就應(yīng)采取程序方式。VFP的工作方式6.1程序文件程序由能夠完成指定任務(wù)的一系列命令組成,這些命令被保存在程序文件中。程序文件又稱為命令文件,其擴(kuò)展名為PRG。程序文件中既可包含能在命令窗口執(zhí)行的VFP命令,也可包含一些程序控制語句(如IF語句、循環(huán)語句)。6.1.1程序文件程序文件既可通過VFP內(nèi)置的文本編輯器來建立和修改,也可通過其他文本編輯器(如記事本)來編輯。程序一旦建立,可以多次執(zhí)行,也可被其他的程序、表單、菜單等調(diào)用。執(zhí)行程序時,系統(tǒng)會自動地按一定的順序來執(zhí)行程序中的命令。程序的概念菜單方式6.1.2程序文件的建立和修改選擇“文件”菜單的“打開”命令,打開“打開”對話框。在“打開”對話框中,在“查找范圍”下拉列表中定位到程序文件所在的文件夾,在“文件類型”下拉列表中選擇“程序”,文件列表中顯示出此文件夾下的程序文件。雙擊要打開的程序文件,或者選擇它,再單擊“確定”按鈕,即可打開程序文件的編輯窗口。修改程序MODIFYCOMMAND<文件名>|?當(dāng)程序文件是一個新文件名時,系統(tǒng)將創(chuàng)建一個新的程序文件,并打開其編輯窗口。當(dāng)程序文件是一個已經(jīng)存在的文件時,系統(tǒng)將打開該程序文件的編輯窗口,供用戶修改。命令方式在項目管理器中建立和修改程序在程序中,每條命令都以回車鍵結(jié)束,一行只能寫一條命令。若命令需分行書寫,應(yīng)在上一行終了時輸入續(xù)行符“;”。在程序中可插入注釋,以提高程序的可讀性。注釋行以單詞“NOTE”或符號“*”開頭,它僅在編輯程序時顯示,不會在運(yùn)行程序時執(zhí)行。在語句末尾也可添加注釋,這種注釋以符號“&&”開頭。程序書寫規(guī)則
6.1.3程序的運(yùn)行在程序處于打開狀態(tài)時運(yùn)行程序
如果程序已在編輯窗口被打開,單擊常用工具欄的“運(yùn)行”按鈕,或在“程序”菜單中選擇“執(zhí)行程序名.prg”命令,可執(zhí)行此程序。程序(P)運(yùn)行(D)通過菜單執(zhí)行程序文件DO<程序名>通過命令執(zhí)行程序文件由于DO命令默認(rèn)是運(yùn)行PRG程序。若用戶要運(yùn)行程序文件,則只需指定主文件名,不需指定擴(kuò)展名通過項目管理器執(zhí)行程序文件在項目管理器中,選擇“代碼”選項卡中“程序”選項下的程序名,單擊“運(yùn)行”按鈕可以運(yùn)行該程序文件。當(dāng)VFP執(zhí)行PRG源程序文件時,系統(tǒng)將自動對其編譯,產(chǎn)生相應(yīng)的FXP文件。系統(tǒng)實際執(zhí)行的是FXP目標(biāo)文件。在執(zhí)行程序的過程中,系統(tǒng)會自動地按一定的順序逐條來執(zhí)行程序中的命令。
中止程序的運(yùn)行如果程序有錯,或在執(zhí)行過程中用戶按了ESC鍵中止程序,系統(tǒng)會打開“程序錯誤”對話框。中止程序的運(yùn)行系統(tǒng)將取消此次程序的執(zhí)行
系統(tǒng)將暫停程序的運(yùn)行,返回到命令窗口用戶可以在執(zhí)行其他的操作后,選擇“程序”菜單的“繼續(xù)執(zhí)行”命令或在命令窗口中執(zhí)行“RESUME”命令,從程序的中止處繼續(xù)運(yùn)行程序
當(dāng)用戶選擇“忽略”時,系統(tǒng)將忽略程序錯誤,繼續(xù)執(zhí)行程序
6.1.4輸入命令在VFP中,應(yīng)用程序的輸入/輸出界面通常采用表單、報表等形式。但在編寫小程序時,仍然常使用傳統(tǒng)的輸入命令。
ACCEPT[<提示信息>]TO<內(nèi)存變量>程序中執(zhí)行到該語句時,在主窗口顯示用戶設(shè)置的提示信息,等待用戶從鍵盤輸入數(shù)據(jù)。用戶輸入數(shù)據(jù)后,按回車鍵,系統(tǒng)將接收到的數(shù)據(jù)作為字符串賦值給內(nèi)存變量,再繼續(xù)往下執(zhí)行程序。
字符串接收命令
<提示信息>是一個字符型表達(dá)式。執(zhí)行此命令時,該表達(dá)式的內(nèi)容作為提示信息,顯示在屏幕上。若缺省此項,則不顯示提示信息。由于此命令接收到的任何數(shù)據(jù)都會作為字符串。用戶在輸入數(shù)據(jù)時,不需要輸入字符串定界符。若用戶不輸入任何數(shù)據(jù),直接按回車鍵,則系統(tǒng)會將對內(nèi)存變量賦值為空串。
字符串接收命令USE圖書
&&打開圖書表ACCEPT"請輸入要查詢的條形碼"totxm
&&接收用戶要查詢的條形碼LOCATEFOR條形碼=txm
&&根據(jù)用戶的輸入查找記錄DISPLAY條形碼,書名,售價,作者
&&顯示圖書記錄的相關(guān)信息USE
&&關(guān)閉數(shù)據(jù)表RETURN例題在圖書表中,根據(jù)用戶輸入的條形碼,查找書籍的條形碼、書名、售價、作者信息。
INPUT[<提示信息>]TO<內(nèi)存變量>該命令與ACCEPT命令類似,但該命令可接收用戶輸入的多種數(shù)據(jù)類型的表達(dá)式。用戶可輸入數(shù)值型、字符型、日期型或邏輯型表達(dá)式。系統(tǒng)先計算表達(dá)式的值,然后將值賦給指定的內(nèi)存變量。內(nèi)存變量的類型由表達(dá)式的數(shù)據(jù)類型決定。當(dāng)用戶輸入字符型、日期型或邏輯型常量時,應(yīng)加上相應(yīng)的定界符。表達(dá)式輸入命令
WAIT[<提示信息>][TO<內(nèi)存變量>][WINDOW[AT<行>,<列>]][TIMEOUT<表達(dá)式>]該命令與ACCEPT命令類似,但該命令只能接收用戶輸入的一個字符。
單個字符接收命令若缺省<提示信息>,執(zhí)行此命令時,屏幕上顯示“按任意鍵繼續(xù)?!比糁付═O<內(nèi)存變量>短語,執(zhí)行此命令時,用戶按任意鍵,不需按回車鍵,該鍵作為一個字符被接收到指定的內(nèi)存變量中。若用戶不輸入任何數(shù)據(jù),直接按回車鍵,或單擊鼠標(biāo),系統(tǒng)會將對內(nèi)存變量賦值為空串。
若不指定TO<內(nèi)存變量>短語,此語句的功能為暫停程序的執(zhí)行,顯示提示信息。用戶按任意鍵,或單擊鼠標(biāo),將繼續(xù)執(zhí)行程序。單個字符接收命令若指定WINDOW短語,將顯示一個窗口顯示提示信息。通常,窗口顯示在屏幕的右上角。若用AT<行>,<列>短語,可指定窗口的位置。TIMEOUT<數(shù)值表達(dá)式>短語,用來設(shè)置等待用戶輸入的時間,以秒為單位。如果在指定的時間內(nèi)用戶未輸入任何字符,系統(tǒng)將自動執(zhí)行后面的命令。單個字符接收命令例如,用戶要在程序執(zhí)行過程中查看數(shù)值型變量A的值,要求結(jié)果顯示在10行30列位置的窗口中,顯示5秒鐘后繼續(xù)執(zhí)行程序,則語句為WAIT“變量A的值為”+STR(A)WINDOWAT10,30TIMEOUT5又例如,用戶要在程序執(zhí)行過程中接收一個字符,將此值存儲在變量B中。則語句為WAIT“請輸入一個字符”TOB單個字符接收命令6.1.5其他命令在程序的結(jié)尾,通常執(zhí)行以下命令,以結(jié)束程序的運(yùn)行。當(dāng)然,如果省略這些命令,也可以終止程序。RETURN結(jié)束當(dāng)前程序的執(zhí)行,返回到調(diào)用它的上級程序,若無上級程序,則返回到命令窗口結(jié)束程序運(yùn)行命令CANCEL終止程序運(yùn)行,清除所有的私有變量,返回命令窗口QUIT退出Visual
FoxPro系統(tǒng),返回到Windows。結(jié)束程序運(yùn)行命令CLEAR清除主屏幕窗口上的所有信息。清屏命令CLOSEALL
關(guān)閉所有已打開的各類文件,并將當(dāng)前工作區(qū)設(shè)為1號工作區(qū)。
關(guān)閉文件命令CLEARALL
可以關(guān)閉文件,還可以清除所有用戶定義的內(nèi)存變量。
關(guān)閉文件命令
SETTALKON/OFF許多命令在執(zhí)行時會返回一些執(zhí)行狀態(tài)的信息這些信息通常會顯示在窗口或狀態(tài)欄中開啟或關(guān)閉人機(jī)會話設(shè)置環(huán)境參數(shù)命令
SETDEFAULTTO<路徑>設(shè)置默認(rèn)的文件路徑設(shè)置環(huán)境參數(shù)命令6.2程序的基本結(jié)構(gòu)結(jié)構(gòu)化程序設(shè)計是根據(jù)給定的任務(wù),設(shè)計、編寫和調(diào)試出完成該任務(wù)的過程。結(jié)構(gòu)化程序設(shè)計的基本思想是采用“自頂向下,逐步求精”的程序設(shè)計方法和“單入口單出口”的控制結(jié)構(gòu)。程序的基本結(jié)構(gòu)自頂向下、逐步求精的程序設(shè)計方法是從問題本身開始,經(jīng)過逐步細(xì)化,將解決問題的步驟分解為由基本程序結(jié)構(gòu)模塊組成的結(jié)構(gòu)化程序框圖。程序的基本結(jié)構(gòu)“單入口單出口”的思想認(rèn)為:一個復(fù)雜的程序,如果它僅是由順序、選擇和循環(huán)三種基本程序結(jié)構(gòu)通過組合、嵌套構(gòu)成,那么這個一定只有一個唯一的入口和出口。據(jù)此,就很容易編寫出結(jié)構(gòu)良好、易于調(diào)試的程序。程序的基本結(jié)構(gòu)順序結(jié)構(gòu)程序是最簡單的程序結(jié)構(gòu),先執(zhí)行A操作,再執(zhí)行B操作,依次執(zhí)行各條語句。6.2.1順序結(jié)構(gòu)ABC6.2.2選擇結(jié)構(gòu)選擇結(jié)構(gòu)是在程序執(zhí)行時,根據(jù)不同的條件,選擇執(zhí)行不同的程序語句。VFP的分支結(jié)構(gòu)程序可以分為簡單分支(IF-ENDIF)、選擇分支(IF-ELSE-ENDIF)以及多路分支(DOCASE-ENDCASE)三種不同的程序IF<條件表達(dá)式>
<語句序列>ENDIF條件.N.語句序列.Y.ENDIF的下一條語句簡單選擇語句如果條件成立,即<條件表達(dá)式.>的值為真,則執(zhí)行語句序列,然后再執(zhí)行ENDIF后面的語句。否則,直接執(zhí)行ENDIF后面的語句。某地的計程車收費(fèi)規(guī)則為:不超過2公里時,一律收取6元。超過部分每公里加收1.8元。編程根據(jù)行車?yán)锍逃嬎銘?yīng)付車費(fèi)。INPUT'請輸入里程數(shù)'TOx
&&接收要計算的行車?yán)锍蘺=6
&&將車費(fèi)賦值為6元IFx>2
&&判斷x是否超過2公里
y=6+(x-2)*1.8
&&重新計算車費(fèi)ENDIF?’里程數(shù)為’,x,’車費(fèi)為’,y
&&顯示里程和車費(fèi)RETURN
&&返回命令窗口例題:簡單選擇語句IF<條件表達(dá)式>
<語句序列1>ELSE
<語句序列2>ENDIF
雙分支選擇語句如果條件成立,即<條件表達(dá)式>的值為真,則執(zhí)行語句序列1,然后執(zhí)行ENDIF后面的語句。否則,執(zhí)行語句序列2的語句,再執(zhí)行ENDIF后面的語句。ENDIF的下一條語句條件語句序列2.N.語句序列1.Y.
雙分支選擇語句某地的計程車收費(fèi)規(guī)則為:不超過2公里時,一律收取6元。超過部分每公里加收1.8元。編程根據(jù)行車?yán)锍逃嬎銘?yīng)付車費(fèi)。INPUT'請輸入里程數(shù)'TOx
&&接收要計算的行車?yán)锍蘄Fx<=2
&&判斷x是否超過2公里
y=6
&&將車費(fèi)賦值為6元ELSE
y=6+(x-2)*1.8
&&將車費(fèi)賦值為6元加超出的部分ENDIF?’里程數(shù)為’,x,’車費(fèi)為’,y
&&顯示里程和車費(fèi)RETURN
&&返回命令窗口例題:雙分支選擇語句在圖書表中,根據(jù)用戶輸入的條形碼查找書籍。如果找到,則顯示書籍的條形碼、書名、售價、作者信息;如果沒有找到,顯示‘查無此書’。
USE圖書
&&打開圖書表ACCEPT"請輸入要查詢的條形碼"totxm
&&接收用戶要查詢的條形碼LOCATEFOR條形碼=txm
&&根據(jù)用戶的輸入查找記錄IFFOUND()
&&判斷是否找到了輸入條碼DISPLAY條形碼,書名,售價,作者
&&顯示圖書記錄的相關(guān)信息ELSE?’查無此書’
&&顯示沒有這本書ENDIFUSE
&&關(guān)閉數(shù)據(jù)表RETURN
&&返回命令窗口例題:雙分支選擇語句
嵌套選擇語句在解決一些復(fù)雜問題時,需要將多個選擇結(jié)構(gòu)語句結(jié)合起來使用。也就是說,在選擇結(jié)構(gòu)的<語句序列>中,允許包括另一個合法的選擇結(jié)構(gòu),形成選擇的嵌套。對于嵌套選擇結(jié)構(gòu)的程序而言,每一個IF必須和一個ENDIF配對。為了使程序易于閱讀,內(nèi)外層選擇結(jié)構(gòu)層次分明,通常按縮進(jìn)格式來書寫。某商場采取打折的方法進(jìn)行促銷,購物金額在300元以上,按九五折優(yōu)惠;購物金額在500元以上,按九折優(yōu)惠;購物金額在1000元以上,按八五折優(yōu)惠。編寫程序,根據(jù)用戶的購物金額,計算其優(yōu)惠額及實際付款金額例題:嵌套選擇語句INPUT'請輸入購物金額'TOje
&&接收要計算的購物金額IFje<=300
&&判斷金額是否超過300元
yh=0
&&沒有優(yōu)惠ELSE
IFje<=500
yh=je*0.05
&&優(yōu)惠額為5%ELSE
IFje<=1000
&&判斷金額是否超過1000元
yh=je*0.1
&&優(yōu)惠額為10%ELSE
yh=je*0.15
&&優(yōu)惠額為15%ENDIFENDIFENDIF?’優(yōu)惠額為’,yh,’實際付款為’,je-yh
&&顯示優(yōu)惠額和實際付款RETURN
&&返回命令窗口例題:嵌套選擇語句DOCASECASE<條件表達(dá)式1>
<語句序列1>CASE<條件表達(dá)式2>
<語句序列2>…CASE<條件表達(dá)式
N>
<語句序列N>[OTHERWISE
<語句序列N+1>]ENDCASE
多路分支系統(tǒng)自上而下依次對各個CASE語句的條件進(jìn)行判斷。若某個<條件表達(dá)式>的值為真,則執(zhí)行該語句下的語句序列。然后,不管其他CASE語句的條件是否成立,轉(zhuǎn)去執(zhí)行ENDCASE后的語句。若所有<條件表達(dá)式>的值都不為真,又有OTHERWISE子句,則執(zhí)行OTHERWISE后的語句序列,再轉(zhuǎn)去執(zhí)行ENDCASE后的語句。若所有<條件表達(dá)式>的值都不為真,又沒有OTHERWISE子句,則直接執(zhí)行ENDCASE后的語句。多路分支ENDCASE的下一條語句條件1.N.條件2…....N.條件N語句序列1.Y.語句序列2.Y.語句序列N.Y.語句序列N+1.N.多路分支流程圖INPUT'請輸入購物金額'TOje
&&接收要計算的購物金額DOCASECASEje<=300
&&判斷金額是否超過300元
yh=0
&&沒有優(yōu)惠CASEje<=500
&&判斷金額是否超過500元
yh=je*0.05
&&優(yōu)惠額為5%CASEje<=1000
&&判斷金額是否超過1000元
yh=je*0.1
&&優(yōu)惠額為10%
OTHERWISE
yh=je*0.15
&&優(yōu)惠額為15%ENDCASE?’優(yōu)惠額為’,yh,’實際付款為’,je-yh
&&顯示優(yōu)惠額和實際付款RETURN
&&返回命令窗口例題:多路分支由于各個CASE條件是按其排列的前后順依次被判斷的。所以,哪一個條件在前,哪一個條件在后,可能會影響程序的執(zhí)行結(jié)果。編寫程序時,應(yīng)根據(jù)條件所蘊(yùn)含的邏輯關(guān)系,認(rèn)真考慮。多路分支6.2.3循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)是指在程序執(zhí)行的過程中,某段代碼被重復(fù)地執(zhí)行若干次,被重復(fù)執(zhí)行的代碼段稱之為循環(huán)體。VFP支持三種循環(huán)結(jié)構(gòu)的控制語句:條件循環(huán)(DOWHILE-ENDDO)、步長型循環(huán)(FOR-ENDFOR)、掃描型循環(huán)(SCAN-ENDSCAN)。DOWHILE<條件表達(dá)式>
<語句序列>ENDDO
條件循環(huán)條件循環(huán)語句,是根據(jù)條件表達(dá)式的值,決定循環(huán)體語句的執(zhí)行次數(shù)。
條件循環(huán)執(zhí)行該語句時,先判斷DO
WHILE處的循環(huán)條件是否成立,如果條件為真,則執(zhí)行DO
WHILE與ENDDO之間的命令序列(循環(huán)體)。當(dāng)執(zhí)行到ENDDO時,返回到DOWHILE,再次判斷循環(huán)條件是否為真,以確定是否再次執(zhí)行循環(huán)體。若條件為假,則結(jié)束該循環(huán)語句,執(zhí)行ENDDO后面的語句。如果第一次判斷條件時,條件即為假,則循環(huán)體一次都不執(zhí)行。
條件循環(huán)體.Y..N.條件循環(huán)USE圖書
&&打開圖書表jx=’Y’
&&設(shè)置變量jx的初值DOWHILEjx=’Y’ORjx=’y’
&&根據(jù)變量jx的值判斷是否循環(huán)ACCEPT"請輸入要查詢的條形碼"totxm
&&接收用戶要查詢的條形碼LOCATEFOR條形碼=txm
&&根據(jù)用戶的輸入查找記錄IFFOUND()
&&判斷是否找到了輸入條碼
DISPLAY條形碼,書名,售價,作者
&&顯示圖書記錄的相關(guān)信息ELSE
?’查無此書’
&&顯示沒有這本書ENDIFWAIT“是否繼續(xù)(Y/N)”TOjx
&&接收用戶輸入的字符是否繼續(xù)查找ENDDOUSE
&&關(guān)閉數(shù)據(jù)表RETURN
&&返回命令窗口例題:條件循環(huán)
條件循環(huán)在循環(huán)體中可以出現(xiàn)兩條特殊的命令:LOOP和EXIT。如果循環(huán)體包含LOOP命令,那么當(dāng)遇到LOOP時,就結(jié)束循環(huán)體的本次執(zhí)行,不再執(zhí)行其后面的語句,而是轉(zhuǎn)回DOWHILE處重新判斷條件。如果循環(huán)體包含EXIT命令,那么當(dāng)遇到EXIT時,就結(jié)束該語句的執(zhí)行,轉(zhuǎn)去執(zhí)行ENDDO后面的語句。通常LOOP和EXIT出現(xiàn)在循環(huán)體內(nèi)包含的選擇結(jié)構(gòu)中,根據(jù)選擇語句的條件來判斷是否LOOP或EXIT。條件命令組.Y..N.無條件循環(huán)命令
EXITLOOP無條件結(jié)束循環(huán)命令
條件循環(huán)例題:條件循環(huán)實現(xiàn)程序例6.7的功能。且如果用戶輸入的條形碼不是8位字符,則提示用戶重新輸入條形碼。USE圖書
&&打開圖書表DOWHILE.T.&&循環(huán)條件永遠(yuǎn)為真值A(chǔ)CCEPT"請輸入要查詢的條形碼"totxm
&&接收用戶要查詢的條形碼IFLEN(ALLT(TXM))<>8
&&如果用戶輸入的條形碼不是8位
WAIT‘請輸入8位條形碼’AT50,20TIMEOUT3
&&顯示警告信息
LOOP
&&跳轉(zhuǎn)到循環(huán)的條件判斷處ENDIFLOCATEFOR條形碼=txm
&&根據(jù)用戶的輸入查找記錄IFFOUND()
&&判斷是否找到了輸入條碼
DISPLAY條形碼,書名,售價,作者
&&顯示圖書記錄的相關(guān)信息ELSE
?’查無此書’
&&顯示沒有這本書ENDIFWAIT“是否繼續(xù)(Y/N)”TOjx
&&接收用戶輸入的字符是否繼續(xù)查找IFjx<>’Y’ANDjx<>’y’
&&如果用戶回答的不是Y或y
EXIT
&&退出循環(huán)ENDIFENDDOUSE
&&關(guān)閉數(shù)據(jù)表RETURN
&&返回命令窗口例題:條件循環(huán)循環(huán)條件為邏輯常量.T.,循環(huán)條件永遠(yuǎn)成立,這種循環(huán)被稱為絕對循環(huán)。這時,在循環(huán)體內(nèi)應(yīng)該有EXIT語句退出循環(huán)。
使用循環(huán)結(jié)構(gòu)時,為使程序最終能退出循環(huán),在循環(huán)體中必須要有使循環(huán)條件的值的發(fā)生改變的語句,或者有EXIT語句。否則程序?qū)⒂肋h(yuǎn)重復(fù)地執(zhí)行循環(huán)體,這種情況稱為死循環(huán)。調(diào)試過程中遇到死循環(huán)時,按鍵盤的ESC鍵可結(jié)束程序的運(yùn)行。條件循環(huán)求1到100之間全部數(shù)之和i=1
&&設(shè)置計數(shù)變量i的初值為1s=0
&&設(shè)置求和變量s的初值為0DOWHILEi<=100
&&循環(huán)條件為i不超過100s=s+i
&&使s的值增加ii=i+1
&&使i的值增加1ENDDO?”1到100的和為”,s
&&顯示求和變量的值RETURN
&&返回命令窗口例題:條件循環(huán)
si初值01
循環(huán)1:12循環(huán)2:1+23循環(huán)3:1+2+3
4循環(huán)4:1+2+3+4
5循環(huán)5:1+2+3+4+5
6……循環(huán)100:1+2+…+100101例題:條件循環(huán)對于讀者表的所有讀者根據(jù)不同的身份來收取押金。其中,教研人員收取50元,工作人員收取30元,研究生收取20元。
將所有讀者的姓名,身份和押金顯示出來
例題:條件循環(huán)USE讀者
&&打開讀者表DOWHILENOTEOF()
&&循環(huán)條件為記錄指針不指向文件尾DOCASECASE身份=’教研人員’
&&判斷當(dāng)前記錄的身份字段的值是否為教研人員
yj=50
&&對yj賦值為50
CASE身份=’工作人員’
&&判斷當(dāng)前記錄的身份字段的值是否為工作人員
yj=30
&&對yj賦值為30CASE身份=’研究生’
&&判斷當(dāng)前記錄的身份字段的值是否為研究生
yj=20
&&對yj賦值為20ENDCASE?姓名,身份,yj
&&顯示當(dāng)前記錄的姓名和身份字段及變量yj的值SKIP
&&向下移動記錄指針ENDDOUSE
&&關(guān)閉數(shù)據(jù)表RETURN
&&返回命令窗口例題:條件循環(huán)FOR循環(huán)變量=<初值>TO<終值>[STEP<步長值>]
<語句序列>ENDFOR|NEXT
步長型循環(huán)
步長型循環(huán)執(zhí)行該語句時,系統(tǒng)首先自動將初值賦給循環(huán)變量,然后判斷循環(huán)變量是否超過終值。若步長值為正數(shù),則循環(huán)變量大于終值為超過;若步長值為負(fù)數(shù),則循環(huán)變量小于終值為超過。若沒有超過,則執(zhí)行循環(huán)體,并將循環(huán)變量增加一個步長值。然后,再去判斷循環(huán)變量是否超過終值。如果沒有超過終值,則再次執(zhí)行循環(huán)體;否則,轉(zhuǎn)去執(zhí)行ENDFOR后面的語句。在缺省步長值時,默認(rèn)的步長值為1。<初值>、<終值>、<步長值>都是數(shù)值型表達(dá)式。這些表達(dá)式的值在第一次循環(huán)時被計算出來,在以后循環(huán)的執(zhí)行過程中不再會被改變。
循環(huán)變量超過終值循環(huán)變量=初值步長型循環(huán)循環(huán)變量=循環(huán)變量+步長.N.循環(huán)體.Y.ENDFOR后面的語句使用步長型循環(huán)實現(xiàn)例6.9s=0
&&設(shè)置求和變量為sFORi=1TO100&&設(shè)置循環(huán)變量i的初值為1,終值為100,步長為1s=s+i
&&使s的值增加iENDFOR?”1到100的和為”,s
&&顯示求和變量的值RETURN
&&返回命令窗口例題:步長型循環(huán)判斷某數(shù)是否為質(zhì)數(shù)除了1和它本身之外不能被任何一個整數(shù)所整除的數(shù)為質(zhì)數(shù)。除了2以外的質(zhì)數(shù)均為素數(shù)。
要判斷一個數(shù)n是否素數(shù),只需用2到n-1的各個整數(shù)去除n。如果都不能整除n,則n就是素數(shù)。只要有一個數(shù)能整除n,則n就不是一個素數(shù)。
例題:步長型循環(huán)INPUT"請輸入一個大于2的整數(shù)"ton
&&接收從鍵盤輸入的整數(shù)賦值給變量nFORi=2TOn-1
&&設(shè)置循環(huán)變量i的初值為2,終值為n-1,步長為1IFMOD(n,i)=0
&&若i整除n,則退出循環(huán)EXITENDIF
ENDFORIFi>n-1
&&退出循環(huán)后,判斷i是否大于n-1?n,’是一個素數(shù)’
&&若i等于n,則說明2到n-1沒有一個數(shù)整除nELSE
?n,’不是一個素數(shù)’
&&否則,說明是在i整除n的情況下退出循環(huán)ENDIFRETURN
&&返回命令窗口例題:步長型循環(huán)
SCAN[<范圍>]
[FOR<條件>]
<語句序列>ENDSCAN掃描型循環(huán)
掃描型循環(huán)執(zhí)行該語句時,系統(tǒng)首先將記錄指針指向給定范圍內(nèi)滿足指定條件的第一條記錄上。如果此時記錄指針指向的不是文件尾,即EOF()為假值,則執(zhí)行循環(huán)體。執(zhí)行完,系統(tǒng)自動將記錄指針定位到給定范圍內(nèi)下一條滿足指定條件的記錄,然后重新判斷記錄指針是否指向文件尾。若不是文件尾,則再次執(zhí)行循環(huán)體,否則轉(zhuǎn)去執(zhí)行ENDSCAN后的語句。當(dāng)缺省范圍和條件時,數(shù)據(jù)表的所有記錄都將執(zhí)行循環(huán)體的語句。循環(huán)體.F.紀(jì)錄指針指向第一條記錄指針是否指向文件尾掃描型循環(huán)紀(jì)錄指針指向下一條記錄.T.ENDSCAN后面的語句USE讀者
&&打開讀者表SCAN
&&對所有記錄進(jìn)行掃描DOCASECASE身份=’教研人員’
&&判斷當(dāng)前記錄的身份字段的值是否為教研人員
yj=50
&&對yj賦值為50
CASE身份=’工作人員’
&&判斷當(dāng)前記錄的身份字段的值是否為工作人員
yj=30
&&對yj賦值為30CASE身份=’研究生’
&&判斷當(dāng)前記錄的身份字段的值是否為研究生
yj=20
&&對yj賦值為20ENDCASE?姓名,身份,yj
&&顯示當(dāng)前記錄的姓名和身份字段及變量yj的值ENDSCANUSE
&&關(guān)閉數(shù)據(jù)表RETURN
&&返回命令窗口例題:掃描循環(huán)在一個循環(huán)結(jié)構(gòu)的循環(huán)體內(nèi)包含另一個循環(huán)結(jié)構(gòu),則稱為多重循環(huán),或稱為循環(huán)的嵌套。前面所介紹的幾種循環(huán)語句不僅自身可以嵌套自身,也可以互相嵌套,實現(xiàn)多重循環(huán)但是,每一層次的循環(huán)開始語句和循環(huán)結(jié)束語句必須互相對應(yīng),層次分明,不能互相交叉。
多重循環(huán)顯示出3到100之間的所有素數(shù),并求這些數(shù)的和
s=0
&&設(shè)置求和變量s的初值為0FORn=3TO99STEP2
&&設(shè)置循環(huán)變量n的初值為3,終值為100,步長為2FORi=3TOINT(SQRT(n))
&&設(shè)置i的初值為2,終值為n的平方根的整數(shù)值IFMOD(n,i)=0
&&若i整除n,則退出循環(huán)EXITENDIF
ENDFORIFi>INT(SQRT(n))
&&退出循環(huán)后,判斷i是否大于內(nèi)層循環(huán)的終值
?n
&&說明沒有發(fā)生i整除n的情況,即n是素數(shù)
s=s+n
&&使求和變量s的值增加nENDIF
ENDFOR?’素數(shù)的和為’,sRETURN
&&返回命令窗口例題編程輸出乘法九九表例題:多重循環(huán)s=0
&&設(shè)置求和變量s的初值為0FORi=1TO9
&&外層循環(huán)變量i從1到9
FORj=1toi
&&內(nèi)層循環(huán)變量j從1到i
??'',str(i,1)+'×'+str(j,1)+'='+str(i*j,2)
&&在本行顯示數(shù)學(xué)式i×j=i與j的乘積
ENDFOR
?
&&換行輸出ENDFOR例題:多重循環(huán)輸入9個數(shù)值,建立一個三行三列的數(shù)組,求出每行元素的最大值,并輸出。
例題:多重循環(huán)DIMEa(3,3),m(3)&&定義三行三列的a數(shù)組,用來保存各行最大值的m數(shù)組FORi=1TO3FORj=1TO3INPUT"請輸入"+STR(i,1)+"行"+STR(j,1)+"列的元素"TOa(i,j)ENDFORENDFOR*上述語句為對二維數(shù)組的各個元素逐一賦值
FORi=1TO3&&外層循環(huán)變量i從2到3
m(i)=a(i,1)&&設(shè)m(i)初值為i行的第一列的數(shù)組元素
FORj=2TO3&&內(nèi)層循環(huán)變量j從2到3IFm(i)<a(i,j)&&判斷第j列元素是否大于m(i)中保存的值
m(i)=a(i,j)&&將m(i)重新賦值為第j列元素
ENDIFENDFORENDFOR*下列語句為對二維數(shù)組的各個元素逐一輸出,并顯示各行的最大值FORi=1TO3?FORj=1TO3??a(i,j)ENDFOR??'最大值為',m(i)ENDFOR例題:多重循環(huán)顯示讀者表中還有未還書籍的讀者的姓名,電話,未還書籍的本數(shù),未還書籍的條形碼和借閱日期。
例題:多重循環(huán)SELE2&&選擇2號工作區(qū)為當(dāng)前工作區(qū)USE借閱&&打開借閱表SELE1&&選擇1號工作區(qū)為當(dāng)前工作區(qū)USE讀者&&打開讀者表SCAN&&對讀者表所有記錄進(jìn)行掃描循環(huán)c=0&&設(shè)統(tǒng)計未還圖書本數(shù)的變量c的初值為0SELE2&&選擇借閱表為當(dāng)前表SCANFOR讀者證號=讀者.讀者證號ANDEMPTY(還書日期)&&掃描讀者證號與讀者表當(dāng)前記錄的讀者證號相同且還書日期為空的記錄c=c+1&&未還圖書本數(shù)變量c增加1?c,條形碼,借閱日期&&顯示未還圖書的條形碼和借閱日期ENDSCAN&&內(nèi)層循環(huán)結(jié)束SELE1&&選擇讀者表為當(dāng)前表IFc>0&&判斷該讀者未還圖書的本數(shù)是否大于0?姓名,'電話',電話號碼,'總計',c,'本'&&顯示該讀者的姓名,電話號碼,未還圖書的本數(shù)ENDIFENDSCAN&&外層循環(huán)結(jié)束USE&&關(guān)閉讀者表SELE2&&選擇借閱表為當(dāng)前表USE&&關(guān)閉借閱表RETURN&&返回命令窗口例題:多重循環(huán)程序6.3多模塊程序設(shè)計結(jié)構(gòu)化程序設(shè)計的基本思想是將一個復(fù)雜的規(guī)模較大的程序系統(tǒng)劃分為若干個功能相關(guān)又相對獨(dú)立的一個個較小的模塊。這樣,既有利于程序的編寫和開發(fā),也有利于程序的維護(hù)和擴(kuò)充。此外,在程序設(shè)計中,如果某個功能的程序段需要多次重復(fù)使用的話,也要把這樣的程序段獨(dú)立出來成為一個模塊,當(dāng)系統(tǒng)中任何地方要用到該功能時,只要調(diào)用相應(yīng)的模塊即可,而不必再重復(fù)編寫。多模塊程序設(shè)計求組合數(shù):Cm=n!(m-n)!INPUT‘m=‘TOmINPUT‘n=‘TOnt=1FORi=1TOmt=t*iENDFORa=tt=1FORi=1TOnt=t*iENDFORb=tt=1FORi=1TOm-nt=t*iENDFORc=t?”組合數(shù)為”,a/(b*c)nm!
求階乘例題由于公式中出現(xiàn)了3個階乘,所以程序中計算階乘的程序段重復(fù)出現(xiàn)三次。為了簡化程序,我們可以把計算階乘的功能定義為一個模塊。在VFP中,模塊可以是一個子程序,也可以是一個過程。子程序就是將模塊建成一個獨(dú)立的命令文件,當(dāng)其他程序中需要用到該模塊的功能,可以通過DO命令來調(diào)用此子程序。由于每調(diào)用一個子程序就要打開一個文件,減慢了程序運(yùn)行的速度。為此,可以通過定義過程實現(xiàn)模塊功能,而一個程序文件中可存放多個過程。多模塊程序設(shè)計6.3.1過程的定義和使用
PROCEDURE|FUNCTION
<過程名><命令序列>[RETURN[<表達(dá)式>]][ENDPROC|ENDFUNC]定義過程PROCDURE或FUNCTION命令表示過程的開始,并對過程命名。
過程名必須以字母或下劃線開頭,可包含字母、數(shù)字和下劃線。ENDPROC或ENDFUNC命令表示過程的結(jié)束。
如果缺省,過程結(jié)束于下一個過程的開始處或文件結(jié)尾處。RETURN命令表示過程的返回。
如果缺省RETURN命令,則在過程的結(jié)束處將自動執(zhí)行一條隱含的RETURN命令。
若RETURN帶<表達(dá)式>,則過程將返回表達(dá)式的值。若不帶表達(dá)式,過程返回一個邏輯真(.T.)。定義過程過程可以保存在程序文件中,放置在程序文件正常代碼的后面。一個程序文件中可以存放多個過程。定義過程當(dāng)主程序中要用到過程所定義的功能,可以用下列兩種格式調(diào)用過程。調(diào)用過程DO
<過程名><過程名>()當(dāng)系統(tǒng)運(yùn)行到程序中調(diào)用過程的命令時,便從過程的第一條語句開始執(zhí)行,執(zhí)行中只要碰到RETURN語句,控制返回到主程序,從主程序中調(diào)用過程的下一條語句處繼續(xù)執(zhí)行。使用第二種格式調(diào)用過程時,該過程將返回一個值,可以作為函數(shù)出現(xiàn)在主程序的表達(dá)式中。調(diào)用過程使用過程的方式求組合數(shù)INPUT'm='TOmINPUT'n='TOnk=ma=jc()k=nb=jc()k=m-nc=jc()?a/(b*c)RETURNPROCjct=1FORi=1TOkt=t*iENDFORRETURNtENDP例題一個應(yīng)用程序往往需要用到多個過程,用戶可將多個過程的定義存放在一個程序文件中,該文件被稱為過程文件。過程文件PROCEDURE
<過程名1>
<命令序列1>
[RETURN<表達(dá)式>][ENDPROC]PROCEDURE
<過程名2>
<命令序列2>
[RETURN<表達(dá)式>][ENDPROC]。。。。。。PROCEDURE
<過程名n>
<命令序列n>
[RETURN<表達(dá)式>][ENDPROC]過程文件由于過程文件也是一個擴(kuò)展名為prg的程序文件,其建立和編輯的方法和其他的程序文件相同。當(dāng)主程序中要用到過程文件中所定義的過程時,首先要在主程序中通過SETPROCEDURETO<過程文件名>命令打開過程文件。此后,主程序可以調(diào)用過程文件中的任一過程。當(dāng)不再需要調(diào)用過程時,應(yīng)該在主程序中使用命令CLOSEPROCEDURE或SETPROCEDURETO關(guān)閉過程文件。
過程文件在調(diào)用過程時,往往需要將一些數(shù)據(jù)從主程序傳送到被調(diào)用的過程中,或?qū)⑦^程運(yùn)行的結(jié)果上傳到主程序中。為此,在定義過程時,可以用PARAMETER<變量表>語句來定義參數(shù)。PARAMETER必須是過程的第一個語句。在PARAMETER中所說明的變量,稱其為形參。6.3.2參數(shù)傳遞當(dāng)主程序中調(diào)用過程時,可以用DO<過程名>WITH<參數(shù)表>或過程名(<參數(shù)表>)進(jìn)行參數(shù)傳遞。在調(diào)用語句中的參數(shù),稱其為實參。實參和形參的個數(shù)、類型必須一一對應(yīng)。實參可為常量、變量、表達(dá)式。若實參為變量,必須在調(diào)用前賦予初值。
參數(shù)傳遞使用帶參數(shù)的過程實現(xiàn)求組合數(shù)INPUT'm='TOmINPUT'n='TOn?jc(m)/(jc(n)*jc(m-n))RETURNPROCjcPARAMETERkt=1FORi=1TOkt=t*iENDFORRETURNtENDP例題以m為實參,m的值傳送給k調(diào)用結(jié)束后,t的值通過過程名傳回到主程序
以n為實參,n的值傳送給k過程的值為n的階乘
以m-n為實參,過程的值為m-n的階乘
當(dāng)實參是常量或表達(dá)式時,采取值傳遞,即實參的值傳給形參,過程中形參變化的結(jié)果不傳給實參。若采取DO<過程名>WITH<參數(shù)>格式調(diào)用過程,當(dāng)實參是變量時,采取的是地址傳遞,即過程中形參變化的結(jié)果將傳給實參?;蛘哒f,對形參的操作實際上相當(dāng)于在對實參所對應(yīng)的變量進(jìn)行。如果將作為實參的變量加上括號,則采取值傳遞,過程中形參變化的結(jié)果不傳給實參。參數(shù)傳遞若采取過程名(<參數(shù)表>)格式調(diào)用過程,在進(jìn)行參數(shù)傳遞時,默認(rèn)是采取值傳遞方式。使用命令SETUDFPARMSTOVALUE|REFERENCE可改變參數(shù)傳遞方式。SETUDFPARMSTOVALUE為按值傳遞,SETUDFPARMSTOREFERENCE為按參數(shù)傳遞。形參變量是局部變量。當(dāng)控制返回到主程序后,形參變量即被清除。參數(shù)傳遞參數(shù)傳遞舉例x=15y=7DOsubWITHx,(y)?x,y?sub(x,y),x,y
RETURNPROCsubPARAMETERSa,ba=a+bb=aRETURNa+bENDP例題x是地址傳遞,y是值傳遞返回主程序后,x的值變?yōu)?2,y的值仍為7
x,y均為值傳遞。返回主程序后,x和y的值不變。顯示結(jié)果58,22,76.3.3變量的作用域多模塊程序中,在一個模塊中定義的變量在其他模塊中不一定能夠使用。不同的變量有不同的作用域,即每個變量有其發(fā)揮作用的有效范圍。根據(jù)變量作用域不同,變量分為全局變量、局部變量和私有變量。全局變量也稱為公共變量,是在任何語句和各個程序模塊中都有效的內(nèi)存變量。
PUBLIC<內(nèi)存變量表>定義全局內(nèi)存變量全局內(nèi)存變量全局變量應(yīng)先定義后賦值,不能在賦值一個變量后再將其定義為全局變量。全局變量在定義以后,默認(rèn)的初值是邏輯假.F定義全局變量的程序運(yùn)行結(jié)束后,全局變量并未被釋放,仍然可以在其他程序中使用。只有在執(zhí)行CLEARMEMORY、RELEASE等命令或退出VFP后,全局變量才被釋放。在命令窗口所建立的內(nèi)存變量,默認(rèn)為全局變量。全局內(nèi)存變量在程序中所有未經(jīng)說明而直接建立的內(nèi)存變量都是私有變量。私有變量可以在創(chuàng)建它的模塊及其調(diào)用的下層模塊中使用。一旦建立它的模塊程序運(yùn)行結(jié)束,這些私有變量將被清除。也就是說,在下層模塊定義的私有變量,無法在其上層模塊中使用。私有變量
局部變量只能在建立它的模塊中使用,不能在上層或下層模塊中使用。當(dāng)建立它的模塊程序運(yùn)行結(jié)束,局部變量被釋放。
LOCAL<內(nèi)存變量表>命令定義的變量是局部變量,并賦予其初值為邏輯值假.F.。同樣,局部變量也要先定義后使用。局部變量LOCALaSTORE10TOa,b?'執(zhí)行過程前a,b的值',a,bDOp1?'執(zhí)行過程后a,b的值',a,b?’c=’,cPROCp1STORE20toa,b
?'執(zhí)行過程時a,b的值',a,bPUBLICcc=30ENDPROC 例題:變量作用域顯示結(jié)果1010
顯示結(jié)果1020
顯示結(jié)果2020
由于一個大型的程序可能由多人開發(fā),在下級子程序中可能會無意地改變上級程序中的私有變量。為了避免這種情況,可以在過程中使用PRIVATE
<內(nèi)存變量表>。該命令并不建立變量,而是用來隱藏在上層程序中可能已經(jīng)存在的內(nèi)存變量,使得這些變量在當(dāng)前模塊程序中暫時無效。這樣,這些變量名可以用來命名在當(dāng)前模塊或其下屬模塊中需要的私有變量,并且不會改變上層模塊中同名變量的取值。一旦當(dāng)前模塊程序運(yùn)行結(jié)束返回上層模塊,那些被隱藏的內(nèi)存變量就恢復(fù)原有的取值。隱藏變量LOCALaSTORE10TOa,b?'執(zhí)行過程前a,b的值',a,bDOp1?'執(zhí)行過程后a,b的值',a,b?’c=’,cPROCp1PRIVATEa,bSTORE20toa,b
?'執(zhí)行過程時a,b的值',a,bPUBLICcc=30ENDPROC 例題:變量作用域顯示結(jié)果1010
顯示結(jié)果1010
顯示結(jié)果2020
6.3.4存儲過程存儲過程是保存在數(shù)據(jù)庫文件中的過程,屬于數(shù)據(jù)庫對象的一部分。它可以被數(shù)據(jù)庫中的對象調(diào)用,例如,可作為數(shù)據(jù)表字段的默認(rèn)值和有效性規(guī)則。數(shù)據(jù)庫編輯存儲過程存儲過程快捷菜單編輯存儲過程單擊數(shù)據(jù)庫設(shè)計器工具欄的“編輯存儲過程”按鈕PROCEDUREnewtxm()SELEMAX(條形碼)FROM圖書INTOARRAYltxm
lntxm=ALLTRIM(STR(VAL(RIGHT(ltxm(1),7))+1))RETU'P'+REPLICATE('0',7-LEN(lntxm))+lntxmENDPROC例題:存儲過程建立一個存儲過程,獲得一個條形碼。該條形碼以字母P開頭,后7位數(shù)字為當(dāng)前圖書表中書籍編號的最大值加一例題:存儲過程設(shè)置為默認(rèn)值一個三位正整數(shù)等于它的各位數(shù)字的立方和,該數(shù)稱為水仙花數(shù)。顯示所有的水仙花數(shù)
FORm=100TO999m1=&&求出m的百位數(shù)
m2=&&求出m的十位數(shù)
m3=m-m1*100-m2*10&&求出m的個位數(shù)IFm=m1*m1*m1+m2*m2*m2+m3*m3*m3
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 室內(nèi)設(shè)計服務(wù)員工作總結(jié)
- 能源化工行業(yè)市場總結(jié)
- 酒店員工培訓(xùn)計劃設(shè)計
- 音樂學(xué)校前臺服務(wù)心得
- 互聯(lián)網(wǎng)產(chǎn)品設(shè)計師工作總結(jié)
- 《易坦靜的臨床應(yīng)用》課件
- 2023-2024學(xué)年上海市徐匯區(qū)南洋模范中學(xué)高二(下)期中地理試卷
- 《燃?xì)饣A(chǔ)知識》課件
- 2022年廣東省河源市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2024年湖北省隨州市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 粵教版科學(xué)四年級上冊全冊試卷(含答案)
- 宮腔鏡診治規(guī)范
- 安全管理計劃指標(biāo)和指標(biāo)體系
- 倉庫物料盤點(diǎn)作業(yè)規(guī)范培訓(xùn)課件
- 六年級《牽手兩代-第二講-乖孩子為什么會厭學(xué)》家長課程培訓(xùn)
- 水稻全生育期營養(yǎng)管理
- 節(jié)流閥流量計算公式
- 美甲店衛(wèi)生制度規(guī)章范本
- 湘少版三年級下冊英語單詞默寫1(附單元標(biāo)題句)
- 2023年昆明市重點(diǎn)中學(xué)物理高二上期末經(jīng)典模擬試題含解析
- 耶魯博弈論24講全筆記
評論
0/150
提交評論