小學教育第三章 VF程序設計基礎-課件_第1頁
小學教育第三章 VF程序設計基礎-課件_第2頁
小學教育第三章 VF程序設計基礎-課件_第3頁
小學教育第三章 VF程序設計基礎-課件_第4頁
小學教育第三章 VF程序設計基礎-課件_第5頁
已閱讀5頁,還剩121頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第三章VisualFoxPro

程序設計基礎基本學習目標:1.掌握建立、修改、運行程序的方法2.掌握和使用順序結構、選擇結構和循環結構進階學習目標:1.靈活運用各種結構進行程序設計2.了解多模塊程序結構1第三章VisualFoxPro

程序設計基礎基本學習目標3.1程序概述程序:為了完成某項任務而編寫的命令序列。程序的本質都是進行數值計算或數據處理,得出有用的信息。程序是完成大型的、復雜的、綜合性較強而且需要多次重復執行的任務的最適合方式。VFP同時支持面向過程(OP)和面向對象(OO)的程序設計方法。其中OP是OO的基礎。23.1程序概述程序:為了完成某項任務而編寫的命令序列。程3.1.1程序設計的步驟建立編輯保存執行調試相關概念:程序代碼:以命令形式出現的指令、函數或任何VFP能理解的操作指令。保存程序代碼的文件稱為命令文件、程序文件或程序。代碼的使用:在程序、命令窗口中,以及表單、類、菜單、報表等的事件、過程或方法程序中。33.1.1程序設計的步驟建立相關概念:31.建立程序建立程序:3種方法(1)命令:MODIFYCOMMAND[<盤符>][<路徑>]〈文件名〉MODIFYFILE[<盤符>][<路徑>]〈文件名〉(2)選擇“文件”|“新建”|選擇文件類型為“程序”|單擊“新建文件”按鈕。(3)在項目管理器中選擇“代碼”選項卡|選擇“程序”|單擊“新建(N)…”按鈕。無論使用哪種方法,VFP都會打開程序窗口,用戶就可在其中編制代碼,完成程序設計。41.建立程序建立程序:3種方法42.程序的編輯和保存(1)編輯:先打開:3種方法①命令:MODIFYCOMMAND|FILE程序文件名②菜單:“文件”|“打開”|選擇文件類型為“程序”|選擇需要打開的程序文件|單擊“確定”按鈕。③項目管理器:選“代碼”選項卡,選中需打開的程序文件,再單擊“修改(M)”按鈕。(2)保存(應隨時保存),默認擴展名.PRG。5種方法:①按下Ctrl+S快捷鍵,存盤但不退出程序窗口。②按下Ctrl+W則存盤退出程序窗口。③選擇“文件”|“保存”或“另存為”命令。④單擊工具欄上的“保存”按鈕。⑤在關閉程序窗口系統詢問是否保存時選擇是即可保存52.程序的編輯和保存(1)編輯:先打開:3種方法53.執行程序:4法(1)命令:DO[<盤符>][<路徑>\]<文件名> 執行程序文件時,將依次執行文件中的命令,直到所有命令執行完畢,或者執行到以下命令: ①CANCEL:終止程序運行,清除所有的私有變量,返回命令窗口; ②RETURN:結束程序執行,返回調用它的上級程序,若無上級程序則 返回命令窗口; ③QUIT:結束程序執行并退出VFP,返回操作系統。(2)菜單:選“程序”|“運行”命令打開“運行”對話框,選擇需執行的程序后單擊“運行”按鈕。(3)項目管理器:在“代碼”選項卡中選擇需要執行的程序文件再單擊“運行(U)”按鈕。(4)程序窗口中:按下Ctrl+E或單擊工具欄上的“!”運行按鈕,也可以右擊程序窗口,從快捷菜單中選擇“執行XXX.PRG”命令(XXX.PRG表示當前程序窗口中的程序文件名)63.執行程序:4法(1)命令:DO[<盤符>][<3.1.2程序中的常用命令

簡單的輸入輸出

數組與表中數據的傳送命令

內存變量與表中記錄的傳送命令

73.1.2程序中的常用命令71.簡單的輸入輸出命令ACCEPTINPUTWAIT@…SAY…GET\\\TEXT…ENDTEXT81.簡單的輸入輸出命令8(1)ACCEPT命令格式: ACCEPT[<提示信息>]TO<內存變量>

功能: 提示并等待用戶輸入一個字符串給指定內存變量。注意:該命令只能輸入字符型數據,所輸入的字符串不需要加定界符。

9(1)ACCEPT命令格式:9【例3-1】打開并顯示數據表的內容CLEARACCEPT“請輸入數據庫名:”TOkmOPENDATABASE&kmACCEPT"請輸入表名"TObmUSE&bmLISTUSE10【例3-1】打開并顯示數據表的內容CLEAR10(2)INPUT命令格式: INPUT[<提示信息>]TO<內存變量>

功能:用以提示并等待用戶輸入數據。可以輸入字符型、數值型、邏輯型、日期型和日期時間型等類型數據,而且可以是常量、變量、函數或表達式等形式,按回車鍵結束輸入。系統會將用戶輸入數據(若需要,則先行計算出結果)賦值給指定內存變量。11(2)INPUT命令格式:11【例3-2】輸入長方形的長和寬,求面積CLEARINPUT“長方形的長為:”TOchangINPUT“長方形的寬為:”TOkuans=chang*kuan?“長方形的面積為:”,s12【例3-2】輸入長方形的長和寬,求面積12(3)WAIT命令格式:WAIT[<提示信息>][TO<內存變量>][WINDOW[AT<行>,<列>]][NOWAIT][CLEAR|NOCLEAR][TIMEOUT<數值表達式>]功能:暫停并顯示提示信息,用戶按任意鍵或單擊鼠標時才繼續執行程序。說明:可選項[TO<內存變量>],將輸入的單個字符存入指定的<內存變量>;若用戶是按Enter鍵或單擊鼠標,<內存變量>的值為空串。若省略所有可選項,屏幕顯示“鍵入任意鍵繼續……”的默認提示信息。13(3)WAIT命令格式:13【例3-3】按學號查“學生成績”CLEARUSE學生成績ACCEPT“請輸入待查學生的學號:"TOnIFLEN(n)=0 WAIT“輸入無效,結束程序運行!”;

WINDOWTIMEOUT5ELSE LISTFORn=學號ENDIFUSE14【例3-3】按學號查“學生成績”CLEAR14ACCEPT、WAIT、INPUT比較ACCEPT命令只能接受字符串,不需要定界符,輸入完畢按回車鍵結束WAIT命令只能輸入單個字符,也不需定界符,但輸入完畢不需按回車鍵INPUT命令功能最強,可接受數值型、字符型、邏輯型、日期型和日期時間型數據,數據形式可以是常量、變量、函數和表達式,如果是字符串,需要用定界符,輸入完畢按回車鍵結束。15ACCEPT、WAIT、INPUT比較ACCEPT命令只能接(4)定位輸入輸出命令@<行,列>[SAY<表達式1>][GET<變量名>][DEFAULT<表達式2>]功能:在指定行列位置顯示<表達式1>的值,并允許修改<變量名>的值。指定數據起始顯示位置需要顯示的串需要輸入或修改的變量變量的初值說明:①行號和列號都從0開始的十進制整數。②先輸出表達式1(背景色以標準型顯示),再空一格后接著顯示變量值(背景色以增強型顯示),無SAY子句則從指定位置顯示變量值。③變量要有初值(可用DEFAULT指定)其類型在編輯期間不能改變,字符型的寬度和數值型的小數位數也不可更改。④GET子句必須由READ子句激活后才能編輯GET變量值。直到光標移出由這些GET變量組成的區域時READ命令才算執行結束。16(4)定位輸入輸出命令@<行,列>[SAY<表達式1CLEARUSE學生成績@2,5SAY"待修改的記錄號:"GETJLHDEFA1READGOJLHSCATTERMEMV&&將記錄數據導出到與字段變量同名的一組內存變量中@4,5SAY"學號:"GETM.學號@6,5SAY"高數:"GETM.高數@8,5SAY"英語:"GETM.英語@10,5SAY"計算機:"GETM.計算機READ@14,5SAY"保存修改?(Y/N):"GETOKDEFA"y"READIFUPPER(OK)=“Y" GATHERMEMV @16,5SAY"存盤完畢!"ELSE @16,5SAY"你放棄了修改。"ENDIFUSE【例3-4】修改“學生成績”記錄17CLEAR【例3-4】修改“學生成績”記錄17(3)文本輸出命令\、\\①\或\\命令格式:<\>|<\\>文本串功能:\:先換行,再原樣輸出文本串中的所有字符。\\:不換行直接輸出。若文本串中有需要計算的表達式,可先用命令SETTEXTMERGEON設置文本的合并計算,然后用一對<<>>將要計算的表達式括起來。這樣,在輸出到<<>>部分時,先計算出其中的表達式的值,再將該值和剩余文本串輸出來。如:SETTEXTMERGEON\今天是<<month(date())>>月<<day(date())>>日&&若今天是9月5日則會輸出“今天是9月5日”的文本。18(3)文本輸出命令\、\\①\或\\命令18②text…endtext命令格式:TEXT 文本行1 文本行2 文本行3 …ENDTEXT功能:先換行,然后將text…endtext之間的所有文本行原樣輸出。19②text…endtext命令192.數組與表中數據的傳送命令(1)將表中數據傳送給數組格式:COPYTOARRAY<數組名>[FIELDS<字段名表>|FIELDSLIKE<通配符>|FIELDSEXCEPT<通配符>][范圍子句][條件子句][NOOPTIMIZE]功能:將當前工作區中打開的表中的數據傳送到一維/二維數組中。一維數組僅存一條記錄,二維數組可存多條記錄。202.數組與表中數據的傳送命令(1)將表中數據傳送給數組20數組與表中數據的傳送說明:如右圖所示:表中的備注字段不會存入數組如:COPYTOARRAYaTempFIELDSLIKEa*,p*&&把表中符合字段首字符為a或p的記錄存入數組aTemp中。如:COPYTOARRAYaMyArray;

FIELDSLIKEA*,P*EXCEPTPARTNO*&&把表中符合字段首字符為A或P但以PARTNO開頭的字段

除外的記錄數據存入數組aMyArray中說明21數組與表中數據的傳送說明:如右圖所示:表中的備注字段不會存入如:USE學生成績 &&打開“學生成績”表DIMENSIONa(3,4)&&定義3行4列的二維數組COPYNEXT3TOARRAYa

&&把表中頭3條記錄存入二維數組a中。DISPLAYMEMORYLIKEa

&&顯示數組中各元素信息,結果如圖所示:

22如:USE學生成績 &&打開“學生成績”表22(2)將數組中的數據添加到數據表中格式:APPENDFROMARRAY<數組名>[FOR條件];[FIELDS<字段列表>|FIELDSLIKE<通配符>|FIELDSEXCEPT<通配符>]功能:與COPYTOARRAY剛好相反,是將數組中符合條件的數據追加到當前工作區中打開的數據表中。說明:①若數組列數多,則忽略多余列。反之,若數組列數少,則多出的字段被置為相應類型的空值。如字符型的則置為指定寬度的空格串。②忽略數組中的備注型、通用型數據。③若數組中某列的值與相應字段的類型不匹配,則對應字段也被置為相應類型的空值。④二維數組中有多少行,則在表中追加相應行數的記錄。若是一維數組,僅追加一行,具體參照二維數組中的一行來處理。23(2)將數組中的數據添加到數據表中說明:23如:DIMENSIONa(4)a=60a(1)="2000130205"USE學生成績&&打開“學生成績”表APPENDFROMARRAYaUSE該段代碼將在“學生成績”表中追加一條新記錄,其學號、高數、英語、計算機字段的值分別為"2000130205",60,60,60。24如:該段代碼將在“學生成績”表中追加一條新記錄,其學號、高數3.內存變量與表中記錄的傳送命令(1)將當前記錄傳送到數組或內存變量中格式:SCATTER[FIELDS<字段名表>][TO<數組名>︱MEMVAR][BLANK]功能:與COPYTOARRAY功能相似。用來將數據表中當前記錄的內容導出到數組或者與字段變量同名的內存變量中。253.內存變量與表中記錄的傳送命令(1)將當前記錄傳送到數組或說明①當使用TO<數組名>子句時,相當于COPYTOARRAY到一維數組中。但不同的是當數組列數少于表中字段數時,會自動擴大數組到適合大小。②當使用MEMVAR子句時,將數據表中當前記錄的內容導出到與字段變量同名的一組內存變量中。若這些同名的內存變量不存在,則自動創建這組變量。若同時還有BLANK子句,則只創建這組變量,并不傳送數據。③忽略表中的備注型、通用型字段數據。26說明①當使用TO<數組名>子句時,相當于COPYTO(2)用數組或內存變量值替換當前記錄格式:GATHER[FROM<數組名>]︱[MEMVAR]|NAME<對象名>[FIELDS<字段列表>|FIELDSLIKE<通配符>|FIELDSEXCEPT<通配符>][MEMO]功能:與SCATTER命令的傳送方向剛好相反,是以數組或指定內存變量中的數據替換當前工作區里打開的數據表中的當前記錄。27(2)用數組或內存變量值替換當前記錄27說明:①若選用FROM<數組名>子句,則與APPENDFROMARRAY從一維數組中添加記錄類似,只是此處是替換當前記錄而不是追加記錄。當數組列數大于表中字段數,則忽略多余的元素。反之,表中多出的字段的值不受影響。②若選用MEMV子句,則使用同名的內存變量值來替換表中相應的字段值。③若需要替換表中的備注字段值,可加上MEMO子句,但是不能替換通用字段值。④若選用NAME<對象名>子句,則可用指定對象中的同名屬性值來替換表中當前記錄相應的字段值。28說明:28USE學生成績&&打開“學生成績”表SCATTERMEMVBLANKM.學號="2000130209"STORE70TOM.高數,M.英語,M.計算機APPENDBLANKGATHERMEMVUSE在“學生成績”表追加一條新記錄,其學號、高數、英語、計算機字段值分別為"2000130209",70,70,7029USE學生成績&&打開“學生成績3.1.3系統運行環境的命令設置(1)SETDEFAUTTO[<路徑字符串>]

&&設置默認搜索目錄搜索順序:I.當前目錄,II.命令指定的目錄,III.系統默認目錄。若都找不到,才報告出錯信息。(2)SETCENTURYON|OFF設置D、T型“年”的顯示位數。默認OFF,2位;ON,4位。(3)SETFIELDSTO[<字段列表>]|[ALL]|[ALLLIKE|EXCEPT<通配符>] &&設置字段表(投影),選取用戶關心的字段,不在<字段列表>中的字段數據不顯示。用SETFIELDSOFF恢復所有字段。(4)SETSAFETYON|OFF&&設置安全操作提示若設為ON,將同名新文件覆蓋舊文件時會詢問是否覆蓋,此時選擇否可不覆蓋,否則覆蓋;用ZAP命令徹底刪除表中的所有記錄時也會詢問是否徹底刪除表中的所有記錄,選擇否可不刪除,否則刪除。若設為OFF,則遇到上面兩種情況都不提示而直接覆蓋或刪除。默認為ON。303.1.3系統運行環境的命令設置(1)SETDEF(5)SETTALKON|OFF功能:打開或關閉對話開關,默認為ON。若設為ON,允許把對話結果發送到VFP主窗口、系統信息窗口、圖形狀態欄或用戶自定義窗口中。若先為OFF后再改為ON,那么對話結果將傳送到發出SETTALKOFF命令之前的輸出位置。若設為OFF:阻止把對話結果發送到VFP主窗口、系統信息窗口、圖形狀態欄或用戶自定義窗口中31313.2程序的基本結構1.順序結構:按語句的書寫順序依次執行。VFP中的大多數命令都可以作為順序結構中的語句。2.分支結構:根據不同的條件,選擇執行不同的程序語句,用來解決有選擇、有轉移的諸多問題的控制結構。3.循環結構:使某些語句或程序段重復執行若干次。如果某些語句或程序段需要在一個固定的位置上重復操作,使用循環是最好的選擇。4.過程結構:在許多應用程序中,有一些程序段需要反復執行多次,這些程序段不在一個固定的位置上,而是分散在程序的許多位置上重復執行,可將其與嵌入它的程序分開,形成獨立的程序序列,待使用時再調入程序中,以實現不同位置上的重復操作。這樣做增強了程序的可讀性和模塊化。我們稱這種具有獨立功能而且可以被其它程序調用的程序序列為過程。323.2程序的基本結構1.順序結構:按語句的書寫順序依次執3.2.1分支結構分支結構形式有三種單向分支雙向分支多向分支。333.2.1分支結構分支結構形式有三種331.單向分支:有條件執行某一操作。(1)單向分支語句:IF〈條件表達式〉 〈語句序列〉ENDIF(2)執行過程:第一步:計算〈條件表達式〉的值。第二步:決定是否執行〈語句序列〉。若該值為真,則執行〈語句序列〉;否則,不執行。第三步:執行ENDIF后面的第一條命令。341.單向分支:有條件執行某一操作。(1)單向分支語句:(2)【例3-5】求一元二次方程ax2+bx+c=0的實根。INPUTTOaINPUTTObINPUTTOcz=b^2-4*a*cIFz>=0 x1=(-b+SQRT(z))/(2*a) x2=(-b-SQRT(z))/(2*a) ?x1,x2ENDIF35【例3-5】求一元二次方程ax2+bx+c=0的實根。352.雙向分支:從兩個分支中選擇一個執行。(1)語句格式:IF〈條件表達式〉 〈語句序列1〉ELSE 〈語句序列2〉ENDIF(2)執行過程:第一步:計算〈條件表達式〉的值。第二步:決定執行哪個操作。當該值為真時,執行〈語句序列1〉中的命令;否則,執行〈語句序列2〉中的命令。第三步:執行ENDIF后面的第一條命令。362.雙向分支:從兩個分支中選擇一個執行。(1)語句格式:(2【例3-6】編寫一密碼校驗程序(假設密碼為ABC)CLEARACCEPT“請輸入您的密碼:”TOmmIFmm=”ABC” CLEAR ?”歡迎使用本系統!”ELSE WAIT”密碼錯誤!”ENDIF37【例3-6】編寫一密碼校驗程序(假設密碼為ABC)373.多向分支:從多個分支中選擇

一個執行(1)語句格式:DOCASE CASE〈條件表達式1〉 <語句序列1> CASE〈條件表達式2〉 <語句序列2> …… CASE〈條件表達式n〉 〈語句序列n〉 [OTHERWISE 〈語句序列n+1〉]ENDCASE383.多向分支:從多個分支中選擇

一個執行(1)語句格式:3(2)執行過程:第一步:計算〈條件表達式1〉的值。第二步:決定下一步的操作。若該值為真,執行〈語句序列1〉,轉第2n+2步,否則執行第三步的操作。第三步:計算〈條件表達式2〉的值。第四步:決定下一步的操作。若該值為真,執行〈語句序列2〉,轉第2n+2步,否則執行第五步的操作。第五步:計算〈條件表達式3〉的值。第六步:決定下一步的操作。若該值為真,執行〈語句序列3〉,轉第2n+2步,否則執行第七步的操作。……第2n-1步:計算〈條件表達式n〉的值。第2n步:決定下一步的操作。若該值為真,執行〈語句序列n〉,轉第2n+2步,否則執行第2n+1步的操作。第2n+1步:若有OTHERWISE子句則執行〈語句序列n+1〉。第2n+2步:執行ENDCASE后的第一條命令。39(2)執行過程:39CLEARINPUT“請輸入收入:”TOpDOCASE CASEp<800 r=0 CASEp<2000 r=0.05 CASEp<5000 r=0.08 OTHERWISE r=0.1ENDCASETax=p*r?”稅金為:”,taxRETURN【例3-7】如表5-1,編程求稅金。40CLEAR【例3-7】如表5-1,編程求稅金。404.使用分支語句的注意事項(1)IF…ENDIF和DOCASE…ENDCASE必須配對使用,DOCASE與第一個CASE〈條件表達式〉之間不應有任何命令。(2)〈條件表達式〉可以是各種表達式或函數的組合,其值必須是邏輯值。(3)〈語句序列〉可以由一個或多個命令組成,也可以是條件控制語句和循環控制語句組成的嵌套結構。(4)DOCASE…ENDCASE命令根據給出的n個〈條件表達式〉的值,選擇n+1個〈語句序列〉中的一個執行。每次最多只能執行一個〈語句序列〉。在多個CASE項的〈條件表達式〉值為真時,只執行第一個〈條件表達式〉值為真的〈語句序列〉。當所有CASE中〈條件表達式〉的值都是假時,如果有OTHERWISE項,則執行〈語句序列n+1〉,否則一個分支也不執行。414.使用分支語句的注意事項(1)IF…ENDIF和DOC3.2.2循環結構循環結構有三種語句:DOWHILEFORSCAN423.2.2循環結構循環結構有三種語句:421.DOWHILE循環DOWHILE<條件表達式> <語句序列1> [LOOP] <語句序列2> [EXIT] <語句序列3>ENDDO執行過程:參閱圖5-6第一步:求解循環頭DOWHILE后的<條件表達式>,若值為.T.,則依次執行循環體中的語句,否則轉第五步。循環體為位于DOWHILE和ENDDO之間的語句序列。第二步:循環體執行過程中,若執行了LOOP語句,則結束本次循環,轉到第一步。第三步:循環體執行過程中,若執行了EXIT語句,則強行跳出循環,轉到第五步。第四步:若循環體中所有語句均已經執行,轉第一步。第五步:本循環語句執行結束,轉去執行ENDDO之后的語句。

431.DOWHILE循環DOWHILE<條件表【例3-8】用DOWHILE循環將學生檔案表中“張三”之前(含“張三”)的所有學生的數據顯示出來。Clearuse學生檔案dowhile.not.eof() DISP if姓名<>"張三" skip loop endif exitenddouseRETURN44【例3-8】用DOWHILE循環將學生檔案表中“張三”之前FOR循環變量=初值TO終值[STEP步長] <語句序列1>

[LOOP]

<語句序列2>

[EXIT]

<語句序列3>

ENDFOR|NEXT2.FOR循環執行過程:參閱圖5-7。第一步:將初值賦給循環變量。第二步:判斷循環變量的值是否超過終值。超過的含義是:若步長大于0,則循環變量大于終值即為超過終值;若步長小于0,則循環變量小于終值就是超過。根據判斷的結果決定本結構的是否再執行。若未超過,則執行循環體(為FOR到與之配對的ENDFOR或NEXT之間的所有語句。若超過,轉第六步。第三步:若執行LOOP命令,結束本次循環,循環變量增加一個步長值,轉第二步。若省略STEP<步長>,則〈步長〉為默認值1。第四步:若執行EXIT命令,轉第六步。第五步:若循環體中所有語句均已經執行,轉第二步。第六步:結束FOR循環,執行其后的語句。

45FOR循環變量=初值TO終值[STEP步長CLEARs=1fh=1FORi=2TO100 s=s+i*fh fh=-1*fhENDFOR?”1+2-3+……+100=”,sRETURN【例3-9】編程求1+2-3+4-5+……-99+100之和。46CLEAR【例3-9】46CLEARINPUT“請從鍵盤輸入一個數:”TOxSTORExTOmax,minFORi=2TO10 INPUT“請從鍵盤輸入一個數:”TOx IFmax<x max=x ENDIF IFmin>x min=x ENDIFENDFOR?“最大值為:”,max?“最小值為:”,minRETURN【例3-10】從鍵盤輸入10個數,編程找出其中的最大值和最小值47CLEAR【例3-10】473.“指針”型循環:SCAN…ENDSCANSCAN[<范圍>][FOR<條件表達式1>| [WHILE<條件表達式2>]

] <語句序列>ENDSCAN功能:在指定的范圍內,用數據記錄指針來控制循環次數。執行語句時,首先判斷函數EOF()的值,若其值為“真”,則結束循環,否則,結合<條件表達式1>或<條件表達式2>,執行〈語句序列〉(滿足條件時執行);然后,記錄指針移到指定的范圍和條件內的下一條記錄,重新判斷函數EOF()的值,直到函數EOF()的值為真時結束循環。483.“指針”型循環:SCAN…ENDSCANSCAN[<CLEARUSE學生檔案SCANFORNOT是否貸款 ?姓名,出生地ENDSCANUSERETURN【例3-11】輸出“學生檔案”表中所有未貸款學生的姓名和出生地。49CLEAR【例3-11】輸出“學生檔案”表中所有未貸款學生的4.使用循環語句的說明(1)DOWHILE…ENDDO、FOR…ENDFOR、 SCAN…ENDSCAN須配對使用。(2)〈語句序列〉可以是任何VFP命令或語句,若為循環語句則構成多重循環。(3)〈循環變量〉應是數值型的內存變量或數組元素。(4)EXIT和LOOP命令嵌入在循環體內,可以出現在〈語句序列〉的任意位置,用以改變循環次數,但是不能單獨使用。(5)EXIT的功能是跳出循環,轉去執行ENDDO、ENDFOR、ENDSCAN后面的第一條命令(6)LOOP的功能是轉回到循環的開始處,重新對“條件”進行判斷,相當于執行了一次ENDDO、ENDFOR、ENDSCAN命令,它可以改變〈語句序列〉中部分命令的執行次數。504.使用循環語句的說明(1)DOWHILE…ENDDO、F3.2.3結構的嵌套應用順序、分支和循環等結構可以相互嵌套,但不允許交叉,必須保證下一個嵌套要完整地包含在上一個的結構體內。正確的嵌套關系如:DOWHILE<條件表達式1> <語句序列11> FOR<循環變量>=<初值>TO<終值>[STEP<步長>] <語句序列21> SCAN[范圍][FOR|WHILE<條件表達式3>] <語句序列3> ENDSCAN <語句行序列22> ENDFOR <語句行序列12>ENDDO513.2.3結構的嵌套應用順序、分支和循環等結構可【例3-12】用多重循環編程輸出下三角形乘法口訣表52【例3-12】用多重循環編程輸出下三角形乘法口訣表52【例3-12】程序:CLEARFORi=1TO9j=1DOWHILEj<=i k=i*j ??STR(j,1)+"*"+STR(i,1)+"="+STR(k,2)+"" j=j+1ENDDO?ENDFORRETURN53【例3-12】程序:533.3自定義函數和過程在程序設計中,常把完成一個功能的程序編寫成一個單元,以便在其他程序中使用該功能時調用該程序。這種為完成一個特定功能而編寫的程序稱為自定義函數或過程。函數的特點:有返回值過程的特點:忽略返回值,重視處理流程543.3自定義函數和過程在程序設計中,常把完成一個功能的程3.3.1自定義函數VisualFoxPro8雖然提供了三百多種函數,但不可能完全滿足用戶的各種需求,為了滿足某些特殊需要,VisualFoxPro允許用戶根據需要編寫一個專用函數,這就是自定義函數。自定義函數的語法如下:FUNCTION函數名 PARAMETERS參數表 語句序列 RETURN返回值ENDFUNC定義函數名稱,其他程序要通過這個名稱來調用這個函數。

定義形式參數,用來接收主調程序傳遞過來的數據(實參)。若無需接收參數,此句可省略。將處理結果值帶回主調程序,無此語句將帶回.T.“FUNCTION函數名”表示函數的開始,缺省時文件名即為函數名。“ENDFUNC”表示函數的結束,缺省時在遇到下一個Function或者文件結束時結束。語句序列是用戶為完成應用需要而編寫的代碼。

553.3.1自定義函數VisualFoxPro8雖然提供CLEARINPUT“x=”TOx?x,”的階乘為:”,jc(x)FUNCTIONjc

PARAMETERSn y=1 FORi=1TOn y=y*i ENDFOR RETURNyENDFUNC【例3-13】將計算階乘的程序寫成自定義函數并調用。56CLEAR【例3-13】將計算階乘的程序寫成自定義函數并調用3.3.2 過程過程的實現和函數基本相同,一般無返回值。若需要,可以通過PARAMETERS語句返回。過程定義的語法如下:PROCEDURE過程名 PARAMETERS參數表 語句序列ENDPROC定義過程名稱,其他程序要通過這個名稱來調用這個過程。

定義形式參數,用來接收主調程序傳遞過來的數據(實參),并可將處理結果值帶回主調程序。若無需接收參數,此句可省略。“PROCEDURE過程名”表示過程的開始,缺省時文件名即為過程名。“ENDPROC”表示過程的結束,缺省時在遇到下一個Function、PROCEDURE或者文件結束時結束。語句序列是用戶為完成應用需要而編寫的代碼。

過程調用格式:DO過程名[WITH參數表]如果沒有參數,可省略[WITH參數表]573.3.2 過程過程的實現和函數基本相同,一般無返回值。若需【例3-14】實現一個字符串輸出的過程。

CLEARDOssPROCEDUREss ?"歡迎使用VFP8系統!"ENDPROC【例5-15】實現一個傳參求累加和的過程。CLEARINPUT"輸入一個數"TOxDOaddouWITHxPROCEDUREaddou PARAMETERSx sum=0 FORi=1TOx sum=sum+I ENDFOR ?"從1累加到",x,"的和為:",sumENDPROC58【例3-14】實現一個字符串輸出的過程。【例5-15】實現一3.3.3變量的作用域變量的作用域是指變量的有效范圍,即變量的“可見性”。定義一個變量時,應該明確要在程序的什么地方使用該變量,以決定其“權力級別”。在VFP中,有三種級別的作用范圍,即全局變量(或稱公共變量)、私有變量和局部變量(或稱本地變量)。1.全局變量:作用范圍最大,在所有程序模塊中都有效。初值為.F.。

定義格式為:PUBLIC<內存變量表>2.私有變量:未經定義就直接使用的變量,在本(子)程序及下屬的 子程序內有效。說明格式為:PRIVATE<內存變量表>3.局部變量:作用范圍最小,只能在建立它的模塊中使用,在高層和 底層模塊中均不能使用,該模塊運行結束時局部變量就自動釋放。

定義格式為:LOCAL<內存變量表>593.3.3變量的作用域變量的作用域是指變量的有效范圍,即【例3-16】變量隱藏與恢復的示例。CLEARRELEASEALL &&清除用戶定義的所有內存變量mj=0 &&在命令窗口設置的變量是公共變量bj=3?"程序執行前的變量清單:"LISTMEMOLIKE?j &&顯示變量清單DOgcWITHbj &&bj傳入gc?"程序執行后的變量清單:" &&顯示變量清單LISTMEMOLIKE?j &&程序執行結束時,被屏蔽的變量mj,bj被恢復

PROCEDUREgcPARAMETERSsj &&sj為私有變量,程序調用前的bj被隱藏起來PRIVATEmj &&mj為私有變量,調用前同名變量mj被隱藏起來mj=3.14*sj*sj?"程序執行時的變量清單:"sj=1 &&改變sj的值就是改變主程序中bj變量的值LISTMEMOLIKE?jRETURN60【例3-16】變量隱藏與恢復的示例。603.4程序的調試在程序開發過程中發生各種錯誤是在所難免的。程序調試的目的就是檢查并糾正程序中的各種錯誤,以保證程序的可靠運行。VFP提供的調試器可以動態監測程序的執行情況,幫助程序設計者較快地找出并糾正這些錯誤,使程序達到預定設計要求。613.4程序的調試在程序開發過程中發生各種錯誤是在所難免的調試器窗口

選擇“工具”菜單中的“調試器”,或用命令DEBUG即可打開如圖5-12所示的調試器窗口。追蹤窗口執行位置指示監視窗口調用棧窗口局部窗口變量值及其類型列表調試輸出窗口62調試器窗口選擇“工具”菜單中的“調試器”,或用命令DEBU調試器的使用單擊“打開程序”按鈕,在跟蹤窗口中打開程序單擊“執行程序”按鈕執行程序在局部窗口中可以顯示變量的名稱、值和類型。在追蹤窗口中“執行位置指示”是一個小箭頭,表示程序執行的當前位置。單擊“單步執行”按鈕就執行一條語句。在調試程序過程中,經常需要將程序執行到一個位置上停下來,該位置稱為斷點。設置斷點的方法是:將鼠標移到指定語句處雙擊,在該語句左邊就會顯示一個小紅圓點,當程序執行到該位置就中斷,以便分析當前程序執行的變量輸出情況。再次雙擊即可取消斷點。63調試器的使用單擊“打開程序”按鈕,在跟蹤窗口中打開程序63作業:本章課后習題

64作業:本章課后習題

64第三章VisualFoxPro

程序設計基礎基本學習目標:1.掌握建立、修改、運行程序的方法2.掌握和使用順序結構、選擇結構和循環結構進階學習目標:1.靈活運用各種結構進行程序設計2.了解多模塊程序結構65第三章VisualFoxPro

程序設計基礎基本學習目標3.1程序概述程序:為了完成某項任務而編寫的命令序列。程序的本質都是進行數值計算或數據處理,得出有用的信息。程序是完成大型的、復雜的、綜合性較強而且需要多次重復執行的任務的最適合方式。VFP同時支持面向過程(OP)和面向對象(OO)的程序設計方法。其中OP是OO的基礎。663.1程序概述程序:為了完成某項任務而編寫的命令序列。程3.1.1程序設計的步驟建立編輯保存執行調試相關概念:程序代碼:以命令形式出現的指令、函數或任何VFP能理解的操作指令。保存程序代碼的文件稱為命令文件、程序文件或程序。代碼的使用:在程序、命令窗口中,以及表單、類、菜單、報表等的事件、過程或方法程序中。673.1.1程序設計的步驟建立相關概念:31.建立程序建立程序:3種方法(1)命令:MODIFYCOMMAND[<盤符>][<路徑>]〈文件名〉MODIFYFILE[<盤符>][<路徑>]〈文件名〉(2)選擇“文件”|“新建”|選擇文件類型為“程序”|單擊“新建文件”按鈕。(3)在項目管理器中選擇“代碼”選項卡|選擇“程序”|單擊“新建(N)…”按鈕。無論使用哪種方法,VFP都會打開程序窗口,用戶就可在其中編制代碼,完成程序設計。681.建立程序建立程序:3種方法42.程序的編輯和保存(1)編輯:先打開:3種方法①命令:MODIFYCOMMAND|FILE程序文件名②菜單:“文件”|“打開”|選擇文件類型為“程序”|選擇需要打開的程序文件|單擊“確定”按鈕。③項目管理器:選“代碼”選項卡,選中需打開的程序文件,再單擊“修改(M)”按鈕。(2)保存(應隨時保存),默認擴展名.PRG。5種方法:①按下Ctrl+S快捷鍵,存盤但不退出程序窗口。②按下Ctrl+W則存盤退出程序窗口。③選擇“文件”|“保存”或“另存為”命令。④單擊工具欄上的“保存”按鈕。⑤在關閉程序窗口系統詢問是否保存時選擇是即可保存692.程序的編輯和保存(1)編輯:先打開:3種方法53.執行程序:4法(1)命令:DO[<盤符>][<路徑>\]<文件名> 執行程序文件時,將依次執行文件中的命令,直到所有命令執行完畢,或者執行到以下命令: ①CANCEL:終止程序運行,清除所有的私有變量,返回命令窗口; ②RETURN:結束程序執行,返回調用它的上級程序,若無上級程序則 返回命令窗口; ③QUIT:結束程序執行并退出VFP,返回操作系統。(2)菜單:選“程序”|“運行”命令打開“運行”對話框,選擇需執行的程序后單擊“運行”按鈕。(3)項目管理器:在“代碼”選項卡中選擇需要執行的程序文件再單擊“運行(U)”按鈕。(4)程序窗口中:按下Ctrl+E或單擊工具欄上的“!”運行按鈕,也可以右擊程序窗口,從快捷菜單中選擇“執行XXX.PRG”命令(XXX.PRG表示當前程序窗口中的程序文件名)703.執行程序:4法(1)命令:DO[<盤符>][<3.1.2程序中的常用命令

簡單的輸入輸出

數組與表中數據的傳送命令

內存變量與表中記錄的傳送命令

713.1.2程序中的常用命令71.簡單的輸入輸出命令ACCEPTINPUTWAIT@…SAY…GET\\\TEXT…ENDTEXT721.簡單的輸入輸出命令8(1)ACCEPT命令格式: ACCEPT[<提示信息>]TO<內存變量>

功能: 提示并等待用戶輸入一個字符串給指定內存變量。注意:該命令只能輸入字符型數據,所輸入的字符串不需要加定界符。

73(1)ACCEPT命令格式:9【例3-1】打開并顯示數據表的內容CLEARACCEPT“請輸入數據庫名:”TOkmOPENDATABASE&kmACCEPT"請輸入表名"TObmUSE&bmLISTUSE74【例3-1】打開并顯示數據表的內容CLEAR10(2)INPUT命令格式: INPUT[<提示信息>]TO<內存變量>

功能:用以提示并等待用戶輸入數據。可以輸入字符型、數值型、邏輯型、日期型和日期時間型等類型數據,而且可以是常量、變量、函數或表達式等形式,按回車鍵結束輸入。系統會將用戶輸入數據(若需要,則先行計算出結果)賦值給指定內存變量。75(2)INPUT命令格式:11【例3-2】輸入長方形的長和寬,求面積CLEARINPUT“長方形的長為:”TOchangINPUT“長方形的寬為:”TOkuans=chang*kuan?“長方形的面積為:”,s76【例3-2】輸入長方形的長和寬,求面積12(3)WAIT命令格式:WAIT[<提示信息>][TO<內存變量>][WINDOW[AT<行>,<列>]][NOWAIT][CLEAR|NOCLEAR][TIMEOUT<數值表達式>]功能:暫停并顯示提示信息,用戶按任意鍵或單擊鼠標時才繼續執行程序。說明:可選項[TO<內存變量>],將輸入的單個字符存入指定的<內存變量>;若用戶是按Enter鍵或單擊鼠標,<內存變量>的值為空串。若省略所有可選項,屏幕顯示“鍵入任意鍵繼續……”的默認提示信息。77(3)WAIT命令格式:13【例3-3】按學號查“學生成績”CLEARUSE學生成績ACCEPT“請輸入待查學生的學號:"TOnIFLEN(n)=0 WAIT“輸入無效,結束程序運行!”;

WINDOWTIMEOUT5ELSE LISTFORn=學號ENDIFUSE78【例3-3】按學號查“學生成績”CLEAR14ACCEPT、WAIT、INPUT比較ACCEPT命令只能接受字符串,不需要定界符,輸入完畢按回車鍵結束WAIT命令只能輸入單個字符,也不需定界符,但輸入完畢不需按回車鍵INPUT命令功能最強,可接受數值型、字符型、邏輯型、日期型和日期時間型數據,數據形式可以是常量、變量、函數和表達式,如果是字符串,需要用定界符,輸入完畢按回車鍵結束。79ACCEPT、WAIT、INPUT比較ACCEPT命令只能接(4)定位輸入輸出命令@<行,列>[SAY<表達式1>][GET<變量名>][DEFAULT<表達式2>]功能:在指定行列位置顯示<表達式1>的值,并允許修改<變量名>的值。指定數據起始顯示位置需要顯示的串需要輸入或修改的變量變量的初值說明:①行號和列號都從0開始的十進制整數。②先輸出表達式1(背景色以標準型顯示),再空一格后接著顯示變量值(背景色以增強型顯示),無SAY子句則從指定位置顯示變量值。③變量要有初值(可用DEFAULT指定)其類型在編輯期間不能改變,字符型的寬度和數值型的小數位數也不可更改。④GET子句必須由READ子句激活后才能編輯GET變量值。直到光標移出由這些GET變量組成的區域時READ命令才算執行結束。80(4)定位輸入輸出命令@<行,列>[SAY<表達式1CLEARUSE學生成績@2,5SAY"待修改的記錄號:"GETJLHDEFA1READGOJLHSCATTERMEMV&&將記錄數據導出到與字段變量同名的一組內存變量中@4,5SAY"學號:"GETM.學號@6,5SAY"高數:"GETM.高數@8,5SAY"英語:"GETM.英語@10,5SAY"計算機:"GETM.計算機READ@14,5SAY"保存修改?(Y/N):"GETOKDEFA"y"READIFUPPER(OK)=“Y" GATHERMEMV @16,5SAY"存盤完畢!"ELSE @16,5SAY"你放棄了修改。"ENDIFUSE【例3-4】修改“學生成績”記錄81CLEAR【例3-4】修改“學生成績”記錄17(3)文本輸出命令\、\\①\或\\命令格式:<\>|<\\>文本串功能:\:先換行,再原樣輸出文本串中的所有字符。\\:不換行直接輸出。若文本串中有需要計算的表達式,可先用命令SETTEXTMERGEON設置文本的合并計算,然后用一對<<>>將要計算的表達式括起來。這樣,在輸出到<<>>部分時,先計算出其中的表達式的值,再將該值和剩余文本串輸出來。如:SETTEXTMERGEON\今天是<<month(date())>>月<<day(date())>>日&&若今天是9月5日則會輸出“今天是9月5日”的文本。82(3)文本輸出命令\、\\①\或\\命令18②text…endtext命令格式:TEXT 文本行1 文本行2 文本行3 …ENDTEXT功能:先換行,然后將text…endtext之間的所有文本行原樣輸出。83②text…endtext命令192.數組與表中數據的傳送命令(1)將表中數據傳送給數組格式:COPYTOARRAY<數組名>[FIELDS<字段名表>|FIELDSLIKE<通配符>|FIELDSEXCEPT<通配符>][范圍子句][條件子句][NOOPTIMIZE]功能:將當前工作區中打開的表中的數據傳送到一維/二維數組中。一維數組僅存一條記錄,二維數組可存多條記錄。842.數組與表中數據的傳送命令(1)將表中數據傳送給數組20數組與表中數據的傳送說明:如右圖所示:表中的備注字段不會存入數組如:COPYTOARRAYaTempFIELDSLIKEa*,p*&&把表中符合字段首字符為a或p的記錄存入數組aTemp中。如:COPYTOARRAYaMyArray;

FIELDSLIKEA*,P*EXCEPTPARTNO*&&把表中符合字段首字符為A或P但以PARTNO開頭的字段

除外的記錄數據存入數組aMyArray中說明85數組與表中數據的傳送說明:如右圖所示:表中的備注字段不會存入如:USE學生成績 &&打開“學生成績”表DIMENSIONa(3,4)&&定義3行4列的二維數組COPYNEXT3TOARRAYa

&&把表中頭3條記錄存入二維數組a中。DISPLAYMEMORYLIKEa

&&顯示數組中各元素信息,結果如圖所示:

86如:USE學生成績 &&打開“學生成績”表22(2)將數組中的數據添加到數據表中格式:APPENDFROMARRAY<數組名>[FOR條件];[FIELDS<字段列表>|FIELDSLIKE<通配符>|FIELDSEXCEPT<通配符>]功能:與COPYTOARRAY剛好相反,是將數組中符合條件的數據追加到當前工作區中打開的數據表中。說明:①若數組列數多,則忽略多余列。反之,若數組列數少,則多出的字段被置為相應類型的空值。如字符型的則置為指定寬度的空格串。②忽略數組中的備注型、通用型數據。③若數組中某列的值與相應字段的類型不匹配,則對應字段也被置為相應類型的空值。④二維數組中有多少行,則在表中追加相應行數的記錄。若是一維數組,僅追加一行,具體參照二維數組中的一行來處理。87(2)將數組中的數據添加到數據表中說明:23如:DIMENSIONa(4)a=60a(1)="2000130205"USE學生成績&&打開“學生成績”表APPENDFROMARRAYaUSE該段代碼將在“學生成績”表中追加一條新記錄,其學號、高數、英語、計算機字段的值分別為"2000130205",60,60,60。88如:該段代碼將在“學生成績”表中追加一條新記錄,其學號、高數3.內存變量與表中記錄的傳送命令(1)將當前記錄傳送到數組或內存變量中格式:SCATTER[FIELDS<字段名表>][TO<數組名>︱MEMVAR][BLANK]功能:與COPYTOARRAY功能相似。用來將數據表中當前記錄的內容導出到數組或者與字段變量同名的內存變量中。893.內存變量與表中記錄的傳送命令(1)將當前記錄傳送到數組或說明①當使用TO<數組名>子句時,相當于COPYTOARRAY到一維數組中。但不同的是當數組列數少于表中字段數時,會自動擴大數組到適合大小。②當使用MEMVAR子句時,將數據表中當前記錄的內容導出到與字段變量同名的一組內存變量中。若這些同名的內存變量不存在,則自動創建這組變量。若同時還有BLANK子句,則只創建這組變量,并不傳送數據。③忽略表中的備注型、通用型字段數據。90說明①當使用TO<數組名>子句時,相當于COPYTO(2)用數組或內存變量值替換當前記錄格式:GATHER[FROM<數組名>]︱[MEMVAR]|NAME<對象名>[FIELDS<字段列表>|FIELDSLIKE<通配符>|FIELDSEXCEPT<通配符>][MEMO]功能:與SCATTER命令的傳送方向剛好相反,是以數組或指定內存變量中的數據替換當前工作區里打開的數據表中的當前記錄。91(2)用數組或內存變量值替換當前記錄27說明:①若選用FROM<數組名>子句,則與APPENDFROMARRAY從一維數組中添加記錄類似,只是此處是替換當前記錄而不是追加記錄。當數組列數大于表中字段數,則忽略多余的元素。反之,表中多出的字段的值不受影響。②若選用MEMV子句,則使用同名的內存變量值來替換表中相應的字段值。③若需要替換表中的備注字段值,可加上MEMO子句,但是不能替換通用字段值。④若選用NAME<對象名>子句,則可用指定對象中的同名屬性值來替換表中當前記錄相應的字段值。92說明:28USE學生成績&&打開“學生成績”表SCATTERMEMVBLANKM.學號="2000130209"STORE70TOM.高數,M.英語,M.計算機APPENDBLANKGATHERMEMVUSE在“學生成績”表追加一條新記錄,其學號、高數、英語、計算機字段值分別為"2000130209",70,70,7093USE學生成績&&打開“學生成績3.1.3系統運行環境的命令設置(1)SETDEFAUTTO[<路徑字符串>]

&&設置默認搜索目錄搜索順序:I.當前目錄,II.命令指定的目錄,III.系統默認目錄。若都找不到,才報告出錯信息。(2)SETCENTURYON|OFF設置D、T型“年”的顯示位數。默認OFF,2位;ON,4位。(3)SETFIELDSTO[<字段列表>]|[ALL]|[ALLLIKE|EXCEPT<通配符>] &&設置字段表(投影),選取用戶關心的字段,不在<字段列表>中的字段數據不顯示。用SETFIELDSOFF恢復所有字段。(4)SETSAFETYON|OFF&&設置安全操作提示若設為ON,將同名新文件覆蓋舊文件時會詢問是否覆蓋,此時選擇否可不覆蓋,否則覆蓋;用ZAP命令徹底刪除表中的所有記錄時也會詢問是否徹底刪除表中的所有記錄,選擇否可不刪除,否則刪除。若設為OFF,則遇到上面兩種情況都不提示而直接覆蓋或刪除。默認為ON。943.1.3系統運行環境的命令設置(1)SETDEF(5)SETTALKON|OFF功能:打開或關閉對話開關,默認為ON。若設為ON,允許把對話結果發送到VFP主窗口、系統信息窗口、圖形狀態欄或用戶自定義窗口中。若先為OFF后再改為ON,那么對話結果將傳送到發出SETTALKOFF命令之前的輸出位置。若設為OFF:阻止把對話結果發送到VFP主窗口、系統信息窗口、圖形狀態欄或用戶自定義窗口中95313.2程序的基本結構1.順序結構:按語句的書寫順序依次執行。VFP中的大多數命令都可以作為順序結構中的語句。2.分支結構:根據不同的條件,選擇執行不同的程序語句,用來解決有選擇、有轉移的諸多問題的控制結構。3.循環結構:使某些語句或程序段重復執行若干次。如果某些語句或程序段需要在一個固定的位置上重復操作,使用循環是最好的選擇。4.過程結構:在許多應用程序中,有一些程序段需要反復執行多次,這些程序段不在一個固定的位置上,而是分散在程序的許多位置上重復執行,可將其與嵌入它的程序分開,形成獨立的程序序列,待使用時再調入程序中,以實現不同位置上的重復操作。這樣做增強了程序的可讀性和模塊化。我們稱這種具有獨立功能而且可以被其它程序調用的程序序列為過程。963.2程序的基本結構1.順序結構:按語句的書寫順序依次執3.2.1分支結構分支結構形式有三種單向分支雙向分支多向分支。973.2.1分支結構分支結構形式有三種331.單向分支:有條件執行某一操作。(1)單向分支語句:IF〈條件表達式〉 〈語句序列〉ENDIF(2)執行過程:第一步:計算〈條件表達式〉的值。第二步:決定是否執行〈語句序列〉。若該值為真,則執行〈語句序列〉;否則,不執行。第三步:執行ENDIF后面的第一條命令。981.單向分支:有條件執行某一操作。(1)單向分支語句:(2)【例3-5】求一元二次方程ax2+bx+c=0的實根。INPUTTOaINPUTTObINPUTTOcz=b^2-4*a*cIFz>=0 x1=(-b+SQRT(z))/(2*a) x2=(-b-SQRT(z))/(2*a) ?x1,x2ENDIF99【例3-5】求一元二次方程ax2+bx+c=0的實根。352.雙向分支:從兩個分支中選擇一個執行。(1)語句格式:IF〈條件表達式〉 〈語句序列1〉ELSE 〈語句序列2〉ENDIF(2)執行過程:第一步:計算〈條件表達式〉的值。第二步:決定執行哪個操作。當該值為真時,執行〈語句序列1〉中的命令;否則,執行〈語句序列2〉中的命令。第三步:執行ENDIF后面的第一條命令。1002.雙向分支:從兩個分支中選擇一個執行。(1)語句格式:(2【例3-6】編寫一密碼校驗程序(假設密碼為ABC)CLEARACCEPT“請輸入您的密碼:”TOmmIFmm=”ABC” CLEAR ?”歡迎使用本系統!”ELSE WAIT”密碼錯誤!”ENDIF101【例3-6】編寫一密碼校驗程序(假設密碼為ABC)373.多向分支:從多個分支中選擇

一個執行(1)語句格式:DOCASE CASE〈條件表達式1〉 <語句序列1> CASE〈條件表達式2〉 <語句序列2> …… CASE〈條件表達式n〉 〈語句序列n〉 [OTHERWISE 〈語句序列n+1〉]ENDCASE1023.多向分支:從多個分支中選擇

一個執行(1)語句格式:3(2)執行過程:第一步:計算〈條件表達式1〉的值。第二步:決定下一步的操作。若該值為真,執行〈語句序列1〉,轉第2n+2步,否則執行第三步的操作。第三步:計算〈條件表達式2〉的值。第四步:決定下一步的操作。若該值為真,執行〈語句序列2〉,轉第2n+2步,否則執行第五步的操作。第五步:計算〈條件表達式3〉的值。第六步:決定下一步的操作。若該值為真,執行〈語句序列3〉,轉第2n+2步,否則執行第七步的操作。……第2n-1步:計算〈條件表達式n〉的值。第2n步:決定下一步的操作。若該值為真,執行〈語句序列n〉,轉第2n+2步,否則執行第2n+1步的操作。第2n+1步:若有OTHERWISE子句則執行〈語句序列n+1〉。第2n+2步:執行ENDCASE后的第一條命令。103(2)執行過程:39CLEARINPUT“請輸入收入:”TOpDOCASE CASEp<800 r=0 CASEp<2000 r=0.05 CASEp<5000 r=0.08 OTHERWISE r=0.1ENDCASETax=p*r?”稅金為:”,taxRETURN【例3-7】如表5-1,編程求稅金。104CLEAR【例3-7】如表5-1,編程求稅金。404.使用分支語句的注意事項(1)IF…ENDIF和DOCASE…ENDCASE必須配對使用,DOCASE與第一個CASE〈條件表達式〉之間不應有任何命令。(2)〈條件表達式〉可以是各種表達式或函數的組合,其值必須是邏輯值。(3)〈語句序列〉可以由一個或多個命令組成,也可以是條件控制語句和循環控制語句組成的嵌套結構。(4)DOCASE…ENDCASE命令根據給出的n個〈條件表達式〉的值,選擇n+1個〈語句序列〉中的一個執行。每次最多只能執行一個〈語句序列〉。在多個CASE項的〈條件表達式〉值為真時,只執行第一個〈條件表達式〉值為真的〈語句序列〉。當所有CASE中〈條件表達式〉的值都是假時,如果有OTHERWISE項,則執行〈語句序列n+1〉,否則一個分支也不執行。1054.使用分支語句的注意事項(1)IF…ENDIF和DOC3.2.2循環結構循環結構有三種語句:DOWHILEFORSCAN1063.2.2循環結構循環結構有三種語句:421.DOWHILE循環DOWHILE<條件表達式> <語句序列1> [LOOP] <語句序列2> [EXIT] <語句序列3>ENDDO執行過程:參閱圖5-6第一步:求解循環頭DOWHILE后的<條件表達式>,若值為.T.,則依次執行循環體中的語句,否則轉第五步。循環體為位于DOWHILE和ENDDO之間的語句序列。第二步:循環體執行過程中,若執行了LOOP語句,則結束本次循環,轉到第一步。第三步:循環體執行過程中,若執行了EXIT語句,則強行跳出循環,轉到第五步。第四步:若循環體中所有語句均已經執行,轉第一步。第五步:本循環語句執行結束,轉去執行ENDDO之后的語句。

1071.DOWHILE循環DOWHILE<條件表【例3-8】用DOWHILE循環將學生檔案表中“張三”之前(含“張三”)的所有學生的數據顯示出來。Clearuse學生檔案dowhile.not.eof() DISP if姓名<>"張三" skip loop endif exitenddouseRETURN108【例3-8】用DOWHILE循環將學生檔案表中“張三”之前FOR循環變量=初值TO終值[STEP步長] <語句序列1>

[LOOP]

<語句序列2>

[EXIT]

<語句序列3>

ENDFOR|NEXT2.FOR循環執行過程:參閱圖5-7。第一步:將初值賦給循環變量。第二步:判斷循環變量的值是否超過終值。超過的含義是:若步長大于0,則循環變量大于終值即為超過終值;若步長小于0,則循環變量小于終值就是超過。根據判斷的結果決定本結構的是否再執行。若未超過,則執行循環體(為FOR到與之配對的ENDFOR或NEXT之間的所有語句。若超過,轉第六步。第三步:若執行LOOP命令,結束本次循環,循環變量增加一個步長值,轉第二步。若省略STEP<步長>,則〈步長〉為默認值1。第四步:若執行EXIT命令,轉第六步。第五步:若循環體中所有語句均已經執行,轉第二步。第六步:結束FOR循環,執行其后的語句。

109FOR循環變量=初值TO終值[STEP步長CLEARs=1fh=1FORi=2TO100 s=s+i*fh fh=-1*fhENDFOR?”1+2-3+……+100=”,sRETURN【例3-9】編程求1+2-3+4-5+……-99+100之和。110CLEAR【例3-9】46CLEARINPUT“請從鍵盤輸入一個數:”TOxSTORExTOmax,minFORi=2TO10 INPUT“請從鍵盤輸入一個數:”TOx IFmax<x max=x ENDIF IFmin>x min=x ENDIFENDFOR?“最大值為:”,max?“最小值為:”,minRETURN【例3-10】從鍵盤輸入10個數,編程找出其中的最大值和最小值111CLEAR【例3-10】473.“指針”型循環:SCAN…ENDSCANSCAN[<范圍>][FOR<條件表達式1>| [WHILE<條件表達式2>]

] <語句序列>ENDSCAN功能:在指定的范圍內,用數據記錄指針來控制循環次數。執行語句時,首先判斷函數EOF()的值,若其值為“真”,則結束循環,否則,結合<條件表達式1>或<條件表達式2>,執行〈語句序列〉(滿足條件時執行);然后,記錄指針移到指定的范圍和條件內的下一條記錄,重新判斷函數EOF()的值,直到函數EOF()的值為真時結束循環。1123.“指針”型循環:SCAN…ENDSCANSCAN[<CLEARUSE學生檔案SCANFORNOT是否貸款 ?姓名,出生地ENDSCANUSERETURN【例3-11】輸出“學生檔案”表中所有未貸款學生的姓名和出生地。113CLEAR【例3-11】輸出“學生檔案”表中所有未貸款學生的4.使用循環語句的說明(1)DOWHILE…ENDDO、FOR…ENDFOR、 SCAN…ENDSCAN須配對使用。(2)〈語句序列〉可以是任何VFP命令或語句,若為循環語句則構成多重循環。(3)〈循環變量〉應是數值型的內存變量或數組元素。(4)EXIT和LOOP命令嵌入在循環體內,可以出現在〈語句序列〉的任意位置,用以改變循環次數,但是不能單獨使用。(5)EXIT的功能是跳出循環,轉去執行ENDDO、ENDFOR、ENDSCAN后面的第一條命令(6)L

溫馨提示

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

評論

0/150

提交評論