VisualFoxpro程學設計教程(第二版)課件第六章_第1頁
VisualFoxpro程學設計教程(第二版)課件第六章_第2頁
VisualFoxpro程學設計教程(第二版)課件第六章_第3頁
VisualFoxpro程學設計教程(第二版)課件第六章_第4頁
VisualFoxpro程學設計教程(第二版)課件第六章_第5頁
已閱讀5頁,還剩123頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

封面程序設計基礎程序文件程序的基本結構過程及其調用人機交互方式交互式方式是通過在命令窗口中輸入命令或通過選擇菜單項來實現各種操作,適用于解決一些較為簡單的問題。程序方式要處理復雜的問題,就應采取程序方式。VFP的工作方式6.1程序文件程序由能夠完成指定任務的一系列命令組成,這些命令被保存在程序文件中。程序文件又稱為命令文件,其擴展名為PRG。程序文件中既可包含能在命令窗口執行的VFP命令,也可包含一些程序控制語句(如IF語句、循環語句)。6.1.1程序文件程序文件既可通過VFP內置的文本編輯器來建立和修改,也可通過其他文本編輯器(如記事本)來編輯。程序一旦建立,可以多次執行,也可被其他的程序、表單、菜單等調用。執行程序時,系統會自動地按一定的順序來執行程序中的命令。程序的概念菜單方式6.1.2程序文件的建立和修改選擇“文件”菜單的“打開”命令,打開“打開”對話框。在“打開”對話框中,在“查找范圍”下拉列表中定位到程序文件所在的文件夾,在“文件類型”下拉列表中選擇“程序”,文件列表中顯示出此文件夾下的程序文件。雙擊要打開的程序文件,或者選擇它,再單擊“確定”按鈕,即可打開程序文件的編輯窗口。修改程序MODIFYCOMMAND<文件名>|?當程序文件是一個新文件名時,系統將創建一個新的程序文件,并打開其編輯窗口。當程序文件是一個已經存在的文件時,系統將打開該程序文件的編輯窗口,供用戶修改。命令方式在項目管理器中建立和修改程序在程序中,每條命令都以回車鍵結束,一行只能寫一條命令。若命令需分行書寫,應在上一行終了時輸入續行符“;”。在程序中可插入注釋,以提高程序的可讀性。注釋行以單詞“NOTE”或符號“*”開頭,它僅在編輯程序時顯示,不會在運行程序時執行。在語句末尾也可添加注釋,這種注釋以符號“&&”開頭。程序書寫規則

6.1.3程序的運行在程序處于打開狀態時運行程序

如果程序已在編輯窗口被打開,單擊常用工具欄的“運行”按鈕,或在“程序”菜單中選擇“執行程序名.prg”命令,可執行此程序。程序(P)運行(D)通過菜單執行程序文件DO<程序名>通過命令執行程序文件由于DO命令默認是運行PRG程序。若用戶要運行程序文件,則只需指定主文件名,不需指定擴展名通過項目管理器執行程序文件在項目管理器中,選擇“代碼”選項卡中“程序”選項下的程序名,單擊“運行”按鈕可以運行該程序文件。當VFP執行PRG源程序文件時,系統將自動對其編譯,產生相應的FXP文件。系統實際執行的是FXP目標文件。在執行程序的過程中,系統會自動地按一定的順序逐條來執行程序中的命令。

中止程序的運行如果程序有錯,或在執行過程中用戶按了ESC鍵中止程序,系統會打開“程序錯誤”對話框。中止程序的運行系統將取消此次程序的執行

系統將暫停程序的運行,返回到命令窗口用戶可以在執行其他的操作后,選擇“程序”菜單的“繼續執行”命令或在命令窗口中執行“RESUME”命令,從程序的中止處繼續運行程序

當用戶選擇“忽略”時,系統將忽略程序錯誤,繼續執行程序

6.1.4輸入命令在VFP中,應用程序的輸入/輸出界面通常采用表單、報表等形式。但在編寫小程序時,仍然常使用傳統的輸入命令。

ACCEPT[<提示信息>]TO<內存變量>程序中執行到該語句時,在主窗口顯示用戶設置的提示信息,等待用戶從鍵盤輸入數據。用戶輸入數據后,按回車鍵,系統將接收到的數據作為字符串賦值給內存變量,再繼續往下執行程序。

字符串接收命令

<提示信息>是一個字符型表達式。執行此命令時,該表達式的內容作為提示信息,顯示在屏幕上。若缺省此項,則不顯示提示信息。由于此命令接收到的任何數據都會作為字符串。用戶在輸入數據時,不需要輸入字符串定界符。若用戶不輸入任何數據,直接按回車鍵,則系統會將對內存變量賦值為空串。

字符串接收命令USE圖書

&&打開圖書表ACCEPT"請輸入要查詢的條形碼"totxm

&&接收用戶要查詢的條形碼LOCATEFOR條形碼=txm

&&根據用戶的輸入查找記錄DISPLAY條形碼,書名,售價,作者

&&顯示圖書記錄的相關信息USE

&&關閉數據表RETURN例題在圖書表中,根據用戶輸入的條形碼,查找書籍的條形碼、書名、售價、作者信息。

INPUT[<提示信息>]TO<內存變量>該命令與ACCEPT命令類似,但該命令可接收用戶輸入的多種數據類型的表達式。用戶可輸入數值型、字符型、日期型或邏輯型表達式。系統先計算表達式的值,然后將值賦給指定的內存變量。內存變量的類型由表達式的數據類型決定。當用戶輸入字符型、日期型或邏輯型常量時,應加上相應的定界符。表達式輸入命令

WAIT[<提示信息>][TO<內存變量>][WINDOW[AT<行>,<列>]][TIMEOUT<表達式>]該命令與ACCEPT命令類似,但該命令只能接收用戶輸入的一個字符。

單個字符接收命令若缺省<提示信息>,執行此命令時,屏幕上顯示“按任意鍵繼續。”若指定TO<內存變量>短語,執行此命令時,用戶按任意鍵,不需按回車鍵,該鍵作為一個字符被接收到指定的內存變量中。若用戶不輸入任何數據,直接按回車鍵,或單擊鼠標,系統會將對內存變量賦值為空串。

若不指定TO<內存變量>短語,此語句的功能為暫停程序的執行,顯示提示信息。用戶按任意鍵,或單擊鼠標,將繼續執行程序。單個字符接收命令若指定WINDOW短語,將顯示一個窗口顯示提示信息。通常,窗口顯示在屏幕的右上角。若用AT<行>,<列>短語,可指定窗口的位置。TIMEOUT<數值表達式>短語,用來設置等待用戶輸入的時間,以秒為單位。如果在指定的時間內用戶未輸入任何字符,系統將自動執行后面的命令。單個字符接收命令例如,用戶要在程序執行過程中查看數值型變量A的值,要求結果顯示在10行30列位置的窗口中,顯示5秒鐘后繼續執行程序,則語句為WAIT“變量A的值為”+STR(A)WINDOWAT10,30TIMEOUT5又例如,用戶要在程序執行過程中接收一個字符,將此值存儲在變量B中。則語句為WAIT“請輸入一個字符”TOB單個字符接收命令6.1.5其他命令在程序的結尾,通常執行以下命令,以結束程序的運行。當然,如果省略這些命令,也可以終止程序。RETURN結束當前程序的執行,返回到調用它的上級程序,若無上級程序,則返回到命令窗口結束程序運行命令CANCEL終止程序運行,清除所有的私有變量,返回命令窗口QUIT退出Visual

FoxPro系統,返回到Windows。結束程序運行命令CLEAR清除主屏幕窗口上的所有信息。清屏命令CLOSEALL

關閉所有已打開的各類文件,并將當前工作區設為1號工作區。

關閉文件命令CLEARALL

可以關閉文件,還可以清除所有用戶定義的內存變量。

關閉文件命令

SETTALKON/OFF許多命令在執行時會返回一些執行狀態的信息這些信息通常會顯示在窗口或狀態欄中開啟或關閉人機會話設置環境參數命令

SETDEFAULTTO<路徑>設置默認的文件路徑設置環境參數命令6.2程序的基本結構結構化程序設計是根據給定的任務,設計、編寫和調試出完成該任務的過程。結構化程序設計的基本思想是采用“自頂向下,逐步求精”的程序設計方法和“單入口單出口”的控制結構。程序的基本結構自頂向下、逐步求精的程序設計方法是從問題本身開始,經過逐步細化,將解決問題的步驟分解為由基本程序結構模塊組成的結構化程序框圖。程序的基本結構“單入口單出口”的思想認為:一個復雜的程序,如果它僅是由順序、選擇和循環三種基本程序結構通過組合、嵌套構成,那么這個一定只有一個唯一的入口和出口。據此,就很容易編寫出結構良好、易于調試的程序。程序的基本結構順序結構程序是最簡單的程序結構,先執行A操作,再執行B操作,依次執行各條語句。6.2.1順序結構ABC6.2.2選擇結構選擇結構是在程序執行時,根據不同的條件,選擇執行不同的程序語句。VFP的分支結構程序可以分為簡單分支(IF-ENDIF)、選擇分支(IF-ELSE-ENDIF)以及多路分支(DOCASE-ENDCASE)三種不同的程序IF<條件表達式>

<語句序列>ENDIF條件.N.語句序列.Y.ENDIF的下一條語句簡單選擇語句如果條件成立,即<條件表達式.>的值為真,則執行語句序列,然后再執行ENDIF后面的語句。否則,直接執行ENDIF后面的語句。某地的計程車收費規則為:不超過2公里時,一律收取6元。超過部分每公里加收1.8元。編程根據行車里程計算應付車費。INPUT'請輸入里程數'TOx

&&接收要計算的行車里程y=6

&&將車費賦值為6元IFx>2

&&判斷x是否超過2公里

y=6+(x-2)*1.8

&&重新計算車費ENDIF?’里程數為’,x,’車費為’,y

&&顯示里程和車費RETURN

&&返回命令窗口例題:簡單選擇語句IF<條件表達式>

<語句序列1>ELSE

<語句序列2>ENDIF

雙分支選擇語句如果條件成立,即<條件表達式>的值為真,則執行語句序列1,然后執行ENDIF后面的語句。否則,執行語句序列2的語句,再執行ENDIF后面的語句。ENDIF的下一條語句條件語句序列2.N.語句序列1.Y.

雙分支選擇語句某地的計程車收費規則為:不超過2公里時,一律收取6元。超過部分每公里加收1.8元。編程根據行車里程計算應付車費。INPUT'請輸入里程數'TOx

&&接收要計算的行車里程IFx<=2

&&判斷x是否超過2公里

y=6

&&將車費賦值為6元ELSE

y=6+(x-2)*1.8

&&將車費賦值為6元加超出的部分ENDIF?’里程數為’,x,’車費為’,y

&&顯示里程和車費RETURN

&&返回命令窗口例題:雙分支選擇語句在圖書表中,根據用戶輸入的條形碼查找書籍。如果找到,則顯示書籍的條形碼、書名、售價、作者信息;如果沒有找到,顯示‘查無此書’。

USE圖書

&&打開圖書表ACCEPT"請輸入要查詢的條形碼"totxm

&&接收用戶要查詢的條形碼LOCATEFOR條形碼=txm

&&根據用戶的輸入查找記錄IFFOUND()

&&判斷是否找到了輸入條碼DISPLAY條形碼,書名,售價,作者

&&顯示圖書記錄的相關信息ELSE?’查無此書’

&&顯示沒有這本書ENDIFUSE

&&關閉數據表RETURN

&&返回命令窗口例題:雙分支選擇語句

嵌套選擇語句在解決一些復雜問題時,需要將多個選擇結構語句結合起來使用。也就是說,在選擇結構的<語句序列>中,允許包括另一個合法的選擇結構,形成選擇的嵌套。對于嵌套選擇結構的程序而言,每一個IF必須和一個ENDIF配對。為了使程序易于閱讀,內外層選擇結構層次分明,通常按縮進格式來書寫。某商場采取打折的方法進行促銷,購物金額在300元以上,按九五折優惠;購物金額在500元以上,按九折優惠;購物金額在1000元以上,按八五折優惠。編寫程序,根據用戶的購物金額,計算其優惠額及實際付款金額例題:嵌套選擇語句INPUT'請輸入購物金額'TOje

&&接收要計算的購物金額IFje<=300

&&判斷金額是否超過300元

yh=0

&&沒有優惠ELSE

IFje<=500

yh=je*0.05

&&優惠額為5%ELSE

IFje<=1000

&&判斷金額是否超過1000元

yh=je*0.1

&&優惠額為10%ELSE

yh=je*0.15

&&優惠額為15%ENDIFENDIFENDIF?’優惠額為’,yh,’實際付款為’,je-yh

&&顯示優惠額和實際付款RETURN

&&返回命令窗口例題:嵌套選擇語句DOCASECASE<條件表達式1>

<語句序列1>CASE<條件表達式2>

<語句序列2>…CASE<條件表達式

N>

<語句序列N>[OTHERWISE

<語句序列N+1>]ENDCASE

多路分支系統自上而下依次對各個CASE語句的條件進行判斷。若某個<條件表達式>的值為真,則執行該語句下的語句序列。然后,不管其他CASE語句的條件是否成立,轉去執行ENDCASE后的語句。若所有<條件表達式>的值都不為真,又有OTHERWISE子句,則執行OTHERWISE后的語句序列,再轉去執行ENDCASE后的語句。若所有<條件表達式>的值都不為真,又沒有OTHERWISE子句,則直接執行ENDCASE后的語句。多路分支ENDCASE的下一條語句條件1.N.條件2…....N.條件N語句序列1.Y.語句序列2.Y.語句序列N.Y.語句序列N+1.N.多路分支流程圖INPUT'請輸入購物金額'TOje

&&接收要計算的購物金額DOCASECASEje<=300

&&判斷金額是否超過300元

yh=0

&&沒有優惠CASEje<=500

&&判斷金額是否超過500元

yh=je*0.05

&&優惠額為5%CASEje<=1000

&&判斷金額是否超過1000元

yh=je*0.1

&&優惠額為10%

OTHERWISE

yh=je*0.15

&&優惠額為15%ENDCASE?’優惠額為’,yh,’實際付款為’,je-yh

&&顯示優惠額和實際付款RETURN

&&返回命令窗口例題:多路分支由于各個CASE條件是按其排列的前后順依次被判斷的。所以,哪一個條件在前,哪一個條件在后,可能會影響程序的執行結果。編寫程序時,應根據條件所蘊含的邏輯關系,認真考慮。多路分支6.2.3循環結構循環結構是指在程序執行的過程中,某段代碼被重復地執行若干次,被重復執行的代碼段稱之為循環體。VFP支持三種循環結構的控制語句:條件循環(DOWHILE-ENDDO)、步長型循環(FOR-ENDFOR)、掃描型循環(SCAN-ENDSCAN)。DOWHILE<條件表達式>

<語句序列>ENDDO

條件循環條件循環語句,是根據條件表達式的值,決定循環體語句的執行次數。

條件循環執行該語句時,先判斷DO

WHILE處的循環條件是否成立,如果條件為真,則執行DO

WHILE與ENDDO之間的命令序列(循環體)。當執行到ENDDO時,返回到DOWHILE,再次判斷循環條件是否為真,以確定是否再次執行循環體。若條件為假,則結束該循環語句,執行ENDDO后面的語句。如果第一次判斷條件時,條件即為假,則循環體一次都不執行。

條件循環體.Y..N.條件循環USE圖書

&&打開圖書表jx=’Y’

&&設置變量jx的初值DOWHILEjx=’Y’ORjx=’y’

&&根據變量jx的值判斷是否循環ACCEPT"請輸入要查詢的條形碼"totxm

&&接收用戶要查詢的條形碼LOCATEFOR條形碼=txm

&&根據用戶的輸入查找記錄IFFOUND()

&&判斷是否找到了輸入條碼

DISPLAY條形碼,書名,售價,作者

&&顯示圖書記錄的相關信息ELSE

?’查無此書’

&&顯示沒有這本書ENDIFWAIT“是否繼續(Y/N)”TOjx

&&接收用戶輸入的字符是否繼續查找ENDDOUSE

&&關閉數據表RETURN

&&返回命令窗口例題:條件循環

條件循環在循環體中可以出現兩條特殊的命令:LOOP和EXIT。如果循環體包含LOOP命令,那么當遇到LOOP時,就結束循環體的本次執行,不再執行其后面的語句,而是轉回DOWHILE處重新判斷條件。如果循環體包含EXIT命令,那么當遇到EXIT時,就結束該語句的執行,轉去執行ENDDO后面的語句。通常LOOP和EXIT出現在循環體內包含的選擇結構中,根據選擇語句的條件來判斷是否LOOP或EXIT。條件命令組.Y..N.無條件循環命令

EXITLOOP無條件結束循環命令

條件循環例題:條件循環實現程序例6.7的功能。且如果用戶輸入的條形碼不是8位字符,則提示用戶重新輸入條形碼。USE圖書

&&打開圖書表DOWHILE.T.&&循環條件永遠為真值ACCEPT"請輸入要查詢的條形碼"totxm

&&接收用戶要查詢的條形碼IFLEN(ALLT(TXM))<>8

&&如果用戶輸入的條形碼不是8位

WAIT‘請輸入8位條形碼’AT50,20TIMEOUT3

&&顯示警告信息

LOOP

&&跳轉到循環的條件判斷處ENDIFLOCATEFOR條形碼=txm

&&根據用戶的輸入查找記錄IFFOUND()

&&判斷是否找到了輸入條碼

DISPLAY條形碼,書名,售價,作者

&&顯示圖書記錄的相關信息ELSE

?’查無此書’

&&顯示沒有這本書ENDIFWAIT“是否繼續(Y/N)”TOjx

&&接收用戶輸入的字符是否繼續查找IFjx<>’Y’ANDjx<>’y’

&&如果用戶回答的不是Y或y

EXIT

&&退出循環ENDIFENDDOUSE

&&關閉數據表RETURN

&&返回命令窗口例題:條件循環循環條件為邏輯常量.T.,循環條件永遠成立,這種循環被稱為絕對循環。這時,在循環體內應該有EXIT語句退出循環。

使用循環結構時,為使程序最終能退出循環,在循環體中必須要有使循環條件的值的發生改變的語句,或者有EXIT語句。否則程序將永遠重復地執行循環體,這種情況稱為死循環。調試過程中遇到死循環時,按鍵盤的ESC鍵可結束程序的運行。條件循環求1到100之間全部數之和i=1

&&設置計數變量i的初值為1s=0

&&設置求和變量s的初值為0DOWHILEi<=100

&&循環條件為i不超過100s=s+i

&&使s的值增加ii=i+1

&&使i的值增加1ENDDO?”1到100的和為”,s

&&顯示求和變量的值RETURN

&&返回命令窗口例題:條件循環

si初值01

循環1:12循環2:1+23循環3:1+2+3

4循環4:1+2+3+4

5循環5:1+2+3+4+5

6……循環100:1+2+…+100101例題:條件循環對于讀者表的所有讀者根據不同的身份來收取押金。其中,教研人員收取50元,工作人員收取30元,研究生收取20元。

將所有讀者的姓名,身份和押金顯示出來

例題:條件循環USE讀者

&&打開讀者表DOWHILENOTEOF()

&&循環條件為記錄指針不指向文件尾DOCASECASE身份=’教研人員’

&&判斷當前記錄的身份字段的值是否為教研人員

yj=50

&&對yj賦值為50

CASE身份=’工作人員’

&&判斷當前記錄的身份字段的值是否為工作人員

yj=30

&&對yj賦值為30CASE身份=’研究生’

&&判斷當前記錄的身份字段的值是否為研究生

yj=20

&&對yj賦值為20ENDCASE?姓名,身份,yj

&&顯示當前記錄的姓名和身份字段及變量yj的值SKIP

&&向下移動記錄指針ENDDOUSE

&&關閉數據表RETURN

&&返回命令窗口例題:條件循環FOR循環變量=<初值>TO<終值>[STEP<步長值>]

<語句序列>ENDFOR|NEXT

步長型循環

步長型循環執行該語句時,系統首先自動將初值賦給循環變量,然后判斷循環變量是否超過終值。若步長值為正數,則循環變量大于終值為超過;若步長值為負數,則循環變量小于終值為超過。若沒有超過,則執行循環體,并將循環變量增加一個步長值。然后,再去判斷循環變量是否超過終值。如果沒有超過終值,則再次執行循環體;否則,轉去執行ENDFOR后面的語句。在缺省步長值時,默認的步長值為1。<初值>、<終值>、<步長值>都是數值型表達式。這些表達式的值在第一次循環時被計算出來,在以后循環的執行過程中不再會被改變。

循環變量超過終值循環變量=初值步長型循環循環變量=循環變量+步長.N.循環體.Y.ENDFOR后面的語句使用步長型循環實現例6.9s=0

&&設置求和變量為sFORi=1TO100&&設置循環變量i的初值為1,終值為100,步長為1s=s+i

&&使s的值增加iENDFOR?”1到100的和為”,s

&&顯示求和變量的值RETURN

&&返回命令窗口例題:步長型循環判斷某數是否為質數除了1和它本身之外不能被任何一個整數所整除的數為質數。除了2以外的質數均為素數。

要判斷一個數n是否素數,只需用2到n-1的各個整數去除n。如果都不能整除n,則n就是素數。只要有一個數能整除n,則n就不是一個素數。

例題:步長型循環INPUT"請輸入一個大于2的整數"ton

&&接收從鍵盤輸入的整數賦值給變量nFORi=2TOn-1

&&設置循環變量i的初值為2,終值為n-1,步長為1IFMOD(n,i)=0

&&若i整除n,則退出循環EXITENDIF

ENDFORIFi>n-1

&&退出循環后,判斷i是否大于n-1?n,’是一個素數’

&&若i等于n,則說明2到n-1沒有一個數整除nELSE

?n,’不是一個素數’

&&否則,說明是在i整除n的情況下退出循環ENDIFRETURN

&&返回命令窗口例題:步長型循環

SCAN[<范圍>]

[FOR<條件>]

<語句序列>ENDSCAN掃描型循環

掃描型循環執行該語句時,系統首先將記錄指針指向給定范圍內滿足指定條件的第一條記錄上。如果此時記錄指針指向的不是文件尾,即EOF()為假值,則執行循環體。執行完,系統自動將記錄指針定位到給定范圍內下一條滿足指定條件的記錄,然后重新判斷記錄指針是否指向文件尾。若不是文件尾,則再次執行循環體,否則轉去執行ENDSCAN后的語句。當缺省范圍和條件時,數據表的所有記錄都將執行循環體的語句。循環體.F.紀錄指針指向第一條記錄指針是否指向文件尾掃描型循環紀錄指針指向下一條記錄.T.ENDSCAN后面的語句USE讀者

&&打開讀者表SCAN

&&對所有記錄進行掃描DOCASECASE身份=’教研人員’

&&判斷當前記錄的身份字段的值是否為教研人員

yj=50

&&對yj賦值為50

CASE身份=’工作人員’

&&判斷當前記錄的身份字段的值是否為工作人員

yj=30

&&對yj賦值為30CASE身份=’研究生’

&&判斷當前記錄的身份字段的值是否為研究生

yj=20

&&對yj賦值為20ENDCASE?姓名,身份,yj

&&顯示當前記錄的姓名和身份字段及變量yj的值ENDSCANUSE

&&關閉數據表RETURN

&&返回命令窗口例題:掃描循環在一個循環結構的循環體內包含另一個循環結構,則稱為多重循環,或稱為循環的嵌套。前面所介紹的幾種循環語句不僅自身可以嵌套自身,也可以互相嵌套,實現多重循環但是,每一層次的循環開始語句和循環結束語句必須互相對應,層次分明,不能互相交叉。

多重循環顯示出3到100之間的所有素數,并求這些數的和

s=0

&&設置求和變量s的初值為0FORn=3TO99STEP2

&&設置循環變量n的初值為3,終值為100,步長為2FORi=3TOINT(SQRT(n))

&&設置i的初值為2,終值為n的平方根的整數值IFMOD(n,i)=0

&&若i整除n,則退出循環EXITENDIF

ENDFORIFi>INT(SQRT(n))

&&退出循環后,判斷i是否大于內層循環的終值

?n

&&說明沒有發生i整除n的情況,即n是素數

s=s+n

&&使求和變量s的值增加nENDIF

ENDFOR?’素數的和為’,sRETURN

&&返回命令窗口例題編程輸出乘法九九表例題:多重循環s=0

&&設置求和變量s的初值為0FORi=1TO9

&&外層循環變量i從1到9

FORj=1toi

&&內層循環變量j從1到i

??'',str(i,1)+'×'+str(j,1)+'='+str(i*j,2)

&&在本行顯示數學式i×j=i與j的乘積

ENDFOR

?

&&換行輸出ENDFOR例題:多重循環輸入9個數值,建立一個三行三列的數組,求出每行元素的最大值,并輸出。

例題:多重循環DIMEa(3,3),m(3)&&定義三行三列的a數組,用來保存各行最大值的m數組FORi=1TO3FORj=1TO3INPUT"請輸入"+STR(i,1)+"行"+STR(j,1)+"列的元素"TOa(i,j)ENDFORENDFOR*上述語句為對二維數組的各個元素逐一賦值

FORi=1TO3&&外層循環變量i從2到3

m(i)=a(i,1)&&設m(i)初值為i行的第一列的數組元素

FORj=2TO3&&內層循環變量j從2到3IFm(i)<a(i,j)&&判斷第j列元素是否大于m(i)中保存的值

m(i)=a(i,j)&&將m(i)重新賦值為第j列元素

ENDIFENDFORENDFOR*下列語句為對二維數組的各個元素逐一輸出,并顯示各行的最大值FORi=1TO3?FORj=1TO3??a(i,j)ENDFOR??'最大值為',m(i)ENDFOR例題:多重循環顯示讀者表中還有未還書籍的讀者的姓名,電話,未還書籍的本數,未還書籍的條形碼和借閱日期。

例題:多重循環SELE2&&選擇2號工作區為當前工作區USE借閱&&打開借閱表SELE1&&選擇1號工作區為當前工作區USE讀者&&打開讀者表SCAN&&對讀者表所有記錄進行掃描循環c=0&&設統計未還圖書本數的變量c的初值為0SELE2&&選擇借閱表為當前表SCANFOR讀者證號=讀者.讀者證號ANDEMPTY(還書日期)&&掃描讀者證號與讀者表當前記錄的讀者證號相同且還書日期為空的記錄c=c+1&&未還圖書本數變量c增加1?c,條形碼,借閱日期&&顯示未還圖書的條形碼和借閱日期ENDSCAN&&內層循環結束SELE1&&選擇讀者表為當前表IFc>0&&判斷該讀者未還圖書的本數是否大于0?姓名,'電話',電話號碼,'總計',c,'本'&&顯示該讀者的姓名,電話號碼,未還圖書的本數ENDIFENDSCAN&&外層循環結束USE&&關閉讀者表SELE2&&選擇借閱表為當前表USE&&關閉借閱表RETURN&&返回命令窗口例題:多重循環程序6.3多模塊程序設計結構化程序設計的基本思想是將一個復雜的規模較大的程序系統劃分為若干個功能相關又相對獨立的一個個較小的模塊。這樣,既有利于程序的編寫和開發,也有利于程序的維護和擴充。此外,在程序設計中,如果某個功能的程序段需要多次重復使用的話,也要把這樣的程序段獨立出來成為一個模塊,當系統中任何地方要用到該功能時,只要調用相應的模塊即可,而不必再重復編寫。多模塊程序設計求組合數: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?”組合數為”,a/(b*c)nm!

求階乘例題由于公式中出現了3個階乘,所以程序中計算階乘的程序段重復出現三次。為了簡化程序,我們可以把計算階乘的功能定義為一個模塊。在VFP中,模塊可以是一個子程序,也可以是一個過程。子程序就是將模塊建成一個獨立的命令文件,當其他程序中需要用到該模塊的功能,可以通過DO命令來調用此子程序。由于每調用一個子程序就要打開一個文件,減慢了程序運行的速度。為此,可以通過定義過程實現模塊功能,而一個程序文件中可存放多個過程。多模塊程序設計6.3.1過程的定義和使用

PROCEDURE|FUNCTION

<過程名><命令序列>[RETURN[<表達式>]][ENDPROC|ENDFUNC]定義過程PROCDURE或FUNCTION命令表示過程的開始,并對過程命名。

過程名必須以字母或下劃線開頭,可包含字母、數字和下劃線。ENDPROC或ENDFUNC命令表示過程的結束。

如果缺省,過程結束于下一個過程的開始處或文件結尾處。RETURN命令表示過程的返回。

如果缺省RETURN命令,則在過程的結束處將自動執行一條隱含的RETURN命令。

若RETURN帶<表達式>,則過程將返回表達式的值。若不帶表達式,過程返回一個邏輯真(.T.)。定義過程過程可以保存在程序文件中,放置在程序文件正常代碼的后面。一個程序文件中可以存放多個過程。定義過程當主程序中要用到過程所定義的功能,可以用下列兩種格式調用過程。調用過程DO

<過程名><過程名>()當系統運行到程序中調用過程的命令時,便從過程的第一條語句開始執行,執行中只要碰到RETURN語句,控制返回到主程序,從主程序中調用過程的下一條語句處繼續執行。使用第二種格式調用過程時,該過程將返回一個值,可以作為函數出現在主程序的表達式中。調用過程使用過程的方式求組合數INPUT'm='TOmINPUT'n='TOnk=ma=jc()k=nb=jc()k=m-nc=jc()?a/(b*c)RETURNPROCjct=1FORi=1TOkt=t*iENDFORRETURNtENDP例題一個應用程序往往需要用到多個過程,用戶可將多個過程的定義存放在一個程序文件中,該文件被稱為過程文件。過程文件PROCEDURE

<過程名1>

<命令序列1>

[RETURN<表達式>][ENDPROC]PROCEDURE

<過程名2>

<命令序列2>

[RETURN<表達式>][ENDPROC]。。。。。。PROCEDURE

<過程名n>

<命令序列n>

[RETURN<表達式>][ENDPROC]過程文件由于過程文件也是一個擴展名為prg的程序文件,其建立和編輯的方法和其他的程序文件相同。當主程序中要用到過程文件中所定義的過程時,首先要在主程序中通過SETPROCEDURETO<過程文件名>命令打開過程文件。此后,主程序可以調用過程文件中的任一過程。當不再需要調用過程時,應該在主程序中使用命令CLOSEPROCEDURE或SETPROCEDURETO關閉過程文件。

過程文件在調用過程時,往往需要將一些數據從主程序傳送到被調用的過程中,或將過程運行的結果上傳到主程序中。為此,在定義過程時,可以用PARAMETER<變量表>語句來定義參數。PARAMETER必須是過程的第一個語句。在PARAMETER中所說明的變量,稱其為形參。6.3.2參數傳遞當主程序中調用過程時,可以用DO<過程名>WITH<參數表>或過程名(<參數表>)進行參數傳遞。在調用語句中的參數,稱其為實參。實參和形參的個數、類型必須一一對應。實參可為常量、變量、表達式。若實參為變量,必須在調用前賦予初值。

參數傳遞使用帶參數的過程實現求組合數INPUT'm='TOmINPUT'n='TOn?jc(m)/(jc(n)*jc(m-n))RETURNPROCjcPARAMETERkt=1FORi=1TOkt=t*iENDFORRETURNtENDP例題以m為實參,m的值傳送給k調用結束后,t的值通過過程名傳回到主程序

以n為實參,n的值傳送給k過程的值為n的階乘

以m-n為實參,過程的值為m-n的階乘

當實參是常量或表達式時,采取值傳遞,即實參的值傳給形參,過程中形參變化的結果不傳給實參。若采取DO<過程名>WITH<參數>格式調用過程,當實參是變量時,采取的是地址傳遞,即過程中形參變化的結果將傳給實參。或者說,對形參的操作實際上相當于在對實參所對應的變量進行。如果將作為實參的變量加上括號,則采取值傳遞,過程中形參變化的結果不傳給實參。參數傳遞若采取過程名(<參數表>)格式調用過程,在進行參數傳遞時,默認是采取值傳遞方式。使用命令SETUDFPARMSTOVALUE|REFERENCE可改變參數傳遞方式。SETUDFPARMSTOVALUE為按值傳遞,SETUDFPARMSTOREFERENCE為按參數傳遞。形參變量是局部變量。當控制返回到主程序后,形參變量即被清除。參數傳遞參數傳遞舉例x=15y=7DOsubWITHx,(y)?x,y?sub(x,y),x,y

RETURNPROCsubPARAMETERSa,ba=a+bb=aRETURNa+bENDP例題x是地址傳遞,y是值傳遞返回主程序后,x的值變為22,y的值仍為7

x,y均為值傳遞。返回主程序后,x和y的值不變。顯示結果58,22,76.3.3變量的作用域多模塊程序中,在一個模塊中定義的變量在其他模塊中不一定能夠使用。不同的變量有不同的作用域,即每個變量有其發揮作用的有效范圍。根據變量作用域不同,變量分為全局變量、局部變量和私有變量。全局變量也稱為公共變量,是在任何語句和各個程序模塊中都有效的內存變量。

PUBLIC<內存變量表>定義全局內存變量全局內存變量全局變量應先定義后賦值,不能在賦值一個變量后再將其定義為全局變量。全局變量在定義以后,默認的初值是邏輯假.F定義全局變量的程序運行結束后,全局變量并未被釋放,仍然可以在其他程序中使用。只有在執行CLEARMEMORY、RELEASE等命令或退出VFP后,全局變量才被釋放。在命令窗口所建立的內存變量,默認為全局變量。全局內存變量在程序中所有未經說明而直接建立的內存變量都是私有變量。私有變量可以在創建它的模塊及其調用的下層模塊中使用。一旦建立它的模塊程序運行結束,這些私有變量將被清除。也就是說,在下層模塊定義的私有變量,無法在其上層模塊中使用。私有變量

局部變量只能在建立它的模塊中使用,不能在上層或下層模塊中使用。當建立它的模塊程序運行結束,局部變量被釋放。

LOCAL<內存變量表>命令定義的變量是局部變量,并賦予其初值為邏輯值假.F.。同樣,局部變量也要先定義后使用。局部變量LOCALaSTORE10TOa,b?'執行過程前a,b的值',a,bDOp1?'執行過程后a,b的值',a,b?’c=’,cPROCp1STORE20toa,b

?'執行過程時a,b的值',a,bPUBLICcc=30ENDPROC 例題:變量作用域顯示結果1010

顯示結果1020

顯示結果2020

由于一個大型的程序可能由多人開發,在下級子程序中可能會無意地改變上級程序中的私有變量。為了避免這種情況,可以在過程中使用PRIVATE

<內存變量表>。該命令并不建立變量,而是用來隱藏在上層程序中可能已經存在的內存變量,使得這些變量在當前模塊程序中暫時無效。這樣,這些變量名可以用來命名在當前模塊或其下屬模塊中需要的私有變量,并且不會改變上層模塊中同名變量的取值。一旦當前模塊程序運行結束返回上層模塊,那些被隱藏的內存變量就恢復原有的取值。隱藏變量LOCALaSTORE10TOa,b?'執行過程前a,b的值',a,bDOp1?'執行過程后a,b的值',a,b?’c=’,cPROCp1PRIVATEa,bSTORE20toa,b

?'執行過程時a,b的值',a,bPUBLICcc=30ENDPROC 例題:變量作用域顯示結果1010

顯示結果1010

顯示結果2020

6.3.4存儲過程存儲過程是保存在數據庫文件中的過程,屬于數據庫對象的一部分。它可以被數據庫中的對象調用,例如,可作為數據表字段的默認值和有效性規則。數據庫編輯存儲過程存儲過程快捷菜單編輯存儲過程單擊數據庫設計器工具欄的“編輯存儲過程”按鈕PROCEDUREnewtxm()SELEMAX(條形碼)FROM圖書INTOARRAYltxm

lntxm=ALLTRIM(STR(VAL(RIGHT(ltxm(1),7))+1))RETU'P'+REPLICATE('0',7-LEN(lntxm))+lntxmENDPROC例題:存儲過程建立一個存儲過程,獲得一個條形碼。該條形碼以字母P開頭,后7位數字為當前圖書表中書籍編號的最大值加一例題:存儲過程設置為默認值一個三位正整數等于它的各位數字的立方和,該數稱為水仙花數。顯示所有的水仙花數

FORm=100TO999m1=&&求出m的百位數

m2=&&求出m的十位數

m3=m-m1*100-m2*10&&求出m的個位數IFm=m1*m1*m1+m2*m2*m2+m3*m3*m3

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論