曲芳秀
(佳木斯市職業(yè)技術(shù)學(xué)校,黑龍江 佳木斯 154002)
結(jié)構(gòu)化程序設(shè)計(jì)的主要思想是把應(yīng)用程序分成幾個(gè)相對(duì)獨(dú)立的子模塊,用每個(gè)子模塊實(shí)現(xiàn)一個(gè)功能,然后將各個(gè)子模塊之間通過(guò)調(diào)用和傳遞把它們組合在一起,初學(xué)者學(xué)會(huì)編寫結(jié)構(gòu)化程序,對(duì)于編寫出高質(zhì)量的、面向?qū)ο蟮膽?yīng)用程序大有幫助。
順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)3種基本結(jié)構(gòu),它是程序設(shè)計(jì)的基礎(chǔ)。
它是最基本的程序結(jié)構(gòu),是按照命令或語(yǔ)句順序依次執(zhí)行,一直執(zhí)行程序中的每個(gè)命令或語(yǔ)句。
是程序的3種基本結(jié)構(gòu)之一,初學(xué)者可以根據(jù)指定的條件,選擇執(zhí)行不同的程序分支,分為以下3種:
(a)單分支選擇:提供一種選擇,指定的條件滿足,才能執(zhí)行此語(yǔ)句。
(b)雙分支選擇: 提供兩種選擇,指定條件是否滿足,都執(zhí)行一種選擇,并且只能執(zhí)行一種。
(c)多分支選擇:可以提供多種選擇,但是最多執(zhí)行其中一種。
a、 單分支選擇結(jié)構(gòu)格式如圖1:
IF<條件>
<語(yǔ)句組>
ENDIF
圖1 單分支選擇結(jié)構(gòu)的流程圖
說(shuō)明:在使用IF語(yǔ)句時(shí),其中IF是開始語(yǔ)句,而ENDIF是結(jié)束語(yǔ)句,因此它們必須成對(duì)使用,缺一不可。
程序流程:首先判斷條件是不是滿足。如滿足,那么“條件”的值為.T.,就先執(zhí)行“語(yǔ)句組”后再執(zhí)行ENDIF后面的語(yǔ)句;反之,將不執(zhí)行“語(yǔ)句組”,直接執(zhí)行ENDIF后面的語(yǔ)句。
引證:求一元二次方程A+BX+C=0的根X1,X2。
Z=B∧2-4*A*C
IF(Z>=0)
X1=(-B+SQRT(Z))/(2*A)
X2=(-B-SQRT(Z))/(2*A)
? X1,X2
ENDIF
b、 雙分支選擇結(jié)構(gòu)格式如圖2:
IF<條件>
<語(yǔ)句組1-ELSE>
<語(yǔ)句組2>ENDIF
圖2 雙分支選擇結(jié)構(gòu)的流程圖
程序流程:首先判斷條件是不是滿足。如滿足,“條件”的值為.T.。那么就先執(zhí)行“語(yǔ)句組1”后再執(zhí)行ENDIF后面的語(yǔ)句;反之,我們就先執(zhí)行“語(yǔ)句組2”,然后再執(zhí)行ENDIF后面的語(yǔ)句。
SET TALK OFF
CLEAR
INPUT”請(qǐng)輸入X的值:”TO X
IF X>=0
Y=2*X+1
ELSE
Y=2*X-1
ENDIF
?”f(“+ALLTRIM(STR(X))+”)=”+ALLTRIM(STR(Y))
SET TAKL ON RETURN
C、多分支選擇結(jié)構(gòu)格式:
DO CASE
CASE<條件1>
<語(yǔ)句組1>
CASE<條件2>
<語(yǔ)句組2>
……….
CASE<條件n>
<語(yǔ)句組n>
[OTHERWISE語(yǔ)句組]
ENDCASE
說(shuō)明:DO CASE 是多分支選擇結(jié)構(gòu)開始的語(yǔ)句,ENDCASE是多分支語(yǔ)句結(jié)束的語(yǔ)句,它們必須成對(duì)使用,缺一不可。
程序流程:首先來(lái)判斷第1個(gè)CASE后面的“條件1”是否得到滿足。如滿足,那么“條件1”的值為.T.,就先執(zhí)行“語(yǔ)句組1”,然后再執(zhí)行ENDCASE后面的語(yǔ)句;否則,我們繼續(xù)判斷第2個(gè)CASE后面的“條件2”,如滿足,就先執(zhí)行“語(yǔ)句組2”,然后再執(zhí)行ENDCASE后面的語(yǔ)句,一直進(jìn)行。直到所有CASE后面的條件都不滿足,這時(shí)如有OTHERWISE選項(xiàng)時(shí),我們就執(zhí)行其下面的“語(yǔ)句組”;如果沒有OTHERWISE選項(xiàng)時(shí),就執(zhí)行ENDCASE后面的語(yǔ)句如圖3所示。
圖3 多分支選擇結(jié)構(gòu)的流程圖
引證:f(x)是一個(gè)分段函數(shù),當(dāng)X小于-1或大于5時(shí),取f(x)=0;當(dāng)X大于等于-1或小于1時(shí),f(x)取2(x2)-X;當(dāng)X大于等于1或小于5時(shí),f(x)取X。
Input”請(qǐng)輸入X值:” TO X
DO CASE
CASE X<-1
f=0
CASE x<1
f=2*x*x-x
CASE x<5
f=x
OTHERWISE
f=0
ENDCASE
? “”,f
RETURN
循環(huán)結(jié)構(gòu):是按指定條件來(lái)重復(fù)的執(zhí)行某一個(gè)程序段,所以,循環(huán)結(jié)構(gòu)也稱為重復(fù)結(jié)構(gòu)。那么在循環(huán)結(jié)構(gòu)中,可以重復(fù)執(zhí)行的某一個(gè)程序段我們稱為循環(huán)體。
Visual FoxPro 提供了3中循環(huán)結(jié)構(gòu):指定條件的循環(huán),針對(duì)記錄的循環(huán)和指定次數(shù)的循環(huán)。
(1)指定條件的循環(huán)
格式: DO WHILE<條件>
<語(yǔ)句組>
ENDDO
如圖4所示。
圖4 指定條件的循環(huán)結(jié)構(gòu)流程圖
說(shuō)明:DO WHILE是循環(huán)的開始的語(yǔ)句,ENDDO是循環(huán)結(jié)束的語(yǔ)句,它們必須成對(duì)使用,缺一不可。
程序流程:首先來(lái)判斷條件是否滿足。如不滿足,那么“條件”的值為.F.,將不執(zhí)行循環(huán)體中的語(yǔ)句,然后直接執(zhí)行ENDDO后面的語(yǔ)句;如滿足,那么“條件”的值為.T.,將執(zhí)行循環(huán)體的語(yǔ)句后,將返回DO WHILE處,然后再判斷條件是否滿足。繼續(xù)下去,一直到不滿足條件時(shí)結(jié)束循環(huán)為止。
引證:計(jì)算1-10之間的整數(shù)和
CLEAR
S=0
N=1
DO WHILE N<=10
S=S+N
N=N+1
ENDDO
? “S=”,S,”N=”,N
RETURN
(2)針對(duì)記錄的循環(huán)
格式: SCAN[FOR條件]
<語(yǔ)句組>
ENDSCAN
圖5 針對(duì)記錄的循環(huán)結(jié)構(gòu)流程圖
圖6 指定次數(shù)的循環(huán)結(jié)構(gòu)流程圖
說(shuō)明:SCNA 是循環(huán)開始的語(yǔ)句,ENDSCAN是循環(huán)結(jié)束的語(yǔ)句,它們必須成對(duì)出現(xiàn),缺一不可。 選擇“FOR條件”則對(duì)滿足條件的記錄執(zhí)行循環(huán)體的語(yǔ)句;若省略該選項(xiàng),則對(duì)所有記錄執(zhí)行循環(huán)體語(yǔ)句。其中“條件”是一個(gè)邏輯型表達(dá)式。
程序流程:首先要檢查有沒有滿足條件的記錄。如沒有,那么就不執(zhí)行循環(huán)體中的語(yǔ)句,然后,直接執(zhí)行ENDSCAN后面的語(yǔ)句;如果有,那么就執(zhí)行循環(huán)體中的語(yǔ)句后,記錄指針將自動(dòng)移到下一條滿足條件的記錄上,然后再執(zhí)行循環(huán)體中的語(yǔ)句。繼續(xù)下去,一直到對(duì)所有滿足條件的記錄都執(zhí)行了循環(huán)體中的語(yǔ)句之后才能結(jié)束循環(huán),然后執(zhí)行ENDSCAN后面的語(yǔ)句。
引證:逐個(gè)顯示“學(xué)籍”表中入學(xué)成績(jī)大于400的所有女生的姓名、性別和入學(xué)成績(jī)字段值
CLEAR ALL
USE 學(xué)籍
SCAN FOR 入學(xué)成績(jī)>400
IF 性別=”女”
DISPLAY FIELDS 姓名,性別,入學(xué)成績(jī)
ENDIF
ENDSCAN
USE
RETURN
(3)指定次數(shù)的循環(huán)
格式: FOR<變量>=<初值>TO<終值>[STEP步長(zhǎng)]
<語(yǔ)句組> 變量增值
ENDFOR
ENDFOR后面的語(yǔ)句
說(shuō)明:FOR是循環(huán)語(yǔ)句的開始,ENDFOR是循環(huán)語(yǔ)句的結(jié)束,它們必須成對(duì)出現(xiàn),缺一不可。
“語(yǔ)句組”是該循環(huán)的循環(huán)體,它由一組Visual FoxPro的命令組成?!白兞俊庇糜谥付ㄑh(huán)控制變量?!俺踔怠焙汀敖K值”都是數(shù)值型表達(dá)式?!安介L(zhǎng)”循環(huán)控制變量將按步長(zhǎng)增值;若省略該選項(xiàng),則循環(huán)控制變量增值1如圖6所示。
程序流程:首先把“初值”賦給循環(huán)控制變量,之后來(lái)判斷循環(huán)條件是否滿足。如果循環(huán)控制變量的值小于或等于“終值”而且“步長(zhǎng)”是正數(shù)時(shí),或者循環(huán)控制變量的值大于或等于“終值“而且”步長(zhǎng)“是負(fù)數(shù)時(shí),認(rèn)為滿足循環(huán)的條件。然后就先執(zhí)行循環(huán)體的語(yǔ)句,再把循環(huán)控制變量按”步長(zhǎng)“增加值,然后再去判斷循環(huán)條件是否滿足。繼續(xù)下去,一直到循環(huán)條件不滿足時(shí)才能結(jié)束循環(huán),然后執(zhí)行ENDFOR后面的語(yǔ)句。
引證:編程計(jì)算50-200之間的奇數(shù)和
SET TALK OFF
S=0
FOR N=51 TO 200 STEP 2
S=S+N
ENDFOR
? “S=”,S,”N=”,N
SET TALK ON
初學(xué)者在使用結(jié)構(gòu)化程序設(shè)計(jì)方法編寫程序時(shí),首先要仔細(xì)分析需要解決的問(wèn)題,然后找出解決問(wèn)題的方法,然后使用一組Visual FoxPro的命令實(shí)現(xiàn)操作步驟指定的功能,并且把這些命令按照一定的規(guī)則組織在程序文件中。實(shí)踐中證明了模塊化、自頂向下、逐步求精是解決復(fù)雜問(wèn)題的程序設(shè)計(jì)思想。按照結(jié)構(gòu)化程序設(shè)計(jì)方法,在進(jìn)行程序設(shè)計(jì)時(shí)由最上層開始,一層一層地往下確定,把大型程序逐層分解,每個(gè)子模塊完成一個(gè)相對(duì)簡(jiǎn)單的功能。再把實(shí)現(xiàn)子模塊功能的方法一步一步精確化,最終編寫出程序。