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

下載本文檔

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

文檔簡介

第三章VisualFoxPro

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

程序設計基礎基本學習目標3.1程序概述程序:為了完成某項任務而編寫的命令序列。程序的本質(zhì)都是進行數(shù)值計算或數(shù)據(jù)處理,得出有用的信息。程序是完成大型的、復雜的、綜合性較強而且需要多次重復執(zhí)行的任務的最適合方式。VFP同時支持面向過程(OP)和面向?qū)ο螅∣O)的程序設計方法。其中OP是OO的基礎。23.1程序概述程序:為了完成某項任務而編寫的命令序列。程3.1.1程序設計的步驟建立編輯保存執(zhí)行調(diào)試相關概念:程序代碼:以命令形式出現(xiàn)的指令、函數(shù)或任何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則存盤退出程序窗口。③選擇“文件”|“保存”或“另存為”命令。④單擊工具欄上的“保存”按鈕。⑤在關閉程序窗口系統(tǒng)詢問是否保存時選擇是即可保存52.程序的編輯和保存(1)編輯:先打開:3種方法53.執(zhí)行程序:4法(1)命令:DO[<盤符>][<路徑>\]<文件名> 執(zhí)行程序文件時,將依次執(zhí)行文件中的命令,直到所有命令執(zhí)行完畢,或者執(zhí)行到以下命令: ①CANCEL:終止程序運行,清除所有的私有變量,返回命令窗口; ②RETURN:結束程序執(zhí)行,返回調(diào)用它的上級程序,若無上級程序則 返回命令窗口; ③QUIT:結束程序執(zhí)行并退出VFP,返回操作系統(tǒng)。(2)菜單:選“程序”|“運行”命令打開“運行”對話框,選擇需執(zhí)行的程序后單擊“運行”按鈕。(3)項目管理器:在“代碼”選項卡中選擇需要執(zhí)行的程序文件再單擊“運行(U)”按鈕。(4)程序窗口中:按下Ctrl+E或單擊工具欄上的“!”運行按鈕,也可以右擊程序窗口,從快捷菜單中選擇“執(zhí)行XXX.PRG”命令(XXX.PRG表示當前程序窗口中的程序文件名)63.執(zhí)行程序:4法(1)命令:DO[<盤符>][<3.1.2程序中的常用命令

簡單的輸入輸出

數(shù)組與表中數(shù)據(jù)的傳送命令

內(nèi)存變量與表中記錄的傳送命令

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

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

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

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

WINDOWTIMEOUT5ELSE LISTFORn=學號ENDIFUSE14【例3-3】按學號查“學生成績”CLEAR14ACCEPT、WAIT、INPUT比較ACCEPT命令只能接受字符串,不需要定界符,輸入完畢按回車鍵結束WAIT命令只能輸入單個字符,也不需定界符,但輸入完畢不需按回車鍵INPUT命令功能最強,可接受數(shù)值型、字符型、邏輯型、日期型和日期時間型數(shù)據(jù),數(shù)據(jù)形式可以是常量、變量、函數(shù)和表達式,如果是字符串,需要用定界符,輸入完畢按回車鍵結束。15ACCEPT、WAIT、INPUT比較ACCEPT命令只能接(4)定位輸入輸出命令@<行,列>[SAY<表達式1>][GET<變量名>][DEFAULT<表達式2>]功能:在指定行列位置顯示<表達式1>的值,并允許修改<變量名>的值。指定數(shù)據(jù)起始顯示位置需要顯示的串需要輸入或修改的變量變量的初值說明:①行號和列號都從0開始的十進制整數(shù)。②先輸出表達式1(背景色以標準型顯示),再空一格后接著顯示變量值(背景色以增強型顯示),無SAY子句則從指定位置顯示變量值。③變量要有初值(可用DEFAULT指定)其類型在編輯期間不能改變,字符型的寬度和數(shù)值型的小數(shù)位數(shù)也不可更改。④GET子句必須由READ子句激活后才能編輯GET變量值。直到光標移出由這些GET變量組成的區(qū)域時READ命令才算執(zhí)行結束。16(4)定位輸入輸出命令@<行,列>[SAY<表達式1CLEARUSE學生成績@2,5SAY"待修改的記錄號:"GETJLHDEFA1READGOJLHSCATTERMEMV&&將記錄數(shù)據(jù)導出到與字段變量同名的一組內(nèi)存變量中@4,5SAY"學號:"GETM.學號@6,5SAY"高數(shù):"GETM.高數(shù)@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.數(shù)組與表中數(shù)據(jù)的傳送命令(1)將表中數(shù)據(jù)傳送給數(shù)組格式:COPYTOARRAY<數(shù)組名>[FIELDS<字段名表>|FIELDSLIKE<通配符>|FIELDSEXCEPT<通配符>][范圍子句][條件子句][NOOPTIMIZE]功能:將當前工作區(qū)中打開的表中的數(shù)據(jù)傳送到一維/二維數(shù)組中。一維數(shù)組僅存一條記錄,二維數(shù)組可存多條記錄。202.數(shù)組與表中數(shù)據(jù)的傳送命令(1)將表中數(shù)據(jù)傳送給數(shù)組20數(shù)組與表中數(shù)據(jù)的傳送說明:如右圖所示:表中的備注字段不會存入數(shù)組如:COPYTOARRAYaTempFIELDSLIKEa*,p*&&把表中符合字段首字符為a或p的記錄存入數(shù)組aTemp中。如:COPYTOARRAYaMyArray;

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

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

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

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

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

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

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

一個執(zhí)行(1)語句格式:3(2)執(zhí)行過程:第一步:計算〈條件表達式1〉的值。第二步:決定下一步的操作。若該值為真,執(zhí)行〈語句序列1〉,轉(zhuǎn)第2n+2步,否則執(zhí)行第三步的操作。第三步:計算〈條件表達式2〉的值。第四步:決定下一步的操作。若該值為真,執(zhí)行〈語句序列2〉,轉(zhuǎn)第2n+2步,否則執(zhí)行第五步的操作。第五步:計算〈條件表達式3〉的值。第六步:決定下一步的操作。若該值為真,執(zhí)行〈語句序列3〉,轉(zhuǎn)第2n+2步,否則執(zhí)行第七步的操作?!?n-1步:計算〈條件表達式n〉的值。第2n步:決定下一步的操作。若該值為真,執(zhí)行〈語句序列n〉,轉(zhuǎn)第2n+2步,否則執(zhí)行第2n+1步的操作。第2n+1步:若有OTHERWISE子句則執(zhí)行〈語句序列n+1〉。第2n+2步:執(zhí)行ENDCASE后的第一條命令。39(2)執(zhí)行過程: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)〈條件表達式〉可以是各種表達式或函數(shù)的組合,其值必須是邏輯值。(3)〈語句序列〉可以由一個或多個命令組成,也可以是條件控制語句和循環(huán)控制語句組成的嵌套結構。(4)DOCASE…ENDCASE命令根據(jù)給出的n個〈條件表達式〉的值,選擇n+1個〈語句序列〉中的一個執(zhí)行。每次最多只能執(zhí)行一個〈語句序列〉。在多個CASE項的〈條件表達式〉值為真時,只執(zhí)行第一個〈條件表達式〉值為真的〈語句序列〉。當所有CASE中〈條件表達式〉的值都是假時,如果有OTHERWISE項,則執(zhí)行〈語句序列n+1〉,否則一個分支也不執(zhí)行。414.使用分支語句的注意事項(1)IF…ENDIF和DOC3.2.2循環(huán)結構循環(huán)結構有三種語句:DOWHILEFORSCAN423.2.2循環(huán)結構循環(huán)結構有三種語句:421.DOWHILE循環(huán)DOWHILE<條件表達式> <語句序列1> [LOOP] <語句序列2> [EXIT] <語句序列3>ENDDO執(zhí)行過程:參閱圖5-6第一步:求解循環(huán)頭DOWHILE后的<條件表達式>,若值為.T.,則依次執(zhí)行循環(huán)體中的語句,否則轉(zhuǎn)第五步。循環(huán)體為位于DOWHILE和ENDDO之間的語句序列。第二步:循環(huán)體執(zhí)行過程中,若執(zhí)行了LOOP語句,則結束本次循環(huán),轉(zhuǎn)到第一步。第三步:循環(huán)體執(zhí)行過程中,若執(zhí)行了EXIT語句,則強行跳出循環(huán),轉(zhuǎn)到第五步。第四步:若循環(huán)體中所有語句均已經(jīng)執(zhí)行,轉(zhuǎn)第一步。第五步:本循環(huán)語句執(zhí)行結束,轉(zhuǎn)去執(zhí)行ENDDO之后的語句。

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

[LOOP]

<語句序列2>

[EXIT]

<語句序列3>

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

45FOR循環(huán)變量=初值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“請從鍵盤輸入一個數(shù):”TOxSTORExTOmax,minFORi=2TO10 INPUT“請從鍵盤輸入一個數(shù):”TOx IFmax<x max=x ENDIF IFmin>x min=x ENDIFENDFOR?“最大值為:”,max?“最小值為:”,minRETURN【例3-10】從鍵盤輸入10個數(shù),編程找出其中的最大值和最小值47CLEAR【例3-10】473.“指針”型循環(huán):SCAN…ENDSCANSCAN[<范圍>][FOR<條件表達式1>| [WHILE<條件表達式2>]

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

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

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

PARAMETERSn y=1 FORi=1TOn y=y*i ENDFOR RETURNyENDFUNC【例3-13】將計算階乘的程序?qū)懗勺远x函數(shù)并調(diào)用。56CLEAR【例3-13】將計算階乘的程序?qū)懗勺远x函數(shù)并調(diào)用3.3.2 過程過程的實現(xiàn)和函數(shù)基本相同,一般無返回值。若需要,可以通過PARAMETERS語句返回。過程定義的語法如下:PROCEDURE過程名 PARAMETERS參數(shù)表 語句序列ENDPROC定義過程名稱,其他程序要通過這個名稱來調(diào)用這個過程。

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

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

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

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

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

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

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

64作業(yè):本章課后習題

64第三章VisualFoxPro

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

程序設計基礎基本學習目標3.1程序概述程序:為了完成某項任務而編寫的命令序列。程序的本質(zhì)都是進行數(shù)值計算或數(shù)據(jù)處理,得出有用的信息。程序是完成大型的、復雜的、綜合性較強而且需要多次重復執(zhí)行的任務的最適合方式。VFP同時支持面向過程(OP)和面向?qū)ο螅∣O)的程序設計方法。其中OP是OO的基礎。663.1程序概述程序:為了完成某項任務而編寫的命令序列。程3.1.1程序設計的步驟建立編輯保存執(zhí)行調(diào)試相關概念:程序代碼:以命令形式出現(xiàn)的指令、函數(shù)或任何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則存盤退出程序窗口。③選擇“文件”|“保存”或“另存為”命令。④單擊工具欄上的“保存”按鈕。⑤在關閉程序窗口系統(tǒng)詢問是否保存時選擇是即可保存692.程序的編輯和保存(1)編輯:先打開:3種方法53.執(zhí)行程序:4法(1)命令:DO[<盤符>][<路徑>\]<文件名> 執(zhí)行程序文件時,將依次執(zhí)行文件中的命令,直到所有命令執(zhí)行完畢,或者執(zhí)行到以下命令: ①CANCEL:終止程序運行,清除所有的私有變量,返回命令窗口; ②RETURN:結束程序執(zhí)行,返回調(diào)用它的上級程序,若無上級程序則 返回命令窗口; ③QUIT:結束程序執(zhí)行并退出VFP,返回操作系統(tǒng)。(2)菜單:選“程序”|“運行”命令打開“運行”對話框,選擇需執(zhí)行的程序后單擊“運行”按鈕。(3)項目管理器:在“代碼”選項卡中選擇需要執(zhí)行的程序文件再單擊“運行(U)”按鈕。(4)程序窗口中:按下Ctrl+E或單擊工具欄上的“!”運行按鈕,也可以右擊程序窗口,從快捷菜單中選擇“執(zhí)行XXX.PRG”命令(XXX.PRG表示當前程序窗口中的程序文件名)703.執(zhí)行程序:4法(1)命令:DO[<盤符>][<3.1.2程序中的常用命令

簡單的輸入輸出

數(shù)組與表中數(shù)據(jù)的傳送命令

內(nèi)存變量與表中記錄的傳送命令

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

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

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

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

WINDOWTIMEOUT5ELSE LISTFORn=學號ENDIFUSE78【例3-3】按學號查“學生成績”CLEAR14ACCEPT、WAIT、INPUT比較ACCEPT命令只能接受字符串,不需要定界符,輸入完畢按回車鍵結束WAIT命令只能輸入單個字符,也不需定界符,但輸入完畢不需按回車鍵INPUT命令功能最強,可接受數(shù)值型、字符型、邏輯型、日期型和日期時間型數(shù)據(jù),數(shù)據(jù)形式可以是常量、變量、函數(shù)和表達式,如果是字符串,需要用定界符,輸入完畢按回車鍵結束。79ACCEPT、WAIT、INPUT比較ACCEPT命令只能接(4)定位輸入輸出命令@<行,列>[SAY<表達式1>][GET<變量名>][DEFAULT<表達式2>]功能:在指定行列位置顯示<表達式1>的值,并允許修改<變量名>的值。指定數(shù)據(jù)起始顯示位置需要顯示的串需要輸入或修改的變量變量的初值說明:①行號和列號都從0開始的十進制整數(shù)。②先輸出表達式1(背景色以標準型顯示),再空一格后接著顯示變量值(背景色以增強型顯示),無SAY子句則從指定位置顯示變量值。③變量要有初值(可用DEFAULT指定)其類型在編輯期間不能改變,字符型的寬度和數(shù)值型的小數(shù)位數(shù)也不可更改。④GET子句必須由READ子句激活后才能編輯GET變量值。直到光標移出由這些GET變量組成的區(qū)域時READ命令才算執(zhí)行結束。80(4)定位輸入輸出命令@<行,列>[SAY<表達式1CLEARUSE學生成績@2,5SAY"待修改的記錄號:"GETJLHDEFA1READGOJLHSCATTERMEMV&&將記錄數(shù)據(jù)導出到與字段變量同名的一組內(nèi)存變量中@4,5SAY"學號:"GETM.學號@6,5SAY"高數(shù):"GETM.高數(shù)@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.數(shù)組與表中數(shù)據(jù)的傳送命令(1)將表中數(shù)據(jù)傳送給數(shù)組格式:COPYTOARRAY<數(shù)組名>[FIELDS<字段名表>|FIELDSLIKE<通配符>|FIELDSEXCEPT<通配符>][范圍子句][條件子句][NOOPTIMIZE]功能:將當前工作區(qū)中打開的表中的數(shù)據(jù)傳送到一維/二維數(shù)組中。一維數(shù)組僅存一條記錄,二維數(shù)組可存多條記錄。842.數(shù)組與表中數(shù)據(jù)的傳送命令(1)將表中數(shù)據(jù)傳送給數(shù)組20數(shù)組與表中數(shù)據(jù)的傳送說明:如右圖所示:表中的備注字段不會存入數(shù)組如:COPYTOARRAYaTempFIELDSLIKEa*,p*&&把表中符合字段首字符為a或p的記錄存入數(shù)組aTemp中。如:COPYTOARRAYaMyArray;

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

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

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

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

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

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

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

一個執(zhí)行(1)語句格式:3(2)執(zhí)行過程:第一步:計算〈條件表達式1〉的值。第二步:決定下一步的操作。若該值為真,執(zhí)行〈語句序列1〉,轉(zhuǎn)第2n+2步,否則執(zhí)行第三步的操作。第三步:計算〈條件表達式2〉的值。第四步:決定下一步的操作。若該值為真,執(zhí)行〈語句序列2〉,轉(zhuǎn)第2n+2步,否則執(zhí)行第五步的操作。第五步:計算〈條件表達式3〉的值。第六步:決定下一步的操作。若該值為真,執(zhí)行〈語句序列3〉,轉(zhuǎn)第2n+2步,否則執(zhí)行第七步的操作?!?n-1步:計算〈條件表達式n〉的值。第2n步:決定下一步的操作。若該值為真,執(zhí)行〈語句序列n〉,轉(zhuǎn)第2n+2步,否則執(zhí)行第2n+1步的操作。第2n+1步:若有OTHERWISE子句則執(zhí)行〈語句序列n+1〉。第2n+2步:執(zhí)行ENDCASE后的第一條命令。103(2)執(zhí)行過程: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)〈條件表達式〉可以是各種表達式或函數(shù)的組合,其值必須是邏輯值。(3)〈語句序列〉可以由一個或多個命令組成,也可以是條件控制語句和循環(huán)控制語句組成的嵌套結構。(4)DOCASE…ENDCASE命令根據(jù)給出的n個〈條件表達式〉的值,選擇n+1個〈語句序列〉中的一個執(zhí)行。每次最多只能執(zhí)行一個〈語句序列〉。在多個CASE項的〈條件表達式〉值為真時,只執(zhí)行第一個〈條件表達式〉值為真的〈語句序列〉。當所有CASE中〈條件表達式〉的值都是假時,如果有OTHERWISE項,則執(zhí)行〈語句序列n+1〉,否則一個分支也不執(zhí)行。1054.使用分支語句的注意事項(1)IF…ENDIF和DOC3.2.2循環(huán)結構循環(huán)結構有三種語句:DOWHILEFORSCAN1063.2.2循環(huán)結構循環(huán)結構有三種語句:421.DOWHILE循環(huán)DOWHILE<條件表達式> <語句序列1> [LOOP] <語句序列2> [EXIT] <語句序列3>ENDDO執(zhí)行過程:參閱圖5-6第一步:求解循環(huán)頭DOWHILE后的<條件表達式>,若值為.T.,則依次執(zhí)行循環(huán)體中的語句,否則轉(zhuǎn)第五步。循環(huán)體為位于DOWHILE和ENDDO之間的語句序列。第二步:循環(huán)體執(zhí)行過程中,若執(zhí)行了LOOP語句,則結束本次循環(huán),轉(zhuǎn)到第一步。第三步:循環(huán)體執(zhí)行過程中,若執(zhí)行了EXIT語句,則強行跳出循環(huán),轉(zhuǎn)到第五步。第四步:若循環(huán)體中所有語句均已經(jīng)執(zhí)行,轉(zhuǎn)第一步。第五步:本循環(huán)語句執(zhí)行結束,轉(zhuǎn)去執(zhí)行ENDDO之后的語句。

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

[LOOP]

<語句序列2>

[EXIT]

<語句序列3>

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

109FOR循環(huán)變量=初值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“請從鍵盤輸入一個數(shù):”TOxSTORExTOmax,minFORi=2TO10 INPUT“請從鍵盤輸入一個數(shù):”TOx IFmax<x max=x ENDIF IFmin>x min=x ENDIFENDFOR?“最大值為:”,max?“最小值為:”,minRETURN【例3-10】從鍵盤輸入10個數(shù),編程找出其中的最大值和最小值111CLEAR【例3-10】473.“指針”型循環(huán):SCAN…ENDSCANSCAN[<范圍>][FOR<條件表達式1>| [WHILE<條件表達式2>]

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

溫馨提示

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

評論

0/150

提交評論