《VisualFoxPro程序設計》第六章結構化程序設計.ppt_第1頁
《VisualFoxPro程序設計》第六章結構化程序設計.ppt_第2頁
《VisualFoxPro程序設計》第六章結構化程序設計.ppt_第3頁
《VisualFoxPro程序設計》第六章結構化程序設計.ppt_第4頁
《VisualFoxPro程序設計》第六章結構化程序設計.ppt_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Visual FoxPro 6.0 程序設計.課件,-1-,第6章 結構化程序設計,6.1 程序文件 6.2 程序控制結構 6.3 過程與過程調用 6.4 程序的調試,提示:單擊各個標題前的動畫符號“ ” ,鏈接到相應的章節(jié)。,Visual FoxPro 6.0 程序設計.課件,-2-,在程序設計的方法中,結構化程序設計是程序設計的基本方法。結構化程序設計的基本思想是逐步求精、模塊化和自頂向下,將一個復雜的程序系統(tǒng)的設計任務分成多個易于控制和處理的子任務,每個子任務都是可獨立編程的子程序、過程或函數(shù)模塊。其程序控制結構有順序結構、分支結構和循環(huán)結構三種。,Visual FoxPro 6.0 程序設計.課件,-3-,6.1 程序文件,6.1.1 程序文件建立 6.1.2 簡單的交互方式輸入輸出命令 6.1.3 應用程序的調試與執(zhí)行,Visual FoxPro 6.0 程序設計.課件,-4-,6.1 程序文件,前面已經(jīng)介紹了Visual FoxPro的交互式操作方式:菜單操作方式和命令操作方式。這兩種方式對于需要大量重復操作的數(shù)據(jù)庫管理工作來說,效率低下;而且這兩種方式都要求用戶熟練掌握Visual FoxPro中的各種數(shù)據(jù)操作,這在實際應用環(huán)境中并不現(xiàn)實。因此,Visual FoxPro提供了程序文件方式來管理數(shù)據(jù)庫,即通過程序文件編輯工具,將數(shù)據(jù)庫操作的命令、函數(shù)等編制成一個有序序列存放在程序文件中,然后通過菜單操作方式或命令操作方式運行該程序文件,即可完成相應的一系列操作,程序文件的擴展名為.PRG。,Visual FoxPro 6.0 程序設計.課件,-5-,6.1.1 程序文件的建立,Visual FoxPro中編寫的代碼都存放在純文本格式的文件中,因此任何可以建立、編輯文本文件的工具都可以創(chuàng)建和編輯Visual FoxPro程序文件,通常使用的是Visual FoxPro提供的內部編輯器。程序文件建立的方法有多種,常用的有下列3種方法。 1.菜單方式 單擊“文件”|“新建”命令,在彈出的“新建”對話框中,選擇文件類型為“程序”,然后單擊“新建文件”按鈕,即可打開如圖所示的程序編輯窗口。,在編輯窗口中可以逐條輸入命令,程序文件建立好后,可以單擊“文件”“保存”命令來保存該程序文件。,Visual FoxPro 6.0 程序設計.課件,-6-,2.項目管理器方式,(1)單擊“文件”|“新建”命令,在彈出的“新建”對話框中,選擇文件類型為“項目”,然后單擊“新建文件”按鈕,在打開的“創(chuàng)建”對話框中輸入項目文件名后,單擊“保存”按鈕,即可打開“項目管理器”對話框。 (2)在“項目管理器”對話框的“全部”選項卡中,單擊“代碼”前的“+”號展開“代碼”文件夾,選擇“程序”選項,然后單擊“新建”按鈕,如圖所示,也可打開程序編輯窗口。,Visual FoxPro 6.0 程序設計.課件,-7-,3.命令方式,命令格式如下: MODIFY COMMAND 在命令窗口中輸入該命令后,也會打開程序編輯窗口。 其中各參數(shù)的說明如下: 如果命令中給出,若該文件不存在,則打開以該文件名為標題的程序編輯窗口;若該文件已存在,則在程序編輯窗口中打開該文件,可以重新進行編輯修改。 如果命令中缺省,則會打開默認以“程序1”、“程序2”為標題的程序編輯窗口,在保存時,用戶應重新為程序文件命名。 若中未給出包含盤符和路徑的絕對路徑,默認保存在當前文件中;中可以缺省程序文件的擴展名,系統(tǒng)會自動加上擴展名.PRG。,Visual FoxPro 6.0 程序設計.課件,-8-,6.1.2 簡單的交互方式輸入輸出命令,在程序的執(zhí)行過程中,經(jīng)常需要從鍵盤輸入數(shù)據(jù),或將運行結果在屏幕上顯示出來,這就需要在程序設計中使用到交互式的輸入輸出命令。 1.輸入單字符命令 輸入單字符命令的格式如下: WAIT TO 其中各參數(shù)的說明如下: 表示在等待用戶輸入時,在屏幕上顯示的提示內容,通常是一個字符串,需用單引號、雙引號或方括號作為定界符括起來,也可以是字符串變量。若省略該項,屏幕上顯示的是系統(tǒng)默認的提示信息“按任意鍵繼續(xù)”。 TO 表示將輸入的單個字符賦給內存變量。輸入字符時,不需輸入字符的定界符,否則內存變量得到的是第一個定界符;若未輸入字符就按回車鍵或單擊鼠標,則內存變量得到空值。若省略該項,則輸入的字符不能保留。 注意:該命令一般只是為了顯示提示信息,等待用戶按任意鍵后繼續(xù)執(zhí)行。,Visual FoxPro 6.0 程序設計.課件,-9-,2.輸入字符串命令,輸入字符串命令的格式如下: ACCEPT TO 其中各參數(shù)的說明如下: 表示在等待用戶輸入時,在屏幕上顯示的提示內容,通常是一個字符串,需用單引號、雙引號或方括號作為定界符括起來,也可以是字符串變量。 TO 表示將輸入的字符串賦給內存變量。輸入字符串時,不需輸入字符串的定界符,否則定界符也會作為字符串的一部分被賦給內存變量;若未輸入字符就按回車鍵或單擊鼠標,則內存變量得到空值。若省略該項,則輸入的字符不能保留。 【例6-1】編寫程序文件prog.prg,要求根據(jù)鍵盤輸入的學生姓名,顯示該學生的學生信息。 分析:要在表中查詢滿足條件的記錄,首先應打開該表,根據(jù)題目要求,本題應先打開的是學生信息表student,再用ACCEPT命令將所輸入的學生姓名存放到內存變量中,再根據(jù)該值在表中進行查詢并顯示,所有操作結束后應關閉該表。,Visual FoxPro 6.0 程序設計.課件,-10-,程序編輯窗口的輸入如圖6-3所示,運行時在屏幕中輸入“王燕燕”,結果如圖6-4所示。,圖6-3 程序編輯窗口的輸入,圖6-4 結果顯示,Visual FoxPro 6.0 程序設計.課件,-11-,3.輸入任意數(shù)據(jù)命令,輸入任意數(shù)據(jù)命令的格式如下: INPUT TO 其中各參數(shù)的說明如下: 表示在等待用戶輸入時,在屏幕上顯示的提示內容,通常是一個字符串,需用單引號、雙引號或方括號作為定界符括起來,也可以是字符串變量。 TO 表示將輸入的數(shù)據(jù)賦給內存變量。INPUT命令可以接受字符型、數(shù)值型、邏輯型、日期型和日期時間型數(shù)據(jù),可以接受常量、變量或一般表達式。數(shù)值型常量可直接輸入,字符型常量必須加定界符,邏輯型常量必須加圓點定界符(如.T.或.F.),日期型和日期時間型常量既可按嚴格格式輸入,也可利用相應的轉換函數(shù)輸入(如2008/5/27、2008-5-27 11:14:20a、CTOD(“05-27-08“)、CTOT(“05-27-08 11:14:20a“))。若未輸入直接按回車鍵,屏幕會繼續(xù)顯示提示信息等待輸入。,Visual FoxPro 6.0 程序設計.課件,-12-,4.非格式輸出命令,該命令的格式如下: ?|? 該命令的功能是在Visual FoxPro的主窗口中換行或不換行輸出中各個表達式的值,其中,?表示換行輸出,即中各個表達式的值在當前主窗口中最后一次輸出位置的下一行輸出;?表示不換行輸出,即中各個表達式的值在當前主窗口中最后一次輸出位置后直接輸出,并不換行。,Visual FoxPro 6.0 程序設計.課件,-13-,5.格式輸入輸出命令,該命令格式如下: SAY GET READ 其中各參數(shù)的說明如下: :表示在Visual FoxPro的主窗口中指定的位置輸入輸出。起始行列號均為0,行和列可以是常量值,也可以是數(shù)值型表達式。 SAY GET :如果后面沒有READ選項,將在指定的位置輸出表達式和變量的值;如果后面有READ選項,則對變量的原有值進行編輯修改,并將結果保存在變量中。其中的變量可以是已賦值的內存變量,也可以是字段變量,類型可以是數(shù)值型、字符型、邏輯型、日期型、日期時間型、備注型、通用型等。,Visual FoxPro 6.0 程序設計.課件,-14-,圖6-5 程序編輯窗口的輸入,圖6-6 結果顯示,【例6-2】編寫程序prog2.prg,使用格式輸入輸出命令,修改學生信息表student中指定學號的學生記錄的字段值。 程序編輯窗口的輸入如圖6-5,運行時在屏幕中輸入“王燕燕”,運行結果如圖6-6。,Visual FoxPro 6.0 程序設計.課件,-15-,6.其他輔助命令,(1)清屏命令 清屏命令主要用于清除VFP主窗口中的內容,清除完后光標回到窗口的左上角,該命令格式如下:CLEAR (2)終止程序命令 該命令的功能是終止程序的運行,返回VFP的主窗口,同時釋放所有私有變量,其格式如下:CANCEL (3)退出系統(tǒng)命令 該命令的功能是退出VFP系統(tǒng),回到操作系統(tǒng),退出前將關閉所有文件,清除所有變量,其格式如下:QUIT (4)設置會話狀態(tài)命令 該命令的格式如下:SER TALK ON|OFF 該命令用于設置是否顯示命令執(zhí)行過程中的狀態(tài)信息,默認時為SET TALK ON,即打開會話狀態(tài)。通常在執(zhí)行單命令或調試程序時,設置為ON狀態(tài);而在程序執(zhí)行時設置為OFF狀態(tài)。,Visual FoxPro 6.0 程序設計.課件,-16-,6.1.3 應用程序的執(zhí)行,運行程序文件的方法有多種,常用的方法主要有以下3種: 單擊“程序”|“運行”命令,在打開的“運行”對話框中選擇要運行的程序文件,然后單擊“運行”按鈕即可運行該程序文件。 在“項目管理器”對話框的“全部”選項卡中,先選中要運行的程序,然后單擊“運行”按鈕,即可執(zhí)行該程序。 在命令窗口中輸入命令:DO ,也可以執(zhí)行相應的程序文件。 事實上,在程序輸入完畢后,不關閉程序編輯窗口,直接單擊工具欄的“運行”按鈕可以直接運行程序,若程序無語法錯誤,可以得到運行結果,若程序中存在語法錯誤,則會彈出“程序錯誤”對話框,給出錯誤的提示信息,此時,可以單擊“取消”按鈕,或按【Esc】鍵終止程序的運行,再根據(jù)錯誤提示修改程序。,Visual FoxPro 6.0 程序設計.課件,-17-,6.2 程序控制結構,6.2.1 順序結構程序設計 6.2.2 分支結構程序設計 6.2.3 循環(huán)結構程序設計,Visual FoxPro 6.0 程序設計.課件,-18-,6.2程序控制結構,程序的控制結構包括順序結構、分支結構和循環(huán)結構3種,每一種控制結構可以包含一個或多個語句,任何程序都是由這3種基本控制結構構成的。,Visual FoxPro 6.0 程序設計.課件,-19-,6.2.1 順序結構,順序結構是程序設計中最簡單、最常用的基本結構,在該結構中,程序按照命令語句書寫的先后順序依次執(zhí)行,該結構的流程圖如圖6-7所示。順序結構是任何程序的主體基本結構,在分支結構和循環(huán)結構內部,也常以順序結構作為其子結構,前面介紹的例子使用的都是順序結構。 順序結構的基本組成語句是數(shù)據(jù)的輸入輸出、賦值語句等,數(shù)據(jù)的輸入和輸出已在上一節(jié)介紹,下面介紹順序結構中常用的賦值語句和語句的續(xù)行與注釋功能。,Visual FoxPro 6.0 程序設計.課件,-20-,1.賦值語句,程序設計中經(jīng)常要使用變量,變量在使用之前需要設定一個初始值,使用過程中也可能要重新賦值,因此可以使用賦值語句將指定的值賦給變量或對象的某個屬性,賦值語句主要有如下兩種格式: (1)使用賦值符號“=” 該語句的格式如下:= 該語句的意思是將表達式的值計算出來后賦給變量名所代表的存儲單元。 (2)使用STORETO命令 該命令的格式如下:STORE TO 該命令是將表達式的值計算出來后賦值變量名表中的每個變量。如:STORE 3*5 TO a,b,c,d 是將變量a,b,c,d同時賦值為15,Visual FoxPro 6.0 程序設計.課件,-21-,在使用賦值語句時需要注意以下幾點: 應注意區(qū)分賦值符號與數(shù)學中的等號。a=3應讀作“將數(shù)值3賦給變量a”,a=a+1表示將原來a的值加上1后再放到原來a的存儲單元中,即將原來a的值加上1后再賦給a。因此,下面兩個語句的意思是不同的: X=y &表示將y的值賦給x y=x &表示將x的值賦給y 若要對日期型或日期時間型內存變量賦值,如果表達式是同樣類型的常量,必須用花括號“ ”括起來并在前面加一個“”符號,如果表達式是字符串,則應用轉換函數(shù)將其轉換為相應的類型。 例如:t1=2008/5/27 t2=2008-5-27 11:14:20a t3=CTOD(“05-27-08“) t4=CTOT(“05-27-08 11:14:20a“) 賦值符號的左邊只能是變量,不能是表達式,如x+y=z是錯誤的賦值語句。,Visual FoxPro 6.0 程序設計.課件,-22-,2.語句的續(xù)行,當一條語句很長時,在程序編輯窗口中書寫或閱讀都不方便,例如: select top 50 percent 學號,姓名,身高,year(出生日期) 出生年份from student order by 出生年份 desc,身高 這時,為了便于書寫和理解,可以使用語句的續(xù)行功能,用分號“;”將較長的語句分為兩行或多行。因此上述語句可以改寫為: select top 50 percent 學號,姓名,身高,year(出生日期) 出生年份; from student; order by 出生年份 desc,身高 注意:作為續(xù)行符的分號只能出現(xiàn)在行尾。,Visual FoxPro 6.0 程序設計.課件,-23-,3.語句的注釋,為了提高程序的可讀性,通常在程序的適當位置加上相應的注釋,Visual FoxPro中提供了兩種注釋語句。 (1)程序注釋 該語句的格式如下:NOTE|* 該語句通常單獨放置一行,用于對程序進行注釋,程序運行時,不執(zhí)行以NOTE或*開頭的行。 (2)行注釋 語句格式如下:& 該語句通常放在某行命令之后,用于對該行命令進行注釋。 注意:不能在命令語句行的續(xù)行分號后面加入注釋。,Visual FoxPro 6.0 程序設計.課件,-24-,6.2.2 分支結構,分支結構也稱為選擇結構,是在程序執(zhí)行時,根據(jù)不同的條件,選擇執(zhí)行不同的語句。Visual FoxPro中提供了兩種分支結構語句,分別是IF語句和DO CASE語句。 1.IF語句 IF語句主要有兩種形式:單分支形式和雙分支形式。 (1)單分支形式 單分支形式的格式如下: IF ENDIF 注意:IF和ENDIF必須成對使用,并分兩行書寫。,Visual FoxPro 6.0 程序設計.課件,-25-,其中條件表達式是關系表達式或邏輯表達式,語句執(zhí)行時,首先計算條件表達式的值,若為真(.T.)則執(zhí)行語句塊中的語句,否則不執(zhí)行語句塊。無論是否執(zhí)行語句塊中的語句,程序都將轉向ENDIF后面的下一條語句繼續(xù)執(zhí)行。 流程圖如圖。,Visual FoxPro 6.0 程序設計.課件,-26-,【例6-3】從鍵盤上輸入兩個數(shù)x和y,比較大小,若x小于y,則交換兩個變量值,使得x不小于y。 分析:根據(jù)題目要求,若滿足“x小于y”這個條件,則執(zhí)行“交換兩個變量值”的操作,因此IF后面的應是“x,應是“交換兩個變量值”。 由于計算機內存有易被覆蓋的特點,因此計算機中交換兩個變量的值只能借助于第三個中間變量來間接交換,如圖6-9所示,則交換兩個變量值的代碼應為: t=x x=y y=t,Visual FoxPro 6.0 程序設計.課件,-27-,本題程序代碼如下: *prog3.prg input “x=“ to x input “y=“ to y if xy t=x x=y y=t endif ?“x=“,x ?“y=“,y,Visual FoxPro 6.0 程序設計.課件,-28-,(2)雙分支形式,雙分支格式: IF ELSE ENDIF 語句執(zhí)行時,根據(jù)條件表達式的值選擇執(zhí)行兩個語句塊中的一個。若條件表達式的值為真(.T.),則執(zhí)行IF后面的語句塊1,然后執(zhí)行ENDIF后面的語句;若條件表達式的值為假(.F.),則執(zhí)行ELSE后面的語句塊2,然后執(zhí)行ENDIF后面的語句。其流程圖如圖6-10所示。,Visual FoxPro 6.0 程序設計.課件,-29-,用雙分支實現(xiàn),其程序代碼如下: if x=0 y=cos(x)+sqrt(x2+1) else y=log(x2)+x-10 endif 也可用單分支實現(xiàn),其程序代碼如下: y=cos(x)+sqrt(x2+1) if x0 y=log(x2)+x-10 endif,【例6-4】計算分段函數(shù):,Visual FoxPro 6.0 程序設計.課件,-30-,(3)IF語句的嵌套,IF語句的上述兩種形式中的語句塊可以包含任何合法的VFP語句,當然也可以包含另一條IF語句,這就構成了IF語句的嵌套,利用IF語句的嵌套可以實現(xiàn)多分支的選擇結構, 【例6-5】從鍵盤上輸入3個數(shù)a、b、c,求這3個數(shù)的最大值并輸出。 分析:假設ab且ac,則最大值肯定是a,若這個條件不滿足,而所滿足的條件是ba且bc,則最大值肯定是b,否則最大值肯定是c。,Visual FoxPro 6.0 程序設計.課件,-31-,程序代碼如下:,*prog5.prg input “請輸入a的值“ to a input “請輸入b的值“ to b input “請輸入c的值“ to c if ab and ac t=a else if ba and bc t=b else t=c endif endif ?“三個數(shù)中的最大值是:“,t,Visual FoxPro 6.0 程序設計.課件,-32-,2.DO CASE語句,該語句的格式如下: DO CASE CASE CASE CASE OTHERWISE ENDCASE 語句執(zhí)行時,依次判斷條件表達式的值,一旦某一條件滿足,則執(zhí)行相應語句塊;如果所有條件表達式的值都為假,若無OTHERWISE子句,則不執(zhí)行任何語句,若有OTHERWISE子句,則執(zhí)行OTHERWISE后面的語句塊n+1,無論執(zhí)行哪一個語句塊后,都不再判斷下面的條件,而轉去執(zhí)行ENDCASE后面的語句,其流程圖如圖6-11所示,Visual FoxPro 6.0 程序設計.課件,-33-,【例6-6】某百貨公司打折促銷的優(yōu)惠方法:每位顧客一次性購物: 500元以上者,按九五折優(yōu)惠; 1000元以上者,按九折優(yōu)惠; 2000元以上者,按八五折優(yōu)惠; 5000元以上者,按八折優(yōu)惠。 編寫程序,實現(xiàn)輸入購物款數(shù),計算并輸出優(yōu)惠后的價格。,程序代碼如下: *prog6.prg input “請輸入原價:“ to x do case case x500 y=x case x1000 y=x*0.95 case x2000 y=x*0.9 case x5000 y=x*0.85 otherwise y=x*0.8 endcase ?“優(yōu)惠后的價格是:“,y,Visual FoxPro 6.0 程序設計.課件,-34-,6.2.3 循環(huán)結構,VFP提供了3種循環(huán)語句:當型循環(huán)DO WHILE語句、計數(shù)型循環(huán)FOR語句和掃描型循環(huán)SCAN語句。 1. 當型循環(huán)DO WHILE語句 該語句的格式如下: DO WHILE EXIT LOOP ENDDO,Visual FoxPro 6.0 程序設計.課件,-35-,【例6-7】編制程序求1+2+3+100的和,并輸出結果。 分析:實現(xiàn)自然數(shù)的累加,應該設置一個累加變量和一個計數(shù)變量,累加變量的初值為0,計數(shù)變量從1開始逐次累加到累加變量中,每累加一次,計數(shù)變量加1,直到計數(shù)變量為100為止。 程序代碼如下: *prog7.prg s=0 i=1 do while i=100 s=s+i i=i+1 enddo ?“s=“,s,Visual FoxPro 6.0 程序設計.課件,-36-,【例6-8】統(tǒng)計學生信息表student中年齡在20歲以上的學生人數(shù),并輸出結果。 程序代碼如下: *prog8.prg use student n=0 &計數(shù)變量初值為0 do while not eof() &循環(huán)條件是還未到表尾 if year(date()-year(出生日期)20 n=n+1 endif skip &修改記錄指針,指向下一記錄,若沒該句,將造成死循環(huán) enddo use ?“年齡大于20歲的人數(shù)有:“,n,Visual FoxPro 6.0 程序設計.課件,-37-,該語句的格式如下: FOR = TO STEP EXIT LOOP ENDFOR|NEXT 語句執(zhí)行時,首先給循環(huán)變量賦予初值,與終值比較,若超過終值,則循環(huán)體一次也不執(zhí)行,直接轉去執(zhí)行ENDFOR|NEXT后面的語句;若不超過終值,則依次執(zhí)行循環(huán)體中的語句,遇到ENDFORNEXT語句,將循環(huán)變量加上步長后,程序轉回到循環(huán)初始語句,繼續(xù)判斷,流程圖如圖6-13所示。 步長可正可負.步長為1時,可省略STEP子句。 當循環(huán)次數(shù)事先已知時,通常使用計數(shù)型循環(huán),循環(huán)次數(shù)可以根據(jù)下式計算: INT(ABS(終值-初值)/步長)+1,2.計數(shù)型循環(huán)FOR語句,Visual FoxPro 6.0 程序設計.課件,-38-,【例6-9】編制程序實現(xiàn)100以內的奇數(shù)累加和,并輸出結果。 分析:實現(xiàn)100以內奇數(shù)的累加,循環(huán)變量的初值應為1,終值應為99,循環(huán)變量的步長應為2。 【例6-10】從鍵盤上輸入一個大于1的自然數(shù),判斷是否為素數(shù)(除1和它本身外,不能被其他任何一個整數(shù)整除的自然數(shù))。 分析:判斷某數(shù)n是否為素數(shù),最簡單的方法是:從i=2,3,n-1逐個判斷n能否被i整除,只要有一個能整除,n就不是素數(shù),退出循環(huán);若都不能整除,則n是素數(shù)。可進一步證明:若n不能被2中的任何一個整數(shù)整除,則n為素數(shù)。,Visual FoxPro 6.0 程序設計.課件,-39-,3.掃描型循環(huán)SCAN語句,該語句的格式如下: SCAN FOR EXIT LOOP ENDSCAN 掃描型循環(huán)語句專門用來對當前打開的數(shù)據(jù)表進行操作,它對指定范圍滿足條件的記錄逐一掃描,找到一條滿足條件的記錄就執(zhí)行一次循環(huán)體語句,每執(zhí)行一次,記錄指針后移,直到所有滿足條件的記錄都執(zhí)行完畢。 說明: 語句中缺省時默認為ALL。 其中的EXIT和LOOP子句的功能和DO WHILE循環(huán)中的功能相同。,Visual FoxPro 6.0 程序設計.課件,-40-,【例6-11】用掃描型循環(huán)SCAN語句統(tǒng)計學生信息表student中年齡在20歲以上的學生人數(shù),并輸出結果。 程序代碼如下: *prog11.prg use student n=0 scan for year(date()-year(出生日期)20 n=n+1 endscan ?“年齡大于20歲的人數(shù)有:“,n,Visual FoxPro 6.0 程序設計.課件,-41-,4.循環(huán)的嵌套,在一個循環(huán)體內又包含了一個完整的循環(huán)結構時稱為循環(huán)結構的嵌套。在實際應用中,三種循環(huán)語句可以相互嵌套,會呈現(xiàn)出多種復雜形式,在編程或閱讀程序時要注意各層循環(huán)變量的變化規(guī)律。 在使用循環(huán)嵌套時需要注意以下幾點: 循環(huán)嵌套時,必須完整嵌套,不能交叉嵌套;循環(huán)體內可以嵌套分支語句,嵌套時也要求完整嵌套,不能交叉嵌套。 內重循環(huán)的循環(huán)變量與外重循環(huán)的循環(huán)變量不能同名,以免混淆。 多重循環(huán)的循環(huán)次數(shù)等于每一重循環(huán)的循環(huán)次數(shù)的乘積。,Visual FoxPro 6.0 程序設計.課件,-42-,【例6-12】打印九九乘法表,運行界面如圖6-14所示。 程序代碼如下: *prog12.prg clear &先將VFP主窗口清空 1,30 say “九九乘法表“ 2,28 say “-“ ? for i=1 to 9 for j=1 to 9 ?str(i,1)+“*“+STR(j,1)+“=“+str(i*j,2) ?space(2) &每個算式之間空兩格 endfor ? &當前行算式輸出完以后,換行再輸出下一行 endfor,Visual FoxPro 6.0 程序設計.課件,-43-,數(shù)組這種數(shù)據(jù)結構在程序設計中經(jīng)常使用,在Visual FoxPro中,只能定義一維數(shù)組和二維數(shù)組。因為數(shù)組中數(shù)組元素的下標是有序的,可以以數(shù)組元素的下標作為循環(huán)變量,利用循環(huán)結構來處理數(shù)組中每個數(shù)組元素。一般用一重循環(huán)來處理一維數(shù)組,用二重循環(huán)來處理二維數(shù)組,下面以一維數(shù)組為例進行介紹。 (1)一維數(shù)組的基本操作 假設定義有一維數(shù)組dimension a(10),下面以該數(shù)組為例介紹一維數(shù)組的基本操作。,數(shù)組元素的輸出 for i=1 to 10 ?a(i) endfor,數(shù)組元素的輸入 for i=1 to 10 input to a(i) endfor,5.數(shù)組問題,Visual FoxPro 6.0 程序設計.課件,-44-,數(shù)組元素的求和 s=0 for i=1 to 10 s=s+a(i) endfor,求數(shù)組元素中的最大值 max=a(1) for i=1 to 10 if(a(i)max) max=a(i) endif endfor,Visual FoxPro 6.0 程序設計.課件,-45-,數(shù)組最典型的應用是排序,排序的算法有多種,如選擇法、冒泡法、插入法等,下面介紹冒泡法排序。 假設定義了一個數(shù)組dimension a(10),則冒泡法排序的基本思想是:從第一個元素開始,對數(shù)組中兩兩相鄰的元素比較,即a(1)與a(2)比較,若為逆序,則a(1)與a(2)交換,然后a(2)與a(3)比較直到最后a(9)與a(10)比較,這時最大的數(shù)沉底成為數(shù)組中的最后一個元素,一些較小的數(shù)如同氣泡一樣上浮一個位置,這是第一趟排序。然后對a(1)a(9)中的9個數(shù)進行同上述一樣的比較,次最大數(shù)放入a(9)中,完成第2趟排序。依此類推,進行9趟排序后,所有數(shù)均有序。因此可以用二重循環(huán)來實現(xiàn)這個排序,外循環(huán)確定進行幾趟排序,內循環(huán)確定每趟排序中比較幾次。 代碼如下: for i=1 to 9 &確定排序的趟數(shù) for j=1 to 10-I &確定每趟排序中比較的次數(shù) if a(j)a(j+1) &若相鄰的兩個數(shù)為逆序,則交換 t=a(j) a(j)=a(j+1) a(j+1)=t endif endfor endfor,(2)一維數(shù)組的排序,Visual FoxPro 6.0 程序設計.課件,-46-,【例6-13】隨機產生20個學生成績,求出他們的平均成績,并統(tǒng)計出高于平均成績的學生數(shù),再將這20個學生成績按升序排列后輸出。 分析:Visual FoxPro提供了隨機數(shù)函數(shù)RAND(),可以產生一個01(不包括1)之間的隨機數(shù)。學生成績通常在0100之間,為了產生這之間的隨機數(shù),可以用表達式INT(RAND()*100)+1來實現(xiàn)。 程序代碼如下: *prog12.prg,Visual FoxPro 6.0 程序設計.課件,-47-,clear dimension a(20) for i=1 to 20 a(i)=int(rand()*100)+1 endfor s=0 for i=1 to 20 s=s+a(i) endfor av=s/20 ?“平均成績是:“,av n=0 for i=1 to 20 if a(i)av n=n+1 endif endfor,?“高于平均成績的人數(shù)為:“,n for i=1 to 19 for j=1 to 20-i if a(j)a(j+1) t=a(j) a(j)=a(j+1) a(j+1)=t endif endfor endfor ? for i=1 to 20 ?a(i) endfor,Visual FoxPro 6.0 程序設計.課件,-48-,6.3 過程與過程調用,6.3.1 子程序設計與調用 6.3.2 過程與過程文件 6.3.3 局部變量和全局變量、過程調用中的參數(shù)傳遞,Visual FoxPro 6.0 程序設計.課件,-49-,6.3.1 子程序設計與調用,在程序設計中,經(jīng)常會遇到同一段功能代碼在不同的程序段執(zhí)行多次的情況,這時往往將該功能代碼單獨編寫成一個獨立的程序文件存在磁盤上,需要時調用它,這個獨立的模塊稱為子程序。程序之間通過相互調用來建立關系。在Visual FoxPro中,子程序是被其他程序調用的程序文件,主程序能調用子程序,但子程序不能調用主程序,可是子程序可以調用其他的子程序,構成子程序的嵌套調用。 在模塊化程序設計中,通常將功能和結構相對獨立的功能模塊,單獨編寫成一個獨立的子程序。子程序結構不僅易于調試和維護,而且當需要時可以多次調用,減少重復編程,提高程序的通用性。子程序的表現(xiàn)形式有過程、自定義函數(shù)和方法3種。,Visual FoxPro 6.0 程序設計.課件,-50-,1.子程序的建立 子程序是一個獨立的程序文件,文件擴展名為.PRG,它的建立與前面所說的程序建立的方法一樣。 2.子程序的調用 DO WITH 其中WITH 是可選項,用于主程序與子程序之間的參數(shù)傳遞,實際參數(shù)列表中的各項可以是常量、變量或表達式,相互之間用逗號隔開。 3.子程序的返回 RETURN TO MASTER|TO 執(zhí)行子程序時,遇到RETURN命令,就返回到調用它的主程序,或是上一級子程序中調用命令的下一條語句繼續(xù)執(zhí)行。通常子程序的最后一條語句是RETURN命令,若缺省,則當子程序執(zhí)行到最后時將自動執(zhí)行RETURN功能,返回到主調程序中。,Visual FoxPro 6.0 程序設計.課件,-51-,圖6-17是子程序嵌套調用時的程序執(zhí)行過程示意圖。,Visual FoxPro 6.0 程序設計.課件,-52-,【例6-14】分別建立如上圖所示的各程序文件,分析執(zhí)行主程序main.prg的執(zhí)行結果。程序代碼如下:,*main.prg clear ?“正在執(zhí)行main.prg“ ?“開始調用子程序sub1.prg“ do sub1 ?“從子程序sub1.prg中返回“,*sub1.prg ?“正在執(zhí)行sub1.prg“ ?“開始調用子程序sub2.prg“ do sub2 ?“從子程序sub2.prg中返回“ ?“開始調用子程序sub3.prg“ do sub3 ?“從子程序sub3.prg中返回“ return,*sub2.prg ?“正在執(zhí)行sub2.prg“ return,*sub3.prg ?“正在執(zhí)行sub3.prg“ return,Visual FoxPro 6.0 程序設計.課件,-53-,6.3.2 過程與過程文件,在編寫一個大型程序時,可能劃分為許多功能模塊,如果都寫成子程序,就要創(chuàng)建很多程序文件,這些程序文件都存放在磁盤上,每調用一次子程序就訪問一次磁盤,需要花費一定的時間,如果程序中調用子程序較多,訪問磁盤的次數(shù)就多,因此影響程序運行速度。另外,每調用一次子程序將打開一個文件,而由于系統(tǒng)允許同時打開文件數(shù)目的限制,調用子程序的嵌套層數(shù)也受到限制,否則程序不能正常運行。 因此引入過程的概念,其實過程和子程序非常類似,只是將多個子程序的功能模塊代碼保存在一個程序文件中,在該程序文件中每個子程序都單獨定義,而含有多個子程序的程序文件就稱為過程文件,這樣打開一個過程文件就意味著打開了所有的過程。當然過程也可以不形成過程文件,直接與調用它的程序放在同一個文件中,不過應把過程放在主程序代碼之后,不能將主程序代碼放在過程之后。,Visual FoxPro 6.0 程序設計.課件,-54-,1.過程的定義,過程定義的語法格式如下: PROCEDURE PARAMETERS RETURN ENDPROC 其中各參數(shù)的說明如下: PROCEDURE :過程的起始語句。 PARAMETERS :有此子句稱為有參過程,否則稱為無參過程。有參過程中,該子句必須是第一條命令語句。中形參的個數(shù)最多為27個,且只能是內存變量,相互之間用逗號隔開。 RETURN :該子句表示將控制返回到調用該過程的語句的下一條語句繼續(xù)執(zhí)行。若缺省了該子句,則在過程結束處自動執(zhí)行一條隱含的RETURN語句。 ENDPROC:過程的結束語句,該語句可以省略,若省略,則過程結束于下一條PROCEDURE語句或程序文件尾。,Visual FoxPro 6.0 程序設計.課件,-55-,2.過程的調用,調用過程的語法格式如下: DO WITH 實參列表中的各項可以是常量、變量或一般表達式,相互之間用逗號隔開。 【例6-15】利用過程來計算圓面積。 程序代碼如下: clear input “請輸入圓的半徑:“ to r s=0 do area with r,s ?“半徑為“,r,“的圓的面積為:“,s *area過程 procedure area parameters r,s s=3.14*r*r return endproc,Visual FoxPro 6.0 程序設計.課件,-56-,3.過程文件的建立,過程文件是由若干個過程組合而成的,它的建立方法與程序文件的建立方法相同,擴展名也為.PRG。 4.過程文件的打開與關閉 調用過程文件中的過程前,首先要打開包含它的過程文件。 (1)過程文件的打開 SET PROCEDURE TO , , ADDITIVE 該語句用于打開指定的過程文件,使該過程文件中所有的過程均可供調用。 可以同時打開多個過程文件,如果命令中帶有ADDITIVE子句,則在打開當前過程文件時,以前打開的過程文件不關閉,即以前打開的過程文件中的過程仍可以被調用;若命令中未帶該子句,則在打開當前過程文件時,以前打開的所有過程文件都會被關閉,即以前打開的過程文件中的所有過程都不能再被調用。 (2)過程文件的關閉 語句格式1為:SET PROCEDURE TO 語句格式2為:CLOSE PROCEDURE,Visual FoxPro 6.0 程序設計.課件,-57-,【例6-16】調用過程文件中的求階乘的過程,求1!+2!+n!。 程序代碼如下:,*prog16.prg clear set procedure to jc input “請輸入n的值:“ to n store 0 to s,j for i=1 to n do fact with i,j s=s+j endfor set procedure to ?“1!+2!+n!=“,s,*jc.prg procedure fact parameters x,y t=1 for i=1 to x t=t*i endfor y=t return endproc,Visual FoxPro 6.0 程序設計.課件,-58-,6.3.3 自定義函數(shù),函數(shù)分為系統(tǒng)函數(shù)與自定義函數(shù), Visual FoxPro提供了幾百個系統(tǒng)函數(shù)供用戶調用,大大方便了用戶的編程,但在解決實際問題時,系統(tǒng)提供的函數(shù)可能不能滿足用戶的需求,這時可以自己定義和編寫的函數(shù),這樣的函數(shù)稱為自定義函數(shù)。函數(shù)和過程的作用十分相似,用戶自定義的函數(shù)實質上是帶有返回值的子程序或過程。 1.自定義函數(shù)的建立 自定義函數(shù)的語法格式如下: FUNCTION PARAMETERS RETURN ENDFUNC,Visual FoxPro 6.0 程序設計.課件,-59-,自定義函數(shù)的函數(shù)名不能與VFP系統(tǒng)函數(shù)同名,也不能和內存變量同名。 自定義函數(shù)通常會計算出一個值,由RETURN 語句返回,若RETURN后面缺省表達式,默認函數(shù)返回值為.T.,若省略RETURN語句,則函數(shù)執(zhí)行結束時,系統(tǒng)自動執(zhí)行一個隱含的RETURN命令。 自定義函數(shù)可作為一個獨立的模塊放在調用它的程序文件中,通常放在程序文件的底部;也可以作為一個獨立的程序文件,供所有程序調用,這時可以省略自定義函數(shù)的起始語句FUNCTION ,若不省略該語句,則函數(shù)名必須與程序文件名相同;自定義函數(shù)還可以放在過程文件中,隨著過程文件的打開而打開,以供調用。 2.自定義函數(shù)的調用 函數(shù)名(實際參數(shù)列表) 函數(shù)定義好后,可供程序在任何地方調用。函數(shù)調用時,實際參數(shù)的個數(shù)與形式參數(shù)的個數(shù)必須相等,且依次虛實結合。若是無參函數(shù),調用時圓括號不能省略。,Visual FoxPro 6.0 程序設計.課件,-60-,【例6-17】將上例改用自定義函數(shù)來實現(xiàn),其中函數(shù)放在調用程序所在的程序文件中。 分析:若通過自定義函數(shù)來實現(xiàn)求某個數(shù)的階乘,主調模塊應通過參數(shù)將該數(shù)傳遞給被調函數(shù),被調函數(shù)可以使用返回值將計算結果返回給主調模塊,因此函數(shù)中只需有一個形式參數(shù):求階乘的數(shù)。 程序代碼如下:,*prog17.prg clear input “請輸入n的值:“ to n s=0 for i=1 to n s=s+fact(i) endfor set procedure to ?“1!+2!+n!=“,s function fact parameters x t=1 for j=1 to x t=t*j endfor return t endfunc,Visual FoxPro 6.0 程序設計.課件,-61-,6.3.4參數(shù)傳遞,主程序在調用子程序、過程和自定義函數(shù)時,經(jīng)常需要把主程序中的數(shù)據(jù)傳遞給子程序、過程和自定義函數(shù),然后再將處理的結果返回給主程序,這就需要通過實際參數(shù)與形式參數(shù)間的參數(shù)傳遞來實現(xiàn)。 參數(shù)傳遞中要求實際參數(shù)與形式參數(shù)依次相對應,實參與形參對應的次序應一致、類型應一致、參數(shù)個數(shù)通常也一致,但可以不相同,若個數(shù)不相同時,形參的個數(shù)不能少于實參的個數(shù),否則系統(tǒng)產生運行錯誤,若形參的個數(shù)多于實參的個數(shù),多余的形參取初始值為.F.;但參數(shù)名不要求相同,即對應的實參與形參可以不同名。 根據(jù)形參值的改變是否影響實參的值,可以將參數(shù)傳遞分為兩類:值傳遞和引用傳遞。,Visual FoxPro 6.0 程序設計.課件,-62-,1.值傳遞 值傳遞中形參值的改變不影響實參的值,形參與實參使用不同的內存空間。在主程序調用子程序、過程和自定義函數(shù)時,形參單獨分配空間,系統(tǒng)會計算出主程序中實參的值,并把它們賦值給相應的形參。形參在程序調用過程中若發(fā)生值的改變,不影響實參原來的值。 值傳遞的兩種情況: (1)程序調用時,可以使用如下兩種格式的語句: 文件名|過程名|函數(shù)名(實際參數(shù)列表) 或者: DO 文件名|過程名 WITH (實際參數(shù)列表) 即將實際參數(shù)加上圓括號后再放到實參列表中,默認的是值傳遞的方式。 (2)若程序調用格式為:文件名|過程名|函數(shù)名(實際參數(shù)列表),可在程序調用之前使用命令設置參數(shù)傳遞的方式為值傳遞,命令格式如下: SET UDFPARMS TO VALUE,Visual FoxPro 6.0 程序設計.課件,-63-,2.引用傳遞,引用傳遞中形參值的改變影響實參的值,形參與實參使用的是同一個內存空間(盡管它們的名字可能不同)。 引用傳遞的3種情況: (1) 程序調用時,使用如下的語句調用格式: DO 文件名|過程名 WITH 實際參數(shù)列表 (2) 若程序調用格式為:文件名|過程名|函數(shù)名 (實際參數(shù)列表),可在程序調用之前使用命令設置參數(shù)傳遞的方式為引用傳遞,命令格式如下: SET UDFPARMS TO REFERENCE。 (3)使用標記實際參數(shù) 程序調用時,在實際參數(shù)前加標記,則強制參數(shù)以引用方式傳遞,Visual FoxPro 6.0 程序設計.課件,-64-,【例6-18】值傳遞和引用傳遞示例。程序prog18.prg如下: clear store 0 to a,b do sub with a,(b) &參數(shù)a是引用傳遞,參數(shù)b是值傳遞 ?“第1次調用:“,a,b set udfparms to value &設置為值傳遞方式 store 0 to a,b sub(a,(b) &參數(shù)a,b均為值傳遞方式 ?“第2次調用:“,a,b set udfparms to reference &設置為引用傳遞方式 store 0 to a,b sub(a,(b) &參數(shù)a是引用傳遞,參數(shù)b是值傳遞 ?“第3次調用:“,a,b store 0 to a,b sub(a,b) &參數(shù)a,b均為引用傳遞方式 ?“第4次調用:“,a,b procedure sub parameters x,y x=x+10 y=y+10 return endproc,Visual FoxPro 6.0 程序設計.課件,-65-,6.3.5 變量的作用域,內存變量在程序中的作用范圍稱為內存變量的作用域。根據(jù)變量作用域的不同,可將內存變量分為3類:本地變量(局部變量)、私有變量和公共變量(全局變量)。 1. 本地變量(局部變量) 本地變量的作用域只包括定義它的模塊,不能在其它模塊中使用。本地變量一經(jīng)定義,就在內存中分配了存儲單元,一旦離開了本模塊,本地變量所占的存儲單元就被釋放,因此不能再被使用。 定義本地變量的語法格式:LOCAL 該命令將內存變量表中的變量定義為本地變量,并將這些變量的初值賦值為.F.。 注意:LOCAL命令可以定義本地變量,也可定義本地數(shù)組。LOCAL命令與LOCATE命令的前4個字符相同,因此不可縮寫。,Visual FoxPro 6.0 程序設計.課件,-66-,2.私有變量 私有變量的作用域包括定義它的模塊及其調用的子程序、過程或函數(shù)模塊,定義私有變量的語法格式如下: PRIVATE 該命令將內存變量表中的變量定義為私有變量,并將這些變量的初值賦值為.F.。 PRIVATE命令可以定義私有變量,也可定義私有數(shù)組。程序中未加定義而直接使用的內存變量是私有變量。 當被調用的子程序、過程或函數(shù)模塊中有與主調模塊序中的變量同名時,且希望起作用的是被調用模塊中的變量時,可以在被調用模塊中用PRIVATE命令聲明該變量,來隱藏上級主調模塊中的同名變量,使得主調模塊中的同名變量在被調模塊中暫時被屏蔽,直到被調模塊執(zhí)行結束后,返回到主調模塊中,再恢復使用主調模塊中的同名變量。 在多人開發(fā)的應用程序中為了防止不同模塊中因變量名相同而造成失誤,可以在各自開發(fā)的子程序模塊中定義私有變量,以屏蔽主調模塊中的同名變量。,Visual FoxPro 6.0 程序設計.課件,-67-,3. 公共變量(全局變量) 公共變量的作用域包括程序的所有模塊,定義公共變量的語法格式如下: PUBLIC 該命令將內存變量表中的變量定義為公共變量,并將這些變量的初值賦值為.F.。 PUBLIC命令可以定義公共變量,也可定義公共數(shù)組。 用PUBLIC命令定義的公共變量在整個程序運行過程中始終有效,始終占有內存的存儲單元,即使程序運行結束,系統(tǒng)也不會自動釋放存儲單元,而只能用RELEASE命令或CLEAR ALL命令才能清除公共變量。 若某模塊中建立的內存變量要供其它模塊使用,必須將這種變量用PUBLIC命令聲明

溫馨提示

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

評論

0/150

提交評論