999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

VFP中三種模塊化程序設計方法的研究與實踐

2012-04-29 09:01:56王秀娟洪軍
計算機時代 2012年11期

王秀娟 洪軍

摘要: VFP是基于數據庫管理和應用程序開發的高級語言。VFP中可以用子程序、過程、函數三種方式實現模塊程序設計。這三種方式功能相同,但格式、調用方式、數據傳遞方式又不盡相同;這三種方式可以相互轉換。學生在學習中常常不能確認應該采用哪種方式實現模塊功能。為此,詳細分析了三種方式的設計過程,以幫助學生理解并掌握這三種方式的結構及其轉換格式,各種不同格式的調用方式,以及它們的用處和模塊的編程方法。

關鍵詞: 子程序; 過程; 函數; 局部變量

中圖分類號:TP392文獻標志碼:B 文章編號:1006-8228(2012)11-44-04

Research and practice of three modularized program design methods in Visual FoxPro

Wang Xiujuan1, Hong Jun2

(1. School of electronics and computer science and technology, North University of China, Taiyuan, Shanxi 030051;

2. School of Software, North University of China)

Abstract: Visual FoxPro is an advanced language which is based on database management and application program development. There are three kinds of modularized programming method including subprogram, procedure and function. Though they have the same function, they are different in format program invocation, data transmission and can be transformed to each other which make the students unclear about which method they should use to design the module. A detailed analysis of the three methods and some examples are given to help the students to learn the structure, transition and invocation of the three methods and master the modularized program design easily.

Key words: subprogram; procedure; function; local variable

0 引言

VFP(Visual FoxPro)是一種關系型數據庫管理系統,它不僅支持面向對象的可視化程序設計,還支持傳統的面向過程的程序設計。面向過程的程序設計方法要求將一個大的系統分解為多個模塊,用以實現功能的分解和代碼的重用。VFP中實現模塊的程序設計方法比較多,包括:子程序、過程、函數。下面舉例分析三種方式的異同。

1 三種設計方法詳解

1.1 子程序

在VFP中子程序的結構和程序的結構基本相同,通常使用MODIFY COMMAND命令單獨建立一個程序文件,以擴展名.PRG保存成一個程序文件[1]。一般習慣在子程序的末尾加上RETURN命令返回調用處。調用子程序的格式為:DO 子程序文件名[WITH <參數表>]。

1.2 過程

VFP中按照過程是否單獨保存成程序文件將過程分為兩種:內部過程和外部過程。內部過程與主程序放在一個文件里,通常放在主程序文件的后面;外部過程單獨保存成一個程序文件,優點是不依附于主程序,可以被多個程序共享[2]。

內部過程格式:

PROCEDURE <過程名>

[PARAMETERS <形式參數表>]

<命令組>

RETURN|ENDPRO

調用格式:DO 過程名 WITH <參數表>

下面舉例說明內部過程和外部過程之間的區別,編寫程序實現輸出任意兩個數值之間的所有素數,在過程中判斷單個數是否素數。

例1:內部過程。

*MAIN.PRG文件代碼如下:

INPUT TO X1

INPUT TO X2

FOR M=X1 TO X2

FLAG=.T.

DO PRIME WITH M,FLAG

IF FLAG

?M

ENDIF

ENDFOR

CANCEL

PROCEDURE PRIME

PARAMETERS N,FLAG1

K=INT(SQRT(N))

J=2

DO WHILE J<=K .AND. FLAG1

IF MOD(N,J)=0

FLAG1=.F.

ENDIF

J=J+1

ENDDO

RETURN

例2:外部過程。

*MAIN.PRG文件代碼如下:

INPUT TO X1

INPUT TO X2

FOR M=X1 TO X2

FLAG=.T.

DO P1.PRG WITH M,FLAG

IF FLAG

?M

ENDIF

ENDFOR

CANCEL

*外部過程文件P1.PRG代碼如下:

PARAMETERS N,FLAG1

K=INT(SQRT(N))

J=2

DO WHILE J<=K .AND. FLAG1

IF MOD(N,J)=0

FLAG1=.F.

ENDIF

J=J+1

ENDDO

RETURN

在例1中將內部過程PRIME和主程序放在同一個文件中,并放在主程序的后面,程序運行時從主程序開始,當執行到命令DO PRIME WITH M,FLAG時,轉去執行過程PRIME,其中PRIME是過程名。用外部過程實現時,主程序和外部過程分別存放在兩個程序文件中,主程序文件調用時使用命令DO P1.PRG WITH M,FLAG,其中P1.PRG是外部過程保存的文件名,另外在外部過程文件中不需要使用“PROCEDURE <過程名>”語句定義過程名,因為過程名不起作用,調用時使用的是文件名。

此外,如果在調用過程時需要返回數據給主調程序,此時不能通過RETURN命令返回,因為使用“DO”命令調用過程時,過程中的“RETURN”命令不能返回數據(即使使用“RETURN表達式”形式,也不能將表達式的結果返回,此時的表達式不起作用)[3]。這時可以通過傳地址的方式來實現將過程的運行結果傳回調用處。在程序中使用變量“FLAG”作為過程調用的返回值,過程調用前“FLAG=.T.”(即假定被判定數據為素數),調用過程時將實參FLAG的值傳遞給形參FLAG1(此時FLAG1=.T.),在調用過程中判定數據是否能整除,若能整除則修改變量“FLAG1”的值為“.F.”,若所有的除數都不能整除則FLAG1的值不變。調用過程結束時將形參N的值傳回給實參M,將形參FLAG1的值傳回給實參FLAG,即通過傳地址的方式在調用過程中實現將運算數據返回調用處。

1.3 函數

VFP中函數有兩種類型:庫函數和自定義函數。其中庫函數是VFP系統為用戶提供的內部函數,用以實現一些常用的功能,用戶可以直接調用。自定義函數是用戶根據需要自己編寫的函數(即自定義函數)[3]。

自定義函數格式:

[FUNCTION <函數名>]

[PARAMETERS <參數表>]

<命令組>

RETURN [<表達式>]

函數的調用形式是:

<函數名>(<自變量表>)

例3:將例1用過程編寫的求素數的程序改寫成用函數來實現。

INPUT TO X1

INPUT TO X2

FOR M=X1 TO X2

IF PRIME(M)

? M

ENDIF

ENDFOR

CANCEL

FUNCTION PRIME

PARAMETERS N

FLAG=.T.

K=INT(SQRT(N))

J=2

DO WHILE J<=K .AND. FLAG

IF MOD(N,J)=0

FLAG=.F.

ENDIF

J=J+1

ENDDO

RETURN FLAG

在例3中用“RETURN FLAG”命令給函數返回一個值,事實上在函數調用過程中通過RETURN命令最多只能返回一個值到函數調用處。若想返回多個結果只是使用RETURN命令是無法實現的。

為了對比子程序、函數、過程三種結構的異同,現將上述程序用子程序的方式來編寫,如下所示。

例4:

*MAIN.PRG文件代碼如下:

INPUT TO X1

INPUT TO X2

FOR M=X1 TO X2

FLAG=.T.

DO P2

IF FLAG

?M

ENDIF

ENDFOR

CANCEL

*子程序文件P2.PRG代碼如下:

K=INT(SQRT(M))

J=2

DO WHILE J<=K .AND. FLAG

IF MOD(M,J)=0

FLAG=.F.

ENDIF

J=J+1

ENDDO

RETURN

在例4中利用局部變量的特點,局部變量的作用域是在本級和下級程序中都可以使用[4],因此在子程序P2中判斷數據M是否是素數,然后修改局部變量FLAG的值,調用子程序“DO P2”后,判斷變量“FLAG”的值,返回為真時,M是素數。

2 三種方式調用形式探討

從以上的4個小程序可以看出,在VFP中通過子程序、函數、過程都可以實現模塊的編寫,三種方式功能相同。雖然在VFP中模塊的實現方式分成這樣的三種方式,但實際上這三種形式也不是涇渭分明的,也就是說無論它們的編寫格式和調用格式都不是固定不變的。上面介紹的格式是人們通常習慣的一種編寫和調用格式。對于子程序、函數、過程都可以采用 “<函數名>(<自變量表>)”或“DO 過程名 WITH <參數表>” 的調用形式。例如在調用子程序時也可以使用函數的調用形式即 <函數名>(<自變量表>),同樣調用函數時也可用DO <文件名>的形式來執行。下面以求圓柱體的體積為例,對比在子程序、過程、函數中采用不同的調用方式時,源程序的異同。

例5:

*子程序的一般調用格式,MAIN.PRG程序代碼如下:

INPUT TO R

INPUT TO H

V=0

DO P3.PRG

?V

*子程序P3.PRG代碼如下:

V=PI()*R^2*H

RETURN

例5是采用一般的子程序格式編寫和調用的,將這個程序改成使用函數格式調用,修改如下:

例6:

*子程序采用函數的調用格式,MAIN.PRG程序代碼如下:

INPUT TO R

INPUT TO H

V=0

P3(R,H)&& DO P3 WITH R,H

?V

*子程序P3.PRG代碼如下:

PARA R,H

V=PI()*R^2*H

RETURN

程序調試運行后,驗證結果是正確的。說明子程序的調用也可使用函數的調用格式,但此時需要注意的是在子程序中必須要有“PARAMETERS”語句,因為在函數調用過程中要將實參的值傳遞給對應的形參,實參和形參必須一一對應,所以PARAMETERS語句不能缺少。在上述程序中也可將“P3(R,H)”命令改寫成“DO P3 WITH R,H”,此時也存在實參和形參之間的數據傳遞,而且從外觀上看更像是外部過程形式了。

再將例6改成用函數實現求圓柱體的體積,代碼修改如下:

例7:

*函數一般調用格式:

INPUT TO R

INPUT TO H

?CYLINDER(R,H)

FUNCTION CYLINDER

PARA R,H

V=PI()*R^2*H

RETURN V

例8:例7中的函數不變,將函數調用方式該為DO命令調用。

INPUT TO R

INPUT TO H

V=0

DO CYLINDER WITH R,H

?V

FUNCTION CYLINDER

PARA R,H

V=PI()*R^2*H

RETURN V

對比例7和例8兩個程序,對于函數的調用也可使用“DO 函數名 WITH 參數表列”形式,但調用過程結束時,不能通過RETURN命令來返回運算結果,此時RETURN后的表達式不起作用。在該程序中采用了局部變量V,在函數調用過程中修改變量V的值來實現數據的傳遞。從這個例子中看出,雖然編寫的是函數,但是在調用時用的是“DO”命令,此種調用方法不能通過RETURN命令來返回運算結果。

例9:將該程序用過程形式實現,修改如下:

*過程一般調用格式

INPUT TO R

INPUT TO H

V=0

DO CYLINDER WITH R,H

?V

CANCEL

PROCEDURE CYLINDER

PARA R,H

V=PI()*R^2*H

RETURN

例10:將例9的過程調用方式改為“過程名(實參表列)”形式。

INPUT TO R

INPUT TO H

?CYLINDER(R,H)

PROCEDURE CYLINDER

PARA R,H

V=PI()*R^2*H

RETURN V

程序調試運行后,驗證結果也是正確的。對比上述的兩個程序,也可使用“過程名(實參表列)”形式調用過程,而且采用這種形式調用過程時還可以通過RETURN命令返回結果。

從以上程序的驗證結果來看,在編寫函數和過程時,不管是用“FUNCTION”還是“PROCEDURE”都是一樣的,關鍵是看調用時使用的是“DO”命令還是“函數名(實參表列)”。這兩種形式調用時都實現實參到形參數據的傳遞[5]。若采用“函數名(實參表列)”形式調用,調用結束后通過“RETURN”命令可以返回一個結果給調用處;若采用“DO”命令調用函數或過程,因為無法通過“RETURN”命令返回結果,此時可以采用全局變量或局部變量的方式來實現在上下級程序之間數據的傳遞,或是在“DO 過程名 WITH <參數表>”中通過在“參數表”中多增加參數方式來實現(即將調用函數或過程需傳回的數據另外設成一個參數),在函數或過程調用結束后通過將形參的值再傳遞給實參,比如例1中判斷一個數是否素數的內部過程的實現方式就屬于這種。

同理,子程序也是一樣的,只是將過程名或函數名變成了程序文件名,調用時同樣可以采用兩種形式。

3 結束語

子程序、函數、過程本質上是一樣的,在調用時都是通過變量的作用域和實參—形參數據傳遞兩種方式實現數據的傳遞的。調用時可以使用“DO”命令或“函數名(實參表列)”兩種形式。當調用形式不同時,程序也略有不同。經過以上分析,作者認為雖然很多書中把模塊化的程序設計方式分成子程序、過程、函數三種,我們仍然可以把它們都看成是子程序(因為它們都不能夠單獨運行)。這樣,子程序就包括兩種:一種是子程序單獨保存在一個程序文件中(即外部子程序),另一種是子程序和程序在同一個文件中(即內部子程序),此時需要給子程序一個標志(即過程名或函數名)。

外部子程序單獨在一個文件,此時子程序可以和普通程序相同結構,也可包含PARAMETERS子句。外部子程序格式和調用方式如表1所示。

表1外部子程序格式及其調用方式

[[格式\&調用方式\&普通子程序\&DO\&PARAMETERS\&DO 子程序 WITH <實參表列>

子程序(實參表列)\&]]

內部子程序和主程序在同一個文件,子程序必須放在主程序的后面。內部子程序格式和調用方式如表2所示。

表2內部子程序格式及其調用方式

[[\&調用方式\&PROCEDURE子程序名\&DO 子程序 WITH <實參表列>

子程序(實參表列)\&FUNCTION 子程序名\&DO 子程序 WITH <實參表列>

子程序(實參表列)\&]

]

VFP以其本身的優勢,被許多高校作為一門計算機基礎課程。筆者在多年從事VFP教學的過程中,不斷嘗試總結,最終發現,在講述模塊的程序設計方法時,采用以上的方法進行講解,有利于學生掌握模塊的含義及其編寫,達到事半功倍的效果。此外,VFP的教學還需要深入探討。

參考文獻:

[1] 劉衛國.Visual FoxPro程序設計教程(第2版)[M].北京郵電大學出版

社,2005.

[2] 柳青,劉順來.Visual FoxPro程序設計教程(第2版)[M].高等教育出版

社,2009.

[3] 潘曉南.Visual FoxPro數據庫應用技術[M].中國鐵道出版社,2004.

[4] 劉麗.Visual FoxPro程序設計[M].中國鐵道出版社,2005.

[5] 張瑩.Visual FoxPro數據庫與程序設計教程[M].機械工業出版社,

2007.

主站蜘蛛池模板: 欧美特黄一免在线观看| 国产精品久久自在自线观看| 亚洲av无码片一区二区三区| 日本尹人综合香蕉在线观看| 一区二区三区四区精品视频| 东京热一区二区三区无码视频| 亚洲国产欧美国产综合久久 | 色综合成人| 中文天堂在线视频| 九九热精品在线视频| 日韩在线2020专区| 麻豆a级片| 国产主播一区二区三区| 国产草草影院18成年视频| 国产午夜精品一区二区三| 香蕉久久国产精品免| 99久视频| 男女猛烈无遮挡午夜视频| 国产精品一线天| 午夜激情福利视频| 三上悠亚精品二区在线观看| 91久久夜色精品国产网站| 五月天在线网站| 欧美精品成人一区二区在线观看| 99爱在线| igao国产精品| 一区二区三区四区日韩| 2021国产在线视频| 国产极品美女在线| 日韩免费毛片视频| 国产精欧美一区二区三区| 一级毛片基地| 孕妇高潮太爽了在线观看免费| 亚洲成aⅴ人在线观看| 国产午夜小视频| 国产第一页第二页| 免费一级毛片在线播放傲雪网| 亚洲成人精品| 国产乱人伦精品一区二区| 日韩东京热无码人妻| 国产亚洲精久久久久久无码AV| 免费国产黄线在线观看| 一个色综合久久| 青青青视频91在线 | 精品视频一区二区观看| 97视频在线观看免费视频| 首页亚洲国产丝袜长腿综合| 国内精自视频品线一二区| 熟妇丰满人妻av无码区| 久久婷婷人人澡人人爱91| 国产美女在线观看| 91精品啪在线观看国产| 亚洲成人黄色在线| 欧美国产日韩在线| AV无码无在线观看免费| 免费在线a视频| 国产精品无码久久久久AV| 青青草久久伊人| 2021国产在线视频| 欧美日韩v| 激情综合婷婷丁香五月尤物 | 激情综合图区| 国产大片黄在线观看| 亚洲最新网址| 欧美成人精品一区二区| 在线观看视频一区二区| 中文字幕第1页在线播| 午夜高清国产拍精品| 欧美日韩专区| 在线播放精品一区二区啪视频| 国产jizz| 成人福利在线视频| 国产精品香蕉| 日韩在线欧美在线| 午夜日b视频| 欧美成人午夜视频免看| 欧美日韩国产精品va| 亚洲国产黄色| www.99精品视频在线播放| 欧美亚洲国产一区| 精品无码视频在线观看| 人妻中文久热无码丝袜|