版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第6章項(xiàng)目與程序設(shè)計
6.1項(xiàng)目管理6.2程序初步知識6.3結(jié)構(gòu)化程序設(shè)計6.4模塊化思想與實(shí)現(xiàn)6.5程序調(diào)試6.6程序的連編第6章項(xiàng)目與程序設(shè)計
6.1項(xiàng)目管理1學(xué)習(xí)目標(biāo)了解項(xiàng)目管理的基本概念,掌握VFP“項(xiàng)目管理器”的使用方法;理解程序的概念,掌握程序的建立、編輯和運(yùn)行的方法;理解并掌握算法的表示方法,尤其是流程圖方法;理解并掌握結(jié)構(gòu)化程序的三種基本結(jié)構(gòu);了解模塊化程序設(shè)計的思想;理解并掌握用戶自定義函數(shù)的定義、調(diào)用和返回值和參數(shù)傳遞的概念;掌握程序調(diào)試的基本方法。學(xué)習(xí)目標(biāo)了解項(xiàng)目管理的基本概念,掌握VFP“項(xiàng)目管理器”的2重點(diǎn)與難點(diǎn)重點(diǎn)在于結(jié)構(gòu)化程序設(shè)計與調(diào)試、函數(shù)設(shè)計與使用;難點(diǎn)在于靈活掌握三種基本結(jié)構(gòu)的嵌套、正確地傳遞函數(shù)的參數(shù)。重點(diǎn)與難點(diǎn)重點(diǎn)在于結(jié)構(gòu)化程序設(shè)計與調(diào)試、函數(shù)設(shè)計與使用;36.1項(xiàng)目管理進(jìn)行VFP數(shù)據(jù)庫應(yīng)用系統(tǒng)的項(xiàng)目開發(fā)時,常常要與各種文件、數(shù)據(jù)和對象打交道,如:數(shù)據(jù)庫、數(shù)據(jù)表、視圖、查詢、菜單、表單、程序文件和其他文件。項(xiàng)目就是有關(guān)文件、數(shù)據(jù)和對象的集合。項(xiàng)目管理是按照一定的順序和邏輯關(guān)系,對數(shù)據(jù)庫應(yīng)用系統(tǒng)涉及到的各種類型文件、數(shù)據(jù)和對象進(jìn)行有效組織,并將它們編譯成.app或exe文件。VFP提供了管理功能強(qiáng)大的項(xiàng)目管理器來創(chuàng)建和管理項(xiàng)目。6.1項(xiàng)目管理進(jìn)行VFP數(shù)據(jù)庫應(yīng)用系統(tǒng)的項(xiàng)目開發(fā)時,常常要4VFP的項(xiàng)目管理器VFP的項(xiàng)目管理器56.2程序初步知識如果完成一項(xiàng)任務(wù)不是一兩個命令就能完成,而需要一組命令來完成,并且這組命令出現(xiàn)的先后順序不能顛倒,這樣的要求對一般的數(shù)據(jù)庫系統(tǒng)的操作人員來說是十分困難的。本章介紹的程序方式,系統(tǒng)設(shè)計人員將完成某一項(xiàng)任務(wù)的一組操作命令保存在程序文件中,操作人員只需調(diào)用該程序文件就可以完成該項(xiàng)任務(wù),可明顯地降低了操作的難度。6.2程序初步知識如果完成一項(xiàng)任務(wù)不是一兩個命令就能完成,66.2.1程序的概念程序(Program)是指完成特定任務(wù)的一組命令的有序集合。在VFP中,程序是以文本的形式保存在程序文件(.prg)中,當(dāng)該程序被調(diào)用時,系統(tǒng)會從前往后地、按次序地和自動地執(zhí)行包含在程序文件中的命令直至結(jié)束。6.2.1程序的概念程序(Program)是指完成特定任務(wù)7程序方式同交互方式和菜單方式相比
具有非常明顯的優(yōu)點(diǎn):(1)程序以文本文件的形式保存,方便創(chuàng)建、修改;(2)程序一旦編好,就可以被無限次調(diào)用,具有“一勞永逸”的特點(diǎn);(3)具有通用性的程序,還可以被其他程序調(diào)用,或調(diào)用其他程序,提高了編寫程序的效率。程序方式同交互方式和菜單方式相比具有非常明顯的優(yōu)點(diǎn):86.2.2程序的建立與編輯在VFP中,程序可以通過菜單方式和命令方式來建立與編輯。命令方式:modifycommand[文件名|?]其中,(1)命令動詞:Modify(修改)。(2)文件名或“?”是可選項(xiàng):文件名包括主文件名和類型名,主文件名由用戶自定義,而類型名為“.prg”,用戶不指定時,系統(tǒng)會自動添加上“.prg”6.2.2程序的建立與編輯在VFP中,程序可以通過菜單方式9注意事項(xiàng)在建立和編輯程序文件時,需要注意以下幾點(diǎn):(1)命令的書寫要符合命令書寫的規(guī)則。(2)為了增加程序的可讀性,可以在程序中加上注釋。(3)為了增加程序的可讀性,常常在編寫程序時采用縮進(jìn)方式,本書采用縮進(jìn)方式編寫程序。(4)在程序的編寫過程中,合理使用“剪貼板”可以提高程序編寫效率。(5)程序編寫過程中要注意及時保存??梢栽凇拔募辈藛沃羞x擇“保存”或“另存為”命令,也可以使用Ctrl+W組合鍵。放棄本次修改可以直接按Esc鍵。注意事項(xiàng)在建立和編輯程序文件時,需要注意以下幾點(diǎn):10其他編輯器編寫程序文件除了使用VFP自帶的編輯器外,也可以使用任何其他的文本編輯系統(tǒng),譬如:記事本、EDIT,但不能使用具有格式編排的系統(tǒng),譬如:Word??梢詮腤ord中復(fù)制程序到記事本,但需要從“選擇性粘帖”中選擇“無格式文本”。記事本默認(rèn)的文件類型名為“.txt”,所以,在保存對話框中,請用雙引號界定,譬如:"test.prg",否則會自動添加“.txt”,像這個樣子“test.prg.txt”。其他編輯器編寫程序文件除了使用VFP自帶的編輯器外,也可以使116.2.3程序的執(zhí)行程序的執(zhí)行同程序的建立和編輯一樣也有兩種方式:菜單方式和命令方式。從“程序”菜單中選擇“運(yùn)行”菜單項(xiàng)
在命令窗口中輸入如下命令:do程序文件名[with參數(shù)表]其中,程序文件名無需帶上類型名;“with參數(shù)表”是可選項(xiàng):通過參數(shù)表向程序傳遞數(shù)據(jù),參數(shù)表如果有多個參數(shù),則需要用逗號隔開,在編寫帶參數(shù)的程序時,必須把如下命令:parameters參數(shù)表放在程序的開頭。6.2.3程序的執(zhí)行程序的執(zhí)行同程序的建立和編輯一樣也有兩126.2.4程序的注釋為了增加程序的可讀性,通常需要在程序中添加上注釋。有兩種形式的注釋:(1)整行為注釋:以*或Note開頭。*注釋文本或note注釋文本(2)在命令尾部注釋:以&&引出注釋文本。
注意:程序的注釋不影響程序的執(zhí)行效率,因?yàn)樵诰幾g時,系統(tǒng)并不會將注釋編譯到編譯后的文件(.fxp)中去。6.2.4程序的注釋為了增加程序的可讀性,通常需要在程序中13【例6.1】編寫一個簡單的程序,通過參數(shù)傳遞兩個數(shù),在屏幕上顯示兩個數(shù)的和、兩個數(shù)的積(Eg6_1.prg)。*第一個簡單的程序note在實(shí)際的程序中,并不需要每行都注釋的parametersm,n&&m,n是形式參數(shù)settalkoff&&狀態(tài)的設(shè)置,關(guān)閉交互模式clear&&清除顯示屏幕?"m+n=",m+n&&"m+n="是提示,m+n是表達(dá)式?"m*n=",m*n&&"m*n="是提示,m*n是表達(dá)式return&&結(jié)束本程序返回VFP系統(tǒng)程序執(zhí)行命令格式如下:DoEg6_1with6,9↙程序運(yùn)行的結(jié)果:m+n=15m*n=54【例6.1】編寫一個簡單的程序,通過參數(shù)傳遞兩個數(shù),在屏幕上146.2.6輸入輸出命令程序的運(yùn)行離開不了輸入、輸出命令。輸入命令完成從鍵盤上接收數(shù)據(jù)。輸出命令完成將運(yùn)行的結(jié)果顯示在屏幕上。6.2.6輸入輸出命令程序的運(yùn)行離開不了輸入、輸出命令。151.輸入命令(1)單字符輸入命令wait[提示信息][to內(nèi)存變量][window[nowait]][timeout數(shù)值表達(dá)式](2)字符型數(shù)據(jù)輸入命令A(yù)ccept[提示信息][To內(nèi)存變量](3)任意類型數(shù)據(jù)輸入命令I(lǐng)nput[提示信息][To內(nèi)存變量](4)格式化輸入@行,列[say表達(dá)式][get變量]read[save][cycle][timeout等待時間]1.輸入命令(1)單字符輸入命令16舉例(在命令窗口測試)wait"按Y鍵退出系統(tǒng)"tochaccept"你的姓名:"toXMinput"姓名"toxm&&字符型input"出生日期"tocsrq&&日期型input"身高"tosg&&數(shù)值型input"是否黨員"tosfdy&&邏輯型name=space(8)@5,10say"姓名"getnameread舉例(在命令窗口測試)wait"按Y鍵退出系統(tǒng)"toc172.輸出命令前面已經(jīng)講述了“?”和“??”的用法。(1)文本輸出命令\|\\文本行或text文本內(nèi)容endtext(2)格式輸出命令@行,列Say表達(dá)式picture格式控制字符2.輸出命令前面已經(jīng)講述了“?”和“??”的用法。18舉例(在命令窗口測試)\程序測試行1
\\程序測試行2Text========Menu==========1.輸入2.修改3.刪除4.打印0.退出=======================Endtext@3,6say姓名@4,6say工資picture"99999.99"&&有兩位小數(shù)舉例(在命令窗口測試)\程序測試行1
\\程序測試行2196.3結(jié)構(gòu)化程序設(shè)計
6.3.1算法的表示數(shù)據(jù)結(jié)構(gòu)+算法=程序一個好的程序離不開好的算法,設(shè)計程序的實(shí)質(zhì)就是設(shè)計算法。算法:廣義地說,為了解決一個問題而采取的方法和步驟。為了表示一個算法,可以用不同的方法。常用的有自然語言、傳統(tǒng)的流程圖、N-S流程圖、偽代碼、PAD圖等。6.3結(jié)構(gòu)化程序設(shè)計
6.3.1算法的表示數(shù)據(jù)結(jié)構(gòu)+算法201.傳統(tǒng)的流程圖符號起止框處理框輸出框判斷框注釋框連接點(diǎn)流程線或1.傳統(tǒng)的流程圖符號起止框處理框輸出框判斷框注釋框連接點(diǎn)流程212.三種基本結(jié)構(gòu)及其流程圖表示1966年,Bohra和Jacopini提出了以下三種基本結(jié)構(gòu)ppABABppA(a)順序結(jié)構(gòu)(b)選擇結(jié)構(gòu)(c)循環(huán)結(jié)構(gòu)2.三種基本結(jié)構(gòu)及其流程圖表示1966年,Bohra和Ja223.“結(jié)構(gòu)化”的算法三種基本結(jié)構(gòu)有以下共同特點(diǎn):
①只有一個入口;②只有一個出口;③結(jié)構(gòu)內(nèi)的每一部分都有機(jī)會被執(zhí)行到;④結(jié)構(gòu)內(nèi)不存在“死循環(huán)”(無終止的循環(huán))。已經(jīng)證明,以上三種結(jié)構(gòu)及其嵌套而順序組成的算法結(jié)構(gòu),可以解決任何復(fù)雜的問題。由基本結(jié)構(gòu)所構(gòu)成的算法屬于“結(jié)構(gòu)化”的算法,它不存在無規(guī)律的轉(zhuǎn)向,只在基本結(jié)構(gòu)內(nèi)才允許存在分支和向前或向后的跳轉(zhuǎn)。其他結(jié)構(gòu)都可以由三種基本結(jié)構(gòu)及其嵌套派生出來。3.“結(jié)構(gòu)化”的算法三種基本結(jié)構(gòu)有以下共同特點(diǎn):236.3.2順序結(jié)構(gòu)在單個處理器的計算機(jī)中,程序是按順序串行方式執(zhí)行,即上一條命令執(zhí)行完畢才能執(zhí)行下一條命令,自上而下地一條一條地執(zhí)行命令直至程序執(zhí)行完畢。這里的命令可以是單條命令,也可以是包括多條命令且具有內(nèi)部結(jié)構(gòu)的復(fù)合命令、函數(shù)或過程。6.3.2順序結(jié)構(gòu)在單個處理器的計算機(jī)中,程序是按順序串行24【例6.2】編寫一個程序,輸入a和b的值,計算a除以b并顯示結(jié)果(Eg6_2.prg)。
clear*inputinput"a="toainput"b="tob*processc=a/b*output?creturn【例6.2】編寫一個程序,輸入a和b的值,計算a除以b并顯示256.3.3選擇結(jié)構(gòu)選擇結(jié)構(gòu)也叫分支結(jié)構(gòu),它能夠根據(jù)指定關(guān)系表達(dá)式或邏輯表達(dá)式(或稱條件表達(dá)式)的值在兩條或多條程序執(zhí)行路徑中選擇其中一條執(zhí)行。在VFP中,選擇結(jié)構(gòu)分為if~endif、if~else~endif和docase~endcase。6.3.3選擇結(jié)構(gòu)選擇結(jié)構(gòu)也叫分支結(jié)構(gòu),它能夠根據(jù)指定關(guān)系261.if~else~endif結(jié)構(gòu)if表達(dá)式命令組1else命令組2endifpp命令組1命令組2表達(dá)式.T..F.1.if~else~endif結(jié)構(gòu)if表達(dá)式pp27【例6.3】編寫一個程序,判斷輸入的一個年份是否為閏年,如果是閏年,顯示“閏年”,否則顯示“不是閏年”。判斷閏年的條件:年份能被4整除但不能被100整除;或者能被400整除(Eg6_3.prg)。clearinput"year="toyif(mod(y,4)=0.and.mod(y,100)<>0.or.mod(y,400)=0)?"閏年"else?"不是閏年"endif整除是通過判斷余數(shù)是否為0,若為0,表示整除,否則不能被整除。整除可以用函數(shù)mod()或求余運(yùn)算符“%”來完成。
【例6.3】編寫一個程序,判斷輸入的一個年份是否為閏年,如果282.if~endif結(jié)構(gòu)if表達(dá)式命令組1endifpp命令組1表達(dá)式.T..F.2.if~endif結(jié)構(gòu)pp命令組1表達(dá)式.T..F.29【例6.4】編程實(shí)現(xiàn):輸入一個口令,如果口令符合,顯示“口令驗(yàn)證通過!”。,否則直接結(jié)束程序(Eg6_4.prg)。clearaccept"口令:"topsdifupper(psd)="HELLO"?"口令驗(yàn)證通過!"endifreturn*說明:upper函數(shù)是為了統(tǒng)一各種輸入的情況?!纠?.4】編程實(shí)現(xiàn):輸入一個口令,如果口令符合,顯示“口令303.docase~endcase結(jié)構(gòu)docasecase條件1命令組1case條件2命令組2……[otherwise命令組n+1]endcase條件1條件2條件n命令組1命令組2命令組n命令組n+1….F..F..F..T..T..T.3.docase~endcase結(jié)構(gòu)條件1條件2條件31【例6.5】編程實(shí)現(xiàn):輸入一個百分制成績,輸出它對應(yīng)的等級,優(yōu)秀:90~100、良好:80~89、中等:70~79、及格:60~69和不及格:60分以下(Eg6_5.prg)。*變量cj存放百分制成績;dj存放對應(yīng)的等級描述。clearinput"百分制成績:"tocjdocasecasecj>=90.and.cj<=100dj="優(yōu)秀"casecj>=80.and.cj<90dj="良好"casecj>=70.and.cj<80dj="中等"casecj>=60.and.cj<70dj="及格"
casecj>=0.and.cj<60dj="不及格"otherwisedj="輸入的成績不在[0,100]"endcase?"對應(yīng)的等級:",djreturn【例6.5】編程實(shí)現(xiàn):輸入一個百分制成績,輸出它對應(yīng)的等級,32【例6.5】程序也可以由if~else~endif來實(shí)現(xiàn)(Eg6_5a.prg)clearinput"百分制成績:"tocjif(cj>=90.and.cj<=100)dj="優(yōu)秀"elseif(cj>=80)dj="良好"elseif(cj>=70)dj="中等"elseif(cj>=60)dj="及格"else
if(cj>=0)dj="不及格"elsedj="輸入的成績不在[0,100]"endifendifendifendifendif?"對應(yīng)的等級:",djreturn【例6.5】程序也可以由if~else~endif來實(shí)現(xiàn)(E336.3.4循環(huán)結(jié)構(gòu)環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計的三種基本結(jié)構(gòu)之一,它是在給定條件成立(即表達(dá)式的值為.T.)時,反復(fù)執(zhí)行語句組(稱為循環(huán)體)。VFP中的循環(huán)結(jié)構(gòu):dowhile~enddo、for~endfor和scan~endscan結(jié)構(gòu)。6.3.4循環(huán)結(jié)構(gòu)環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計的三種基本結(jié)構(gòu)之一341.dowhile~enddo結(jié)構(gòu)dowhile表達(dá)式命令組1[loop][exit]命令組2enddo表達(dá)式循環(huán)體命令組.T..F.1.dowhile~enddo結(jié)構(gòu)dowhile35【例6.6】編程,計算,并顯示結(jié)果(eg6_6.prg)。clearn=1s=0dowhile(n<=100)s=s+nn=n+1enddo?"1+2+...+100=",sreturnn現(xiàn)值(初始:1)s(初始:0)n增值后(n=n+1)10+1=11+1=221+2=32+1=333+3=63+1=4………………1004950+100=5050100+1=101101結(jié)束循環(huán)【例6.6】編程,計算,并顯示結(jié)果(eg6_6.prg)。c362.for~endfor結(jié)構(gòu)for控制變量=初始值to終止值step步長命令組1[loop][exit]命令組2endfor|next控制變量=初始值控制變量超過終止值命令組控制變量=控制變量+步長.T..F.2.for~endfor結(jié)構(gòu)控制變量=初始值控制變量超37【例6.7】編程,計算,并顯示結(jié)果(eg6_7.prg)。clearn=1t=1forn=1to100step1t=t*nendfor?"100!=1*2*...*100=",treturn【例6.7】編程,計算,并顯示結(jié)果(eg6_7.prg)。c383.scan~endscan結(jié)構(gòu)該結(jié)構(gòu)用于數(shù)據(jù)表循環(huán)掃描。功能:如果條件表達(dá)式的值為.T.,scan命令自動將記錄指針移動到下一條滿足條件的記錄上,然后執(zhí)行命令組,當(dāng)遇到文件末尾.或遇到了exit命令則結(jié)束該循環(huán)。scanfor條件表達(dá)式1|while條件表達(dá)式2命令組1[loop][exit]命令組2endscan注意:for子句與while子句用法不同。如果for子句,所有滿足“條件表達(dá)式1”為.T.的記錄都會執(zhí)行命令組;如果while字句,只要“條件表達(dá)式2”為.T.才執(zhí)行命令組,直至遇到使該表達(dá)式為.F.的記錄為止,即不一定能夠找出所有滿足條件的記錄。因此,常用for子句。3.scan~endscan結(jié)構(gòu)該結(jié)構(gòu)用于數(shù)據(jù)表循環(huán)掃39【例6.8】編程,循環(huán)掃描成績表(cj.dbf),顯示需要補(bǔ)考學(xué)生的記錄。比較for子句和while子句的不同,假設(shè)成績表已經(jīng)存在并輸入了記錄,表結(jié)構(gòu):學(xué)號(C,4)、姓名(C,8)、語文(N,5,1)、數(shù)學(xué)(N,5,1)和英語(N,5,1)。(eg6_8.prg)。clearusecj?"for子句:"scanfor語文<60.or.數(shù)學(xué)<60.or.英語<60dispendscan?"while子句:"scanwhile語文<60.or.數(shù)學(xué)<60.or.英語<60dispendscan【例6.8】編程,循環(huán)掃描成績表(cj.dbf),顯示需要406.3.5Exit和Loop命令Exit和Loop命令用在循環(huán)結(jié)構(gòu)中,都用于控制程序的流程。但是Exit命令用于結(jié)束本層循環(huán),執(zhí)行本層循環(huán)后面的命令;而Loop用于結(jié)束本次循環(huán),進(jìn)入下一次循環(huán)條件的判斷。6.3.5Exit和Loop命令Exit和Loop命令用在41【例6.9】輸入若干個學(xué)生的百分制成績,輸入負(fù)數(shù)表示結(jié)束并不計算在總分以內(nèi),如果輸入成績大于100,則需要重新輸入。計算平均分并輸出(eg6_9.prg)。
clears=0n=0dowhile.T.input"x="toxif(x<0)exitendifif(x>100)loopendifn=n+1s=s+nenddoif(n=0)?"沒有輸入有效數(shù)據(jù)!"else?"平均成績:",s/nendifreturn開始.T.結(jié)束.T.s=0n=0沒有數(shù)據(jù)x<0x>100n=n+1s=s+nn=0輸出平均輸入x.T..T..F.【例6.9】輸入若干個學(xué)生的百分制成績,輸入負(fù)數(shù)表示結(jié)束并不426.3.6結(jié)構(gòu)化程序設(shè)計舉例【例6.10】編程實(shí)現(xiàn)在屏幕上顯示乘法口訣表?!纠?.11】用公式л/4≈1-+-+...求л的近似值,直到最后一項(xiàng)的絕對值小于10-6為止。【例6.12】編程實(shí)現(xiàn)一個文本菜單程序。6.3.6結(jié)構(gòu)化程序設(shè)計舉例【例6.10】編程實(shí)現(xiàn)在屏幕上43【例6.10】編程實(shí)現(xiàn)在屏幕上顯示乘法口訣表(eg6_10.prg)。分析:乘法口訣表有9行,第1行有一個算式,第2行有兩個算式,…,第9行有九個算式。所以,第1層循環(huán)控制從1到9行,內(nèi)部嵌套的第2層循環(huán)控制第i行從第1到第i個算式的顯示。clearfori=1to9?forj=1toi??str(i,1,0)+"*"+str(j,1,0)+"="+str(i*j,2,0)+spac(2)endforendfor【例6.10】編程實(shí)現(xiàn)在屏幕上顯示乘法口訣表(eg6_10.44分析:公式可以變形為+(-)++(-)+...,從變形后的式子可以看出:
①這是一個累加的式子②每項(xiàng)的分子保持為1,分母為奇數(shù),即后一項(xiàng)是前一項(xiàng)的值加2。③每項(xiàng)的符號是正號與符號交替出現(xiàn)。即正、負(fù)、正...④循環(huán)終止條件是最后一項(xiàng)的值小于10-6,即循環(huán)繼續(xù)的條件是每項(xiàng)的值大于或等于10-6。分析:公式可以變形為+(-)++(-)+...,從變形后的式45【例6.11】程序代碼右邊的程序中:t表示某項(xiàng),s表示分子和正負(fù)符號,n表示分母,則t=s/n;pi表示累加結(jié)果;正負(fù)符號交替s=-s;分母后一項(xiàng)是前一項(xiàng)加2可以表示為n=n+2。clearpi=0store1tos,nt=s/ndowhile(abs(t)>1e-6)pi=pi+tn=n+2s=-st=s/nenddo?"PI=",pi*4return【例6.11】程序代碼右邊的程序中:clear46【例6.12】編程實(shí)現(xiàn)一個文本菜單程序(eg6_12.prg)。分析:菜單程序包括菜單顯示、菜單選取和分支執(zhí)行三個部分,當(dāng)然這三個部分必須放在一個循環(huán)內(nèi),并且循環(huán)的終止必須通過選取的條件判斷來實(shí)現(xiàn)?!纠?.12】編程實(shí)現(xiàn)一個文本菜單程序(eg6_12.prg47【例6.12】程序代碼dowhile.T.ch=0clear@5,10say"==========mainmenu=========="@6,10say"1.輸入功能"@7,10say"2.修改功能"@8,10say"3.刪除功能"@9,10say"4.列表功能"@10,10say"0.退出"@11,10say"============================="@12,10say"你的選擇(0-4):"getchpict"9"&&"9"是數(shù)字摸板。readcleardocasecasech=0?"你選了退出"wait"任按一鍵退出。"exitcasech=1?"你選輸入功能"wait"任按一鍵返回菜單選擇。"casech=2?"你選修改功能"wait"任按一鍵返回菜單選擇。"casech=3?"你選刪除功能"wait"任按一鍵返回菜單選擇。"casech=4?"你選列表功能"wait"任按一鍵返回菜單選擇。"otherwise?"你的選擇不在0到4之間"wait"任按一鍵返回菜單選擇。"endcaseenddoreturn【例6.12】程序代碼dowhile.T.casech=486.4模塊化思想與實(shí)現(xiàn)
6.4.1模塊化結(jié)構(gòu)化程序設(shè)計方法是把一個復(fù)雜問題的求解過程分階段進(jìn)行,每個階段處理的問題都控制在人們?nèi)菀桌斫夂吞幚淼姆秶鷥?nèi)。根據(jù)問題的規(guī)模和對問題的熟悉程度決定了問題處理的具體方法。如果問題規(guī)模較大,對問題還有些地方不太清楚,可以采用“自下而上,逐步積累”方法。但是一般采用“自頂向下,逐步細(xì)化”的方法,因?yàn)槭褂迷摲椒ū阌隍?yàn)證算法的正確性,在進(jìn)行下一層展開之前必須檢查本層的設(shè)計是否正確,只有本層設(shè)計正確的條件下才能向下細(xì)化,這樣可以保證算法的正確性。具體步驟:首先進(jìn)行系統(tǒng)整體規(guī)劃,其次進(jìn)行模塊化規(guī)劃與設(shè)計,最后進(jìn)行結(jié)構(gòu)化編碼與調(diào)試。6.4模塊化思想與實(shí)現(xiàn)
6.4.1模塊化結(jié)構(gòu)化程序設(shè)計方49模塊化所謂模塊化就是獨(dú)立地完成某項(xiàng)功能的函數(shù)或過程。在VFP中,系統(tǒng)提供了不少可以獨(dú)立完成功能的函數(shù),并且允許自定義函數(shù)或過程,所以,用戶自定義函數(shù)或過程是VFP實(shí)現(xiàn)模塊化的手段。模塊化思想使得編寫、修改、調(diào)試、維護(hù)和擴(kuò)充更加容易,并且多人之間合作完成一個大的項(xiàng)目更方便。模塊化所謂模塊化就是獨(dú)立地完成某項(xiàng)功能的函數(shù)或過程。在VF506.4.2自定義函數(shù)與過程1.自定義函數(shù)與過程的創(chuàng)建2.自定義函數(shù)與過程的調(diào)用6.4.2自定義函數(shù)與過程1.自定義函數(shù)與過程的創(chuàng)建511.自定義函數(shù)與過程的創(chuàng)建function函數(shù)名[lparameters參數(shù)1[,參數(shù)2],…]命令段return表達(dá)式endfunc或funciton函數(shù)名([參數(shù)1[,參數(shù)2],…])命令段return表達(dá)式endfuncprocedure過程名[lparameters參數(shù)1[,參數(shù)2],…]命令段[return表達(dá)式]endproc或procedure過程名([參數(shù)1[,參數(shù)2],…])命令段[return表達(dá)式]endproc1.自定義函數(shù)與過程的創(chuàng)建function函數(shù)名proc522.自定義函數(shù)與過程的調(diào)用由于自定義函數(shù)與過程可以存放在一個程序文件中,也可能集中存放在一個過程文件中,類似庫文件,可以減少打開文件的個數(shù)和便于維護(hù)。所以調(diào)用方法有兩種方式。(1)調(diào)用程序文件中的自定義函數(shù)或過程(2)調(diào)用過程文件中的自定義函數(shù)或過程2.自定義函數(shù)與過程的調(diào)用由于自定義函數(shù)與過程可以存放在一個53(1)調(diào)用程序文件中的自定義函數(shù)或過程
函數(shù)名([參量1[,參量2,…]])
do過程名[with[參量1[,參量2,…]]]或過程名([參量1[,參量2,…]])(1)調(diào)用程序文件中的自定義函數(shù)或過程函數(shù)名([參54(2)調(diào)用過程文件中的自定義函數(shù)或過程首先打開過程文件,使用如下命令:setprocedureto過程文件名然后采用方式(1)中的調(diào)用命令調(diào)用自定義函數(shù)與過程。最后關(guān)閉過程文件,命令格式如下:setprocedureto或closeprocedure(2)調(diào)用過程文件中的自定義函數(shù)或過程首先打開過程文件553.自定義函數(shù)與過程的舉例【例6.13】編程計算,并顯示計算結(jié)果。要求計算階乘用自定義函數(shù)實(shí)現(xiàn)?!纠?.14】編程實(shí)現(xiàn)在屏幕上以矩陣形式顯示二維數(shù)組,要求顯示部分使用自定義過程?!纠?.15】編程實(shí)現(xiàn),菜單選擇如下功能:顯示乘法口訣表、求累加、計算階乘。要求使用過程文件存儲各個功能。3.自定義函數(shù)與過程的舉例【例6.13】編程計算,56【例6.13】編程計算,并顯示計算結(jié)果。要求計算階乘用自定義函數(shù)實(shí)現(xiàn)(eg6_13.prg)。clears=0forn=1to100s=s+jc(n)&&jc(n)是函數(shù)調(diào)用,出現(xiàn)在表達(dá)式中endfor?"1!+2!+...+100!=",sreturnfunctionjclparametersmt=1forj=1tomt=t*jendforreturntendfunc【例6.13】編程計算,并顯示計算結(jié)果。要求計算階乘57【例6.14】編程實(shí)現(xiàn)在屏幕上以矩陣形式顯示二維數(shù)組,要求顯示部分使用自定義過程(eg6_14.prg)。cleardimea(3,4)fori=1to3forj=1to4a(i,j)=int(rand()*100)%100endforendfordoprint_awith3,4returnprocedureprint_a(m,n)fori=1tom?forj=1ton??str(a(i,j),3)+spac(2)endforendforreturn說明:rand()隨機(jī)值函數(shù),返回值<1,int()函數(shù)是取整數(shù),int(rand()*100)%100將數(shù)值限制在100以內(nèi)。【例6.14】編程實(shí)現(xiàn)在屏幕上以矩陣形式顯示二維數(shù)組,要求顯58【例6.15】編程實(shí)現(xiàn),菜單選擇如下功能:顯示乘法口訣表、求累加、計算階乘。要求使用過程文件存儲各個功能(eg6_15.prg,過程文件:proc6_15.prg)。*eg6_15.prgclearsetproceduretoproc6_15dowhile.T.cleartext1.乘法口訣2.累加3.階乘0.退出endtextinput"你的選擇(0-3):"toch
docasecasech=1docfkjcasech=2doqhcasech=3dojccasech=0exitotherwisewait"你的選擇不在[0,3],任按一鍵重新選擇!"endcaseenddosetproceduretoreturn【例6.15】編程實(shí)現(xiàn),菜單選擇如下功能:顯示乘法口訣表、求59【例6.15】的過程文件(proc6_15.prg)*proc6_15.prg*過程文件開始procedurecfkjclear?"功能1:顯示乘法口訣"fori=1to9?forj=1toi??str(i,1)+"*"+str(j,1)+;"="+str(i*j,2)+spac(2)endforendforwait"任按一鍵返回菜單選擇。"endprocprocedurejcclear?"功能3:計算1*2*...*n的積"input"n="tons=1fori=1tons=s*iendfor?"1*2*...*n=",swait"任按一鍵返回菜單選擇。"endproc*過程文件結(jié)束procedureqhclear?"功能2:計算1+2+...+n的和"input"n="tons=0fori=1tons=s+iendfor?"1+2+...+n=",swait"任按一鍵返回菜單選擇。"endproc【例6.15】的過程文件(proc6_15.prg)*pro606.4.3參數(shù)的傳遞參數(shù)分為形式參數(shù)和實(shí)際參數(shù)。在自定義函數(shù)與過程的創(chuàng)建中定義的參數(shù)是形式參數(shù),簡稱形參;在函數(shù)與過程調(diào)用中使用的參數(shù)是實(shí)際參數(shù),簡稱實(shí)參。注意:形參必須為變量名,而實(shí)參可以是變量名也可以是表達(dá)式。6.4.3參數(shù)的傳遞參數(shù)分為形式參數(shù)和實(shí)際參數(shù)。61【例6.16】編程實(shí)現(xiàn),按從大到小的順序顯示三個數(shù)。要求使用函數(shù)求兩個中較大的數(shù)、兩個中較小的數(shù)(eg6_16.prg)。clearinput"a="toainput"b="tobinput"c="tocd=nmax(a,b)&&a,b是實(shí)參d=nmax(d,c)&&d,c是實(shí)參x=nmin(a,nmin(b,c))&&變量a和nmin(b,c)表達(dá)式是外層nmin的實(shí)參z=a+b+c-d-x?"從大到?。?,d,z,xreturnfunctionnmaxlparameterx,y&&x,y是形參ifx>yreturnxelsereturnyendifendfuncfunctionnminlparametera,b&&a,b是形參ifa<breturnaelsereturnbendifendfunc【例6.16】編程實(shí)現(xiàn),按從大到小的順序顯示三個數(shù)。要求使用62參數(shù)傳遞參數(shù)的傳遞是單向傳遞,即由實(shí)參傳遞給形參。如果實(shí)參是表達(dá)式,則計算表達(dá)式的值,將該值傳遞給形參。如果實(shí)參是變量,可以有兩種情形:將實(shí)參變量的值拷貝到形參變量,或者是形參共用實(shí)參變量的地址,也就是說可以分為:值傳遞和引用傳遞。參數(shù)傳遞參數(shù)的傳遞是單向傳遞,即由實(shí)參傳遞給形參。631.值傳遞值傳遞是將實(shí)參表達(dá)式或變量的值拷貝到形參變量,之后實(shí)參與形參沒有聯(lián)系,即形參改變后的值不能影響實(shí)參。在VFP中,默認(rèn)情況下就是采用這種傳遞方式。1.值傳遞值傳遞是將實(shí)參表達(dá)式或變量的值拷貝到形參變量,之64【例6.17】編程實(shí)現(xiàn)兩個數(shù)的交換,要求交換用過程實(shí)現(xiàn)(eg6_17.prg)。clearinput"a="toainput"b="tobswap(a,b)?"交換后:",a,breturnprocswaplparametera,bt=aa=bb=tendproc程序執(zhí)行后發(fā)現(xiàn)交換后的值沒有變,為什么呢?
abt②③①①t=a②a=b③b=tabab實(shí)參形參【例6.17】編程實(shí)現(xiàn)兩個數(shù)的交換,要求交換用過程實(shí)現(xiàn)(eg652.引用傳遞引用傳遞,也叫地址傳遞,它可以實(shí)現(xiàn)形參改變實(shí)參的值,即將改變后的值返回給主程序,要求實(shí)參為變量名。在VFP中,默認(rèn)情況下對象通常以引用的方式傳遞參數(shù)。引用傳遞可以通過以下兩種形式進(jìn)行:(1)使用SetUDFParams命令的ToReference子句在調(diào)用用戶自定義函數(shù)或過程前,使用SetUDFParams命令指定VFP是引用方式傳遞參數(shù),其命令格式如下:setudfparamstovalue|reference其中,ToValue表示值傳遞方式;ToReference表示引用方式。(2)使用@標(biāo)記參數(shù)如果在實(shí)參變量前加@標(biāo)志,則將強(qiáng)制變量以引用的方式傳遞參數(shù)。2.引用傳遞引用傳遞,也叫地址傳遞,它可以實(shí)現(xiàn)形參改變實(shí)參的66(1)使用SetUDFParams命令的ToReference子句
【例6.18】分析下面程序的運(yùn)行結(jié)果(eg6_18.prg)。clearx=100setudfparamstovalueprocx(x)?"value:x=",xsetudfparamstoreferenceprocx(x)?"reference:x=",xprocedureprocxlparayy=y*2endproc(1)使用SetUDFParams命令的ToRefere67(2)使用@標(biāo)記參數(shù)
【例6.19】分析下面程序的運(yùn)行結(jié)果(eg6_19.prg)cleara=10proc_a(@a)?"a=",aprocedureproc_alparaxx=1endproc(2)使用@標(biāo)記參數(shù)
【例6.19】分析下面程序的運(yùn)行結(jié)果(686.4.3內(nèi)存變量的作用域內(nèi)存變量的作用域是按變量在程序中的作用范圍來區(qū)分的,可以分為:全局、局部和本地作用域的內(nèi)存變量三種。6.4.3內(nèi)存變量的作用域內(nèi)存變量的作用域是按變量在程序中691.全局型內(nèi)存變量使用Public命令定義的內(nèi)存變量視為全局型內(nèi)存變量。命令格式:public<內(nèi)存變量表>
全局型內(nèi)存變量在整個程序、過程或自定義函數(shù),以及調(diào)用它的程序、過程和函數(shù)中都有效。即使整個程序結(jié)束,全局型內(nèi)存變量也不被釋放,需要使用命令來釋放:Release或clear全局型內(nèi)存變量必須先定義后賦值。已經(jīng)定義為全局型內(nèi)存變量的,還可以在下一級程序中重新定義為局部型內(nèi)存變量,但反過來是不行的。1.全局型內(nèi)存變量使用Public命令定義的內(nèi)存變量視為全局702.局部型內(nèi)存變量使用Private命令定義的內(nèi)存變量視為局部型內(nèi)存變量。命令格式:private<內(nèi)存變量表>局部型內(nèi)存變量可以在定義它的程序以及被該程序調(diào)用的程序、過程或函數(shù)中有效。一旦程序運(yùn)行或調(diào)用結(jié)束,局部型內(nèi)存變量將從內(nèi)存中釋放。局部型內(nèi)存變量也可以向下延伸作用域,即如果定義它的程序再調(diào)用其它子程序,則該變量在子程序中繼續(xù)有效,如果所在子程序中改變了它的值,則返回調(diào)用程序時也帶回新值,并在程序中繼續(xù)使用。2.局部型內(nèi)存變量使用Private命令定義的內(nèi)存變量視為局71全局型內(nèi)存變量與局部型內(nèi)存變量同名
在局部變量的作用域,全局型變量被屏蔽,即不可見、不可用,但仍然存在于內(nèi)存中。只要離開該局部變量的作用域,所屏蔽的內(nèi)存變量便恢復(fù)其可見、可用狀態(tài)。全局型內(nèi)存變量與局部型內(nèi)存變量同名在局部變量的作用域,全局723.本地型內(nèi)存變量使用Local命令定義的內(nèi)存變量視為本地內(nèi)存變量。命令格式:local<內(nèi)存變量表>本地型內(nèi)存變量只能在定義它的程序中有效,一旦定義它的程序執(zhí)行完畢,它將被釋放,該類型的內(nèi)存變量不能延伸其作用域。3.本地型內(nèi)存變量使用Local命令定義的內(nèi)存變量視為本地內(nèi)73【例6.20】分析下面程序的運(yùn)行結(jié)果(eg6_20.prg)。
clearpublicxx=100privateyy=50z=10?"before:",x,y,zdoxyz?"after:",x,y,zreturnprocedurexyzprivatexlocalyx=3y=4z=z+5?"procedure:",x,y,zendproc【例6.20】分析下面程序的運(yùn)行結(jié)果(eg6_20.prg)746.5程序調(diào)試程序編寫好了并不意味著完成,還需要進(jìn)行調(diào)試以排除程序中錯誤。程序中的錯誤分為語法錯誤和邏輯錯誤,前者容易排除,而后者不容易被發(fā)現(xiàn)和排除。常見的語法錯誤:遺漏關(guān)鍵字或保留字和變量之間的空格;遺漏常量的定界符;拼寫錯誤;內(nèi)存變量沒有初始化;表達(dá)式或函數(shù)中的數(shù)據(jù)類型不匹配;丟失“)”或左右括號不匹配;控制語句丟失結(jié)束語句,譬如:endif,enddo或endcase,控制語句嵌套錯誤。6.5程序調(diào)試程序編寫好了并不意味著完成,還需要進(jìn)行調(diào)試以75程序調(diào)試程序調(diào)試是通過輸入數(shù)據(jù),跟蹤變量變化,顯示中間結(jié)果或最終結(jié)果,通過輸出正確與否來判斷程序運(yùn)行是否正確。簡單的調(diào)試方式就是在程序中添加適當(dāng)?shù)妮敵稣Z句。程序調(diào)試程序調(diào)試是通過輸入數(shù)據(jù),跟蹤變量變化,顯示中間結(jié)果76程序調(diào)試器從VFP主菜單的“工具”菜單中選擇“調(diào)試器”菜單項(xiàng),打開“調(diào)試器”窗口
調(diào)用“調(diào)試器”也可以使用命令,其命令格式:debug
程序調(diào)試器從VFP主菜單的“工具”菜單中選擇“調(diào)試器”菜單77【例6.18】使用“調(diào)試器”調(diào)試?yán)?.13的程序,熟悉“調(diào)試器”的基本用法?!纠?.18】使用“調(diào)試器”調(diào)試?yán)?.13的程序,熟悉“調(diào)試786.6程序的連編數(shù)據(jù)庫應(yīng)用系統(tǒng)的程序編寫和調(diào)試完畢,還需要對程序進(jìn)行連編。打開項(xiàng)目管理器,包含所有需要的文件,并且設(shè)置好主文件,再單擊“連編”按鈕,彈出“連編選項(xiàng)”窗口。6.6程序的連編數(shù)據(jù)庫應(yīng)用系統(tǒng)的程序編寫和調(diào)試完畢,還需要79本章小結(jié)VFP使用“項(xiàng)目管理器”來管理項(xiàng)目的各種類型的文件;程序是完成某一特定操作的一組命令的有序集合;創(chuàng)建和編輯程序文件可以使用VFP提供的工具modifycommand,也可以使用其它文本編寫軟件來做;三種基本結(jié)構(gòu):順序、選擇和循環(huán)結(jié)構(gòu);VFP通過自定義函數(shù)或過程來實(shí)現(xiàn)程序的模塊化;參數(shù)傳遞是實(shí)參傳遞給形參,分值傳遞和引用傳遞方式;變量的作用域分為:全局、局部和本地作用域;程序錯誤分為:語法錯誤和邏輯錯誤,程序調(diào)試就是查找程序的錯誤。本章小結(jié)VFP使用“項(xiàng)目管理器”來管理項(xiàng)目的各種類型的文件;80作業(yè)P1396.21至6.26P1436.31至6.33作業(yè)P1396.21至6.2681第6章項(xiàng)目與程序設(shè)計
6.1項(xiàng)目管理6.2程序初步知識6.3結(jié)構(gòu)化程序設(shè)計6.4模塊化思想與實(shí)現(xiàn)6.5程序調(diào)試6.6程序的連編第6章項(xiàng)目與程序設(shè)計
6.1項(xiàng)目管理82學(xué)習(xí)目標(biāo)了解項(xiàng)目管理的基本概念,掌握VFP“項(xiàng)目管理器”的使用方法;理解程序的概念,掌握程序的建立、編輯和運(yùn)行的方法;理解并掌握算法的表示方法,尤其是流程圖方法;理解并掌握結(jié)構(gòu)化程序的三種基本結(jié)構(gòu);了解模塊化程序設(shè)計的思想;理解并掌握用戶自定義函數(shù)的定義、調(diào)用和返回值和參數(shù)傳遞的概念;掌握程序調(diào)試的基本方法。學(xué)習(xí)目標(biāo)了解項(xiàng)目管理的基本概念,掌握VFP“項(xiàng)目管理器”的83重點(diǎn)與難點(diǎn)重點(diǎn)在于結(jié)構(gòu)化程序設(shè)計與調(diào)試、函數(shù)設(shè)計與使用;難點(diǎn)在于靈活掌握三種基本結(jié)構(gòu)的嵌套、正確地傳遞函數(shù)的參數(shù)。重點(diǎn)與難點(diǎn)重點(diǎn)在于結(jié)構(gòu)化程序設(shè)計與調(diào)試、函數(shù)設(shè)計與使用;846.1項(xiàng)目管理進(jìn)行VFP數(shù)據(jù)庫應(yīng)用系統(tǒng)的項(xiàng)目開發(fā)時,常常要與各種文件、數(shù)據(jù)和對象打交道,如:數(shù)據(jù)庫、數(shù)據(jù)表、視圖、查詢、菜單、表單、程序文件和其他文件。項(xiàng)目就是有關(guān)文件、數(shù)據(jù)和對象的集合。項(xiàng)目管理是按照一定的順序和邏輯關(guān)系,對數(shù)據(jù)庫應(yīng)用系統(tǒng)涉及到的各種類型文件、數(shù)據(jù)和對象進(jìn)行有效組織,并將它們編譯成.app或exe文件。VFP提供了管理功能強(qiáng)大的項(xiàng)目管理器來創(chuàng)建和管理項(xiàng)目。6.1項(xiàng)目管理進(jìn)行VFP數(shù)據(jù)庫應(yīng)用系統(tǒng)的項(xiàng)目開發(fā)時,常常要85VFP的項(xiàng)目管理器VFP的項(xiàng)目管理器866.2程序初步知識如果完成一項(xiàng)任務(wù)不是一兩個命令就能完成,而需要一組命令來完成,并且這組命令出現(xiàn)的先后順序不能顛倒,這樣的要求對一般的數(shù)據(jù)庫系統(tǒng)的操作人員來說是十分困難的。本章介紹的程序方式,系統(tǒng)設(shè)計人員將完成某一項(xiàng)任務(wù)的一組操作命令保存在程序文件中,操作人員只需調(diào)用該程序文件就可以完成該項(xiàng)任務(wù),可明顯地降低了操作的難度。6.2程序初步知識如果完成一項(xiàng)任務(wù)不是一兩個命令就能完成,876.2.1程序的概念程序(Program)是指完成特定任務(wù)的一組命令的有序集合。在VFP中,程序是以文本的形式保存在程序文件(.prg)中,當(dāng)該程序被調(diào)用時,系統(tǒng)會從前往后地、按次序地和自動地執(zhí)行包含在程序文件中的命令直至結(jié)束。6.2.1程序的概念程序(Program)是指完成特定任務(wù)88程序方式同交互方式和菜單方式相比
具有非常明顯的優(yōu)點(diǎn):(1)程序以文本文件的形式保存,方便創(chuàng)建、修改;(2)程序一旦編好,就可以被無限次調(diào)用,具有“一勞永逸”的特點(diǎn);(3)具有通用性的程序,還可以被其他程序調(diào)用,或調(diào)用其他程序,提高了編寫程序的效率。程序方式同交互方式和菜單方式相比具有非常明顯的優(yōu)點(diǎn):896.2.2程序的建立與編輯在VFP中,程序可以通過菜單方式和命令方式來建立與編輯。命令方式:modifycommand[文件名|?]其中,(1)命令動詞:Modify(修改)。(2)文件名或“?”是可選項(xiàng):文件名包括主文件名和類型名,主文件名由用戶自定義,而類型名為“.prg”,用戶不指定時,系統(tǒng)會自動添加上“.prg”6.2.2程序的建立與編輯在VFP中,程序可以通過菜單方式90注意事項(xiàng)在建立和編輯程序文件時,需要注意以下幾點(diǎn):(1)命令的書寫要符合命令書寫的規(guī)則。(2)為了增加程序的可讀性,可以在程序中加上注釋。(3)為了增加程序的可讀性,常常在編寫程序時采用縮進(jìn)方式,本書采用縮進(jìn)方式編寫程序。(4)在程序的編寫過程中,合理使用“剪貼板”可以提高程序編寫效率。(5)程序編寫過程中要注意及時保存。可以在“文件”菜單中選擇“保存”或“另存為”命令,也可以使用Ctrl+W組合鍵。放棄本次修改可以直接按Esc鍵。注意事項(xiàng)在建立和編輯程序文件時,需要注意以下幾點(diǎn):91其他編輯器編寫程序文件除了使用VFP自帶的編輯器外,也可以使用任何其他的文本編輯系統(tǒng),譬如:記事本、EDIT,但不能使用具有格式編排的系統(tǒng),譬如:Word??梢詮腤ord中復(fù)制程序到記事本,但需要從“選擇性粘帖”中選擇“無格式文本”。記事本默認(rèn)的文件類型名為“.txt”,所以,在保存對話框中,請用雙引號界定,譬如:"test.prg",否則會自動添加“.txt”,像這個樣子“test.prg.txt”。其他編輯器編寫程序文件除了使用VFP自帶的編輯器外,也可以使926.2.3程序的執(zhí)行程序的執(zhí)行同程序的建立和編輯一樣也有兩種方式:菜單方式和命令方式。從“程序”菜單中選擇“運(yùn)行”菜單項(xiàng)
在命令窗口中輸入如下命令:do程序文件名[with參數(shù)表]其中,程序文件名無需帶上類型名;“with參數(shù)表”是可選項(xiàng):通過參數(shù)表向程序傳遞數(shù)據(jù),參數(shù)表如果有多個參數(shù),則需要用逗號隔開,在編寫帶參數(shù)的程序時,必須把如下命令:parameters參數(shù)表放在程序的開頭。6.2.3程序的執(zhí)行程序的執(zhí)行同程序的建立和編輯一樣也有兩936.2.4程序的注釋為了增加程序的可讀性,通常需要在程序中添加上注釋。有兩種形式的注釋:(1)整行為注釋:以*或Note開頭。*注釋文本或note注釋文本(2)在命令尾部注釋:以&&引出注釋文本。
注意:程序的注釋不影響程序的執(zhí)行效率,因?yàn)樵诰幾g時,系統(tǒng)并不會將注釋編譯到編譯后的文件(.fxp)中去。6.2.4程序的注釋為了增加程序的可讀性,通常需要在程序中94【例6.1】編寫一個簡單的程序,通過參數(shù)傳遞兩個數(shù),在屏幕上顯示兩個數(shù)的和、兩個數(shù)的積(Eg6_1.prg)。*第一個簡單的程序note在實(shí)際的程序中,并不需要每行都注釋的parametersm,n&&m,n是形式參數(shù)settalkoff&&狀態(tài)的設(shè)置,關(guān)閉交互模式clear&&清除顯示屏幕?"m+n=",m+n&&"m+n="是提示,m+n是表達(dá)式?"m*n=",m*n&&"m*n="是提示,m*n是表達(dá)式return&&結(jié)束本程序返回VFP系統(tǒng)程序執(zhí)行命令格式如下:DoEg6_1with6,9↙程序運(yùn)行的結(jié)果:m+n=15m*n=54【例6.1】編寫一個簡單的程序,通過參數(shù)傳遞兩個數(shù),在屏幕上956.2.6輸入輸出命令程序的運(yùn)行離開不了輸入、輸出命令。輸入命令完成從鍵盤上接收數(shù)據(jù)。輸出命令完成將運(yùn)行的結(jié)果顯示在屏幕上。6.2.6輸入輸出命令程序的運(yùn)行離開不了輸入、輸出命令。961.輸入命令(1)單字符輸入命令wait[提示信息][to內(nèi)存變量][window[nowait]][timeout數(shù)值表達(dá)式](2)字符型數(shù)據(jù)輸入命令A(yù)ccept[提示信息][To內(nèi)存變量](3)任意類型數(shù)據(jù)輸入命令I(lǐng)nput[提示信息][To內(nèi)存變量](4)格式化輸入@行,列[say表達(dá)式][get變量]read[save][cycle][timeout等待時間]1.輸入命令(1)單字符輸入命令97舉例(在命令窗口測試)wait"按Y鍵退出系統(tǒng)"tochaccept"你的姓名:"toXMinput"姓名"toxm&&字符型input"出生日期"tocsrq&&日期型input"身高"tosg&&數(shù)值型input"是否黨員"tosfdy&&邏輯型name=space(8)@5,10say"姓名"getnameread舉例(在命令窗口測試)wait"按Y鍵退出系統(tǒng)"toc982.輸出命令前面已經(jīng)講述了“?”和“??”的用法。(1)文本輸出命令\|\\文本行或text文本內(nèi)容endtext(2)格式輸出命令@行,列Say表達(dá)式picture格式控制字符2.輸出命令前面已經(jīng)講述了“?”和“??”的用法。99舉例(在命令窗口測試)\程序測試行1
\\程序測試行2Text========Menu==========1.輸入2.修改3.刪除4.打印0.退出=======================Endtext@3,6say姓名@4,6say工資picture"99999.99"&&有兩位小數(shù)舉例(在命令窗口測試)\程序測試行1
\\程序測試行21006.3結(jié)構(gòu)化程序設(shè)計
6.3.1算法的表示數(shù)據(jù)結(jié)構(gòu)+算法=程序一個好的程序離不開好的算法,設(shè)計程序的實(shí)質(zhì)就是設(shè)計算法。算法:廣義地說,為了解決一個問題而采取的方法和步驟。為了表示一個算法,可以用不同的方法。常用的有自然語言、傳統(tǒng)的流程圖、N-S流程圖、偽代碼、PAD圖等。6.3結(jié)構(gòu)化程序設(shè)計
6.3.1算法的表示數(shù)據(jù)結(jié)構(gòu)+算法1011.傳統(tǒng)的流程圖符號起止框處理框輸出框判斷框注釋框連接點(diǎn)流程線或1.傳統(tǒng)的流程圖符號起止框處理框輸出框判斷框注釋框連接點(diǎn)流程1022.三種基本結(jié)構(gòu)及其流程圖表示1966年,Bohra和Jacopini提出了以下三種基本結(jié)構(gòu)ppABABppA(a)順序結(jié)構(gòu)(b)選擇結(jié)構(gòu)(c)循環(huán)結(jié)構(gòu)2.三種基本結(jié)構(gòu)及其流程圖表示1966年,Bohra和Ja1033.“結(jié)構(gòu)化”的算法三種基本結(jié)構(gòu)有以下共同特點(diǎn):
①只有一個入口;②只有一個出口;③結(jié)構(gòu)內(nèi)的每一部分都有機(jī)會被執(zhí)行到;④結(jié)構(gòu)內(nèi)不存在“死循環(huán)”(無終止的循環(huán))。已經(jīng)證明,以上三種結(jié)構(gòu)及其嵌套而順序組成的算法結(jié)構(gòu),可以解決任何復(fù)雜的問題。由基本結(jié)構(gòu)所構(gòu)成的算法屬于“結(jié)構(gòu)化”的算法,它不存在無規(guī)律的轉(zhuǎn)向,只在基本結(jié)構(gòu)內(nèi)才允許存在分支和向前或向后的跳轉(zhuǎn)。其他結(jié)構(gòu)都可以由三種基本結(jié)構(gòu)及其嵌套派生出來。3.“結(jié)構(gòu)化”的算法三種基本結(jié)構(gòu)有以下共同特點(diǎn):1046.3.2順序結(jié)構(gòu)在單個處理器的計算機(jī)中,程序是按順序串行方式執(zhí)行,即上一條命令執(zhí)行完畢才能執(zhí)行下一條命令,自上而下地一條一條地執(zhí)行命令直至程序執(zhí)行完畢。這里的命令可以是單條命令,也可以是包括多條命令且具有內(nèi)部結(jié)構(gòu)的復(fù)合命令、函數(shù)或過程。6.3.2順序結(jié)構(gòu)在單個處理器的計算機(jī)中,程序是按順序串行105【例6.2】編寫一個程序,輸入a和b的值,計算a除以b并顯示結(jié)果(Eg6_2.prg)。
clear*inputinput"a="toainput"b="tob*processc=a/b*output?creturn【例6.2】編寫一個程序,輸入a和b的值,計算a除以b并顯示1066.3.3選擇結(jié)構(gòu)選擇結(jié)構(gòu)也叫分支結(jié)構(gòu),它能夠根據(jù)指定關(guān)系表達(dá)式或邏輯表達(dá)式(或稱條件表達(dá)式)的值在兩條或多條程序執(zhí)行路徑中選擇其中一條執(zhí)行。在VFP中,選擇結(jié)構(gòu)分為if~endif、if~else~endif和docase~endcase。6.3.3選擇結(jié)構(gòu)選擇結(jié)構(gòu)也叫分支結(jié)構(gòu),它能夠根據(jù)指定關(guān)系1071.if~else~endif結(jié)構(gòu)if表達(dá)式命令組1else命令組2endifpp命令組1命令組2表達(dá)式.T..F.1.if~else~endif結(jié)構(gòu)if表達(dá)式pp108【例6.3】編寫一個程序,判斷輸入的一個年份是否為閏年,如果是閏年,顯示“閏年”,否則顯示“不是閏年”。判斷閏年的條件:年份能被4整除但不能被100整除;或者能被400整除(Eg6_3.prg)。clearinput"year="toyif(mod(y,4)=0.and.mod(y,100)<>0.or.mod(y,400)=0)?"閏年"else?"不是閏年"endif整除是通過判斷余數(shù)是否為0,若為0,表示整除,否則不能被整除。整除可以用函數(shù)mod()或求余運(yùn)算符“%”來完成。
【例6.3】編寫一個程序,判斷輸入的一個年份是否為閏年,如果1092.if~endif結(jié)構(gòu)if表達(dá)式命令組1endifpp命令組1表達(dá)式.T..F.2.if~endif結(jié)構(gòu)pp命令組1表達(dá)式.T..F.110【例6.4】編程實(shí)現(xiàn):輸入一個口令,如果口令符合,顯示“口令驗(yàn)證通過!”。,否則直接結(jié)束程序(Eg6_4.prg)。clearaccept"口令:"topsdifupper(psd)="HELLO"?"口令驗(yàn)證通過!"endifreturn*說明:upper函數(shù)是為了統(tǒng)一各種輸入的情況?!纠?.4】編程實(shí)現(xiàn):輸入一個口令,如果口令符合,顯示“口令1113.docase~endcase結(jié)構(gòu)docasecase條件1命令組1case條件2命令組2……[otherwise命令組n+1]endcase條件1條件2條件n命令組1命令組2命令組n命令組n+1….F..F..F..T..T..T.3.docase~endcase結(jié)構(gòu)條件1條件2條件112【例6.5】編程實(shí)現(xiàn):輸入一個百分制成績,輸出它對應(yīng)的等級,優(yōu)秀:90~100、良好:80~89、中等:70~79、及格:60~69和不及格:60分以下(Eg6_5.prg)。*變量cj存放百分制成績;dj存放對應(yīng)的等級描述。clearinput"百分制成績:"tocjdocasecasecj>=90.and.cj<=100dj="優(yōu)秀"casecj>=80.and.cj<90dj="良好"casecj>=70.and.cj<80dj="中等"casecj>=60.and.cj<70dj="及格"
casecj>=0.and.cj<60dj="不及格"otherwisedj="輸入的成績不在[0,100]"endcase?"對應(yīng)的等級:",djreturn【例6.5】編程實(shí)現(xiàn):輸入一個百分制成績,輸出它對應(yīng)的等級,113【例6.5】程序也可以由if~else~endif來實(shí)現(xiàn)(Eg6_5a.prg)clearinput"百分制成績:"tocjif(cj>=90.and.cj<=100)dj="優(yōu)秀"elseif(cj>=80)dj="良好"elseif(cj>=70)dj="中等"elseif(cj>=60)dj="及格"else
if(cj>=0)dj="不及格"elsedj="輸入的成績不在[0,100]"endifendifendifendifendif?"對應(yīng)的等級:",djreturn【例6.5】程序也可以由if~else~endif來實(shí)現(xiàn)(E1146.3.4循環(huán)結(jié)構(gòu)環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計的三種基本結(jié)構(gòu)之一,它是在給定條件成立(即表達(dá)式的值為.T.)時,反復(fù)執(zhí)行語句組(稱為循環(huán)體)。VFP中的循環(huán)結(jié)構(gòu):dowhile~enddo、for~endfor和scan~endscan結(jié)構(gòu)。6.3.4循環(huán)結(jié)構(gòu)環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計的三種基本結(jié)構(gòu)之一1151.dowhile~enddo結(jié)構(gòu)dowhile表達(dá)式命令組1[loop][exit]命令組2enddo表達(dá)式循環(huán)體命令組.T..F.1.dowhile~enddo結(jié)構(gòu)dowhile116【例6.6】編程,計算,并顯示結(jié)果(eg6_6.prg)。clearn=1s=0dowhile(n<=100)s=s+nn=n+1enddo?"1+2+...+100=",sreturnn現(xiàn)值(初始:1)s(初始:0)n增值后(n=n+1)10+1=11+1=221+2=32+1=333+3=63+1=4………………1004950+100=5050100+1=101101結(jié)束循環(huán)【例6.6】編程,計算,并顯示結(jié)果(eg6_6.prg)。c1172.for~endfor結(jié)構(gòu)for控制變量=初始值to終止值step步長命令組1[loop][exit]命令組2endfor|next控制變量=初始值控制變量超過終止值命令組控制變量=控制變量+步長.T..F.2.for~endfor結(jié)構(gòu)控制變量=初始值控制變量超118【例6.7】編程,計算,并顯示結(jié)果(eg6_7.prg)。clearn=1t=1forn=1to100step1t=t*nendfor?"100!=1*2*...*100=",treturn【例6.7】編程,計算,并顯示結(jié)果(eg6_7.prg)。c1193.scan~endscan結(jié)構(gòu)該結(jié)構(gòu)用于數(shù)據(jù)表循環(huán)掃描。功能:如果條件表達(dá)式的值為.T.,scan命令自動將記錄指針移動到下一條滿足條件的記錄上,然后執(zhí)行命令組,當(dāng)遇到文件末尾.或遇到了exit命令則結(jié)束該循環(huán)。scanfor條件表達(dá)式1|while條件表達(dá)式2命令組1[loop][exit]命令組2endscan注意:for子句與while子句用法不同。如果for子句,所有滿足“條件表達(dá)式1”為.T.的記錄都會執(zhí)行命令組;如果while字句,只要“條件表達(dá)式2”為.T.才執(zhí)行命令組,直至遇到使該表達(dá)式為.F.的記錄為止,即不一定能夠找出所有滿足條件的記錄。因此,常用for子句。3.scan~endscan結(jié)構(gòu)該結(jié)構(gòu)用于數(shù)據(jù)表循環(huán)掃120【例6.8】編程,循環(huán)掃描成績表(cj.dbf),顯示需要補(bǔ)考學(xué)生的記錄。比較for子句和while子句的不同,假設(shè)成績表已經(jīng)存在并輸入了記錄,表結(jié)構(gòu):學(xué)號(C,4)、姓名(C,8)、語文(N,5,1)、數(shù)學(xué)(N,5,1)和英語(N,5,1)。(eg6_8.prg)。clearusecj?"for子句:"scanfor語文<60.or.數(shù)學(xué)<60.or.英語<60dispendscan?"while子句:"scanwhile語文<60.or.數(shù)學(xué)<60.or.英語<60dispendscan【例6.8】編程,循環(huán)掃描成績表(cj.dbf),顯示需要1216.3.5Exit和Loop命令Exit和Loop命令用在循環(huán)結(jié)構(gòu)中,都用于控制程序的流程。但是Exit命令用于結(jié)束本層循環(huán),執(zhí)行本層循環(huán)后面的命令;而Loop用于結(jié)束本次循環(huán),進(jìn)入下一次循環(huán)條件的判斷。6.3.5Exit和Loop命令Exit和Loop命令用在122【例6.9】輸入若干個學(xué)生的百分制成績,輸入負(fù)數(shù)表示結(jié)束并不計算在總分以內(nèi),如果輸入成績大于100,則需要重新輸入。計算平均分并輸出(eg6_9.prg)。
clears=0n=0dowhile.T.input"x="toxif(x<0)exitendifif(x>100)loopendifn=n+1s=s+nenddoif(n=0)?"沒有輸入有效數(shù)據(jù)!"else?"平均成績:",s/nendifreturn開始
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版杉木林木材市場調(diào)研與買賣預(yù)測合同3篇
- 二零二五年幼兒園幼兒安全防護(hù)責(zé)任合同2篇
- 2025年度智能家居門窗系統(tǒng)安裝及售后服務(wù)合同范本3篇
- 二零二五版農(nóng)用車租賃管理及技術(shù)支持合同3篇
- 2025年度木工材料采購與供應(yīng)合同范本4篇
- 二零二五年礦山轉(zhuǎn)讓協(xié)議及礦產(chǎn)資源開發(fā)運(yùn)營合同3篇
- 二零二五年度投資擔(dān)保公司產(chǎn)業(yè)投資基金合同
- 課題申報參考:明清江南文人居室陳設(shè)藝術(shù)研究
- 2025年度城市地下綜合管廊配電箱柜安全防護(hù)采購合同4篇
- 二零二五年度文化創(chuàng)意產(chǎn)業(yè)合作聘請兼職勞務(wù)合同
- 人工智能算法與實(shí)踐-第16章 LSTM神經(jīng)網(wǎng)絡(luò)
- 17個崗位安全操作規(guī)程手冊
- 數(shù)學(xué)史簡介課件可編輯全文
- 2025年山東省濟(jì)南市第一中學(xué)高三下學(xué)期期末統(tǒng)一考試物理試題含解析
- 中學(xué)安全辦2024-2025學(xué)年工作計劃
- 網(wǎng)絡(luò)安全保障服務(wù)方案(網(wǎng)絡(luò)安全運(yùn)維、重保服務(wù))
- 2024年鄉(xiāng)村振興(產(chǎn)業(yè)、文化、生態(tài))等實(shí)施戰(zhàn)略知識考試題庫與答案
- 現(xiàn)代科學(xué)技術(shù)概論智慧樹知到期末考試答案章節(jié)答案2024年成都師范學(xué)院
- 軟件模塊化設(shè)計與開發(fā)標(biāo)準(zhǔn)與規(guī)范
- 2024年遼寧鐵道職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 有機(jī)農(nóng)業(yè)種植模式
評論
0/150
提交評論