VFB程序設(shè)計教程教學(xué)課件丶第七章.ppt_第1頁
VFB程序設(shè)計教程教學(xué)課件丶第七章.ppt_第2頁
VFB程序設(shè)計教程教學(xué)課件丶第七章.ppt_第3頁
VFB程序設(shè)計教程教學(xué)課件丶第七章.ppt_第4頁
VFB程序設(shè)計教程教學(xué)課件丶第七章.ppt_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第7章 Visual FoxPro程序設(shè)計,7.1 程序與程序文件,Visual FoxPro支持兩種程序設(shè)計: 結(jié)構(gòu)化程序設(shè)計(面向過程的編程方式) 面向?qū)ο蟮某绦蛟O(shè)計,7.1.1 程序,1. 程序的概念 程序是命令的有序集合 程序以文本文件的形式存儲在磁盤上,稱為程序文件 程序文件的擴(kuò)展名為 .prg,2. 程序方式與交互方式的區(qū)別 程序可完成復(fù)雜的任務(wù),命令只能完成簡單任務(wù) 命令不被保存,程序可長期保存并可多次修改和運(yùn)行 一個程序中可以調(diào)用其他程序,命令則不能,7.1.2 程序文件的建立、編輯、保存和運(yùn)行,1建立和編輯程序文件 (1)命令方式 格式:modify command 說明:擴(kuò)展名.prg可以省略,由系統(tǒng)自動添加。 (2)菜單或工具欄方式,7.1.2 程序文件的建立、編輯、保存和運(yùn)行,2保存程序文件 保存:菜單或工具欄按鈕、關(guān)閉窗口、組合鍵【Ctrl +W】 【ESC】或【Ctrl +Q】放棄當(dāng)前修改,7.1.2 程序文件的建立、編輯、保存和運(yùn)行,3程序文件的運(yùn)行 (1) 命令方式運(yùn)行程序 格式:DO With 說明:文件名可以是.prg文件,也可以是其他類型文件 如:.exe、.mpr、.qpr, 所以要加上擴(kuò)展名。 (2) 菜單或工具欄方式運(yùn)行程序,7.1.3 程序中常出現(xiàn)的錯誤,遺漏關(guān)鍵字和變量之間的空格 遺漏定界符,或定界符使用了中文標(biāo)點符號 關(guān)鍵字、變量名和文件名拼寫錯誤 內(nèi)存變量沒有初始化 表達(dá)式和函數(shù)中的數(shù)據(jù)類型不匹配 控制語句缺少結(jié)束語句 控制語句嵌套錯誤,7.2 程序中常用的命令,7.2.1 基本輸入命令,1Input命令 格式:INPUT 提示信息 TO 功能:從鍵盤上接收數(shù)據(jù)(可為任何類型)賦給內(nèi)存變量 說明: 提示信息要使用定界符定界,提示信息可以省略 不能不輸入任何內(nèi)容直接按回車鍵 輸入的字符數(shù)據(jù)需加定界符,輸入日期數(shù)據(jù)時加大括號 ,輸入邏輯值時加圓點定界符( )。 舉例: input to AA input “請輸入學(xué)生姓名: “ to name input “請輸入該生的出生日期:“ to birth Input “請輸入該生的黨員值:“ to 黨員,2Accept命令 格式:ACCEPT 提示信息 TO 功能 字符串接收命令,僅從鍵盤上接收字符型數(shù)據(jù)并賦給內(nèi)存變量。 輸入的字符串不加定界符,否則,系統(tǒng)會認(rèn)為定界符也是輸入字符串本身的一部分。 如果想輸入123,此時的123也是字符型數(shù)據(jù)不能用于計算。 舉例: accept “請輸入學(xué)生證號“ to no accept to ab accept “請輸入學(xué)生姓名“ to XM,3Wait 命令 格式:WAIT 提示信息 TO Window Timeout 功能:等待用戶按鍵盤上任一個鍵。 說明 省略提示信息后,系統(tǒng)默認(rèn)為提示“按任一鍵繼續(xù)”。 wait to x 用于保存用戶按鍵的字符,可省略此項。 如指定Window項,主窗口的右上角會出現(xiàn)一個Wait提示窗口,來顯示提示信息,否則顯示在屏幕工作中。 如指定Timeout 項,用于設(shè)定等待時間,Timeout 為間隔秒數(shù),一旦超時,系統(tǒng)自動往下執(zhí)行。 wait “請輸入一個字母“ to m window timeout 3,【例7-1】輸入任意一個數(shù)據(jù),判斷該數(shù)的數(shù)據(jù)類型。 程序如下: CLEAR INPUT “請輸入任意類型的一個數(shù)據(jù)” TO X ? X , “的數(shù)據(jù)類型為:” , VARTYPE(X) 第一次運(yùn)行: 請輸入任意類型的一個數(shù)據(jù):123 第二次運(yùn)行: 請輸入任意類型的一個數(shù)據(jù):“123“ 第三次運(yùn)行: 請輸入任意類型的一個數(shù)據(jù):.T. 第四次運(yùn)行: 請輸入任意類型的一個數(shù)據(jù):1991-05-03,【例7-2】查詢學(xué)生表中某些學(xué)生的信息。 程序如下: USE 學(xué)生.DBF ACCEPT “請輸入您要查詢的學(xué)生姓名“ TO NAME LOCATE FOR 姓名=NAME DISP WAIT “您還要查詢其他內(nèi)容?” WINDOW TIMEOUT 5 INPUT “請輸入您要查詢的學(xué)生的身高“ TO HEIGHT LOCATE FOR 身高=HEIGHT DISP USE RETURN,7.2.2 基本輸出命令,1表達(dá)式輸出命令 格式:? | ? , 功能:對一個或多個表達(dá)式求值, 并將結(jié)果輸出到系統(tǒng)主窗口上。 說明:? :表達(dá)式的值換行顯示; ? :表達(dá)式的值不換行顯示; ? :單個?表示需要光標(biāo)換行。 舉例: ? 3+4, date() , 67 use 學(xué)生表 ? 姓名, 性別, 出生日期 ? ?姓名, 身高, 體重,2文本輸出命令 格式:Text EndText 功能:將文本信息輸出在屏幕上。 說明:Text 和EndText必須成對出現(xiàn)。 舉例: text 系 統(tǒng) 主 菜 單 1. 數(shù)據(jù)輸入 2. 數(shù)據(jù)查詢 3. 數(shù)據(jù)統(tǒng)計 4. 退出系統(tǒng) endtext,7.2.3 定位輸入輸出命令,1定位輸出命令 格式: SAY 功能:在屏幕指定位置輸出表達(dá)式的值。 說明:指定了輸出的位置。標(biāo)準(zhǔn)屏幕是25行80列,左上角頂點為(0,0),右下角坐標(biāo)為(24,79)。行、列都可以為表達(dá)式,還可為小數(shù)。 舉例: 10,10 say “hello!“ 15, 20 say “how are you!“ 20, 35 say “大家好!“,2定位輸入命令 格式: SAY (提示信息) GET READ 功能:在屏幕指定位置接收鍵盤輸入的新值 說明 SAY子句:用于顯示提示信息,提示信息加定界符 GET子句:用于為顯示變量的值,并允許輸入新值 GET子句中的變量必須有確定的初值 初值決定了該變量的類型和寬度 READ:使GET后的進(jìn)入編輯狀態(tài); 讓光標(biāo)自動跳到該變量值所在位置上等待編輯修改; 可在多個定位輸入命令后面使用一個read語句。,clear name=“張曉磊“ grade=98.6 birth=2002-09-07 團(tuán)員=.t. 0,10 say “name“ get name read 1,10 say “grade“ get grade read 2,10 say “birth“ get birth read 3,10 say “團(tuán)員“ get 團(tuán)員 read ?name, grade, birth, 團(tuán)員,clear use 學(xué)生表 go 2 0,10 say “姓名:“ get 姓名 1,10 say “性別:“ get 性別 2,10 say “出生日期:“ get 出生日期 3,10 say “黨員:“ get 團(tuán)員 3,10 say “身高:“ get 身高 read,7.2.4 清屏命令,格式: CLEAR 功能:清除屏幕或窗口中的顯示內(nèi)容, 光標(biāo)回到屏幕左上角。,7.2.5 終止程序執(zhí)行和返回命令,1Cancel 終止程序執(zhí)行,關(guān)閉所有打開的程序,返回命令窗口。 2Return 結(jié)束當(dāng)前程序執(zhí)行,返回到調(diào)用它的上一級主程序,若無上級程序則返回命令窗口。 3Quit 退出Visual Foxpro系統(tǒng)。,7.2.6 MessageBox( )函數(shù),1. 語法格式:MESSAGEBOX (提示信息, 對話框的屬性, 對話框窗口標(biāo)題) 2. 功能:顯示一個自定義的對話框。常用作提示之用, 也可作一些簡單的選擇,比如“確定”、“取消”等 3. 舉例:messagebox(“請選擇“, 32+3+0 , “測試“) 4. 說明: (1)提示信息:對話框中所用到的提示文字。,(2)對話框的屬性: MESSAGEBOX(提示信息 , 對話框的屬性 , 對話框窗口標(biāo)題) 例如:messagebox(“請選擇“, 32 + 3 + 0 , “測試“),設(shè)置圖標(biāo),設(shè)置按鈕屬性,設(shè)置默認(rèn)按鈕,(3) 對話框窗口標(biāo)題 MESSAGEBOX(提示信息 , 對話框的屬性 , 對話框窗口標(biāo)題) 例如:messagebox(“請選擇“, 32 + 3 + 0 , “測試“) (4) 返回值:該函數(shù)執(zhí)行后有返回值,類型為數(shù)值型 n=messagebox(“請選擇“, 32 + 3 + 0 , “測試“) ?n,7.3 程序的基本控制結(jié)構(gòu),程序的概念 命令(或語句)的有序集合,以文件(.prg)形式存儲 一個程序一般包括三個部分: 數(shù)據(jù)定義或輸入部分 數(shù)據(jù)處理部分 數(shù)據(jù)輸出部分 程序的三種基本控制結(jié)構(gòu): 順序結(jié)構(gòu) 選擇結(jié)構(gòu) 循環(huán)結(jié)構(gòu),7.3.1 順序結(jié)構(gòu),順序結(jié)構(gòu)程序的含義 按語句排列的先后順序,從上到下依次執(zhí)行各語句。 每個語句執(zhí)行一次,且只執(zhí)行一次。 【例7-3】編程計算圓的周長和面積。 Clear Input “請輸入圓的半徑“ To R Pi=3.14 L=2*PI*R S=PI*R*R ?“圓的周長為:“ , L ?“圓的面積為:“ , S Return,輸入半徑R的值,定義圓周率變量pi,計算周長L和面積S,輸出L和S的值,清屏幕,【例7-4】查詢學(xué)生表中所有男同學(xué)和女同學(xué)的學(xué)生證號,姓名,性別和年齡,并分別顯示男同學(xué)和女同學(xué)的信息。 程序分析: clear use 學(xué)生表 ?“男同學(xué)的信息“ disp 學(xué)生證號,姓名,性別,; (year(date()-year(出生日期) ; for 性別=“男“ ?“女同學(xué)的信息“ disp 學(xué)生證號,姓名,性別,; (year(date()-year(出生日期) ; for 性別=“女“ use,打開學(xué)生表,提示先顯示男同學(xué)信息,逐頁顯示男同學(xué)信息,關(guān)閉打開的表,清屏幕,提示先顯示女同學(xué)信息,逐頁顯示女同學(xué)信息,7.3.2 選擇結(jié)構(gòu),選擇結(jié)構(gòu)又稱分支結(jié)構(gòu),它是在程序執(zhí)行過程中,通過判斷某些條件是否成立來控制程序走向的程序結(jié)構(gòu)。 分支程序結(jié)構(gòu)的分類: 單(向)分支 雙(向)分支 多(向)分支,1單(向)分支,格式: IF ENDIF 功能:若成立, 則執(zhí)行; 否則執(zhí)行ENDIF后面的語句。 說明: IF 和ENDIF必須成對出現(xiàn)。 是一個邏輯值表達(dá)式。 可以是多條語句的集合。,clear input “請輸入一個正整數(shù)“ to x if x0 ?“輸入的是正整數(shù)“ ?“x=“ , x endif return,【例7-5】判斷一個數(shù)是正負(fù)、負(fù)數(shù)、還是零。 程序分析: Clear Input “請輸入一個數(shù)“ to N If N0 ?“是正數(shù)?!?Endif If N0 ? “是負(fù)數(shù)。“ Endif If N=0 ? “是零。“ Endif,【例7-6】在學(xué)生表中根據(jù)所輸入的學(xué)生證號查找該學(xué)生記錄。 程序分析: Clear Use 學(xué)生表 Accept “請輸入所要查找的學(xué)生證號:“ TO XSZH Locate For 學(xué)生證號=XSZH If Found() Disp EndIf Use Return,2雙(向)分支,格式 IF ELSE ENDIF 功能:若條件成立, 則執(zhí)行, 否則執(zhí)行。 說明: IF 和ENDIF必須成對出現(xiàn); ELSE 本身占一行。,【例7-7】用雙分支實現(xiàn)判斷一個數(shù)的正負(fù)。 程序分析: Clear Input “請輸入一個數(shù)“ to N If N=0 ?“是正數(shù)?!?Else ?“是負(fù)數(shù)?!?Endif ?“程序運(yùn)行結(jié)束“ RETURN,是正數(shù),N=0,否,是,是負(fù)數(shù),輸入一個數(shù),程序運(yùn)行結(jié)束,分支語句的嵌套 IF IF ELSE ENDIF ELSE IF ENDIF ENDIF,Clear Input “請輸入一個數(shù)“ to N IF N0 ?“是正數(shù)?!?ELSE IF N=0 ?“是零?!?ELSE ?“是負(fù)數(shù)?!?ENDIF ENDIF ?“程序運(yùn)行結(jié)束“ RETURN,Clear Input “請輸入一個數(shù)“ to N IF N=0 IF N0 ?“是正數(shù)?!?ELSE ?“是零?!?ENDIF ELSE ?“是負(fù)數(shù)?!?ENDIF ?“程序運(yùn)行結(jié)束“ RETURN,【例7-8】在學(xué)生表中根據(jù)所輸入的姓名查找該學(xué)生記錄 程序分析: Clear Use 學(xué)生表 Accept “請輸入所要查找的姓名:“ TO XM Locate For 姓名=XM If Found( ) Disp ELSE ?”查無此人!” EndIf Use Return,顯示當(dāng)前記錄,找到?,否,是,顯示查無此人,按XM查找記錄,關(guān)閉表,打開學(xué)生表,輸入要查找的姓名-XM,3多(向)分支,格式: DO CASE CASE CASE CASE OTHERWISE ENDCASE,【例7-9】根據(jù)所輸入的日期判定今天是星期幾。 程序分析: 輸入日期 INPUT 根據(jù)日期判斷星期幾 DOW(日期變量) 程序結(jié)構(gòu)分析: 單分支 雙分支 多分去,Input “請輸入今天日期:“ To D IF DOW(D)=1 ?“日期日“ ENDIF IF DOW(D)=2 ?“日期一“ ENDIF IF DOW(D)=3 ?“日期二“ ENDIF IF DOW(D)=4 ?“日期三“ ENDIF IF DOW(D)=5 ?“日期四“ ENDIF IF DOW(D)=6 ?“日期五“ ENDIF IF DOW(D)=7 ?“日期六“ ENDIF,【例7-9】根據(jù)所輸入的日期判定今天是星期幾。 程序分析: 輸入日期 INPUT 根據(jù)日期判斷星期幾 DOW(日期變量) 程序結(jié)構(gòu)分析: 單分支 雙分支(嵌套) 多分去,Input “請輸入今天日期:“ To D IF DOW(D)=1 ?“日期日“ ELSE IF DOW(D)=2 ?“日期一“ ELSE IF DOW(D)=3 ?“日期二“ ELSE IF DOW(D)=4 ?“日期三“ ELSE IF DOW(D)=5 ?“日期四“ ELSE IF DOW(D)=6 ?“日期五“ ELSE IF DOW(D)=7 ?“日期六“ ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF,【例7-9】根據(jù)所輸入的日期判定今天是星期幾。 程序分析: 輸入日期 INPUT 根據(jù)日期判斷星期幾 DOW(日期變量) 程序結(jié)構(gòu)分析: 單分支 雙分支 多分去,Input “請輸入今天日期:“ To D Do Case Case Dow(D)=1 ? “星期日” Case Dow(D)=2 ? “星期一” Case Dow(D)=3 ? “星期二” Case Dow(D)=4 ? “星期三” Case Dow(D)=5 ? “星期四” Case Dow(D)=6 ? “星期五” OTHERWISE ? “星期六” EndCase,Accept “請輸入學(xué)生證號:“ To XSZH Use 成績表 Locate For 學(xué)生證號= XSZH Do Case Case 期末成績=90 ? “優(yōu)秀“ Case 期末成績=80 and 期末成績=70 and 期末成績=60 and 期末成績=69 ? “及格“ Case 期末成績60 ? “不及格“ EndCase,【例7-10】根據(jù)所輸入的學(xué)生證號,,為成績表中“期末成績”字段的值判定等級。期末成績在: 90分以上的為優(yōu)秀, 80至89為良好, 70至79為中等, 60至69為及格, 60以下為不及格。 程序分析: 學(xué)生證號的輸入 成績的判斷 分支結(jié)構(gòu),7.3.3 循環(huán)結(jié)構(gòu),循環(huán)結(jié)構(gòu)(簡稱循環(huán)): 程序中,根據(jù)某些條件有規(guī)律地重復(fù)執(zhí)行某程序段 被重復(fù)執(zhí)行的程序段,稱為循環(huán)體 循環(huán)體通過循環(huán)結(jié)構(gòu)語句來實現(xiàn)循環(huán) 循環(huán)結(jié)構(gòu)可以減少程序代碼重復(fù)書寫的工作量,使編程效率大大提高, VFP的循環(huán)結(jié)構(gòu)語句主要三種 當(dāng)型循環(huán) 步長型循環(huán) 表掃描型循環(huán),命令格式1 DO WHILE 循環(huán)體語句 ENDDO,1當(dāng)型循環(huán)(DO WHILEENDDO),語句功能: (1)判斷是否為真(.T.),是真執(zhí)行循環(huán)體語句,否則執(zhí)行ENDDO后面語句 (2)執(zhí)行DO WHILE和ENDDO之間的命令序列(循環(huán)體) (3)遇到ENDDO,轉(zhuǎn)(1) (4)結(jié)束循環(huán),轉(zhuǎn)到ENDDO后面的語句。,【例7-11】輸出至100之間所有能被3整除的數(shù)。 Clear Y=1 Do While Y=100 If mod (Y ,3)=0 ? Y EndIf Y=Y+1 EndDo RETURN,顯示y值,y=100?,N,ENDDO后面語句,Y,定義變量y=1,y整除3?,Y,N,y值增1,【例7-12】把學(xué)生表所有民族為漢族的學(xué)生逐條輸出。 程序PR7-12.prg如下: Clear Use 學(xué)生表.dbf Do While not EOF( ) If 民族=“漢族“ Disp EndIf Skip EndDO USE,命令格式 2 DO WHILE 命令序列1 EXIT 命令序列2 LOOP 命令序列3 ENDDO 語句功能: 在執(zhí)行循環(huán)體語句的過程中遇到exit語句,立即結(jié)束循環(huán)體的執(zhí)行,轉(zhuǎn)到ENDDO的后面; 在執(zhí)行循環(huán)體語句的過程中遇到loop語句,立即結(jié)束循環(huán)體的本次執(zhí)行,轉(zhuǎn)到DO WHILE處,重新判斷循環(huán)條件。 EXIT和LOOP命令只能出現(xiàn)在循環(huán)體中,并且可以出現(xiàn)在循環(huán)體中的任何位置。,【例7-12-1】編寫一個能多次計算任意半徑的圓的周長和面積的程序,當(dāng)輸入的半徑小于或等于 0時,停止運(yùn)行。 Clear input “請輸入圓的半徑:“ to r Pi=3.14 L=2*PI*R S=PI*R*R ?“圓的周長為:“ , L ?“圓的面積為:“ , S,Clear R=1 do while R0 Input “請輸入圓的半徑:“ To R if R=0 loop endif L=2*3.14*R S=3.14*R*R ?“圓的周長為:“ , L ?“圓的面積為:“ , S enddo,Clear do while .T. Input “請輸入圓的半徑:“ To R if R=0 exit endif L=2*3.14*R S=3.14*R*R ?“圓的周長為:“ , L ?“圓的面積為:“ , S enddo,2步長型循環(huán)(FORENDFOR),格式: FOR = TO STEP LOOP EXIT ENDFOR| NEXT 說明: (1)、和是數(shù)值表達(dá)式 (2)值可以為正,也可以為負(fù)。省略時默認(rèn)值為1。 步長值不能為0,否則造成死循環(huán)。 (3)ENDFOR 可以用NEXT代替。 (4)循環(huán)次數(shù)=INT(終值初值)步長+1,for i=1 to 1+7 sete 2 ?i endfor,2步長型循環(huán)(FORENDFOR),格式: FOR = TO STEP LOOP EXIT ENDFOR| NEXT 循環(huán)的執(zhí)行過程: (1)將初值賦給循環(huán)變量, (2)循環(huán)變量與終值比較,若超過終值轉(zhuǎn)(5),否則轉(zhuǎn)(3) (3)執(zhí)行循環(huán)體(EXIT和LOOP意義同前) (4)遇到ENDFOR子句時,循環(huán)變量自動按增值,然后轉(zhuǎn)(2) (5)退出循環(huán),執(zhí)行ENDFOR后面的語句,for i=1 to 1+7 sete 2 ?i endfor,【例7-13】計算1+2+3+100=? Clear S=0 For i=1 to 100 S=S+i Next i ? “1=2+3+100=”, S RETURN,S=0 i=1 DO WHILE i=100 S=S+i i=i+1 ENDDO,【例7-14】向?qū)W生表中一次添加10條新記錄。 采用循環(huán)結(jié)構(gòu),每次添加一條記錄 先插入一條空記錄 利用定位輸入輸出命令輸入記錄內(nèi)容 Clear Use 學(xué)生表 For i=1 to 10 APPEND BLANK 2,1 SAY “學(xué)生證號:“ GET 學(xué)生證號 PICTURE “9999999999“ 4,1 SAY “姓名:“ GET 姓名 6,1 SAY “性別:“ GET 性別 8,1 SAY “出生日期:“ GET 出生日期 10,1 SAY “民族:“ GET 民族 READ ENDFOR USE,格式: SCAN FOR WHILE LOOP EXIT ENDSCAN 功能:在表的指定內(nèi)掃描,查找滿足的 記錄并執(zhí)行循環(huán)體中的命令序列。 說明: (1)默認(rèn)為ALL; (2)每執(zhí)行一遍循環(huán)體,指針自動下移一個記錄, 并自動判斷是否指向文件尾,是則結(jié)束循環(huán), 轉(zhuǎn)到ENDSCAN后面。,3表掃描型循環(huán)(SCANENDSCAN),SCAN ENDSCAN,do while not eof( ) skip enddo,【例7-15】查詢學(xué)生表中所有女黨員并輸出。 clear use 學(xué)生表 scan for 黨員 and 性別=“女“ display endscan use return 【例7-15-1】將上述程序,用當(dāng)型循環(huán)改寫 【例7-15-2】將上述程序,用步長型循環(huán)改寫,7.4 子程序、過程與自定義函數(shù),7.4.1 子程序 1子程序的概念 子程序與主程序: 子程序是指可以被多次反復(fù)地調(diào)用,能完成特定功能的特殊程序段,以獨(dú)立的程序文件方式存儲;相對而言,把調(diào)用子程序的程序稱為“主程序”。 子程序的優(yōu)點: 子程序是相對獨(dú)立的、通用的一段代碼。一個程序由若干個子程序組成,子程序獨(dú)立編碼和測試,子程序還可以重復(fù)使用,這樣可以方便地生成程序,減少代碼的編寫量,并易于修改和維護(hù)程序。,7.4.1 子程序,2子程序的建立:MODIFY COMMAND 子程序文件名 3子程序的調(diào)用 調(diào)用語句格式:DO With 說明: WITH 用于主程序和子程序間參數(shù)的傳遞 子程序參數(shù)定義:PARAMETERS 子程序返回語句的四種格式 RETURN 返回到調(diào)用它的上一級主程序或VFP窗口 RETURN 將表達(dá)式的值返回給調(diào)用程序 RETURN TO 返回指定程序文件 RETURN TO MASTER 直接返回到第一級主程序,7.4.1 子程序,子程序調(diào)用語句的執(zhí)行過程(功能) 執(zhí)行調(diào)用語句時,系統(tǒng)將指定的子程序調(diào)入內(nèi)存并執(zhí)行該子程序,程序轉(zhuǎn)到子程序中;當(dāng)執(zhí)行到子程序中的返回語句時,程序返回主程序,執(zhí)行該調(diào)用語句的下一條可執(zhí)行語句。,主程序: Clear Do zj1.prg Do zj2.prg Return,zj1.prg: P=1 FOR i=1 TO 100 P=P*i ENDFOR ?“100的階乘為“ , p RETURN,Zj2.prg: S=0 FOR i=1 TO 100 S=S+i ENDFOR ?“1-100的和為“ , S RETURN,【例7-16】用子程序求任意一個數(shù)的階乘。 Clear Input “請輸入要求階乘的數(shù):“ To M Do JieCheng.prg With M Return *JieCheng.prg子程序* PARAMETERS N P=1 FOR i=1 TO N P=P*i ENDFOR ?N, “的階乘為“ , p RETURN,主程序PR7-16-1.prg如下(帶兩個參數(shù)): Clear Input “請輸入要求階乘的數(shù):“ To M X=1 Do JieCheng.prg With M,X ?M, “的階乘為“ , X Return *JieCheng.prg子程序* PARAMETERS N, P FOR i=1 TO N P=P*i ENDFOR RETURN,7.4.2 過程和過程文件,1過程 過程的的概念: 過程是以PROCEDURE開頭,以ENDPROC結(jié)尾的一段程序。它可以放在調(diào)用程序中,也可以獨(dú)立存儲為一個過程文件。 過程定義的語法格式: PROCEDURE PARAMETERS RETURN ENDPROC,【例7-17】把求任意一個數(shù)的階乘的程序用過程來實現(xiàn)。 程序與過程在一個程序文件中(不帶參數(shù)): Clear Input “請輸入要求階乘的數(shù):“ To N Do JC *過程JC,也在程序PR7-17-1中 Procedure JC P=1 FOR i=1 TO N P=P*i ENDFOR ?N,“的階乘為“,p ENDPROC RETURN,程序PR7-17-2.prg如下(帶一個參數(shù)): Clear Input “請輸入要求階乘的數(shù):” To M Do JC With M *過程JC,也在程序PR7-17-2中* Procedure JC PARA N P=1 FOR i=1 TO N P=P*i ENDFOR ?N,”的階乘為”,p ENDPROC RETURN,2. 過程文件 過程文件:包括一個或多個過程的程序文件(.prg)。 語法格式: PROCEDURE RETURN ENDPROC PROCEDURE RETURN ENDPROC PROCEDURE RETURN ENDPROC,過程文件的建立: 與程序文件的建立方法完全相同 過程文件的打開與過程的調(diào)用 要調(diào)用過程,必須先打開包含此過程的過程文件。 打開過程文件的格式: SET PROCEDURE TO ,ADDITIVE 說明:可以打開一個或多個過程文件。 過程文件打開后,文件中所有過程都可以被調(diào)用 參數(shù)ADDITIVE表示不關(guān)閉原先已打開過程文件 過程文件的關(guān)閉 SET PROCEDURE TO 或 CLOSE PROCEDURE,【例7-18】輸入任意半徑,計算圓的周長,圓的面積和球的體積用過程文件實現(xiàn)。 程序分析: 主程序 main.prg 過程文件 pp.prg *主程序 main.prg * Clear Input “請輸入半徑:“ To R Set Procedure to PP.prg Do ZC With R Do MJ With R Do TJ With R Set Procedure To,* 過程文件 PP . prg * Proc ZC PARA X L=2*PI( )*X ?”周長為:”,L ENDPROC PROC MJ PARA X S=PI( )*X*X ?”面積為:”,S ENDPROC PROC TJ PARA X V=4/3*PI()*X*X*X ? “體積為:”,V ENDPROC,內(nèi)容回顧,程序 例如:求任意一個整數(shù)的階乘和1到該整數(shù)的和 子程序 過程 函數(shù),Clear Input “請輸入一個整數(shù):“ To N P=1 FOR i=1 TO N P=P*i ENDFOR ?N, “的階乘為:“ , p S=0 FOR i=1 TO N S=S+i ENDFOR ?“1-“, N, “的和為:“ , S RETURN,Clear Input “請輸入一個整數(shù):“ To M Set Procedure to pd.prg do pd1 with M do pd2 with M Set Procedurt to return,*過程文件pd.prg* procedure pd1 Parameters N P=1 FOR i=1 TO N P=P*i ENDFOR ?N, “的階乘為:“ , p endproc procedure pd2 Parameters N S=0 FOR i=1 TO N S=S+i ENDFOR ?“1-“, N, “的和為:“ , S endproc,*主程序:m1.prg* Clear Input “請輸入一個整數(shù):“ To M Do sub1 with M Do sub2 with M Retrun,內(nèi)容回顧,程序 例如:求任意一個整數(shù)的階乘和1到該整數(shù)的和 子程序 過程 函數(shù) 系統(tǒng)函數(shù) 用戶定義函數(shù) date( ) year(date() int( 123.4) mod(23,2) bof( ) eof( ) found( ) recno( ) reccount( ),7.4.3 用戶自定義函數(shù),用戶自定義的函數(shù)和系統(tǒng)內(nèi)部函數(shù)一樣,以函數(shù)的方式調(diào)用,即: 函數(shù)名() 用戶自定義的函數(shù)不能與系統(tǒng)函數(shù)同名。 用戶自定義函數(shù)的語法格式: FUNCTION PARAMETER RETURN ENDFUNC,【例7-19】用函數(shù)實現(xiàn)求組合 CLEAR INPUT “第一個數(shù) : “ TO r INPUT “第二個數(shù) : “ TO n C=JC(n) / (JC(r) * JC(n-r) ) ?“從“,n,“里取“,r,“的組合為“ , C RETURN *JC( )函數(shù):求任意一個數(shù)x的階乘* FUNCTION JC PARAMETERS X P=1 FOR i=1 TO X P=P*i ENDFOR RETURN P &返回 P 的值 ENDFUNC,7.4.4 參數(shù)傳遞和變量的作用域,1參數(shù)傳遞 在主程序調(diào)用子程序時,有時需要調(diào)用程序與被調(diào)用程序之間進(jìn)行參數(shù)傳遞。調(diào)用程序用 DO WITH 把實參數(shù)據(jù)傳遞給被調(diào)用程序中的形參數(shù)據(jù),被調(diào)用程序中用 PARAMETERS 來接收參數(shù)。,*主程序:m1.prg* Clear Input “請輸入一個整數(shù):“ To M Do sub1 with M Retrun,*sub1.prg* paramerters N P=1 FOR i=1 TO N P=P*i ENDFOR ?N,“的階乘為“ , p Return,(1) 參數(shù)傳遞在VFP中分為兩種方式,第一種參數(shù)傳遞方式:按值傳遞 將實參值的副本傳遞給形參,形參值的改變不影響實參變量的值。 第二種參數(shù)傳遞方式:按地址(引用)傳遞 將實參的地址傳給形參,此時形參變量和實參變量同用一個地址內(nèi)數(shù)據(jù),形參的改變直接影響實參值。 參數(shù)傳遞方式的設(shè)置: SET UDFPARMS TO VALUE | REFERENCE 其中:VALUE表示按值傳遞, REFERENCE表示按地址傳遞。,(2) 兩種格式進(jìn)行帶參調(diào)用:,第一種調(diào)用方式 格式1:DO WITH 說明:如果實參是非變量的常量或表達(dá)式即具體值, 此時的參數(shù)傳遞為按值傳遞;但如果實參是 變量,這時是按地址傳遞 第二種調(diào)用方式 格式2: () 說明:默認(rèn)情況下都按值傳遞,如果想要按地址傳遞 可用命令SET UDFPARMS重新設(shè)定。 SET UDFPARMS TO REFERENCE,Clear ?“采用格式2的參數(shù)傳遞“ Y=1 ?“ 格式2按值傳遞“ PP(Y) ?“ 外部“,Y ?“-“ Y=1 Set UDFPAR To REFERE ?“ 格式2按地址傳遞“ PP(Y) ?“ 外部“,Y ?“#“ ?“采用格式1的參數(shù)傳遞“ Y=1 ?“ 格式1按地址傳遞“,DO PP WITH Y ?“ 外部“,Y ?“-“ Y=1 Set UDFPARMS To Values ?“ 格式1按值傳遞“ DO PP WITH Y ?“ 外部“,Y ?“-“ Y=1 ?“ 格式1常量按值傳遞“ DO PP WITH 1 ?“ 外部“,Y ?“-“ RETURN,*過程PP* PROC PP PARA X X=2*X+1 ?“ 內(nèi)部“,X RETURN ENDPROC,【例7-20】兩種格式、兩種方式的參數(shù)傳遞應(yīng)用。,采用格式2的參數(shù)傳遞 格式2按值傳遞 內(nèi)部 3 外部 1 格式2按地址傳遞 內(nèi)部 3 外部 3 # 采用格式1的參數(shù)傳遞 格式1按地址傳遞 內(nèi)部 3 外部 3 格式1按值傳遞 內(nèi)部 3 外部 3 格式1按常量按值傳遞 內(nèi)部 3 外部 1,7.4.4 參數(shù)傳遞和變量的作用域,2變量作用域 (1) 變量的作用域:是指變量作用的有效范圍。 (2) 按變量的作用域來劃分, 變量可分為種: 全局變量(public) 私有變量(private) 本地變量(local), 全局變量PUBLIC 在所有程序模塊中都有效的內(nèi)存變量 全局變量在程序或過程結(jié)束后不會自動釋放,必須使用RELEASE或CLEAR MEMORY命令才能釋放。 全局變量的作用域為從定義點開始,到退出FoxPro時所執(zhí)行的所有的程序或過程。 全局變量須先說明(定義)后使用,通常在主程序中定義,也可在子程序中定義,還可在命令窗口中定義。 格式:PUBLIC 舉例:public a, b , c 說明:變量被說明時即被產(chǎn)生,同時賦初值.F., 私有變量PRIVATE 在建立它的程序模塊以及該程序嵌套調(diào)用的各級子程序中使用的內(nèi)存變量。 局部變量一旦離開定義它們的程序,就將失去意義。 程序中沒有被說明為全局的內(nèi)存變量,都被看成是局部變量。 局部變量也可以用PRIVATE來說明。 格式1: 格式2:PRIVATE ALL LIKE/EXCEPT 說明:變量被說明的同時并不產(chǎn)生變量,當(dāng)?shù)谝淮伪毁x值時才產(chǎn)生。沒被說明,但在程序中被賦初值,系統(tǒng)默認(rèn)其為單元的局部變量(隱式說明)。在主程序中說明的局部變量其作用域等同于整個程序的全局變量。, 本地變量Local 用Local定義的本地內(nèi)存變量只能在定義它的程序模塊中存在,一旦定義它的程序運(yùn)行完畢,本地變量就會從內(nèi)存中釋放。其它程序中不能訪問本地變量。,【例7-21】全局變量、 局部變量及其作用域示例。 *主程序* CLEAR CLEAR MEMORY Public A1 A1=“1“ DO 子程序1 ?“主程序中內(nèi)存變量有:“ LIST MEMORY LIKE A* RETURN,PROCEDURE 子程序1 PUBLIC A2 A2=“2“ PRIVATE A3 STORE “3“ TO A1,A2,A3 ?“子程序1中第一次顯示內(nèi)存變量“ LIST MEMORY LIKE A* DO 子程序2 ?“子程序1中第二次顯示內(nèi)存變量“ LIST MEMORY LIKE A* RETURN PROCEDURE 子程序2 PRIVATE A2 LOCAL A4 STORE 4 TO A1,A2,A3,A4 ?“子程序2中第一次顯示內(nèi)存變量“ LIST MEMORY LIKE A* RETURN,子程序1中第一次顯示內(nèi)存變量 A1 Pub C “3“ A2 Pub C “3“ A3 Priv C “3“ 子程序2中第一次顯示內(nèi)存變量 A1 Pub N 4 A2 (hid) C “3“ A3 Priv N 4 A4 本地 N 4 A2 Priv N 4 子程序1中第二次顯示內(nèi)存變量 A1 Pub N 4 A2 Pub C “3“ A3 Priv N 4 主程序中內(nèi)存變量有: A1 Pub N 4 A2 Pub C “3“,程序填空,*- *【程序填空】 *- *功能: 下面程序是計算1+3+5+99之和的程序。 * 請在【】處添上適當(dāng)?shù)膬?nèi)容,使程序完整。 *- SET TALK OFF *SPACE* 【?】 *SPACE* FOR I=1 TO 99 【?】 S=S+I ENDFOR *SPACE* ?“結(jié)果=“,【?】 SET TALK ON RETURN,答案: =(答案1)= s=0 =(答案2)= step 2 =(答案3)= s =或= str(s) =或= str(s,4),*- *【程序填空】 *- *功能:依次顯示XSDB.DBF數(shù)據(jù)表中的記錄內(nèi)容。請在【】處添上適當(dāng) * 的內(nèi)容,使程序完整。 *- SET TALK OFF *SPACE* 【?】 *SPACE* DO WHILE【?】 DISP *SPACE* 【?】 ENDDO USE SET TALK ON RETURN,答案: =(答案1)= use xsdb =(答案2)= .not. eof() =或= !eof() =或= not eof() =或= Eof() != .T. =(答案3)= SKIP,*- *【程序填空】 *- *功能: 現(xiàn)有職工工資庫文件GZ.DBF和職工檔案DA.DBF。 * 要求對職工工資庫文件中的“基本工資”、“應(yīng)發(fā)工資” * 、“扣款工資”和“實發(fā)工資”的字段進(jìn)行賦值。 * 請在【】處添上適當(dāng)?shù)膬?nèi)容,使程序完整。 *- SET TALK OFF CLEAR SELE A USE GZ INDEX ON 編號 TO GZBHSY SELE B USE DA *SPACE* INDE ON 【?】 TO DABHSY SELE A *SPACE* UPDA ON 編號 FROM DA REPL 基本工資 WITH 【?】 *SPACE* 【?】 應(yīng)發(fā)工資 WITH 基本工資+獎金,扣款合計 WITH 水費(fèi)+電費(fèi)+房租費(fèi),實發(fā)工資 WITH 實發(fā)工資-扣款合計 LIST CLOSE DATABASE SET TALK ON RETURN,答案: =(答案1)= 編號 =(答案2)= B.基本工資 =或= B-基本工資 =(答案3)= REPL ALL,程序改錯,*- *【程序改錯】 *- *題目:表XSDA.DBF結(jié)構(gòu)為:學(xué)號(C,6),姓名(C,6), 性別(C,2),入學(xué)成績(N,6,2)。 本程序?qū)崿F(xiàn)按學(xué)號查找記錄,直到輸入“#“為止。 *- *注意:不可以增加或刪除程序行,也

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論