第07章 結(jié)構(gòu)化程序設(shè)計(jì)_第1頁(yè)
第07章 結(jié)構(gòu)化程序設(shè)計(jì)_第2頁(yè)
第07章 結(jié)構(gòu)化程序設(shè)計(jì)_第3頁(yè)
第07章 結(jié)構(gòu)化程序設(shè)計(jì)_第4頁(yè)
第07章 結(jié)構(gòu)化程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩93頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第7章結(jié)構(gòu)化程序設(shè)計(jì)7.1程序文件7.2程序方式下的幾個(gè)基本命令7.3程序控制結(jié)構(gòu)7.4*

多模塊程序7.5*

程序的調(diào)試第7章結(jié)構(gòu)化程序設(shè)計(jì)7.1程序文件7.2程序方式下的幾個(gè)基本命令7.3程序控制結(jié)構(gòu)7.4*

多模塊程序7.5*

程序的調(diào)試7.1程序文件7.1.1VFP的三種工作方式7.1.2程序文件的建立7.1.3程序的運(yùn)行7.1.1VFP的三種工作方式1.單命令方式2.菜單方式3.程序文件方式7.1程序文件7.1.1VFP的三種工作方式7.1.2程序文件的建立7.1.3程序的運(yùn)行7.1.2程序文件的建立1.菜單方式2.命令方式格式:MODIFYCOMMAND[FileName|?]功能:打開程序編輯窗口,從中可以修改或創(chuàng)建程序文件。說明:(1)FileName:程序文件名稱。若省略程序文件名,將打開程序編輯窗口。(2)如果用MODIFYCOMMAND?,則打開Open對(duì)話框,可在程序編輯窗口修改以前的程序或輸入新程序。7.1.2程序文件的建立2.命令方式一個(gè)簡(jiǎn)單程序示例:程序編輯窗口7.1程序文件7.1.1VFP的三種工作方式7.1.2程序文件的建立7.1.3程序的運(yùn)行7.1.3程序的運(yùn)行VFP中運(yùn)行正在編輯的程序,三種方式:(1)單擊工具欄上的運(yùn)行快捷按鈕“!”。(2)單擊菜單Program→Do。(3)按Ctrl+D快捷鍵。運(yùn)行已存盤的程序,二種方式:(1)菜單方式。單擊菜單Program→Do,打開Do對(duì)話框,選定要執(zhí)行的程序文件,單擊Do按鈕。(2)命令方式。利用運(yùn)行程序命令(Do),其命令格式及用法如下:格式:DOProgramName功能:將指定的程序文件調(diào)入內(nèi)存并運(yùn)行。第7章結(jié)構(gòu)化程序設(shè)計(jì)7.1程序文件7.2程序方式下的幾個(gè)基本命令7.3程序控制結(jié)構(gòu)7.4多模塊程序7.5程序的調(diào)試7.2程序方式下的幾個(gè)基本命令一般地,VFP中一個(gè)程序由三部分組成:(1)初始化部分。程序運(yùn)行環(huán)境設(shè)置和變量初始化,如一系列CLEAR語(yǔ)句和SET語(yǔ)句。(2)主體部分。(3)系統(tǒng)環(huán)境恢復(fù)部分。在結(jié)束程序運(yùn)行之前,將系統(tǒng)環(huán)境恢復(fù)到原設(shè)置狀態(tài),常用的命令有關(guān)閉文件、一系列SET語(yǔ)句、程序結(jié)束語(yǔ)句等。上述很多操作都可以通過相關(guān)的命令來完成。7.2程序方式下的幾個(gè)基本命令7.2.1運(yùn)行環(huán)境設(shè)置命令7.2.2鍵盤輸入命令7.2.3消息窗口函數(shù)7.2.4其他命令和語(yǔ)句7.2程序方式下的幾個(gè)基本命令7.2.1運(yùn)行環(huán)境設(shè)置命令7.2.2鍵盤輸入命令7.2.3消息窗口函數(shù)7.2.4其他命令和語(yǔ)句7.2.1運(yùn)行環(huán)境設(shè)置命令1.設(shè)置默認(rèn)路徑命令格式:SETDEFAULTTOPath功能:設(shè)置VFP用戶此次上機(jī)的缺省路徑,參數(shù)Path為要設(shè)置的缺省路徑。示例:SETDEFAULTTOd:\vfp90\programs2023/1/1514/737.2.1運(yùn)行環(huán)境設(shè)置命令2.設(shè)置檢查日期(時(shí)間)常量格式命令格式:SETSTRICTDATETO[0|1|2]功能:設(shè)置對(duì)有歧義的日期常量(如:10/10/10)和日期時(shí)間常量是否產(chǎn)生錯(cuò)誤信息與提示。0-表示在輸入日期常量時(shí),不檢查日期常量的歧義性和有效性,編譯時(shí)不產(chǎn)生錯(cuò)誤提示,運(yùn)行時(shí)對(duì)無效輸入產(chǎn)生空日期輸出:

//。1-表示實(shí)施嚴(yán)格的檢查。編譯時(shí),對(duì)非嚴(yán)格的日期常量產(chǎn)生錯(cuò)誤提示。2-表示實(shí)施嚴(yán)格的檢查,并且要求使用DATE(nYear,nMonth,nDay)函數(shù)代替CTOD()函數(shù)進(jìn)行字符串到日期數(shù)據(jù)的轉(zhuǎn)換。2023/1/1515/737.2.1運(yùn)行環(huán)境設(shè)置命令例如,在命令窗口輸入下面語(yǔ)句:RELEASEALLSETDATETOYMDSETSTRICTDATETO1&&設(shè)置嚴(yán)格日期格式檢查A={2010-10-1}&&編譯時(shí),提示日期常量格式錯(cuò)誤

,不分配新的變量?A&&提示變量不存在錯(cuò)誤A={^2010-10-1}&&嚴(yán)格的日期常量?A2023/1/1516/73(續(xù))SETSTRICTDATETO0&&關(guān)閉嚴(yán)格日期格式檢查B={2020-10-1}&&不提示日期常量格式錯(cuò)誤?B&&輸出為:2020/10/01SETSTRICTDATETO2&&與設(shè)置為1同,且在代碼中使

用CTOD(),CTOT()時(shí)提示錯(cuò)誤C={2030-10-1}&&提示日期常量格式錯(cuò)誤C=CTOD(“2030-10-1”)&&提示用DATE()代CTOD()

,或?qū)TRICTDATE設(shè)置為小

于2的值C=DATE(2030,10,1)?A,B,C2023/1/1517/737.2.1運(yùn)行環(huán)境設(shè)置命令3.設(shè)置會(huì)話狀態(tài)命令VFP中有些命令(如對(duì)表操作的命令)會(huì)在VFP主窗口中或狀態(tài)欄上返回它們執(zhí)行后的狀態(tài)信息,這個(gè)過程稱為“會(huì)話(TALK)”,可以通過SETTALK來設(shè)置或關(guān)閉會(huì)話功能。格式:SETTALKON|OFF|WINDOW[WindowName]|NOWINDOW說明:ON為缺省值,允許將會(huì)話設(shè)置到VFP窗口、系統(tǒng)信息窗口、圖形狀態(tài)欄或者用戶自定義的窗口。設(shè)為OFF時(shí),則在上述窗口中關(guān)閉會(huì)話。2023/1/1518/737.2.1運(yùn)行環(huán)境設(shè)置命令4.設(shè)置系統(tǒng)保護(hù)命令格式:SETSAFETYON|OFF功能:當(dāng)用戶向VFP發(fā)出修改、清除表文件等涉及到文件安全的命令時(shí),系統(tǒng)是否彈出文件操作提示窗口。默認(rèn)為ON。ON表示需要,OFF表示不需要。2023/1/1519/737.2程序方式下的幾個(gè)基本命令7.2.1運(yùn)行環(huán)境設(shè)置命令7.2.2鍵盤輸入命令7.2.3消息窗口函數(shù)7.2.4其他命令和語(yǔ)句7.2.2鍵盤輸入命令1.字符型數(shù)據(jù)輸入命令A(yù)CCEPT2.表達(dá)式輸入命令I(lǐng)NPUT3.單字符輸入命令WAIT2023/1/1521/737.2.2鍵盤輸入命令字符型數(shù)據(jù)輸入命令A(yù)CCEPT格式:ACCEPT[<cMessageText>]TO<VarName>功能:暫停程序的執(zhí)行,等待用戶輸入一個(gè)字符串給變量。說明:(1)cMessageText是為想要在屏幕上輸出的信息。它可以是字符串常量或字符型內(nèi)存變量,若為內(nèi)存變量,則該變量必須預(yù)先賦值。(2)程序運(yùn)行時(shí),從鍵盤輸入的數(shù)據(jù)都被賦值給內(nèi)存變量VarName,作為字符型數(shù)據(jù)處理,不需要定界符括起來,如果輸入了定界符,則定界符也被作為輸入字符的一部分。(3)輸入完需要的信息后,按回車鍵結(jié)束本命令的輸入。如果沒有輸入任何信息,只按回車鍵,將把一個(gè)空字符串賦值給VarName。2023/1/1522/737.2.2鍵盤輸入命令查找student數(shù)據(jù)庫(kù)中的Students表并顯示任意一個(gè)學(xué)生信息SETTALKOFFCLEAROPENDATABASEstudentUSEstudentsaccept"請(qǐng)輸入學(xué)生的姓名:"toXMLOCATEFOR姓名=XM?"學(xué)生"+XM+"的基本情況如下:"?"學(xué)號(hào):"+Sno?"性別:"+Ssex?"出生日期:"+DTOC(Birthday)CLOSEDATABASESSETTALKONRETURN2023/1/1523/737.2.2鍵盤輸入命令編程從鍵盤輸入某表名,要求打開該表并顯示其內(nèi)容。SETTALKOFFCLEARaccept"請(qǐng)輸入表名:"totablenameUSE&tablename&&其中&為宏替換LISTUSESETTALKONRETURN2023/1/1524/737.2.2鍵盤輸入命令2.表達(dá)式輸入命令I(lǐng)NPUT格式:INPUT[<cMessageText>]TO<VarName>功能:暫停程序的執(zhí)行,接受用戶輸入合法的表達(dá)式,并將表達(dá)式的值賦值給內(nèi)存變量。說明:(1)cMessageText、VarName同“ACCEPT”命令。(2)用戶可輸入任何一個(gè)合法的數(shù)值型、字符型、日期型或邏輯型表達(dá)式,系統(tǒng)先計(jì)算表達(dá)式的值,然后將該值賦值給內(nèi)存變量VarName。(3)如果要輸入字符串?dāng)?shù)據(jù),則必須加上雙引號(hào)或單引號(hào)定界符,如"ABC"。(4)如果輸入非法表達(dá)式,系統(tǒng)將提示重新輸入。2023/1/1525/737.2.2鍵盤輸入命令已知圓半徑為r,編程求圓面積s。(提示:半徑r從鍵盤輸入,結(jié)果保留3位小數(shù);計(jì)算圓面積的VisualFoxPro表達(dá)式為:PI()*r^2)。SETDECIMALSTO3SETFIXEDON&&固定小數(shù)顯示CLEAR?"本程序根據(jù)用戶輸入半徑,計(jì)算圓面積。"INPUT"請(qǐng)輸入圓半徑r="TOrs=PI()*r^2?"圓面積S=",sSETFIXEDOFF&&恢復(fù)啟動(dòng)時(shí)的默認(rèn)值SETDECIMALSTO2&&假設(shè)此前為兩位小數(shù)顯示,現(xiàn)恢復(fù)RETURN2023/1/1526/737.2.2鍵盤輸入命令3.單字符輸入命令WAIT格式:WAIT[cMessageText][TOVarName][WINDOW[ATnRow,nColumn]][NOWAIT][CLEAR|NOCLEAR][TIMEOUTnSeconds]功能:暫停程序,用戶按任意鍵或者時(shí)間超過等待的秒數(shù)后,程序繼續(xù)執(zhí)行。如果包含[TO<VarName>]短語(yǔ),將用戶所按鍵盤字符(單個(gè)字符)賦值給指定的內(nèi)存變量。2023/1/1527/737.2.2鍵盤輸入命令例如,在命令窗口輸入以下語(yǔ)句:WAIT“這是一個(gè)使用示例”WINDOWSAT20,20TIMEOUT8將在屏幕20行、20列處顯示一個(gè)含有“這是一個(gè)使用示例”提示信息的小窗口,若單擊鼠標(biāo)按鍵、或按下鍵盤上任意一個(gè)按鍵、或小窗口在屏幕上停留8秒后,該提示信息從屏幕上消失。2023/1/1528/737.2程序方式下的幾個(gè)基本命令7.2.1運(yùn)行環(huán)境設(shè)置命令7.2.2鍵盤輸入命令7.2.3消息窗口函數(shù)7.2.4其他命令和語(yǔ)句7.2.3消息窗口函數(shù)格式:MESSAGEBOX(

eMessageText&&對(duì)話窗口中要出現(xiàn)的提示信息

[,nDialogBoxType]&&對(duì)話窗口類型

[,cTitleBarText]&&對(duì)話框標(biāo)題

[,nTimeout]&&信息窗口的顯示時(shí)間(以毫秒計(jì)))功能:顯示一個(gè)消息窗口,并根據(jù)所選擇的按鈕返回一個(gè)對(duì)應(yīng)的數(shù)值,含義為:1-確定、2-取消、3-終止、4-重試、5-忽略、6-是、7-否、-1-未擊任何鍵而超時(shí)退出。2023/1/1530/737.2.3消息窗口函數(shù)2023/1/1531/73n1n2n3n4取值按鈕形式取值圖標(biāo)類型取值默認(rèn)按鈕取值窗口類型0確定0無0第一個(gè)按鈕0非模式窗口1確定、取消16終止(×)256第二個(gè)按鈕4096模式窗口2終止、重試、忽略32提問(?)512第三個(gè)按鈕3是、否、取消48警告(!)4是、否64信息(i)5重試、取消nDiaIogBoxType的各個(gè)分量的取值及含義nDialogBoxType:設(shè)定出現(xiàn)在對(duì)話框中的按鈕和圖標(biāo)、缺省按鈕及對(duì)話框模式特性。它由四部分組成,即:nDialogBoxType

=nl+n2+n3+n4

(即:按鈕+圖標(biāo)+默認(rèn)按鈕+窗口模式)。MessageBox()應(yīng)用示例eMessageTitle='報(bào)告'eMessageText='記錄未找到,您還要重新查找嗎?'nDialogType=4+16+256&&4=YesandNobuttons &&16=Stopsignicon &&256=Secondbuttonisdefault&&若將右式改為:4+16+256+4096,又

會(huì)如何?nAnswer=MESSAGEBOX(eMessageText,nDialogType,eMessageTitle)DOCASECASEnAnswer=6WAITWINDOW'您選擇的按鈕是:是'CASEnAnswer=7WAITWINDOW'您選擇的按鈕是:否'ENDCASE2023/1/1532/737.2程序方式下的幾個(gè)基本命令7.2.1運(yùn)行環(huán)境設(shè)置命令7.2.2鍵盤輸入命令7.2.3消息窗口函數(shù)7.2.4其他命令和語(yǔ)句7.2.4其他命令和語(yǔ)句1.程序結(jié)束與調(diào)用返回命令2.注釋命令(語(yǔ)句)2023/1/1534/737.2.4其他命令和語(yǔ)句程序結(jié)束與調(diào)用返回命令一個(gè)獨(dú)立的VFP程序,可以不用程序結(jié)束語(yǔ)句,當(dāng)執(zhí)行完最后一條語(yǔ)句時(shí),程序會(huì)自動(dòng)結(jié)束。但一個(gè)實(shí)用的程序往往由多個(gè)模塊構(gòu)成,各個(gè)模塊根據(jù)需要可互相調(diào)用,這時(shí)就必須返回到相應(yīng)的上層模塊,而不是直接結(jié)束整個(gè)實(shí)用程序。通常有以下幾種情形:(1)返回到其上一級(jí)調(diào)用模塊(RETURN);(2)直接返回到頂級(jí)模塊(RETURNTOMASTER);(3)返回到指定過程(RETURNTOProcedureName)(4)返回到VFP交互命令狀態(tài)(命令窗口)(CANCEL);(5)直接關(guān)閉VisualFoxPro而返回到操作系統(tǒng)(QUIT)。2023/1/1535/737.2.4其他命令和語(yǔ)句2.注釋命令(語(yǔ)句)在程序中加入必要的注釋命令(也稱為注釋語(yǔ)句),可增強(qiáng)程序的可讀性,便于日后的修改。程序執(zhí)行時(shí),注釋命令不被執(zhí)行。VisualFoxPro提供了3種注釋命令。格式1:NOTE[Comments]格式2:*[Comments]功能:使NOTE或*后面的內(nèi)容成為注釋內(nèi)容,又稱為整行注釋,常用來解釋其后一個(gè)語(yǔ)句塊的功能。格式3:[<Command>]&&[Comments]功能:Comments

對(duì)&&左面的命令做出解釋或給出運(yùn)行結(jié)果,又稱為行尾注釋命令。2023/1/1536/73第7章結(jié)構(gòu)化程序設(shè)計(jì)7.1程序文件7.2程序方式下的幾個(gè)基本命令7.3程序控制結(jié)構(gòu)7.4多模塊程序7.5程序的調(diào)試7.3程序控制結(jié)構(gòu)7.3.1順序結(jié)構(gòu)7.3.2分支結(jié)構(gòu)7.3.3循環(huán)結(jié)構(gòu)7.3.4.混合嵌套(結(jié)構(gòu))7.3程序控制結(jié)構(gòu)7.3.1順序結(jié)構(gòu)7.3.2分支結(jié)構(gòu)7.3.3循環(huán)結(jié)構(gòu)7.3.4.混合嵌套(結(jié)構(gòu))7.3.1順序結(jié)構(gòu)順序結(jié)構(gòu)是程序設(shè)計(jì)中最基本的結(jié)構(gòu),它按命令在程序中出現(xiàn)的先后順序依次執(zhí)行。如:?"本程序根據(jù)用戶輸入半徑,計(jì)算圓面積。"INPUT"請(qǐng)輸入圓半徑r="TOrs=PI()*r^2?“圓面積S=”,sRETURN但是,絕大多數(shù)問題僅用順序結(jié)構(gòu)是無法解決的,還要用到分支(選擇)和循環(huán)結(jié)構(gòu)。2023/1/1540/737.3程序控制結(jié)構(gòu)7.3.1順序結(jié)構(gòu)7.3.2分支結(jié)構(gòu)7.3.3循環(huán)結(jié)構(gòu)7.3.4.混合嵌套(結(jié)構(gòu))7.3.2分支結(jié)構(gòu)分支結(jié)構(gòu)(又稱選擇結(jié)構(gòu))能根據(jù)指定的邏輯條件進(jìn)行判斷并控制程序的執(zhí)行方式,這正是計(jì)算機(jī)具有邏輯判斷能力的原因之一。按該結(jié)構(gòu)中執(zhí)行路徑的多少,可分為簡(jiǎn)單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)和多分支結(jié)構(gòu)。無論是哪種類型的分支結(jié)構(gòu),都是根據(jù)所給條件是否為真,選擇執(zhí)行某一分支上的語(yǔ)句序列。2023/1/1542/737.3.2分支結(jié)構(gòu)1.簡(jiǎn)單分支結(jié)構(gòu)2.雙分支選擇結(jié)構(gòu)3.多分支選擇結(jié)構(gòu)2023/1/1543/737.3.2分支結(jié)構(gòu)1.簡(jiǎn)單分支結(jié)構(gòu)2.雙分支選擇結(jié)構(gòu)3.多分支選擇結(jié)構(gòu)2023/1/1544/731.簡(jiǎn)單分支結(jié)構(gòu)格式:IFlExpression[THEN]CommandsENDIF2023/1/1545/73執(zhí)行流程:1.簡(jiǎn)單分支結(jié)構(gòu)例:求一元二次方程AX2+BX+C=0的實(shí)根。CLEARinput"請(qǐng)輸入二次項(xiàng)系數(shù):"toA

input"請(qǐng)輸入一次項(xiàng)系數(shù):"toBinput"請(qǐng)輸入常數(shù)項(xiàng):"toCdelta=B^2-4*A*CIFdelta>=0 X1=(-B+SQRT(delta))/(2*A) X2=(-B-SQRT(delta))/(2*A) ?"一元二次方程的兩個(gè)實(shí)根為:" ?"X1=",X1 ?"X2=",X2ENDIF2023/1/1546/737.3.2分支結(jié)構(gòu)1.簡(jiǎn)單分支結(jié)構(gòu)2.雙分支選擇結(jié)構(gòu)3.多分支選擇結(jié)構(gòu)2023/1/1547/732.雙分支選擇結(jié)構(gòu)格式:IFlExpression[THEN]

Commands1ELSE

Commands2ENDIF2023/1/1548/73執(zhí)行流程:2.雙分支選擇結(jié)構(gòu)例:求AX2+BX+C=0實(shí)根。當(dāng)B2-4AC<0時(shí),顯示“方程無實(shí)根”。input"請(qǐng)輸入二次項(xiàng)系數(shù):"toAinput"請(qǐng)輸入一次項(xiàng)系數(shù):"toBinput"請(qǐng)輸入常數(shù)項(xiàng):"toCdelta=B^2-4*A*CIFdelta>=0

X1=(-B+SQRT(delta))/(2*A) X2=(-B-SQRT(delta))/(2*A) ?"一元二次方程的兩個(gè)實(shí)根為:" ?"X1=",X1 ?"X2=",X2ELSE

?"方程無實(shí)根"ENDIF2023/1/1549/732.雙分支選擇結(jié)構(gòu)例:在student數(shù)據(jù)庫(kù)的students表中任意查找某學(xué)生,查到則顯示該學(xué)生的基本信息,無則顯示“查無此人!”。OPENDATABASEstudentUSEstudentsaccept"請(qǐng)輸入待查學(xué)生的姓名"tostuNameLOCATEFORSName=stuNameIFFOUND()

?"學(xué)號(hào):"+SNo ?"姓名:"+SName ?"出生日期:"+SBirthdayELSE

MESSAGEBOX("查無此人!",0+64,"提示信息")ENDIFCLOSEDATABASES2023/1/1550/73分支嵌套例:設(shè)收入(P)與個(gè)人所得稅(R)的計(jì)算關(guān)系如下列關(guān)系式所示,請(qǐng)編寫計(jì)算個(gè)人所得稅的程序。

0P≤2000R=0.052000<P≤5000

0.10P>50002023/1/1551/73程序如下:R0=0R1=0.05R2=0.10INPUT"請(qǐng)輸入收入:"TOPIF

P<=2000Tax=0ELSE&&2000元以上又分兩種

IFP<=5000Tax=(P-2000)*R1

ELSETax=(P-5000)*R2+3000*R1

ENDIFENDIF?“應(yīng)收所得稅

Tax=”,Tax7.3.2分支結(jié)構(gòu)1.簡(jiǎn)單分支結(jié)構(gòu)2.雙分支選擇結(jié)構(gòu)3.多分支選擇結(jié)構(gòu)2023/1/1552/733.多分支選擇結(jié)構(gòu)格式:

DOCASECASElExpression1 [Commands][CASElExpression2

[Commands]]...[CASElExpressionN

[Commands]][OTHERWISE [Commands]]ENDCASE2023/1/1553/73執(zhí)行流程3.多分支選擇結(jié)構(gòu)CLEARR0=0R1=0.05R2=0.10INPUT"請(qǐng)輸入收入:"TOPDOCASE

CASEP<=2000 Tax=0

CASEP<=5000 Tax=(P-2000)*R1

OTHERWISE Tax=(P-5000)*R2+3000*R1ENDCASE?"應(yīng)收所得稅

Tax=",Tax2023/1/1554/73例:設(shè)收入(P)與個(gè)人所得稅(R)的計(jì)算關(guān)系如下列關(guān)系式所示,請(qǐng)編寫計(jì)算個(gè)人所得稅的程序。

0P≤2000R=0.052000<P≤5000

0.10P>50007.3程序控制結(jié)構(gòu)7.3.1順序結(jié)構(gòu)7.3.2分支結(jié)構(gòu)7.3.3循環(huán)結(jié)構(gòu)7.3.4.混合嵌套(結(jié)構(gòu))7.3.3循環(huán)結(jié)構(gòu)在順序和分支結(jié)構(gòu)中,它們的每一條語(yǔ)句最多執(zhí)行一次。然而,在實(shí)際問題中,某些語(yǔ)句或程序段可能需要重復(fù)運(yùn)行多次才能達(dá)到目的。循環(huán)結(jié)構(gòu)就是用來完成這類需要重復(fù)執(zhí)行的操作的。在VisualFoxPro中,提供了“條件(DOWHILE-ENDDO)”、“步長(zhǎng)型(FOR-ENDFOR)”和“表掃描型(SCAN-ENDSCAN)”三類循環(huán)結(jié)構(gòu)。2023/1/1556/737.3.3循環(huán)結(jié)構(gòu)1.條件循環(huán)結(jié)構(gòu)2.步長(zhǎng)型循環(huán)結(jié)構(gòu)3.表掃描循環(huán)結(jié)構(gòu)4.循環(huán)嵌套2023/1/1557/731.條件循環(huán)結(jié)構(gòu)格式:DOWHILElExpression

Commands[LOOP][EXIT]ENDDO2023/1/1558/73流程:1.條件循環(huán)結(jié)構(gòu)一個(gè)循環(huán)結(jié)構(gòu)一般應(yīng)具備以下幾個(gè)部分:

(1)循環(huán)的初始條件:給循環(huán)控制變量賦初值的語(yǔ)句;(2)循環(huán)頭:循環(huán)語(yǔ)句的起始,即設(shè)置、判斷循環(huán)條件的語(yǔ)句;(3)循環(huán)尾:循環(huán)結(jié)尾語(yǔ)句;(4)循環(huán)體:位于循環(huán)頭與循環(huán)尾之間被重復(fù)執(zhí)行的語(yǔ)句。2023/1/1559/73例:求N!,要求N從鍵盤輸入INPUT"請(qǐng)輸入數(shù)值N:"TOni=1f=1DOWHILE

i<=n

f=f*ii=i+1ENDDO?“N!=”,f1.條件循環(huán)結(jié)構(gòu)逐條顯示student數(shù)據(jù)庫(kù)students表中所有男學(xué)生記錄,并統(tǒng)計(jì)男學(xué)生個(gè)數(shù)。OPENDATABASEstudentUSEstudentsN=0DOWHILE.not.EOF()&&記錄指針控制循環(huán)

IF

性別='男' DISPLAY N=N+1

ENDIF SKIP &&如果沒有SKIP會(huì)怎么樣?ENDDOCLOSEDATABASES?”男學(xué)生個(gè)數(shù)N=”,N2023/1/1560/731.條件循環(huán)結(jié)構(gòu)求N!(用EXIT退出循環(huán))。INPUT"請(qǐng)輸入數(shù)值N:"TOni=1f=1DOWHILE.t.&&注意此處與上述求N!例子的區(qū)別 f=f*i i=i+1 IFi>N

EXIT &&退出循環(huán)體 ENDIFENDDO?“N!=”,f2023/1/1561/731.條件循環(huán)結(jié)構(gòu)逐條顯示student數(shù)據(jù)庫(kù)的students表中除“李”姓以外的所有學(xué)生記錄,并統(tǒng)計(jì)“李”姓學(xué)生的個(gè)數(shù)。SETEXACTOFF&&設(shè)置不精確比較OPENDATABASEstudentUSEstudentsN=0DOWHILE.not.EOF()&&記錄指針控制循環(huán) IF姓名='李' N=N+1&&統(tǒng)計(jì)李姓學(xué)生人數(shù) SKIP

LOOP ENDIF

DISPLAY&&顯示非李姓學(xué)生 SKIPENDDOCLOSEDATABASES?“李姓學(xué)生個(gè)數(shù)N=”,N2023/1/1562/737.3.3循環(huán)結(jié)構(gòu)1.條件循環(huán)結(jié)構(gòu)2.步長(zhǎng)型循環(huán)結(jié)構(gòu)3.表掃描循環(huán)結(jié)構(gòu)4.循環(huán)嵌套2023/1/1563/732.步長(zhǎng)型循環(huán)結(jié)構(gòu)格式:FORVarName=nInitialValue

TO

nFinalValue[STEP

nIncrement]

CommandsENDFOR|NEXT2023/1/1564/73流程:2.步長(zhǎng)型循環(huán)結(jié)構(gòu)方式1:INPUT"請(qǐng)輸入數(shù)值N:"TOnf=1FORi=1TOn f=f*iENDFOR?“N!=”,f2023/1/1565/73方式2:INPUT"請(qǐng)輸入數(shù)值N:"TOnf=1FOR

i=nTO

1

STEP-1f=f*iENDFOR?"N!=",f*求N!,用FOR循環(huán)實(shí)現(xiàn)7.3.3循環(huán)結(jié)構(gòu)1.條件循環(huán)結(jié)構(gòu)2.步長(zhǎng)型循環(huán)結(jié)構(gòu)3.表掃描循環(huán)結(jié)構(gòu)4.循環(huán)嵌套2023/1/1566/733.表掃描循環(huán)結(jié)構(gòu)格式:SCAN[Scope][FORlExpression1][WHILElExpression2][Commands]ENDSCAN功能:在當(dāng)前打開的數(shù)據(jù)表中的指定范圍(Scope)內(nèi)查找符合條件的記錄,若找到,將記錄指針指向該記錄,然后執(zhí)行循環(huán)體,到達(dá)ENDSCAN語(yǔ)句時(shí)返回循環(huán)頭,再次查找符合條件的記錄,直到在指定范圍內(nèi)找不到滿足條件的記錄為止。如果不指定范圍Scope,則對(duì)整個(gè)表中的所有記錄進(jìn)行掃描處理。對(duì)于FOR條件語(yǔ)句,將對(duì)Scope所限定的范圍內(nèi)的每一條記錄進(jìn)行一一判斷,滿足條件則執(zhí)行循環(huán)體;對(duì)于WHILE條件語(yǔ)句,若下一條記錄不滿足條件,則停止循環(huán)。2023/1/1567/733.表掃描循環(huán)結(jié)構(gòu)說明:(1)使用該結(jié)構(gòu)必須先打開要掃描的數(shù)據(jù)表。(2)當(dāng)每次循環(huán)執(zhí)行到ENDSCAN或LOOP語(yǔ)句時(shí),記錄指針自動(dòng)下移,如果已到文件尾,則退出循環(huán),否則繼續(xù)循環(huán)。因此,循環(huán)體中不需要SKIP語(yǔ)句。2023/1/1568/733.表掃描循環(huán)結(jié)構(gòu)用表掃描循環(huán)實(shí)現(xiàn)前述中逐條顯示除“李”姓以外的所有學(xué)生記錄,并統(tǒng)計(jì)“李”姓學(xué)生的個(gè)數(shù)的程序(方式一)。SETEXACTOFF&&設(shè)置不精確比較OPENDATABASEstudentUSEstudentsN=0SCAN IF姓名='李' N=N+1

*SKIP(SCAN循環(huán)會(huì)自動(dòng)移動(dòng)記錄指針) LOOP ENDIF DISPLAY

*SKIP(同上)ENDSCANCLOSEDATABASES?“李姓學(xué)生個(gè)數(shù)N=”,N2023/1/1569/733.表掃描循環(huán)結(jié)構(gòu)用表掃描循環(huán)實(shí)現(xiàn)前述中逐條顯示除“李”姓以外的所有學(xué)生記錄,并統(tǒng)計(jì)“李”姓學(xué)生的個(gè)數(shù)的程序(方式二)。SETEXACTOFF&&設(shè)置不精確比較OPENDATABASEstudentUSEstudentsN=0SCAN

FOR.NOT.姓名='李'&&掃描條件 DISPLAY N=N+1&&累加不姓李的學(xué)生數(shù)ENDSCANGOBOTTOMN=RECNO()-N&&姓李學(xué)生數(shù)=總學(xué)生數(shù)-不姓李學(xué)生數(shù)CLOSEDATABASES?“李姓學(xué)生個(gè)數(shù)N=”,N2023/1/1570/737.3.3循環(huán)結(jié)構(gòu)1.條件循環(huán)結(jié)構(gòu)2.步長(zhǎng)型循環(huán)結(jié)構(gòu)3.表掃描循環(huán)結(jié)構(gòu)4.循環(huán)嵌套2023/1/1571/734.循環(huán)嵌套循環(huán)嵌套是指在一個(gè)循環(huán)結(jié)構(gòu)的循環(huán)體中又含有循環(huán)結(jié)構(gòu),也稱為多重循環(huán)。同一種類型的循環(huán)結(jié)構(gòu)可以嵌套,不同類型的循環(huán)結(jié)構(gòu)也可以嵌套。但要注意,同層循環(huán)的循環(huán)頭語(yǔ)句和循環(huán)結(jié)束語(yǔ)句須配對(duì)出現(xiàn);內(nèi)、外層循環(huán)層次分明,不得交叉。2023/1/1572/734.循環(huán)嵌套編程輸出九九乘法表。CLEARFORa=1TO9&&控制輸出行數(shù)

FORb=1TO9&&控制輸出每行列數(shù) p=a*b ??STR(a,1)+"×"+STR(b,1)+"="+STR(p,2)+""

ENDFOR ?&&注意??和?的區(qū)別ENDFOR2023/1/1573/734.循環(huán)嵌套編程輸出上三角形九九乘法表。CLEARFORa=1TO9

FORb=1TOa&&注意與上例的不同 p=a*b ??STR(a,1)+"×"+STR(b,1)+"="+STR(p,2)+""

ENDFOR ?ENDFOR2023/1/1574/737.3程序控制結(jié)構(gòu)7.3.1順序結(jié)構(gòu)7.3.2分支結(jié)構(gòu)7.3.3循環(huán)結(jié)構(gòu)7.3.4.混合嵌套(結(jié)構(gòu))7.3.4.混合嵌套(結(jié)構(gòu))如前所述,無論是分支結(jié)構(gòu)還是循環(huán)結(jié)構(gòu),都可以進(jìn)行嵌套從而組成更復(fù)雜的程序結(jié)構(gòu)。單純的循環(huán)嵌套稱為多重循環(huán),單純的分支嵌套稱為多重分支;循環(huán)結(jié)構(gòu)中嵌入分支結(jié)構(gòu)或者分支結(jié)構(gòu)內(nèi)包含循環(huán)結(jié)構(gòu),從而構(gòu)成混合嵌套結(jié)構(gòu)。這些嵌套形式統(tǒng)稱為基本結(jié)構(gòu)的嵌套。事實(shí)上,不管是分支結(jié)構(gòu)還是循環(huán)結(jié)構(gòu),都自然而然地嵌套了順序結(jié)構(gòu)。而且,不管是哪一種嵌套,都應(yīng)遵循下面的規(guī)則:①嵌套只能包含而不得交叉。②基本結(jié)構(gòu)的開始與結(jié)束語(yǔ)句就近配對(duì)。③控制只能由內(nèi)層轉(zhuǎn)出而不能由外層轉(zhuǎn)入。2023/1/1576/737.3.4.混合嵌套(結(jié)構(gòu))由男人、女人、小孩搬36塊磚,男人每次搬4塊,女人每次搬3塊,兩個(gè)小孩抬一塊。問男人、女人、小孩各多少時(shí)一次可全搬完,請(qǐng)求出所有可能的方案。(分析:X表示男人,最多9人,Y表示女人,最多12人,小孩最多72人)。?SPACE(9)+"男"+SPACE(9)+"女"+SPACE(9)+"小孩"lines=0&&用于控制滾屏的變量x=0DOWHILEx<=9 y=0

DOWHILEy<=12 z=0

DOWHILEz<=72

IF4*x+3*y+z/2=36 ?x,y,z lines=lines+1

IFlines>30&&輸出滿30行暫停 WAIT lines=0

ENDIF

ENDIF z=z+2

ENDDO y=y+1

ENDDO x=x+1ENDDO2023/1/1577/737.3.4.混合嵌套(結(jié)構(gòu))上例中增加人數(shù)限制:即36塊磚,36人搬,其它不變。即求不定方程:4X+3Y+(36–X–Y)/2=36整數(shù)解。?SPACE(9)+"男"+SPACE(9)+"女"+SPACE(9)+"小孩"x=1DOWHILEx<=9 y=1

DOWHILEy<=12

IF4*x+3*y+(36-x-y)/2=36ANDx+y+(36-x-y)=36&&后一條件恒為真,可省去 ?x,y,(36-x-y)

ENDIF y=y+1

ENDDO x=x+1ENDDO2023/1/1578/737.3.4.混合嵌套(結(jié)構(gòu))排序問題:從鍵盤任意輸入10個(gè)數(shù),然后將它們從小到大排序后輸出。CLEARDIMENSIONx(10)*--------數(shù)據(jù)輸入部分-----------------FORi=1TO10 x(i)=0 @i,2say"請(qǐng)輸入第"+ALLTRIM(STR(i,2))+"個(gè)數(shù)據(jù):"getx(i) readNEXT@12,2say"排序之前的數(shù)據(jù)順序是:"FORi=1TO10 @13+i,5sayx(i)NEXT2023/1/1579/737.3.4.混合嵌套(結(jié)構(gòu))排序問題(續(xù))*--------數(shù)據(jù)處理(排序)部分---------FORi=1TO9 &&控制比較輪次 FORj=i+1TO10 &&控制每輪比較次數(shù) IFx(j)<x(i)&&控制是否要互換位置 a=x(i) x(i)=x(j) x(j)=a ENDIF ENDFORENDFOR2023/1/1580/737.3.4.混合嵌套(結(jié)構(gòu))排序問題(續(xù))*--------排序后數(shù)據(jù)輸出部分---------@26,2say"排序之后的數(shù)據(jù)順序是:"FORi=1TO10 @26+i,5sayx(i)ENDFORRETURN2023/1/1581/737.3.4.混合嵌套(結(jié)構(gòu))在窗口中畫同心圓、矩形或三角形的程序。CLEAR?"這是一個(gè)在窗口中畫同心圓、矩形或三角形圖案的程序。"input"請(qǐng)選擇(1.圓,2.矩形,3.三角形):"toM*----------------取屏幕中心點(diǎn)坐標(biāo)(a,b)a=_screen.Width/2&&_screen是系統(tǒng)變量,表示當(dāng)前系統(tǒng)窗口對(duì)象b=_screen.height/22023/1/1582/737.3.4.混合嵌套(結(jié)構(gòu))在窗口中畫同心圓、矩形或三角形的程序(續(xù))。DOCASE CASEM=1 _screen.ForeColor=RGB(255,0,0)&&設(shè)置屏幕前景色為紅色 FORi=0TO150STEP3 _screen.Circle(i,a,b)&&以屏幕中心為圓心、i為半徑畫同心圓 ENDFOR CASEM=2 _screen.ForeColor=RGB(0,255,0)&&設(shè)置屏幕前景色為綠色 FORi=0TO150STEP3 _screen.box(a-i,b-i,a+i,b+i)&&畫矩形 ENDFOR CASEM=3 _screen.ForeColor=RGB(0,0,255)&&設(shè)置屏幕前景色為藍(lán)色 FORi=0TO150STEP3 _screen.Line(a-i,b+i,a+i,b+i)&&畫線,由多條線堆成三角狀 ENDFOR OTHERWISE ?"請(qǐng)輸入數(shù)字1,2或者3。"ENDCASE_screen.ForeColor=RGB(0,0,0)2023/1/1583/73第7章結(jié)構(gòu)化程序設(shè)計(jì)7.1程序文件7.2程序方式下的幾個(gè)基本命令7.3程序控制結(jié)構(gòu)7.4多模塊程序(略)7.5程序的調(diào)試(略)實(shí)驗(yàn)7結(jié)構(gòu)化程序設(shè)計(jì)實(shí)驗(yàn)?zāi)康氖煜FP面向過程程序設(shè)計(jì)方法,重點(diǎn)在于通過實(shí)驗(yàn)掌握面向過程程序設(shè)計(jì)中的常用輸入輸出語(yǔ)句和三種基本程序結(jié)構(gòu)。建議學(xué)時(shí):4學(xué)時(shí)2023/1/1585/73實(shí)驗(yàn)7結(jié)構(gòu)化程序設(shè)計(jì)實(shí)驗(yàn)要求掌握結(jié)構(gòu)化程序設(shè)計(jì)的基本方法,結(jié)構(gòu)化程序設(shè)計(jì)的算法表示。掌握命令文件(.PRG)的建立、修改和運(yùn)行,并了解程序調(diào)試方法。熟練掌握和運(yùn)用程序設(shè)計(jì)的基本輸入(INPUT、ACCEPT、WAIT等)、輸出語(yǔ)句(?、??)以及環(huán)境設(shè)置語(yǔ)句(CLEAR、SET等);掌握結(jié)構(gòu)化程序設(shè)計(jì)的三種基本結(jié)構(gòu)(順序、選擇、循環(huán)),熟練運(yùn)用三種控制結(jié)構(gòu)編制程序。程序設(shè)計(jì)基本算法:掌握數(shù)值運(yùn)算算法(整除、求余、累加、累乘等),掌握字符處理算法(字符比較、字符轉(zhuǎn)換、字符串拆合等),掌握表檢測(cè)函數(shù)(BOF、EOF、RECCOUNT、RECNO、FCOUNT、FIELD、FOUND等),掌握表內(nèi)容輸入、查詢和顯示輸出的基本算法。了解環(huán)境檢測(cè)函數(shù)(INKEY、FILE、IIF等),了解宏替換、名字表達(dá)式和值表達(dá)式的綜合運(yùn)用。子程序、自定義函數(shù)設(shè)計(jì)與參數(shù)傳遞:了解子程序、過程和自定義函數(shù)的設(shè)計(jì)方法,以及調(diào)用與返回規(guī)則;了解參數(shù)傳遞(傳值和引用)規(guī)則;了解內(nèi)存變量的作用域及其對(duì)參數(shù)傳遞的影響。2023/1/1586/73實(shí)驗(yàn)7結(jié)構(gòu)化程序設(shè)計(jì)實(shí)驗(yàn)內(nèi)容1.編寫一個(gè)求圓面積的程序,圓的半徑要求提示用戶從鍵盤輸入。2.編寫一個(gè)程序,要求任意輸入3個(gè)數(shù),找出其中的最大值和最小值。3.編寫一個(gè)求任意數(shù)N累加和的程序。然后將其修改成求任意數(shù)N階乘的程序。最后再修改成求1!+2!+......+N!的程序。4.編寫程序,要求任意輸入10個(gè)數(shù),統(tǒng)計(jì)其中正數(shù)、負(fù)數(shù)和零的個(gè)數(shù)。5.用掃描循環(huán)(SCAN...ENDSCAN)輸出student表中男同學(xué)的記錄。2023/1/1587/73實(shí)驗(yàn)7結(jié)構(gòu)化程序設(shè)計(jì)實(shí)驗(yàn)內(nèi)容6.編寫一個(gè)程序,其功能是:把student表的記錄按照從最后一個(gè)到第一個(gè)的順序依次顯示出來,而且每一屏只能顯示5個(gè)記錄。顯示的內(nèi)容是:記錄號(hào)、學(xué)號(hào)、姓名、性別、出生日期、黨員否。其中,是黨員的要求顯示為“黨員”,否則為“非黨員”。2023/1/1588/737.6本章小結(jié)本章介紹了程序及程序文件的概念、如何建立和運(yùn)行程序文件,以及程序方式下常用的環(huán)境設(shè)置與輸入/輸出命令等;重點(diǎn)介紹了結(jié)構(gòu)化程序設(shè)計(jì)中的順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu),以及在這三種基本控制結(jié)構(gòu)上的復(fù)合嵌套。理論上,利用這三種基本結(jié)構(gòu)可構(gòu)成任意復(fù)雜的模塊或應(yīng)用程序。本章中的一些基本概念體現(xiàn)了結(jié)構(gòu)化程序設(shè)計(jì)的核心思想,是模塊化程序設(shè)計(jì)的基石,并且結(jié)構(gòu)化程序設(shè)計(jì)中的三種基本控制結(jié)構(gòu)及其復(fù)合嵌套形式也

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論