版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第7章結(jié)構(gòu)化程序設(shè)計,迄今為止,前面介紹的操作都是通過菜單或在命令窗口中逐條輸入命令的方法來執(zhí)行的,這種工作方式稱為單命令方式或交互工作方式。但此方式不適合復(fù)雜的數(shù)據(jù)管理任務(wù)。為此,Visual FoxPro提供了批命令處理方式,即程序工作方式。 程序工作方式是根據(jù)解決實際問題的需要,將一系列的命令按一定的邏輯結(jié)構(gòu)編排成一個完整的應(yīng)用程序,然后由計算機自動地、連續(xù)地按程序的順序執(zhí)行。 Visual FoxPro系統(tǒng)支持傳統(tǒng)的面向過程的程序設(shè)計,也支持面向?qū)ο蟮某绦蛟O(shè)計。 本章介紹面向過程的程序設(shè)計方法,程序中的命令一般稱為語句,每一行為一個語句,不同的語句應(yīng)放在不同的行。,7.1.1程序文件的
2、建立 程序文件(簡稱程序)也叫命令文件。在Visual FoxPro環(huán)境下,利用程序文件方式進行數(shù)據(jù)庫管理,是通過程序文件編輯工具,將對數(shù)據(jù)庫操作的命令和對系統(tǒng)環(huán)境進行設(shè)置的命令,集中在一個以.PRG為擴展名的程序文件中,然后再通過菜單方式或命令方式運行該程序文件。 程序文件的建立可以用Visual FoxPro本身自帶的編輯工具建立,也可用其它文本編輯軟件建立(保存時以帶分行符的純文本文件保存,擴展名為.prg),7.1程序文件的建立與運行,程序的五要素 1,有窮性:程序的操作步驟必須是有限的,不能出現(xiàn)死循環(huán)。 2,確定性:每個語句都必須有確定的含義,不能有二義性。 3,有0個或多個輸入。
3、4,有一個或多個輸出:程序必須有輸出。 5,有效性:程序中的每一步都必須是能有效地執(zhí)行的。,1,用菜單方式建立程序文件 操作步驟(1)執(zhí)行“文件/新建/程序/新建文件” (2)輸入程序文件的內(nèi)容(每行輸入完后按回車鍵) (3)保存文件 2,以命令方式建立程序文件 在命令窗口中輸入命令: modify command 程序文件名 文件名必須包括路徑,缺省時為程序1,關(guān)閉窗口時可以修改。,7.1.2程序文件的運行 方法一:打開程序文件后或編輯完程序后,執(zhí)行“程序”菜單中的“運行”命令,或單擊工具欄中的“ !” 方法二:在沒有打開程序編輯窗口的情況下,在命令窗口中輸入以下格式的命令: do 當(dāng)程序文
4、件不在默認(rèn)目錄下時,程序文件名中必須包含路徑。 中止程序的執(zhí)行:在程序的執(zhí)行過程中可按ESC鍵中止程序的執(zhí)行。 程序的修改:當(dāng)關(guān)閉程序的編輯窗口后,要修改程序,可以通過文件菜單中的打開命令,文件類型選擇“程序”,然后選擇要打開的文件。,7.1.3程序中的輔助命令 1,注釋命令 以note或或開頭的內(nèi)容。其中note和只能作用于整行內(nèi)容作為注釋的情形,要在一行命令右邊加上注釋只能用& 【例7-1】 :程序中的注釋命令示例,* * 程序:職工檔案管理系統(tǒng) * * 作者: 高路 * * 日期 2005年月 * All Rights Reserved * * note 設(shè)置系統(tǒng)運行環(huán)境 set tal
5、k off &關(guān)閉人機對話 set default to e:liang &指定默認(rèn)目錄 set date to YMD &指定日期格式,2,結(jié)束運行程序運行命令 格式1:RETURN 功能:返回到上級程序模塊。若本程序模塊是以菜單方式或命令方式調(diào)用的,則返回交互狀態(tài)(命令窗口中) 格式2:RETURNMASTER 功能:返回到最上級主程序。 格式3:CANCEL 功能:終止程序的執(zhí)行,返回交互狀態(tài)(命令窗口中) 格式4:QUIT 功能:關(guān)閉所有文件,關(guān)閉Visual FoxPro,3,運行環(huán)境設(shè)置 在程序的開始部分經(jīng)常要進行運行環(huán)境的設(shè)置,其設(shè)置見表61,7.1.4程序的交互輸入命令 1,字
6、符串輸入命令 格式:accept to 功能:暫停程序的運行,等待用戶從鍵盤輸入一串字符并賦給指定的內(nèi)存變量。 說明:(1),提示信息用于提示用戶的輸入,其內(nèi)容必須是字符型的。 (2),用此命令輸入的所有內(nèi)容均作為字符型數(shù)據(jù)。 (3),輸入的字符串以回車符結(jié)束。,【例7-2】以下程序段是打開用戶從鍵盤輸入的表名,并根據(jù)輸入的姓名進行簡單的查詢輸出。 accept 請輸入要打開的數(shù)據(jù)表名: to tab_name use &tab_name accept 請輸入被查者姓名: to name locate for 姓名=name display,2,表達式輸入命令 格式:INPUT to 功能:暫
7、停程序的運行,等待用戶從鍵盤輸入數(shù)據(jù)并賦給指定的內(nèi)存變量。若輸入的是一個表達式,則先計算表達式的值,然后將表達式的值賦給內(nèi)存變量。 說明:(1)提示信息為字符型常量 (2)輸入的內(nèi)容可以是任何一個合法的N、C、D、L型表達式 (3)若輸入的是字符串,則必須加上定界符。,【例7-3】根據(jù)輸入的某種商品的單價和數(shù)量,計算并輸出應(yīng)付的金額。 CLEAR ALL INPUT 單價: TO dj INPUT 數(shù)量: TO sl ?應(yīng)付金額:+str(dj*sl,9,2) RETURN,3,等待或單字符輸入命令 格式:WAIT to 功能:暫停程序的運行,等待用戶從鍵盤輸入一個字符。當(dāng)包含to 短語時,將
8、輸入的字符賦給指定的內(nèi)存變量,否則當(dāng)用戶按下任意鍵后繼續(xù)執(zhí)行程序。 說明: 當(dāng)命令中包含了提示信息時,將顯示提示信息。 本命令只能輸入一個字符(按下后不能修改,也不用按回車鍵結(jié)束輸入) 若命令中不帶任何選項,只有WAIT,則程序暫停并顯示“按任意鍵后繼續(xù).”,【例7-4】下面的程序段是用WAIT命令接收用戶的回答,當(dāng)輸入N或n時終止程序的運行,返回命令窗口。 . wait 繼續(xù)運行嗎?(Y/N) to jx if upper(jx)=N cancel endif .,4,定位輸出與輸入命令 格式1:say 功能:在屏幕上的指定行、列位置,輸出表達式的值 格式2:sayget read 功能:在
9、屏幕上的指定行、列位置,輸出表達式的值,并在其后顯示變量的值,當(dāng)執(zhí)行read語句后可在原位置修改變量的值,修改后的值會自動返回給變量。 格式3:saygetrange,valid 功能:在格式2的基礎(chǔ)上用表達式1和表達式2的值來規(guī)定數(shù)值或日期型變量的上限和下限。 valid用于規(guī)定輸入的變量值要滿足的條件。,【例7-5】定位輸出輸入命令應(yīng)用舉例。 clear use zgda append blank 6,12 say 請輸入新職工的信息: 7,12 say 姓名: get 姓名 8,12 say 性別: get 性別 valid 性別$男女 9,12 say 年齡 get 年齡 range
10、18,60 read browse use return,7.2 順序結(jié)構(gòu)程序設(shè)計,7.2.13種基本程序結(jié)構(gòu) 程序中的基本語句由一般語句(能在命令窗口中運行的語句)和結(jié)構(gòu)控制語句組成。結(jié)構(gòu)控制語句有選擇結(jié)構(gòu)(分支結(jié)構(gòu))和循環(huán)結(jié)構(gòu)。 程序的基本結(jié)構(gòu)有:順序結(jié)構(gòu)、分支結(jié)構(gòu)(又稱為選擇結(jié)構(gòu))和循環(huán)結(jié)構(gòu)。,1,順序結(jié)構(gòu):由一般語句按一定的順序排列而成,執(zhí)行時嚴(yán)格地從上至下執(zhí)行 2,分支結(jié)構(gòu):根據(jù)給定的條件決定執(zhí)行哪一個程序塊。分為簡單分支、選擇分支和多路分支。 3,循環(huán)結(jié)構(gòu):在一定的條件下反復(fù)執(zhí)行某一程序段,直至條件不滿足時止。此條件又稱為循環(huán)條件。 循環(huán)結(jié)構(gòu)分為:當(dāng)型循環(huán)(dowhile循環(huán))、計
11、數(shù)型循環(huán)(for循環(huán))、掃描型循環(huán)(scan循環(huán)),7.2.2順序結(jié)構(gòu)程序設(shè)計 順序結(jié)構(gòu)的一般格式為: 設(shè)置工作環(huán)境 打開表等 給變量賦值 計算或操作語句 輸出語句 關(guān)閉文件 恢復(fù)工作環(huán)境,【例7-6】在職工檔案表中查看指定職工的有關(guān)情況。,算法: S1:打開職工檔案表 S2:輸入要查詢的職工的姓名 S3:按姓名查詢 S4:顯示查詢結(jié)果 S5:關(guān)閉表,use zgda accept 請輸入被查詢者姓名: to xm locate for 姓名=xm clear ?姓名:+姓名 ?職稱:+職稱 ?出生日期:+DTOC(出生日期) use return,【例7-7】根據(jù)輸入的人口基數(shù)和年平均增長率
12、,計算二十年后的人口數(shù).,算法: S1:清屏 S2:輸入人口基數(shù) S3:輸入年平均增長率 S4:計算二十年后的人口數(shù) S5:輸出計算結(jié)果,clear input 人口基數(shù): TO aa input 年平均增長率: to bb cc=aa*(1+bb)20 ?二十年后的人口數(shù)為:+str(cc) return,7.3 分支結(jié)構(gòu)程序設(shè)計,7.3.1 簡單分支結(jié)構(gòu) 格式: IF ENDIF 功能:若條件成立,則執(zhí)行其后的語句系列,否則跳過語句系列,執(zhí)行ENDIF后面的語句。 說明:1,IF和ENDIF必須成對出現(xiàn),且各占一行 2,書寫時最好將IF后面的語句系列向右縮進,將IF與其相對應(yīng)的ENDIF對
13、齊。,【例7-8】某種商品一次購買100件以上時,可享受8%的優(yōu)惠,試編程根據(jù)輸入的單價和數(shù)量計算應(yīng)付的金額。,算法設(shè)計: S1:輸入數(shù)量與單價 S2:計算金額je S3:IF 數(shù)量=100 je=je*0.92 ENDIF S4:輸出金額,clear input 數(shù)量: to sl input 單價: to dj je=dj*sl if sl=100 je=je*0.92 endif ?應(yīng)付金額:+str(je,8,2) return,【例7-9】在程序中設(shè)置簡單口令核對的一段程序 ?口令 set console off accept to password set console on i
14、f passwordABCD cancel endif,7.3.2選擇分支結(jié)構(gòu) 格式: IF條件 語句系列1 ELSE 語句系列2 ENDIF 功能:若條件為真則執(zhí)行語句系列1而不執(zhí)行語句系列2,否則執(zhí)行語句系列2而不執(zhí)行語句系列1。 說明:1,IF和ENDIF必須成對出現(xiàn),且各占一行,ELSE也必須獨占一行。 2,語句系列中的語句可以是一句,也可以是多句。,【例7-10】設(shè)出租車不超過5公里時一律收費10元,超過時則超過部分每公里加收1.5元,試編程根據(jù)里程數(shù)計算車費。 clear input 里程數(shù): to lc if lc=5 ?車費十元 else cf=10+(lc-5)*1.5 ?車
15、費為:+str(cf,6,2) endif return,【例7-11】按姓名查詢職工檔案表中職工的基本情況。 clear use zgda input 請輸入要查詢的職工的姓名: to xm locate for 姓名=xm if found() display else ?查無此人! endif clear all return,7.3.3 分支嵌套結(jié)構(gòu) 前面的分支結(jié)構(gòu)中的語句系列也可以是IF.ELSE語句,即分支結(jié)構(gòu)可以嵌套。 【例7-12】設(shè)硅谷公司員工的工資計算方法如下: 工作時數(shù)超過120小時者,超過部分加百分之十五 工作時數(shù)低于80者,扣發(fā)500元 余者按每小時68元計發(fā),cle
16、ar input 請輸入工時: to gs if gs120 gz=gs*68+(gs-120)*68*0.15 else if gs80 gz=gs*68-500 else gz=gs*68 endif endif ? gz,7.3.4多路分支結(jié)構(gòu) 格式: DOCASE CASE條件1 CASE條件2 CASE條件n OTHERWISE ENDCASE 功能:根據(jù)條件執(zhí)行相應(yīng)的語句,當(dāng)前面n個條件均不成立時執(zhí)行語句系列n+1,說明:1,DO CASE必須和CASE成對出現(xiàn),且 各占一行 2, 各CASE語句的執(zhí)行是從CASE開始 按順序執(zhí)行,因此必須對條件的順序加以考慮。 3,DO CASE
17、與第1個CASE語句之間的語句將不執(zhí)行 【例7-13】編程計算銀行存款整存整取應(yīng)得的利息。,clear input本金(元): to bj input存期(年): to cq do case case cq=5 rate=7.5 case cq=3 rate=6.9 case cq=2 rate=6.6 case cq=1 rate=6.3 case cq=0.5 rate=4.5 otherwise rate=1.7 endcase lixi=bj*cq*rate/1000 ?應(yīng)得利息:+str(lixi,8,2) return,作業(yè),1,編程求下面分段函數(shù)的值(其中自變量x的值由鍵盤輸入)
18、。 2,編程求一元二次方程的根。 3,從鍵盤輸入成績,然后根據(jù)下面標(biāo)準(zhǔn)給出等級成績(要求用 DO CASE語句完成) 成績 等級成績 等級 90100 A60-69 D 80-69 B60 E 70-79 C,提示: 1,S1:輸入x的值 S2:使用if語句根據(jù)x的值計算出y的值 S3:輸出y的值 2,S1:輸入一元二次方程的二次項、一次項系數(shù)和常數(shù)項 S2:ifa=0則輸出“不是一元二次方程”,終止程序 S3:計算disc=b2-4*a*c S4:根據(jù)disc的不同情況分別計算出方程的根:實根、虛根,并輸出 3,S1:輸入成績 S2:do case case 成績=90 輸出評語 . end
19、case,7.4 循環(huán)結(jié)構(gòu)程序設(shè)計,三種循環(huán)結(jié)構(gòu):當(dāng)型循環(huán)、步長型循環(huán)和掃描型循環(huán) 循環(huán)結(jié)構(gòu)的組成: 循環(huán)開始語句 循環(huán)體 循環(huán)結(jié)束語句 其中:循環(huán)開始語句一般由循環(huán)結(jié)構(gòu)語句和條件判斷組成。 循環(huán)體是要反復(fù)執(zhí)行的程序段,7.4.1當(dāng)型循環(huán)結(jié)構(gòu) 1, DO WHILE循環(huán)語句 【格式】DO WHILE ENDDO,一個循環(huán)結(jié)構(gòu)一般應(yīng)具備如下的條件: (1)循環(huán)的初始條件:一般為給循環(huán)控制變量賦初值; (2)循環(huán)頭:循環(huán)語句的起始,設(shè)置、判斷循環(huán)條件; (3)循環(huán)尾:循環(huán)語句的結(jié)尾; (4)循環(huán)體:位于循環(huán)頭和循環(huán)尾之間、循環(huán)控制重復(fù)執(zhí)行的語句序列,循環(huán)的終止: 正常終止:當(dāng)循環(huán)條件為假(即不成立
20、)時,將終止循環(huán)的執(zhí)行轉(zhuǎn)到執(zhí)行ENDDO后面的語句。 非正常終止:通過EXIT、QIUT、CANCEL和LOOP等語句控制循環(huán)的執(zhí)行。其中: EXIT:終止本層循環(huán)的執(zhí)行轉(zhuǎn)到執(zhí)行ENDDO后面的語句。 CANCEL:終止程序的執(zhí)行,返回命令窗口 QUIT:終止程序的執(zhí)行,關(guān)閉所有文件,關(guān)閉Visual FoxPro LOOP:終止從本語句的下一語句開始到ENDDO之間的語句的執(zhí)行,回到循環(huán)的開始處。 以上4個命令一般和IF語句配合使用,當(dāng)某一條件滿足時執(zhí)行相應(yīng)的語句。,【例7-14】求123.100的累計值 clear store 0 to n,sum do while n100 n=n+1
21、sum=sum+n enddo ?累計值為:+str(sum,6),已知遞推公式,求其通項的值 若 Si=Si-1+f(i) 求Sn的值的程序段為 s=0 i=1 do while i=n s=s+f(i) i=i+1 enddo,例:求1 到100的所有偶數(shù)之和,si=si-1+2i 程序段為: s=0 i=1 do while i=50 s=s+2*i i=i+1 enddo,【例7-15】雞兔同籠問題。設(shè)雞和兔共有頭37個、腳134個,問雞和兔各有多少? 設(shè)雞有cock個,兔有rabbit個,則有: cock+rabbit=37 2*cock+4*rabbit=134 解題方法:對雞、兔
22、的各種情形(雞數(shù)從0到37)進行判斷 cock=0 do while cock=37 rabbit=37-cock if 2*cock+4*rabbit=134 ?雞:+str(cock,2)+ 兔:+str(rabbit,2) endif cock=cock+1 enddo,【例7-16】簡單的程序功能選擇程序。下面程序是打開職工檔案表后,在屏幕上顯示一個可對該表進行“瀏覽”、“修改”或“追加”操作的菜單供用戶選擇,根據(jù)選擇結(jié)果由多路分支語句控制所做的相應(yīng)的操作。,算法設(shè)計: S1:打開表 S2:do while .t. S21: 顯示選擇菜單:1,瀏覽,2,修改,3,追加,4,退出 S22
23、:選擇 S23:根據(jù)選擇結(jié)果執(zhí)行相應(yīng)的操作,SET TALK OFF SET STATUS OFF &關(guān)閉狀態(tài)行 CLEAR ALL USE ZGDA DO WHILE .T. CLEAR TEXT 1-瀏覽 2修改 3追加0退出 ENDTEXT ? WAIT 請選擇(03): TO X,CLEAR DO CASE CASE X=1 GO TOP BROWSE NOMODIFY CASE X=2 INPUT 請輸入修改的記錄號: TO jlh EDIT CASE X=3 APPEND LIST CASE X=0 EXIT OTHERWISE WAIT 選擇錯,按任意鍵繼續(xù) ENDCASE EN
24、DDO CLOSE ALL SET TALK ON RETURN,【例7-17】編程輸出職工檔案表中基本工資在800元以下的職工的姓名及基本工資,并統(tǒng)計這些職工的人數(shù)。,clear all use zgda n=0 do while !EOF() if 基本工資800 ?姓名,基本工資 n=n+1 endif skip enddo ?基本工資小于800的共有+str(n)+人 use return,clear all use zgda n=0 do while !EOF() if 基本工資=800 skip loop endif ?姓名,基本工資 n=n+1 skip enddo ?基本工資小
25、于800的共有+str(n)+人 use return,7.4.2步長型循環(huán)結(jié)構(gòu),格式: FOR = TO STEP ENDFOR或NEXT 功能:當(dāng)循環(huán)變量不超過終值時執(zhí)行循環(huán)體,超過終值時執(zhí)行ENDFOR后的語句。超過的意義為:當(dāng)步長為正時循環(huán)變量大于終值為超過;當(dāng)步長為負(fù)時循環(huán)變量小于終值為超過。,使用FOR循環(huán)語句的有關(guān)說明: 省略STEP ,則步長為默認(rèn)值1; 初值、終值和步長都可以是數(shù)值表達式,但這些表達式僅在循環(huán)語句開始執(zhí)行時計算一次。循環(huán)語句執(zhí)行過程中,初值、終值和步長是不會改變的,并由此確定循環(huán)的次數(shù); 可以在循環(huán)體內(nèi)改變循環(huán)變量的值,但會改變循環(huán)執(zhí)行次數(shù); EXIT和LOO
26、P命令可以出現(xiàn)在循環(huán)體內(nèi)。執(zhí)行LOOP命令時,結(jié)束本次循環(huán),循環(huán)變量增加一個步長值,返回FOR循環(huán)頭判斷循環(huán)條件是否成立。執(zhí)行EXIT命令時,程序跳出循環(huán),執(zhí)行循環(huán)尾后面的語句,【例7-18】用步長型循環(huán)求1到100之和,sum=0 for i=1 to 100 sum=sum+i endfor ?1+2+.+100=,sum,sum=0 for i=2 to 100 step 2 sum=sum+i endfor ?1+2+.+100=,sum,sum=0 for i=1 to 100 step 2 sum=sum+i endfor ?1+2+.+100=,sum,例:求n! set tal
27、k off input n=: to n p=1 for i=1 to n p=p*i endfor ?p set talk on,例:求1!+2!+ +n! set talk off input n=: to n sum=0 p=1 for i=1 to n p=p*i sum=sum+p endfor ?sum set talk on,【例7-19】從鍵盤輸入10個數(shù),編程找出其中的最大值和最小值。 SET TALK OFF CLEAR INPUT “請從鍵盤輸入一個數(shù):” TO A STORE A TO MAX,MIN FOR I=2 TO 10 INPUT “請從鍵盤輸入一個數(shù):” T
28、O A IF MAXA MIN=A ENDIF ENDFOR ? “最大值為:” , MAX ? “最小值為:” , MIN SET TALK ON RETURN,7.4.3 掃描型循環(huán)結(jié)構(gòu)(scan循環(huán)),1,SCAN ENDSCAN 語法:SCAN 范圍 for|while 條件 語句序列 ENDSCAN 功能:對當(dāng)前表的指定范圍內(nèi)的滿足條件的記錄逐個 執(zhí)行一次語句序列,直到條件不成立或記錄指針指向表尾。,說明:(1)使用SCAN循環(huán)之前必須先打開要操作的表。 (2)缺省范圍短語時,指ALL。 (3) 執(zhí)行完循環(huán)體后記錄指針自動指向下一記錄。 (4)SCAN為循環(huán)起始語句,ENDSCAN為
29、循環(huán)結(jié)束語句,這兩個語句必須配對使用。 (5) 循環(huán)體內(nèi)可以使用LOOP語句和EXIT語句。,【例7-20】編程輸出職工檔案表中基本工資在800元以下的職工的姓名及基本工資,并統(tǒng)計這些職工的人數(shù)。,clear all use zgda n=0 do while !EOF() if 基本工資800 ?姓名,基本工資 n=n+1 endif skip enddo ?基本工資小于800的共有+str(n,3)+人 use return,clear all use zgda n=0 scan if 基本工資800 ?姓名,基本工資 n=n+1 endif endscan ?基本工資小于800的共有+s
30、tr(n,3)+人 use return,作業(yè),1,用FOR循環(huán)語句編程求 1+1/1!1/2!1/n! 2,編程求學(xué)生表中入學(xué)成績大于550的人數(shù)(用SCAN語句) 3,由鍵盤輸入多串字符,每個字符串輸入完成后給一 個選擇提示:“是否繼續(xù)(Y/N?),若輸入Y或y則繼續(xù),否則退出輸出字母個數(shù)和數(shù)字個數(shù)。,習(xí)題講解,1,編程求下面分段函數(shù)的值(其中自變量x的值由鍵盤輸入)。 2,編程求一元二次方程的根。 3,從鍵盤輸入成績,然后根據(jù)下面標(biāo)準(zhǔn)給出等級成績(要求用 DO CASE語句完成) 成績 等級成績 等級 90100 A60-69 D 80-69 B60 E 70-79 C,input 請輸
31、入自變量x的值: to x if x0 y=x2 else if x=1 y=sin(x) else y=1-2*x endif endif ?x=+str(x,4,2) ?y=+str(y,5,3),input請輸入二次項系數(shù): to a input請輸入一次項系數(shù): to b input請輸入常數(shù)項: to c if a=0 ?不是一元二次方程 wait cancel endif disc=b*b-4*a*c if disc=0 x1=(-b+sqrt(disc)/(2*a) x2=(-b-sqrt(disc)/(2*a) ?方程有兩個根:,x1,x2 endif if disc0 ?方程
32、有一對共軛復(fù)根,其實部為:,b/(2*a),虛部為:,sqrt(-disc)/(2*a) endif return,input 請輸入百分制成績: to score do case case score=90 ?等級為A case score=80 ?等級為B case score=70 ?等級為C case score=60 ?等級為D otherwise ?等級為E endcase,7.4.4 循環(huán)嵌套結(jié)構(gòu),循環(huán)的嵌套,是在一個循環(huán)結(jié)構(gòu)的循環(huán)體中又包含另一個循環(huán)。我們稱外層循環(huán)為外循環(huán),被包含的循環(huán)為內(nèi)循環(huán)。嵌套層數(shù)一般沒有限制,但內(nèi)循環(huán)的循環(huán)體必須完全包含在外循環(huán)的循環(huán)體中,不能相互交叉
33、。正確的嵌套關(guān)系如: DO WHILE DO WHILE DO WHILE ENDDO ENDDO ENDDO,例7-21:輸出乘法口訣表 基本思路:輸出第1到第9行 a=1 do while a=9 輸出第a行 換行 a=a+1 enddo 輸出第a行:輸出a1=a . aa=a*a共a個式子 b=1 do while b=a 不換行輸出ab=a*b b=b+1 enddo 不換行輸出ab=a*b:?a,b,=,a*b ? +str(a,1)+str(b,1)+=+str(a*b,2),clear a=1 do while a=9 b=1 ? do while b=a ?space(2)+s
34、tr(a,1)+str(b,1)+=+str(a*b,2) b=b+1 enddo a=a+1 enddo,例7-22:編程輸出如下圖形,clear for m=1 to 8 m+2,20-m say for n=1 to 2*m-1 ?* endfor endfor,輸出8行“*”號,第m行輸出2m-1個其中第1個星號的列號遞減 for m=1 to 8 移動輸出位置到m+2行20-m列 輸出2m-1個“*”號 endfor,例7-23輸出3到500之間的所有素數(shù),for m=3 to 500 若m能被2.m-1中的某一個數(shù)整除則m不是素數(shù) 否則m為素數(shù),輸出m endfor for i=2
35、 to m-1 if m%i=0 exit endif,for m=3 to 500 step 2 for i=3 to m-1 if m%i=0 exit endif endfor if im-1 ?m endif endfor,【例7-24】某單位按部門建立了rsda1rsda8共個結(jié)構(gòu)相同的人事檔案數(shù)據(jù)表,其中日期型字段“工作日期”記載著各位職工參加工作的日期,試編程分別統(tǒng)計各部門各階段(1978年前,1978年至1984年,1985年至1999年,2000年后)參加工作的職工人數(shù)。,算法設(shè)計 打開表rsda1 對當(dāng)前表的各個記錄求其工作日期所在的年份y 根據(jù)y的值修改各階段參加工作的人
36、數(shù) 對其余表重復(fù)上面操作,clear all for n=1 to 8 bm=rsda+str(n,1) use &bm store 0 to a,b,c,d scan y=year(工作日期) do case case y1978 a=a+1 case y1985 b=b+1 case y2000 c=c+1 otherwise d=d+1,endcase endscan ?部門:+str(n,1) ?各年參加工作的人數(shù)為,a,b,c,d n=n+1 enddo close all,7.5模塊結(jié)構(gòu)程序設(shè)計,結(jié)構(gòu)化程序設(shè)計采用的是自頂向下,逐步求精的模塊化結(jié)構(gòu)程序設(shè)計。 模塊:具有某種功能的一
37、段獨立的程序。 模塊化程序設(shè)計:不同的功能用不同的模塊實現(xiàn),模塊之間的連接用DO命令實現(xiàn),被調(diào)用的模塊稱為子模塊,調(diào)用子模塊的模塊稱為主模塊。 模塊化程序設(shè)計的優(yōu)點:程序結(jié)構(gòu)清晰,易于分別編寫與調(diào)試,便于維護與調(diào)用,有利于程序功能的進一步擴充與完善。,7.5.1 程序模塊的建立與運行,程序模塊的建立方法與建立程序的方法相同。利用模塊建立完整的程序的步驟為: :用建立程序文件的方法分別建立各子模塊并保存。 :用建立程序文件的方法建立主程序(在其中用命令 調(diào)用子模塊) :調(diào)試程序(即運行主程序) 說明:,模塊的最后一個語句為RETURN語句; ,子模塊也可調(diào)用其余模塊; ,當(dāng)程序執(zhí)行RETURN語
38、句后,將轉(zhuǎn)向調(diào)用該子模塊的DO語句的下一語句,模塊中位于RETURN語句后的語句將不被執(zhí)行。,【例7-25】用子模塊調(diào)用完成例7-24,*主模塊main.prg clear all n=1 do while n=8 clear bm=rsda+str(n,1) use &bm do subpro &調(diào)用子模塊 close data n=n+1 enddo return,*子模塊,文件名為subpro.prg store 0 to a,b,c,d scan y=year(工作日期) do case case y1978 a=a+1 case y1985 b=b+1 case y2000 c=c+
39、1 otherwise d=d+1 endcase endscan ?部門+str(n,1) ? 參加工作各階段人數(shù)為:,a,b,c,d return,【例7-26】對于任意輸入的x、y、z的正整數(shù)值,計算x!+y!+z!的值,子模塊subp_1.prg public t t=1 for i=1 to n t=t*i next return,*主模塊main_1.prg clear input x=: to x input y=: to y input z=: to z n=x do subp_1 a=t n=y do subp_1 b=t n=z,do subp_1 w=a+b+t ?x!+
40、y!+z!=,w return,【例7-27】一個簡化的職工檔案管理系統(tǒng)的“檔案管理”主程序模塊,檔案管理 dagl.prg,添加記錄 tjjl.prg,刪除記錄 scjl.prg,修改數(shù)據(jù) xgsj.prg,查詢檢索 cxjs.prg,按記錄修改 ajlxg.prg,按字段修改 azdxg.prg,主控程序模塊算法 S1: 環(huán)境設(shè)置 S2: do while .t. S21: 顯示簡易菜單 S22: 使用wait命令進行菜單選擇 S23: 用do case按不同的選擇調(diào)用相應(yīng)的子模塊 S3: 結(jié)束,SET TALK OFF &不顯示命令執(zhí)行結(jié)果 SET SAFETY OFF &重寫文件時不提
41、示 SET STATUS OFF &關(guān)閉狀態(tài)行 SET DEFAULT TO D:ZGDAG1 &設(shè)置默認(rèn)目錄 CLEAR DO WHILE .T. CLEAR 2,20 SAY *職工檔案管理系統(tǒng)* 3,20 SAY T_添加記錄 S_刪除記錄 4,20 SAY X_修改數(shù)據(jù) C_查詢檢索 5,20 SAY Q_退出 6,20 SAY *,? WAIT 請鍵入字母選擇對應(yīng)功能: TO ch ch=upper(ch) do case case ch=Q ?歡迎再次使用本系統(tǒng)! exit case ch=T do tjjl case ch=S do scjl case ch=X do xgsj
42、case ch=C do cxjs otherwise ?選擇錯誤,重新選擇 wait,endcase enddo set talk on close all return,7.5.3 帶參模塊的建立與調(diào)用,在模塊程序設(shè)計中,各模塊之間常需要傳遞數(shù)據(jù):將主模塊中的初始數(shù)據(jù)傳遞到子模塊中,將子模塊中的結(jié)果傳回給主模塊。 數(shù)據(jù)的傳遞有兩種方法:一是通過帶參調(diào)用程序模塊的方法,二是通過全局變量。 帶參調(diào)用程序模塊的方法:要求子模塊中必須有接受參數(shù)的命令,在主模塊中通過帶參模塊調(diào)用命令調(diào)用子模塊并將數(shù)據(jù)傳遞給子模塊。,1,帶參模塊調(diào)用 格式:DO 程序模塊名WITH參數(shù)表 功能:調(diào)用指定名稱的程序模塊
43、,并將參數(shù)表中的各參數(shù)的值分別傳遞給所調(diào)用模塊中的對應(yīng)位置的參數(shù)。 說明:(1)本命令通常在主模塊中使用,也可在命令窗口中使用。 (2)程序模塊名應(yīng)是一個可被帶參調(diào)用的程序模塊,且應(yīng)具有接收參數(shù)的功能。 (3)參數(shù)表中的參數(shù)稱為實際參數(shù),各參數(shù)間用逗號分隔,參數(shù)可以是常量、變量和表達式,變量和表達式必須有確定的值。,2,接收參數(shù)命令 格式:PARAMETERS參數(shù)表 功能:接收帶參模塊調(diào)用命令傳遞過來的各個參數(shù)。 說明:(1)本命令必須為第一個可執(zhí)行語句。 (2)中的各參數(shù)為形式參數(shù),其個數(shù)和類型必須和實際參數(shù)一一對應(yīng)。 (3)當(dāng)流程返回主模塊時,形參的值將傳遞給實參變量。 【例7-28】利用
44、帶參調(diào)用的方法計算圓柱體的體積,*計算圓柱體體積的可被帶參調(diào)用的子模塊 *程序名:rhv.prg PARAMETERS R,H,V S=PI()*R*R V=S*H RETURN,*帶參調(diào)用計算圓柱體體積的主模塊 *程序名:例7_28.prg CLEAR INPUT 圓住體的底面半徑為: TO a INPUT 圓住體的高為: TO b c=0 DO rhv with a,b,c ?圓柱體的體積為:,c return,【例7-29】統(tǒng)計“分?jǐn)?shù).dbf”數(shù)據(jù)表中各門課程不及格的人數(shù),并調(diào)用帶參模塊scr.prg顯示統(tǒng)計結(jié)果。,store 0 to x,y,z use 分?jǐn)?shù) scan if 語文60
45、 x=x+1 endif if 數(shù)學(xué)60 y=y+1 endif if 英語60 z=z+1 endif endscan,do scr with x,語文 do scr with y,數(shù)學(xué) do scr with z,英語 return,*scr.prg parameters rs,kc if rs0 cd=len(ltrim(str(rs) ? kc+不及格人數(shù)為+str(rs,cd)+人 endif return,7.5.4 內(nèi)存變量作用域,不同的范圍定義的變量有不同的使用范圍, 1,子程序中能否使用主程序中定義的變量? 2,能否使用其它程序中定義的變量? 3,主程序中能否使用子程序中定義
46、的變量?, 4,程序中能否使用在命令窗口中定義的變量? 內(nèi)存變量的作用域:內(nèi)存變量在各程序模塊內(nèi)起作用的有效范圍。 內(nèi)存變量的分類:按作用域的不同,可把內(nèi)存變量分為全局變量和局部變量。,,全局變量 又稱為公共變量。是在任何命令語句以及任何嵌套層次的程序模塊中均起作用的內(nèi)存變量。定義全局變量的命令如下: 格式:PUBLIC 說明:(1) 全局變量在創(chuàng)建它的程序模塊運行結(jié)束后并不釋放,因而可在其后的各 模塊中使用。 (2) 全局變量應(yīng)先定義后賦值,不允許先賦值后定義。 (3) 全局變量可用RELEASE命令釋放,沒有釋放前不能重新定義為局部變量。 (4) 在命令窗口中定義的變量為全局變量。,,局部
47、變量 只在當(dāng)前模塊和其下層模塊中使用的變量。 格式1:PRIVATE 格式2:PRIVATEALLLIKE/EXCEPT 功能:指定某些變量為只在本模塊及其下屬模塊中使用的局部變量,并使其上級模塊中的同名變量隱蔽起來直至本級模塊運行結(jié)束為止。,說明: 使用內(nèi)存變量表時,表中所列的內(nèi)存變量為局部變量。 使用短語ALL時,在本模塊中建立的所有內(nèi)存變量均為局部變量。 使用短語LIKE通配符時,與通配符相匹配的內(nèi)存變量均為局部變量。 通配符有“*”號和“?”號,*號代表任意一串字符,?號則只代表一個字符,?號常用于確定字符的位置。如第1個字母為a的所有變量:a*,第2、3個字母為cd的內(nèi)存變量:?cd
48、*。 使用短語EXCEPT通配符時,不與通配符相匹配的內(nèi)存變量為局部變量。 在程序模塊中所有未經(jīng)特殊說明的內(nèi)存變量均為局部變量,局部變量可在創(chuàng)建它的模塊及其下屬模塊中使用,而不能在其上級模塊中使用。,【例7-30】內(nèi)存變量作用域示例,*子模塊sub_3.prg PRIVATE b PUBLIC c a=10 b=11 c=12 d=13 ?子模塊中,a=,a,b=,b,c=,c,d=,d RETURN,*主模塊main_3.prg CLEAR ALL a=1 b=2 ?主模塊中,a=,a,b=,b DO sub_3 ?返回主模塊后,a=,a,b=,b,c=,c,d=,d RETURN,b為局部
49、變量,其值不會返回到主模塊 c為全局變量,其值會返回到主模塊中 d為局部變量,其值不會返回到主模塊 a為主模塊中定義的變量,其值會返回,7.5.5過程與過程文件,1,過程的概念 過程是由一個或多個命令、語句構(gòu)成,以返回語句return結(jié)束的獨立程序段。使用過程時,通過過程名調(diào)用并執(zhí)行。過程一般放在主模塊之后,與主模塊在同一個程序文件中。 過程的一般形式為: procedure parameters return 調(diào)用過程的方法為:DO 在一個程序文件中可以包含多個過程,也可將多個過程組織成一個過程文件,*過程應(yīng)用示例 CLEAR ALL INPUT x= TO x INPUT y= TO y
50、INPUT z= TO z n=x do factorial a=t n=y do factorial b=t n=z do factorial w=a+b+t ?w=x!+y!+z!=,w,【例7-32】編寫一個計算階乘的通用過程,并將其包含在一個求解w=x!+y!+z!之值的程序中.,*以下為計算階乘的通用過程 PROCEDURE factorial PUBLIC t t=1 for i=1 to n t=t*i next return,2, 過程文件 當(dāng)有多個過程時,可以將其放在一個文件中,此文件稱為過程文件,過程文件的格式為: procedure parameters return p
51、rocedure parameters return . procedure parameters return 即由多個過程按順序排列而成,過程文件的建立:與普通程序文件的建立方法相同。 過程文件中的過程的調(diào)用方法: 先打開過程文件,然后使用DO過程名調(diào)用過程文件中的過程。 過程文件的打開格式: SET PROCEDURE TO 過程文件名 過程文件的關(guān)閉: CLOSE PROCEDURE 或 SET PROCEDURE TO,7.5.6 用戶自定義函數(shù),除了使用系統(tǒng)提供的函數(shù)外,用戶還可以定義函數(shù). 函數(shù)定義的一般格式: function parameters return 調(diào)用方法與調(diào)用
52、系統(tǒng)函數(shù)相同: 函數(shù)名(參數(shù)表),說明: 自定義函數(shù)程序段允許以function 開頭,并包含在調(diào)用它的程序文件中,作為其中的一部分出現(xiàn).也可以在缺省function 的情況下,以一個獨立的程序文件存儲,此時程序名即為其函數(shù)名。 PARAMETERS語句用來接收調(diào)用此函數(shù)時傳遞過來的自變量的值,若函數(shù)不用接收參數(shù),則去掉此句。 RETURN語句用來返回函數(shù)值,其返回的數(shù)據(jù)類型即函數(shù)的類型。 自定義函數(shù)的調(diào)用方法與調(diào)用系統(tǒng)函數(shù)的方法相同,例7-33:編寫一個計算階乘的自定義函數(shù)包含在調(diào)用它的程序中,并調(diào)用此函數(shù)計算組合數(shù),clear input 請輸入m的值: TO m input 請輸入n的值
53、: TO n y=jiech(m)/(jiech(n)*jiech(m-n) ? 組合數(shù)的計算結(jié)果是:+str(y,8) return FUNCTION JIECH PARAMETERS K t=1 for i=1 to k t=t*i endfor return t endfunc,clear input 請輸入m的值: TO m input 請輸入n的值: TO n y=jiech(m)/(jiech(n)*jiech(m-n) ? 組合數(shù)的計算結(jié)果是:+str(y,8) return FUNCTION JIECH PARAMETERS K t=1 for i=1 to k t=t*i e
54、ndfor return t endfunc,【例7-34】編寫一個獨立保存的自定義函數(shù),用來自動實現(xiàn)將阿拉伯?dāng)?shù)字的整數(shù)金額轉(zhuǎn)換為對應(yīng)的漢字大寫金額。,PARAMETERS je z1=元拾佰仟萬拾佰仟億拾佰仟 z2=零壹貳叁肆伍陸柒捌玖 je=ALLTRIM(STR(je,12) cd=LEN(je) dxje=整 k=0 DO WHILE cd0 k=k+1 n=val(substr(je,cd,1) &n為從個位開始的阿拉伯?dāng)?shù)字 b1=substr(z2,n*2+1,2) &b1為與n對應(yīng)的漢字 b2=subst(z1,k*2-1,2) &b2依次為元拾佰仟萬拾佰仟億拾佰仟 dxje=b1+b2+dxje cd=cd-1 enddo return dxje,7.6數(shù)組及其應(yīng)用,數(shù)組是一批名稱相同,而以不同下標(biāo)加以區(qū)分的內(nèi)存變量,數(shù)組中的每個內(nèi)存變量稱為數(shù)組元素,數(shù)組元素用數(shù)組名和下標(biāo)表示,下標(biāo)的個數(shù)決定數(shù)組的維數(shù)。Visual FoxPro中的數(shù)組有以下特點: ()只有一維數(shù)組和二維數(shù)組,二維數(shù)組相當(dāng)于一個矩陣。 ()每個數(shù)組至多可有3600個元素,同一數(shù)組內(nèi)的各元素的數(shù)據(jù)類型可以不同。 ()二維數(shù)組可作為一維數(shù)組進行訪問。,7.6.1數(shù)組的定義與使用,,數(shù)組的定義,例:
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年份餐飲廢棄物處理承包協(xié)議3篇
- 2025版挖掘機械銷售代理合同模板
- 二零二五年度哺乳期離婚雙方子女保險權(quán)益轉(zhuǎn)移協(xié)議2篇
- 2024證券公司與其合作方之間國際證券交易合同
- 二零二五版領(lǐng)養(yǎng)未成年人監(jiān)護責(zé)任協(xié)議參考4篇
- 二零二五版園林景觀木工施工合作協(xié)議4篇
- 二零二五版合伙房產(chǎn)買賣合同及配套裝修設(shè)計服務(wù)6篇
- 2025年度特種運輸服務(wù)買賣合同安全與時效承諾
- 2025版彩禮退還與婚姻解除條件及財產(chǎn)分割協(xié)議書范本3篇
- 基于2025年度規(guī)劃的文化園區(qū)停車場建設(shè)與運營合同3篇
- 職業(yè)衛(wèi)生培訓(xùn)課件
- 柴油墊資合同模板
- 湖北省五市州2023-2024學(xué)年高一下學(xué)期期末聯(lián)考數(shù)學(xué)試題
- 城市作戰(zhàn)案例研究報告
- 【正版授權(quán)】 ISO 12803:1997 EN Representative sampling of plutonium nitrate solutions for determination of plutonium concentration
- 道德經(jīng)全文及注釋
- 2024中考考前地理沖刺卷及答案(含答題卡)
- 多子女贍養(yǎng)老人協(xié)議書范文
- 彩票市場銷售計劃書
- 骨科抗菌藥物應(yīng)用分析報告
- 支付行業(yè)反洗錢與反恐怖融資
評論
0/150
提交評論