第7章 結構化程序設計_第1頁
第7章 結構化程序設計_第2頁
第7章 結構化程序設計_第3頁
第7章 結構化程序設計_第4頁
第7章 結構化程序設計_第5頁
已閱讀5頁,還剩76頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

VisualFoxPro程序設計第7結構化程序設計近幾年來,程序設計的方法正在逐步由面向過程的結構化程序設計轉向面向對象的程序設計,但是在程序設計的過程中,往往將結構化程序設計與面向對象的程序設計結合起來,這樣更有利于設計出功能強大、靈活多變的數據庫應用系統。1第七章結構化程序設計7.1程序設計入門7.2順序結構程序設計7.3分支結構程序設計7.4循環結構程序設計7.5用戶自定義函數和過程27.1程序設計入門基本概念基本語句創建、修改、運行程序37.1.1程序的基本概念1.程序能夠完成一定任務的命令的有序集合。程序文件擴展名:.prg2.程序設計為完成一個特定的任務而編寫程序的過程。3.程序的基本結構順序分支循環47.1.1程序的基本概念4.程序的基本構成規則(1)程序由若干程序行組成。(2)每一個程序行以回車鍵結束;若一個程序行在一行中寫不完,則在行尾用分號(;)表示續行,然后在下一行繼續書寫完整。(3)程序尾部使用CANCEL、RETURN或QUIT等命令表示該程序結束。57.1.2程序的創建、修改與運行一、程序的建立項目管理器方式菜單方式命令方式:

MODIFYCOMMAND<程序文件名>

代碼程序新建67.1.2程序的創建、修改與運行創建程序的步驟(1)打開程序編輯窗口。(2)在程序編輯窗口中逐條輸入命令,并以回車鍵換行。(3)保存程序文件。(.prg)【例7-1】建立一個程序,輸出半徑是4的圓的面積。77.1.2程序的創建、修改與運行二、程序的修改在程序文件的編輯狀態下完成。打開程序三種方法:項目管理器方式菜單方式命令方式:

MODIFYCOMMAND<程序文件名>87.1.2程序的創建、修改與運行三、程序的運行單擊工具欄上的按鈕。項目管理器方式:“運行”按鈕。命令方式:DO<程序文件名>。97.1.3程序中常用的基本語句1、字符串輸入語句ACCEPT[<信息提示>]TO<內存變量>字符串常量例:ACCEPT“請輸入一個數:”TOx接收的數據作為字符型處理功能:在屏幕上顯示[<提示信息>],并等待用戶通過鍵盤輸入內容,把輸入內容作為字符串常量賦值給指定的<內存變量>。107.1.3程序中常用的基本語句【例7-2】從鍵盤上任意鍵入一個數,求其平方根。CLEARACCEPT"請輸入一個數:"TOxy=SQRT(VAL(x))?x,"的平方根是:",yRETURNVal()函數:字符型轉換成數值型117.1.3程序中常用的基本語句2、表達式輸入語句INPUT[<信息提示>]TO<內存變量>字符串常量可接收任意類型數據,需加定界符功能:在屏幕上顯示[<提示信息>],并等待用戶通過鍵盤輸入表達式,再把表達式的值賦給指定的<內存變量>。12例如:s=100inputtoa?"a=",a

執行上述命令若輸入的內容為:s+20,則輸出結果為:a=120這表明變量a接收的是表達式的值。13例如,把上例中的input改成accept:s=100accepttob?"b=",b執行上述命令,若輸入的內容為s+20,則輸出結果為:b=s+20這表明變量b接收的是字符串“s+20”。說明:這兩個命令中的<提示信息>可以缺省。當提示信息缺省的時候,則直接等待用戶輸入。147.1.3程序中常用的基本語句【例7-3】在成績表cj.dbf中,按學號查詢學生的成績情況。CLEARUSEcj.dbfINPUT“輸入要查詢的學號:”TOxh2DISPLAYFORxh=xh2USERETURN字符型數據加引號157.1.3程序中常用的基本語句3、單字符輸入語句WAIT[<提示信息>][TO<內存變量>];

[WINDOW[AT<行>,<列>]];

[TIMEOUT<數值表達式>]

只接收一個字符提示窗口的位置最大等待時間提示信息出現在提示窗口功能:該命令的作用是暫停程序的執行,直到用戶按任意鍵或單擊鼠標或等待輸入一個字符(可存入指定的內存變量)或在指定時間內繼續程序的執行。16例如:WAIT"單字符輸入語句測試"WINDOWAT15,22TIMEOUT5例如:若在主窗口的10行、20列處顯示提示信息“輸入無效,請等待重新輸入…”,10秒鐘后自動關閉提示窗口,程序繼續執行。可使用命令:

WAIT“輸入無效,請等待重新輸入…”WINDOWTIMEOUT10AT10,20。177.1.3程序中常用的基本語句4、定位輸入輸出語句@<行>,<列>[SAY<表達式1>][GET<變量名>];[Default表達式2][<READ>]

在指定位置輸出表達式1指定要輸入或編輯數據的變量名為變量指定初始值可以為變量輸入數據通常get和read配合使用,以便為變量輸入值187.1.3程序中常用的基本語句【例7-5】從鍵盤上任意鍵入一個數,求其平方根。CLEARx=0@10,10SAY"請輸入一個數:"GETxREADy=SQRT(x)@12,10SAY"其平方根是:"@12,22SAYyRETURN197.1.3程序中常用的基本語句5、程序結束語句(1)CANCEL語句功能:結束程序的執行,返回命令窗口,同時關閉所有打開文件。(2)RETURN語句功能:結束程序的執行。如果程序是被另一程序調用,則返回到調用程序,否則返回到命令窗口。(3)

QUIT語句功能:結束程序執行并退出VisualFoxPro系統,返回操作系統。20程序的基本結構

VisualFoxPro系統的程序有兩個特點:一是程序控制流模式,由順序、分支(選擇)、循環三種基本結構構成。二是面向對象可視化的結構程序模塊,在每個模塊的內部也是由程序控制流組成。217.2順序結構程序設計順序結構是按照程序語句的書寫順序,逐條依次執行。【例7-6】從鍵盤輸入半徑,求圓的面積。r=0INPUT“請輸入圓的半徑:”TOrs=0s=3.14*r*r?”該圓的面積為:”,sRETURN227.3分支結構程序設計在分支結構中,程序根據判斷條件是否成立來選擇執行分支,每一個分支對應一個程序段。單分支結構雙分支結構多分支結構237.3.1單分支結構單分支結構用于控制程序中的語句行序列的執行與否,它根據指定的條件表達式來進行判斷。【語句格式】IF<條件表達式><語句行序列>ENDIF條件表達式語句行序列ENDIF后面的語句.T..F.24補充例題:若考試成績大于等于60分,顯示合格Input“請輸入一個成績:”toxIfx>=60?”成績合格”Endif7.3.1單分支結構257.3.2雙分支結構雙分支結構根據指定的一個條件表達式的兩種不同結果值來判斷執行兩個分支中的哪一個分支,從而得到兩種不同的程序結果。【語句格式】IF<條件表達式><語句行序列1>ELSE<語句行序列2>ENDIF條件表達式語句行序列1語句行序列2.T..F.ENDIF后面的語句26補充例題:若考試成績大于等于60分,顯示合格,否則顯示不合格

INPUT“請輸入一個成績:”toxIFx>=60?”成績合格”

ELSE?”成績不合格”

ENDIF7.3.2雙分支結構277.3.2雙分支結構【例7-10】假設托運50公斤以內的行李按每公斤0.8元計費,如果超過50公斤時,超過的部分每公斤加價0.4元,計算公式如下:(1)當x≤50公斤:y=0.8*x(2)當x>50公斤:y=0.8*50+(0.8+0.4)*(x-50)從鍵盤任意鍵入行李的重量,求該行李的托運費。編程如下:INPUT"請輸入行李的重量:"TOxIFx<=50y=0.8*xELSEy=0.8*50+(0.8+0.4)*(x-50)ENDIF@10,30SAY"行李的重量為:"+STR(x,6,2)+"公斤,其托運費;為:"+STR(y,6,2)+"元"RETURN287.3.3多分支結構【語句格式】DOCASECASE<條件表達式1><語句行序列1>CASE<條件表達式2><語句行序列2>…………CASE<條件表達式n><語句行序列n>[OTHERWISE<語句行序列n+1>]ENDCASE297.3.3多分支結構條件表達式1.T.語句行序列1EDNCASE后面的語句條件表達式2.T.語句行序列2.F..F..F.條件表達式n語句行序列n.F.……語句行序列n+1.T.執行流程307.3.3多分支結構注意事項

DOCASE語句只執行第一個條件表達式值為.T.的CASE語句下的語句行序列,之后便結束該多分支語句。假如各條件表達式的值均為.F.,若有OTHERWISE子句,則程序執行<語句行序列n+1>,之后結束該多分支語句;否則直接結束多分支語句。在構成多分支語句時,DOCASE和ENDCASE必須配對出現。在表達分支語句時,不允許在一個命令行中輸入完,必須按照【語句格式】中規定的樣式一行一個回車分行鍵入。317.3.3多分支結構【例7-11】從鍵盤上輸入一個成績值,判斷出它所對應的等級。(85-100:優秀;75-84:良好;60-74:及格;0-59:不及格)CLEARINPUT"請輸入一個成績:"TOnxDOCASECASEnx>=85grade="優秀"CASEnx>=75grade="良好"CASEnx>=60grade="及格"OTHERWISEgrade="不及格"ENDCASE@10,29SAYSTR(nx)+"對應的成績等級是:"+gradeRETURN327.3.3多分支結構【例7-12】判斷隨機給定的某一天是星期幾。CLEARINPUT"請輸入一個日期:"TOdx

x=DOW(dx)DOCASE CASEx=1 y="星期日" CASEx=2 y="星期一"……CASEx=7 y="星期六"ENDCASE@10,30SAYDTOC(dx)+"是:"+yRETURN

337.4循環結構程序設計循環結構是指從程序的某處開始有規律的重復執行某一程序段的程序結構。三種循環結構:DOWHILE循環FOR循環SCAN循環兩個命令:EXITLOOP347.4.2FOR循環FOR循環根據循環變量的初值、終值和步長決定循環體的執行次數。適用條件:循環次數已知格式:FOR

<循環變量>=<初值>

TO

<終值>[STEP<步長>][LOOP][EXIT]ENDFOR/NEXT35執行流程循環變量在初值與終值之間?循環變量=初值語句行序列循環變量=循環變量+步長.T..F.ENDFOR后面的語句367.4.2FOR循環例1:計算S=1+2+……+100

S=0&&用于存放累加和

FORI=1TO100STEP1S=S+I

ENDFOR?S100以內的奇、偶數和?377.4.2FOR循環注意事項FOR與ENDFOR/NEXT必須成對出現,缺一不可步長可正可負可省略(缺省時為1)。當初值大于終值時,步長為負數例如:

FORi=10to1step-4??iENDFOR387.4.2FOR循環【例7-19】求1~100之間既非3的倍數也非5的倍數的所有奇數的和。CLEAs=0FORi=1TO100STEP2IFMOD(i,3)<>0andMOD(i,5)<>0s=s+i

ENDIFENDFOR?"1~100之間既非3的倍數也非5的倍數的所有奇數的和",sRETURN39關于LOOP和EXIT語句LOOP語句結束本次循環,它使得其后的語句在本次循環時不被執行,跳入下次循環EXIT語句結束整個循環,可放在循環中的任何位置,無條件的退出循環。407.4.2FOR循環【例7-19】求1~100之間既非3的倍數也非5的倍數的所有奇數的和。CLEAs=0FORi=1TO100STEP2IFMOD(i,3)=0ORMOD(i,5)=0

LOOPENDIFs=s+iENDFOR?"1~100之間既非3的倍數也非5的倍數的所有奇數的和",sRETURN417.4.2FOR循環【例7-20】判斷從鍵盤上輸入的一個數是否為素數。CLEAINPUT"請輸入一個數N:"TOnklkey=.T.ni=2FORni=2TOnk-1IFMOD(nk,ni)=0

lkey=.F.

EXITENDIFENDFOR?"您輸入的數:"+IIF(lkey,"是素數","不是素數")RETURN

427.4.1DOWHILE循環DOWHILE循環又稱條件循環,是根據條件表達式的值來決定循環體的執行次數的一種循環結構。適用條件:循環次數未知格式:DOWHILE<條件表達式><語句行序列>[LOOP][EXIT]ENDDO循環體437.4.1DOWHILE循環執行流程條件表達式循環體.T..F.循環體中要有使得條件表達式最終為.F.的語句或通過EXIT強制退出ENDDO后面的語句447.4.1DOWHILE循環例1:計算S=1+2+……+100I=1S=0DOWHILE

I<=100

S=S+II=I+1ENDDO?S計算N!(N在0至10至間)457.4.1DOWHILE循環例2:將ASC字符組成的字符串反序顯示變量c變量pabcdeffedcbaLEFT(c,1)SUBSTR(c,2)c=+pp=LEN(c)=0退出循環!循環條件?LEN(c)>0467.4.1DOWHILE循環Store"abcdef"tocP=space(0)DoWhile

LEN(c)>0P=LEFT(c,1)+Pc=SUBSTR(c,2)Enddo?P477.4.1DOWHILE循環【例7-13】將由任意字符(包括漢字)組成的字符串反序顯示。CLEARSTORE"ab程序設計cd"TOc1,c2p=SPACE(0)48DOWHILELEN(c1)>0x=ASC(LEFT(c1,1))

IFx>127y=2ELSEy=1ENDIFp=LEFT(c1,y)+pc1=SUBSTR(c1,y+1)ENDDO?c2+"的反序列為:"+pRETURN497.4.1DOWHILE循環【例7-21】統計教師表中職稱名稱為教授、副教授、講師、助教的各有多少人。CLEARUSEjs.dbfEXCLUSIVESTORE0TOt1,t2,t3,t4DOWHILE

.NOT.EOF()DOCASECASEzcmc="教授"t1=t1+1CASEzcmc="副教授"t2=t2+150

CASEzcmc="講師"t3=t3+1OTHERWISEt4=t4+1ENDCASE

SKIPENDDO@8,30SAY"教授的人數:"+STR(t1)@10,30SAY"副教授的人數:"+STR(t2)@12,30SAY"講師的人數:"+STR(t3)@14,30SAY"助教的人數:"+STR(t4)USERETURN517.4.1DOWHILE循環LOOP命令(短路語句):跳出本次循環返回到循環的開始處,重新對循環條件進行判斷。【例7-15】將教師表(js.dbf)中基本工資小于800元的教師的基本工資增加200元。CLEARUSEjs.dbfEXCLUSIVEDOWHILE.NOT.EOF()IFjbgz>=800SKIP

LOOPENDIFREPLACEjbgzWITHjbgz+200SKIPENDDOUSERETURN

527.4.1DOWHILE循環EXIT命令(循環退出語句)【例7-20】要求產生一個在70~80之間的隨機數。x=0DOWHILE.T.x=INT(RAND()*100)

IFx>70ANDx<80EXITENDIFENDDO@10,20SAYxRETURN537.4.3SCAN循環適用條件:僅用于處理表中的記錄格式:

SCAN[<范圍>][FOR<條件表達式1>][WHILE<條件表達式2>]<語句組>[LOOP][EXIT]ENDSCAN循環控制條件:EOF()的值SCAN循環又稱數據表掃描型循環或者指針型循環,即根據表中的當前記錄指針,決定循環體的執行次數。54EOF()?.F.在<范圍>內.T..T..F.條件表達式2.T..F.條件表達式1.T.語句行序列記錄指針自動下移.F.ENDSCAN后面的語句SKIP557.4.3SCAN循環【例7-22】將教師表(js.dbf)中職稱是“助教”的基本工資增加500元,其他不變。CLEARUSEjs.dbfEXCLUSIVESCANALLFORzcmc="助教"REPLACEjbgzWITHjbgz+500ENDSCANUSERETURN56對比:DOWHILE循環將教師表(js.dbf)中基本工資小于800元的教師的基本工資增加200元。CLEARUSEjs.dbfEXCLUSIVEDOWHILE.NOT.EOF()IFjbgz>=800SKIPLOOPENDIFREPLACEjbgzWITHjbgz+200SKIPENDDOUSERETURN

577.4.3SCAN循環【例7-23】統計學生表中女生黨員的人數。CLEARUSExs.dbfEXCLUSIVEx=0SCANALLFORxb="女".AND.dyf

x=x+1ENDSCAN@10,30SAY“女生黨員的人數是:"@10,52SAYxUSERETURN

587.4.4循環嵌套循環嵌套在一個循環的循環體內又包含有其他循環。注意:(1)內層循環必須被完全包含在外層循環之中,不得交叉。(2)程序每執行一次外層循環,則其內層循環必須執行完所有的循環次數,之后才能進入到外層的下一次循環,依此類推。(3)當循環語句與分支語句嵌套使用時,也不能出現交叉。59【例7-24】編程計算s=1!+3!+5!+…+25!s=0p=1FORi=1TO25STEP2

FORj=1toip=p*j

ENDFOR

s=s+pENDFOR?sRETURN607.5用戶自定義函數和過程在程序設計中,經常把完成一個特定功能的程序編寫成一個函數或過程,作為一個獨立的模塊,以便在其他程序使用該功能時調用此模塊。這種用以完成一個特定功能的程序,稱為用戶自定義函數或過程。必要性:同樣功能的程序可以被多個程序所調用61返回處理結果時,使用RETURN。缺少RETURN語句或缺少RETURN后面的表達式時,返回值為.T.參數的意義:對不同的數據進行類似的處理,增加靈活性。過程定義

PROCEDURE<過程名>[PARAMETERS<形式參數表>]<語句行序列>[RETURN[表達式]]

ENDPROC7.5用戶自定義函數和過程62函數定義

FUNCTION<用戶自定義函數名>[PARAMETERS<形式參數表>]<語句行序列>[RETURN[<表達式>]]

ENDFUNC返回處理結果時,使用RETURN。缺少RETURN語句或缺少RETURN后面的表達式時,返回值為.T.參數的意義:對不同的數據進行類似的處理,增加靈活性。7.5用戶自定義函數和過程63函數和過程的調用DO<函數名或過程名>[WITH<參數表>]函數名或過程名([<參數表>])7.5用戶自定義函數和過程64函數與過程的區別

從實現功能來說,兩者相同,函數與過程均可。通常:需要返回計算的值則應使用函數,不需要返回值的使用過程。7.5用戶自定義函數和過程65PROCEDURE示例M=5?jc(m)PROCEDUREjc

PARAMETERSn p=1 FORi=1ton p=p*i ENDFOR

RETURNpENDPROCFUNCTION示例(將過程改為函數)M=5?jc(m)FUNCTIONjc

PARAMETERSn p=1 FORi=1ton p=p*i ENDFOR

RETURNpENDFUNC輸出結果都是:1207.5用戶自定義函數和過程66PROCEDURE示例M=5dojcwithmPROCEDUREjc

PARAMETERSn p=1 FORi=1ton p=p*i ENDFOR

?pENDPROCFUNCTION示例(將過程改為函數)M=5dojcwithmFUNCTIONjc

PARAMETERSn p=1 FORi=1ton p=p*i ENDFOR

?pENDFUNC輸出結果都是:1207.5用戶自定義函數和過程67過程與函數的創建方法放在程序文件的后面過程文件:存儲了一個或多個過程或函數的文件。獨立程序:只存儲了一個過程或函數的文件,文件名必須與過程名或函數名相同,它可以作為過程或函數使用。7.5用戶自定義函數和過程實驗指導書7-3:168【例7-27】利用用戶自定義函數求x!+y!,要求x和y從鍵盤上隨機輸入。代碼如下:CLEARINPUT"請輸入x的值:"TOxs1=fJC(x)&&調用函數fJCINPUT"請輸入y的值:"TOys2=fJC(y)&&調用函數fJC?STR(x,4),"!+",STR(y,4),"!=",STR(s1+s2,8)RETURN放在程序文件的后面舉例69*函數fJC的定義FUNCTION

fJC

PARAMETERSns=1

IFn>=1

FORi=1TOns=s*i

ENDFOR

ENDIFRETURN(s)70【例7-28】創建一個用戶自定義函數CCDOW()。功能是:返回一個日期是星期幾,如:CCDOW({^1999/3/1})的返回值是“星期一”。代碼如下:CLEARcx={}@4,20SAY"請輸入一個字符型日期:"GET

cxREAD@8,20SAY"輸入的日期是:"??CCDOW(cx)RETURN放在程序文件的后面舉例71FUNCTION

CCDOW(cx)

dx=DOW(cx)

DOCASE

CASEdx=1 title1="星期日"

CASEdx=2title1="星期一"……

CASEdx=7title1="星期六"

ENDCASE

RETURN(title1)ENDFUNC72【例7-29】創建一個用戶自定義函數CCDOW()。功能是:返回一個日期是星期幾,如:CCDOW({^1999/3/1})的返回值是“星期一”。(1)主程序文件,文件名為MAIN.PRGCLEARcx={}@4,20SAY"請輸入一個字符型日期:"GET

cxREAD@8,20SAY"輸入的日期是:"??CCDOW(cx)RETURN獨立程序形式舉例:73(2)用戶自定義函數文件,文件名為CCDOW.prgFUNCTION

CCDOW(cx)

dx=DOW(cx)

DOCASE

CASEdx=1 title1="星期日"

CASEdx=2title1="星期一"……

CASEdx=7title1="星期六"

ENDCASE

RETURN(title1)ENDFUNC74過程文件:多個函數或過程存放在一個文件中。(1)過程文件的建立與修改

方法同程序文件的建立與修改。可使用命令:【格式】MODIFYCOMMAND<過程文件名>(2)過程文件的打開對于過程文件在調用之前必須先打開【格式】SETPROCEDURETO<過程文件名>(3)過程文件的關閉【格式】CLOSEPROCEDURE75調用函數和過程時的查找順序在本文件中查找在已打開的過程文件中查找在默認目錄中的獨立程序中查找76參數傳遞的兩種方式按數值傳遞按引用傳遞(傳遞地址)傳遞方式的設置:setudfparmstovalue時,默認設置:

do函數過程名with變量名

---

溫馨提示

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

評論

0/150

提交評論