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

下載本文檔

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

文檔簡介

第7章

VisualFoxPro程序設(shè)計7.1程序與程序文件VisualFoxPro支持兩種程序設(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)命令方式格式:modifycommand[<程序文件名>]說明:擴(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<參數(shù)>]

說明:文件名可以是.prg文件,也可以是其他類型文件如:.exe、.mpr、.qpr,所以要加上擴(kuò)展名。(2)菜單或工具欄方式運(yùn)行程序7.1.3程序中常出現(xiàn)的錯誤遺漏關(guān)鍵字和變量之間的空格遺漏定界符,或定界符使用了中文標(biāo)點(diǎn)符號關(guān)鍵字、變量名和文件名拼寫錯誤內(nèi)存變量沒有初始化表達(dá)式和函數(shù)中的數(shù)據(jù)類型不匹配控制語句缺少結(jié)束語句控制語句嵌套錯誤7.2程序中常用的命令7.2.1基本輸入命令1.Input命令格式:INPUT[提示信息]TO<內(nèi)存變量>功能:從鍵盤上接收數(shù)據(jù)(可為任何類型)賦給內(nèi)存變量說明:提示信息要使用定界符定界,提示信息可以省略不能不輸入任何內(nèi)容直接按回車鍵輸入的字符數(shù)據(jù)需加定界符,輸入日期數(shù)據(jù)時加大括號{},輸入邏輯值時加圓點(diǎn)定界符(.)。舉例:inputtoAAinput"請輸入學(xué)生姓名:"tonameinput"請輸入該生的出生日期:"tobirthInput"請輸入該生的黨員值:"to黨員2.Accept命令格式:ACCEPT[提示信息]TO<內(nèi)存變量>功能字符串接收命令,僅從鍵盤上接收字符型數(shù)據(jù)并賦給內(nèi)存變量。輸入的字符串不加定界符,否則,系統(tǒng)會認(rèn)為定界符也是輸入字符串本身的一部分。如果想輸入123,此時的123也是字符型數(shù)據(jù)不能用于計算。舉例:accept"請輸入學(xué)生證號"tonoaccepttoabaccept“請輸入學(xué)生姓名"toXM3.Wait命令格式:WAIT[提示信息][TO<內(nèi)存變量>][Window][Timeout<表達(dá)式>]功能:等待用戶按鍵盤上任一個鍵。說明省略提示信息后,系統(tǒng)默認(rèn)為提示“按任一鍵繼續(xù)…”。

waittox<內(nèi)存變量>用于保存用戶按鍵的字符,可省略此項(xiàng)。如指定Window項(xiàng),主窗口的右上角會出現(xiàn)一個Wait提示窗口,來顯示提示信息,否則顯示在屏幕工作中。如指定[Timeout<表達(dá)式>]項(xiàng),用于設(shè)定等待時間,Timeout為間隔秒數(shù),一旦超時,系統(tǒng)自動往下執(zhí)行。

wait"請輸入一個字母"tomwindowtimeout3【例7-1】輸入任意一個數(shù)據(jù),判斷該數(shù)的數(shù)據(jù)類型。程序如下:CLEARINPUT“請輸入任意類型的一個數(shù)據(jù)”TOX?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é)生.DBFACCEPT"請輸入您要查詢的學(xué)生姓名"TONAMELOCATEFOR姓名=NAMEDISPWAIT“您還要查詢其他內(nèi)容?”WINDOWTIMEOUT5INPUT"請輸入您要查詢的學(xué)生的身高"TOHEIGHTLOCATEFOR身高=HEIGHTDISPUSERETURN7.2.2基本輸出命令1.表達(dá)式輸出命令格式:?|??<表達(dá)式1>[,<表達(dá)式2>…]功能:對一個或多個表達(dá)式求值,并將結(jié)果輸出到系統(tǒng)主窗口上。說明:?:表達(dá)式的值換行顯示;??:表達(dá)式的值不換行顯示;

?:單個?表示需要光標(biāo)換行。舉例:?3+4,date(),6>7use學(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á)式>功能:在屏幕指定位置輸出表達(dá)式的值。說明:<行,列>:指定了輸出的位置。標(biāo)準(zhǔn)屏幕是25行80列,左上角頂點(diǎn)為(0,0),右下角坐標(biāo)為(24,79)。行、列都可以為表達(dá)式,還可為小數(shù)。舉例:@10,10say"hello!"@15,20say"howareyou!"@20,35say"大家好!"2.定位輸入命令格式:@<行,列>[SAY(提示信息)]GET<變量>…READ功能:在屏幕指定位置接收鍵盤輸入的新值說明SAY子句:用于顯示提示信息,提示信息加定界符GET子句:用于為顯示變量的值,并允許輸入新值

GET子句中的變量必須有確定的初值

初值決定了該變量的類型和寬度

READ:使GET后的<變量>進(jìn)入編輯狀態(tài);讓光標(biāo)自動跳到該變量值所在位置上等待編輯修改;可在多個定位輸入命令后面使用一個read語句。clearname="張曉磊"grade=98.6birth={^2002-09-07}團(tuán)員=.t.@0,10say"name"getnameread@1,10say"grade"getgraderead@2,10say"birth"getbirthread@3,10say"團(tuán)員"get團(tuán)員read?name,grade,birth,團(tuán)員clearuse學(xué)生表go2@0,10say"姓名:"get姓名@1,10say"性別:"get性別@2,10say"出生日期:"get出生日期@3,10say"黨員:"get團(tuán)員@3,10say"身高:"get身高read7.2.4清屏命令格式:CLEAR功能:清除屏幕或窗口中的顯示內(nèi)容,光標(biāo)回到屏幕左上角。7.2.5終止程序執(zhí)行和返回命令1.Cancel終止程序執(zhí)行,關(guān)閉所有打開的程序,返回命令窗口。2.Return結(jié)束當(dāng)前程序執(zhí)行,返回到調(diào)用它的上一級主程序,若無上級程序則返回命令窗口。3.Quit退出VisualFoxpro系統(tǒng)。7.2.6MessageBox()函數(shù)1.語法格式:MESSAGEBOX(提示信息[,對話框的屬性[,對話框窗口標(biāo)題]])2.功能:顯示一個自定義的對話框。常用作提示之用,也可作一些簡單的選擇,比如“確定”、“取消”等3.舉例:messagebox("請選擇",32+3+0,"測試")4.說明:(1)提示信息:對話框中所用到的提示文字。(2)對話框的屬性:MESSAGEBOX(提示信息[,對話框的屬性[,對話框窗口標(biāo)題]])例如:messagebox("請選擇",32+3+0,"測試")值圖標(biāo)16紅色叉號32問號48感嘆號64字母i值對話框按鈕屬性0僅有一個“確定”按鈕1有“確定”和“取消”按鈕2“終止”、“重試”、“忽略”3“是”、“否”、“取消”4“是”和“否”按鈕5“重試”和“取消”按鈕值默認(rèn)按鈕0第1個256第2個512第3個設(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值鍵1確定2取消3終止4重試5忽略6是7否7.3程序的基本控制結(jié)構(gòu)程序的概念命令(或語句)的有序集合,以文件(.prg)形式存儲一個程序一般包括三個部分:數(shù)據(jù)定義或輸入部分?jǐn)?shù)據(jù)處理部分?jǐn)?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í)行一次?!纠?-3】編程計算圓的周長和面積。ClearInput"請輸入圓的半徑"ToRPi=3.14L=2*PI*RS=PI*R*R?"圓的周長為:",L?"圓的面積為:",S

Return命令序列1命令序列2……命令序列n輸入半徑R的值定義圓周率變量pi計算周長L和面積S輸出L和S的值清屏幕【例7-4】查詢學(xué)生表中所有男同學(xué)和女同學(xué)的學(xué)生證號,姓名,性別和年齡,并分別顯示男同學(xué)和女同學(xué)的信息。程序分析:clearuse學(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<條件><命令序列1>ENDIF功能:若<條件>成立,則執(zhí)行<命令序列1>;否則執(zhí)行ENDIF后面的語句。說明:

IF和ENDIF必須成對出現(xiàn)。<條件>是一個邏輯值表達(dá)式。<命令序列1>可以是多條語句的集合。命令序列1條件?不成立成立clearinput"請輸入一個正整數(shù)"toxifx>0?"輸入的是正整數(shù)"?"x=",xendifreturn【例7-5】判斷一個數(shù)是正負(fù)、負(fù)數(shù)、還是零。程序分析:ClearInput"請輸入一個數(shù)"toNIfN>0?"是正數(shù)。"EndifIfN<0?"是負(fù)數(shù)。"EndifIfN=0?"是零。"Endif

【例7-6】在學(xué)生表中根據(jù)所輸入的學(xué)生證號查找該學(xué)生記錄。程序分析:ClearUse學(xué)生表Accept"請輸入所要查找的學(xué)生證號:"TOXSZHLocateFor學(xué)生證號=XSZHIfFound()

DispEndIfUseReturn2.雙(向)分支格式IF<條件><命令序列1>ELSE<命令序列2>ENDIF功能:若〈條件〉成立,則執(zhí)行<命令序列1>,否則執(zhí)行<命令序列2>。說明:IF和ENDIF必須成對出現(xiàn);ELSE本身占一行。命令序列1條件?不成立成立命令序列2【例7-7】用雙分支實(shí)現(xiàn)判斷一個數(shù)的正負(fù)。程序分析:ClearInput"請輸入一個數(shù)"toNIfN>=0?"是正數(shù)。"Else?"是負(fù)數(shù)。"Endif?"程序運(yùn)行結(jié)束"RETURN是正數(shù)N>=0否是是負(fù)數(shù)輸入一個數(shù)程序運(yùn)行結(jié)束分支語句的嵌套IF<條件>IF<條件><語句序列1>ELSE<語句序列2>ENDIFELSE

IF<條件><語句序列2>ENDIFENDIFClearInput"請輸入一個數(shù)"toNIFN>0?"是正數(shù)。"ELSEIFN=0?"是零。"ELSE?"是負(fù)數(shù)。"ENDIFENDIF?"程序運(yùn)行結(jié)束"RETURNClearInput"請輸入一個數(shù)"toNIFN>=0IFN>0?"是正數(shù)。"ELSE?"是零。"ENDIFELSE?"是負(fù)數(shù)。"ENDIF?"程序運(yùn)行結(jié)束"RETURN【例7-8】在學(xué)生表中根據(jù)所輸入的姓名查找該學(xué)生記錄

程序分析:ClearUse學(xué)生表Accept"請輸入所要查找的姓名:"TOXMLocateFor姓名=XMIfFound()

DispELSE?”查無此人!”EndIfUseReturn顯示當(dāng)前記錄找到?否是顯示查無此人按XM查找記錄關(guān)閉表打開學(xué)生表輸入要查找的姓名-XM3.多(向)分支格式:DOCASECASE<條件1><命令序列1>CASE<條件2><命令序列2>…………CASE<條件n><命令序列n>[OTHERWISE<命令序列n+1>]ENDCASE條件1otherwise條件2條件n…ENDCASE的下一條命令命令序列1命令序列2命令序列n命令序列n+1YYYNNN【例7-9】根據(jù)所輸入的日期判定今天是星期幾。程序分析:輸入日期

INPUT

根據(jù)日期判斷星期幾

DOW(日期變量)程序結(jié)構(gòu)分析:單分支雙分支多分去Input"請輸入今天日期:"ToDIFDOW(D)=1?"日期日"ENDIFIFDOW(D)=2?"日期一"ENDIFIFDOW(D)=3?"日期二"ENDIFIFDOW(D)=4?"日期三"ENDIFIFDOW(D)=5?"日期四"ENDIFIFDOW(D)=6?"日期五"ENDIFIFDOW(D)=7?"日期六"ENDIF【例7-9】根據(jù)所輸入的日期判定今天是星期幾。程序分析:輸入日期

INPUT根據(jù)日期判斷星期幾

DOW(日期變量)程序結(jié)構(gòu)分析:單分支雙分支(嵌套)多分去Input"請輸入今天日期:"ToDIFDOW(D)=1?"日期日"ELSEIFDOW(D)=2?"日期一"ELSEIFDOW(D)=3?"日期二"ELSEIFDOW(D)=4?"日期三"ELSEIFDOW(D)=5?"日期四"ELSEIFDOW(D)=6?"日期五"ELSEIFDOW(D)=7?"日期六"ENDIFENDIFENDIFENDIFENDIFENDIFENDIF【例7-9】根據(jù)所輸入的日期判定今天是星期幾。程序分析:輸入日期

INPUT根據(jù)日期判斷星期幾

DOW(日期變量)程序結(jié)構(gòu)分析:單分支雙分支多分去Input"請輸入今天日期:"ToDDoCaseCaseDow(D)=1?“星期日”CaseDow(D)=2?“星期一”CaseDow(D)=3?“星期二”CaseDow(D)=4?“星期三”CaseDow(D)=5?“星期四”CaseDow(D)=6?“星期五”O(jiān)THERWISE?“星期六”EndCaseAccept"請輸入學(xué)生證號:"ToXSZHUse成績表LocateFor學(xué)生證號=XSZHDoCaseCase期末成績>=90?"優(yōu)秀"

Case期末成績>=80and期末成績<=89?"良好"

Case期末成績>=70and期末成績<=79?"中等"

Case期末成績>=60and期末成績<=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)語句來實(shí)現(xiàn)循環(huán)循環(huán)結(jié)構(gòu)可以減少程序代碼重復(fù)書寫的工作量,使編程效率大大提高,VFP的循環(huán)結(jié)構(gòu)語句主要三種當(dāng)型循環(huán)步長型循環(huán)表掃描型循環(huán)命令格式1DOWHILE<條件>循環(huán)體語句ENDDO1.當(dāng)型循環(huán)(DOWHILE……ENDDO)循環(huán)體語句條件?NENDDO后面語句Y語句功能:(1)判斷<條件>是否為真(.T.),是真執(zhí)行循環(huán)體語句,否則執(zhí)行ENDDO后面語句(2)執(zhí)行DOWHILE和ENDDO之間的命令序列(循環(huán)體)(3)遇到ENDDO,轉(zhuǎn)(1)(4)結(jié)束循環(huán),轉(zhuǎn)到ENDDO后面的語句?!纠?-11】輸出1至100之間所有能被3整除的數(shù)。ClearY=1DoWhileY<=100Ifmod(Y,3)=0?Y

EndIfY=Y+1EndDoRETURN顯示y值y<=100?NENDDO后面語句Y定義變量y=1y整除3?YNy值增1【例7-12】把學(xué)生表所有民族為漢族的學(xué)生逐條輸出。程序PR7-12.prg如下:ClearUse學(xué)生表.dbfDoWhilenotEOF()

If民族="漢族"

Disp

EndIfSkipEndDOUSE命令格式2DOWHILE<條件>[命令序列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)到DOWHILE處,重新判斷循環(huán)條件。EXIT和LOOP命令只能出現(xiàn)在循環(huán)體中,并且可以出現(xiàn)在循環(huán)體中的任何位置。【例7-12-1】編寫一個能多次計算任意半徑的圓的周長和面積的程序,當(dāng)輸入的半徑小于或等于0時,停止運(yùn)行。Clearinput"請輸入圓的半徑:"torPi=3.14L=2*PI*RS=PI*R*R?"圓的周長為:",L?"圓的面積為:",SClearR=1dowhileR>0Input"請輸入圓的半徑:"ToRifR<=0loop

endifL=2*3.14*RS=3.14*R*R?"圓的周長為:",L?"圓的面積為:",SenddoCleardowhile.T.Input"請輸入圓的半徑:"ToRifR<=0exit

endifL=2*3.14*RS=3.14*R*R?"圓的周長為:",L?"圓的面積為:",Senddo2.步長型循環(huán)(FOR…ENDFOR)格式:FOR<循環(huán)變量>=<初值>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[(終值-初值)/步長]+1fori=1to1+7sete2?iendfor2.步長型循環(huán)(FOR…ENDFOR)格式:FOR<循環(huán)變量>=<初值>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后面的語句fori=1to1+7sete2?iendfor【例7-13】計算1+2+3+……+100=?ClearS=0Fori=1to100S=S+iNexti?“1=2+3+……+100=”,SRETURNS=0i=1DOWHILEi<=100S=S+ii=i+1ENDDO【例7-14】向?qū)W生表中一次添加10條新記錄。采用循環(huán)結(jié)構(gòu),每次添加一條記錄先插入一條空記錄利用定位輸入輸出命令輸入記錄內(nèi)容

ClearUse學(xué)生表Fori=1to10APPENDBLANK

@2,1SAY"學(xué)生證號:"GET學(xué)生證號PICTURE"9999999999"@4,1SAY"姓名:"GET姓名

@6,1SAY"性別:"GET性別

@8,1SAY"出生日期:"GET出生日期

@10,1SAY"民族:"GET民族

READENDFORUSE格式: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)(SCAN…ENDSCAN)SCAN<命令序列>ENDSCANdowhilenoteof()<命令序列>skipenddo【例7-15】查詢學(xué)生表中所有女黨員并輸出。clearuse學(xué)生表scanfor黨員and性別="女"displayendscanusereturn【例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)點(diǎn):子程序是相對獨(dú)立的、通用的一段代碼。一個程序由若干個子程序組成,子程序獨(dú)立編碼和測試,子程序還可以重復(fù)使用,這樣可以方便地生成程序,減少代碼的編寫量,并易于修改和維護(hù)程序。主程序:ClearDojc.prg

&&調(diào)用子程序jc.prgReturnjc.prg:P=1FORi=1TO100P=P*iENDFOR?"100的階乘為",pRETURN7.4.1子程序2.子程序的建立:MODIFYCOMMAND子程序文件名3.子程序的調(diào)用調(diào)用語句格式:DO<子程序文件名>[With<參數(shù)列表>]

說明:

WITH用于主程序和子程序間參數(shù)的傳遞子程序參數(shù)定義:PARAMETERS<參數(shù)列表>子程序返回語句的四種格式

RETURN

返回到調(diào)用它的上一級主程序或VFP窗口

RETURN<表達(dá)式>

將表達(dá)式的值返回給調(diào)用程序

RETURNTO<程序文件名>

返回指定程序文件

RETURNTOMASTER

直接返回到第一級主程序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í)行語句。主程序:ClearDozj1.prgDozj2.prgReturnzj1.prg:P=1FORi=1TO100P=P*iENDFOR?"100的階乘為",pRETURNZj2.prg:S=0FORi=1TO100S=S+iENDFOR?"1-100的和為",SRETURN【例7-16】用子程序求任意一個數(shù)的階乘。ClearInput"請輸入要求階乘的數(shù):"ToMDoJieCheng.prgWithMReturn**JieCheng.prg子程序**PARAMETERSNP=1FORi=1TONP=P*iENDFOR?N,"的階乘為",pRETURN主程序PR7-16-1.prg如下(帶兩個參數(shù)):ClearInput"請輸入要求階乘的數(shù):"ToMX=1DoJieCheng.prgWithM,X?M,"的階乘為",XReturn**JieCheng.prg子程序**PARAMETERSN,PFORi=1TONP=P*iENDFORRETURN7.4.2過程和過程文件1.過程過程的的概念:

過程是以PROCEDURE<過程名>開頭,以ENDPROC結(jié)尾的一段程序。它可以放在調(diào)用程序中,也可以獨(dú)立存儲為一個過程文件。過程定義的語法格式:

PROCEDURE<過程名>PARAMETERS<參數(shù)表><命令序列>[RETURN[<表達(dá)式>]]ENDPROC【例7-17】把求任意一個數(shù)的階乘的程序用過程來實(shí)現(xiàn)。程序與過程在一個程序文件中(不帶參數(shù)):ClearInput"請輸入要求階乘的數(shù):"ToNDoJC

*******過程JC,也在程序PR7-17-1中ProcedureJCP=1FORi=1TONP=P*iENDFOR?N,"的階乘為",pENDPROCRETURN程序PR7-17-2.prg如下(帶一個參數(shù)):ClearInput“請輸入要求階乘的數(shù):”ToMDoJCWithM

*******過程JC,也在程序PR7-17-2中*****ProcedureJC

PARAN

P=1

FORi=1TON

P=P*i

ENDFOR

?N,”的階乘為”,pENDPROCRETURN2.過程文件過程文件:包括一個或多個過程的程序文件(.prg)。語法格式:

PROCEDURE<過程名1><命令序列1>RETURNENDPROCPROCEDURE<過程名2><命令序列2>RETURNENDPROC…………PROCEDURE<過程名n><命令序列n>RETURNENDPROC過程文件的建立:與程序文件的建立方法完全相同過程文件的打開與過程的調(diào)用要調(diào)用過程,必須先打開包含此過程的過程文件。打開過程文件的格式:

SETPROCEDURETO[<過程文件1>[,<過程文件2>,…]][ADDITIVE]說明:可以打開一個或多個過程文件。過程文件打開后,文件中所有過程都可以被調(diào)用參數(shù)ADDITIVE表示不關(guān)閉原先已打開過程文件過程文件的關(guān)閉

SETPROCEDURETO

CLOSEPROCEDURE【例7-18】輸入任意半徑,計算圓的周長,圓的面積和球的體積用過程文件實(shí)現(xiàn)。程序分析:主程序

main.prg過程文件

pp.prg*******主程序main.prg********ClearInput"請輸入半徑:"ToRSetProceduretoPP.prg

DoZCWithRDoMJWithRDoTJWithRSetProcedureTo**過程文件PP.prg****ProcZC

PARA

X

L=2*PI()*X

?”周長為:”,LENDPROCPROCMJ

PARA

X

S=PI()*X*X

?”面積為:”,SENDPROCPROCTJ

PARAX

V=4/3*PI()*X*X*X

?“體積為:”,VENDPROC內(nèi)容回顧程序

例如:求任意一個整數(shù)的階乘和1到該整數(shù)的和子程序過程函數(shù)ClearInput"請輸入一個整數(shù):"ToNP=1FORi=1TONP=P*iENDFOR?N,"的階乘為:",pS=0FORi=1TONS=S+iENDFOR?"1-",N,"的和為:",SRETURN**主程序:m1.prg**ClearInput"請輸入一個整數(shù):"ToMDosub1withMDosub2withMRetrun**sub1.prg**paramertersNP=1FORi=1TONP=P*iENDFOR?N,"的階乘為",pReturn**sub2.prg**paramertersNS=0FORi=1TONS=S+iENDFOR?"1-",N,"的和為",SReturnClearInput"請輸入一個整數(shù):"ToMSetProceduretopd.prgdopd1withMdopd2withMSetProcedurttoreturn***過程文件pd.prg****procedurepd1ParametersNP=1FORi=1TONP=P*iENDFOR?N,"的階乘為:",pendprocprocedurepd2ParametersNS=0FORi=1TONS=S+iENDFOR?"1-",N,"的和為:",Sendproc**主程序:m1.prg**ClearInput"請輸入一個整數(shù):"ToMDosub1withMDosub2withMRetrun內(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ù)表>])用戶自定義的函數(shù)不能與系統(tǒng)函數(shù)同名。用戶自定義函數(shù)的語法格式:FUNCTION<函數(shù)名>

PARAMETER<形參變量名表>

<命令序列>

RETURN[<表達(dá)式>]ENDFUNC【例7-19】用函數(shù)實(shí)現(xiàn)求組合CLEARINPUT"第一個數(shù):"TOrINPUT"第二個數(shù):"TOnC=JC(n)/(JC(r)*JC(n-r))?"從",n,"里取",r,"的組合為",CRETURN***JC()函數(shù):求任意一個數(shù)x的階乘**FUNCTIONJCPARAMETERSXP=1FORi=1TOXP=P*iENDFORRETURNP&&返回P的值ENDFUNC7.4.4參數(shù)傳遞和變量的作用域1.參數(shù)傳遞 在主程序調(diào)用子程序時,有時需要調(diào)用程序與被調(diào)用程序之間進(jìn)行參數(shù)傳遞。調(diào)用程序用DO<被調(diào)用程序名>WITH<實(shí)參列表>把實(shí)參數(shù)據(jù)傳遞給被調(diào)用程序中的形參數(shù)據(jù),被調(diào)用程序中用PARAMETERS<形參列表>來接收參數(shù)。**主程序:m1.prg**ClearInput"請輸入一個整數(shù):"ToMDosub1withMRetrun**sub1.prg**paramertersNP=1FORi=1TONP=P*iENDFOR?N,"的階乘為",pReturn(1)參數(shù)傳遞在VFP中分為兩種方式第一種參數(shù)傳遞方式:按值傳遞將實(shí)參值的副本傳遞給形參,形參值的改變不影響實(shí)參變量的值。第二種參數(shù)傳遞方式:按地址(引用)傳遞將實(shí)參的地址傳給形參,此時形參變量和實(shí)參變量同用一個地址內(nèi)數(shù)據(jù),形參的改變直接影響實(shí)參值。參數(shù)傳遞方式的設(shè)置:

SETUDFPARMSTOVALUE|REFERENCE

其中:VALUE表示按值傳遞,REFERENCE表示按地址傳遞。(2)兩種格式進(jìn)行帶參調(diào)用:第一種調(diào)用方式格式1:DO<被調(diào)用程序名>WITH<實(shí)參列表>說明:如果實(shí)參是非變量的常量或表達(dá)式即具體值,此時的參數(shù)傳遞為按值傳遞;但如果實(shí)參是變量,這時是按地址傳遞第二種調(diào)用方式格式2:<被調(diào)用程序名>(<實(shí)參列表>)說明:默認(rèn)情況下都按值傳遞,如果想要按地址傳遞可用命令SETUDFPARMS重新設(shè)定。

SETUDFPARMSTOREFERENCEClear?"@@采用格式2的參數(shù)傳遞"Y=1?"格式2按值傳遞"PP(Y)?"外部",Y?"------------------"Y=1SetUDFPARToREFERE?"格式2按地址傳遞"PP(Y)?"外部",Y?"######################"?"@@采用格式1的參數(shù)傳遞"Y=1?"格式1按地址傳遞"DOPPWITHY?"外部",Y?"------------------"Y=1SetUDFPARMSToValues?"格式1按值傳遞"DOPPWITHY?"外部",Y?"------------------"Y=1?"格式1常量按值傳遞"DOPPWITH1?"外部",Y?"------------------"RETURN*過程PP*PROCPPPARAXX=2*X+1?"內(nèi)部",XRETURNENDPROC【例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外部17.4.4參數(shù)傳遞和變量的作用域2.變量作用域(1)變量的作用域:是指變量作用的有效范圍。(2)按變量的作用域來劃分,變量可分為種:①全局變量(public)②私有變量(private)

③本地變量(local)①全局變量PUBLIC在所有程序模塊中都有效的內(nèi)存變量全局變量在程序或過程結(jié)束后不會自動釋放,必須使用RELEASE或CLEARMEMORY命令才能釋放。全局變量的作用域?yàn)閺亩x點(diǎn)開始,到退出FoxPro時所執(zhí)行的所有的程序或過程。全局變量須先說明(定義)后使用,通常在主程序中定義,也可在子程序中定義,還可在命令窗口中定義。格式:PUBLIC<變量名表>舉例:publica,b,c說明:變量被說明時即被產(chǎn)生,同時賦初值.F.②私有變量PRIVATE在建立它的程序模塊以及該程序嵌套調(diào)用的各級子程序中使用的內(nèi)存變量。局部變量一旦離開定義它們的程序,就將失去意義。程序中沒有被說明為全局的內(nèi)存變量,都被看成是局部變量。局部變量也可以用PRIVATE來說明。格式1:<變量名表>格式2:PRIVATEALL[LIKE<通配符變量名>/EXCEPT<通配符變量名>]說明:變量被說明的同時并不產(chǎn)生變量,當(dāng)?shù)谝淮伪毁x值時才產(chǎn)生。沒被說明,但在程序中被賦初值,系統(tǒng)默認(rèn)其為單元的局部變量(隱式說明)。在主程序中說明的局部變量其作用域等同于整個程序的全局變量。③本地變量Local

用Local定義的本地內(nèi)存變量只能在定義它的程序模塊中存在,一旦定義它的程序運(yùn)行完畢,本地變量就會從內(nèi)存中釋放。其它程序中不能訪問本地變量?!纠?-21】全局變量、局部變量及其作用域示例。**主程序**CLEARCLEARMEMORYPublicA1A1="1"DO子程序1?"主程序中內(nèi)存變量有:"LISTMEMORYLIKEA*RETURNPROCEDURE子程序1PUBLICA2A2="2"PRIVATEA3STORE"3"TOA1,A2,A3?"子程序1中第一次顯示內(nèi)存變量"LISTMEMORYLIKEA*DO子程序2?"子程序1中第二次顯示內(nèi)存變量"LISTMEMORYLIKEA*RETURNPROCEDURE子程序2PRIVATEA2LOCALA4STORE4TOA1,A2,A3,A4?"子程序2中第一次顯示內(nèi)存變量"LISTMEMORYLIKEA*RETURN子程序1中第一次顯示內(nèi)存變量A1PubC"3"A2PubC"3"A3PrivC"3"子程序2中第一次顯示內(nèi)存變量A1PubN4A2(hid)C"3"A3PrivN4A4本地N4A2PrivN4子程序1中第二次顯示內(nèi)存變量A1PubN4A2PubC"3"A3PrivN4主程序中內(nèi)存變量有:A1PubN4A2PubC"3"程序填空*-------------------------------------------------------*【程序填空】*-------------------------------------------------------*功能:下面程序是計算1+3+5+…+99之和的程序。*請在【】處添上適當(dāng)?shù)膬?nèi)容,使程序完整。*-------------------------------------------------------SETTALKOFF***********SPACE**********【?】***********SPACE**********FORI=1TO99【?】S=S+IENDFOR***********SPACE**********?"結(jié)果=",【?】SETTALKONRETURN答案:=======(答案1)=======s=0=======(答案2)=======step2=======(答案3)=======s=========或=========str(s)=========或=========str(s,4)*-------------------------------------------------------*【程序填空】*-------------------------------------------------------*功能:依次顯示XSDB.DBF數(shù)據(jù)表中的記錄內(nèi)容。請在【】處添上適當(dāng)*的內(nèi)容,使程序完整。*-------------------------------------------------------SETTALKOFF***********SPACE**********【?】***********SPACE**********DOWHILE【?】DISP***********SPACE**********【?】ENDDOUSESETTALKONRETURN答案:=======(答案1)=======usexsdb=======(答案2)=======.not.eof()=========或=========!eof()=========或=========noteof()=========或=========Eof()!=.T.=======(答案3)=======SKIP*-------------------------------------------------------*【程序填空】*-------------------------------------------------------*功能:現(xiàn)有職工工資庫文件GZ.DBF和職工檔案DA.DBF。*要求對職工工資庫文件中的“基本工資”、“應(yīng)發(fā)工資”*、“扣款工資”和“實(shí)發(fā)工資”的字段進(jìn)行賦值。*請在【】處添上適當(dāng)?shù)膬?nèi)容,使程序完整。*-------------------------------------------------------SETTALKOFFCLEARSELEAUSEGZINDEXON編號TOGZBHSYSELEBUSEDA***********SPACE**********INDEON【?】TODABHSYSELEA***********SPACE**********UPDAON編號FROMDAREPL基本工資WITH【?】***********SPACE**********【?】應(yīng)發(fā)工資WITH基本工資+獎金,扣款合計WITH水費(fèi)+電費(fèi)+房租費(fèi),實(shí)發(fā)工資WITH實(shí)發(fā)工資-扣款合計LISTCLOSEDATABASESETTALKONRETURN答案:=======(答案1)=======編號=======(答案2)=======B.基本工資=========或=========B->基本工資=======(答案3)=======REPLALL程序改錯*-------------------------------------------------------*【程序改錯】*-------------------------------------------------------*題目:表XSDA.DBF結(jié)構(gòu)為:學(xué)號(C,6),姓名(C,6),性別(C,2),入學(xué)成績(N,6,2)。本程序?qū)崿F(xiàn)按學(xué)號查找記錄,直到輸入"#"為止。*-------------------------------------------------------*注意:不可以增加或刪除程序行,也不可以更改程序的結(jié)構(gòu)。*-------------------------------------------------------SETTALKOFFUSEXSDA**********FOUND**********ACCEPT"請輸入要查找的學(xué)號"ONXHDOWHILEXH!="#"**********FOUND**********LOCATEFOR學(xué)號="CJ"IFFOUND()?學(xué)號,姓名,入學(xué)成績

ELSE?"無此學(xué)號"ENDIFACCEPT"請繼續(xù)輸入要查找的學(xué)號"TOXH**********FOUND**********ENDFOR?"謝謝使用本查找系統(tǒng)"USESETTALKONRETU答案:=======(答案1)=======ACCEPT"請輸入要查找的學(xué)號"TOXH=======(答案2)=======LOCATEFOR學(xué)號=XH=======(答案3)=======ENDDO=========或=========ENDD*-------------------------------------------------------*【程序改錯】*-------------------------------------------------------*題目:計算出1-50以內(nèi)(包含50)能被3和5整除的數(shù)之和。*-------------------------------------------------------*注意:不可以增加或刪除程序行,也不可以更改程序的結(jié)構(gòu)。*-------------------------------------------------------SETTALKOFFCLEARX=0**********FOUND**********Y=1**********FOUND**********DOWHILNOTEOF()X=X+1DOCASECASEMOD(X,5)=0ANDMOD(X,3)=0Y=Y+XCASEX<=50LOOPCASEX>50EXITENDCASEENDDO**********FOUND**********?XSETTALKONRETU答案:=======(答案1)=======Y=0=======(答案2)=======DOWHIL.T.=======(答案3)=======

溫馨提示

  • 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

提交評論