• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

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

      2012-04-29 09:01:56王秀娟洪軍
      計算機時代 2012年11期
      關(guān)鍵詞:子程序函數(shù)過程

      王秀娟 洪軍

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

      關(guān)鍵詞: 子程序; 過程; 函數(shù); 局部變量

      中圖分類號: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)是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它不僅支持面向?qū)ο蟮目梢暬绦蛟O(shè)計,還支持傳統(tǒng)的面向過程的程序設(shè)計。面向過程的程序設(shè)計方法要求將一個大的系統(tǒng)分解為多個模塊,用以實現(xiàn)功能的分解和代碼的重用。VFP中實現(xiàn)模塊的程序設(shè)計方法比較多,包括:子程序、過程、函數(shù)。下面舉例分析三種方式的異同。

      1 三種設(shè)計方法詳解

      1.1 子程序

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

      1.2 過程

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

      內(nèi)部過程格式:

      PROCEDURE <過程名>

      [PARAMETERS <形式參數(shù)表>]

      <命令組>

      RETURN|ENDPRO

      調(diào)用格式:DO 過程名 WITH <參數(shù)表>

      下面舉例說明內(nèi)部過程和外部過程之間的區(qū)別,編寫程序?qū)崿F(xiàn)輸出任意兩個數(shù)值之間的所有素數(shù),在過程中判斷單個數(shù)是否素數(shù)。

      例1:內(nèi)部過程。

      *MAIN.PRG文件代碼如下:

      INPUT TO X1

      INPUT TO X2

      FOR M=X1 TO X2

      FLAG=.T.

      DO PRIME WITH M,F(xiàn)LAG

      IF FLAG

      ?M

      ENDIF

      ENDFOR

      CANCEL

      PROCEDURE PRIME

      PARAMETERS N,F(xiàn)LAG1

      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,F(xiàn)LAG

      IF FLAG

      ?M

      ENDIF

      ENDFOR

      CANCEL

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

      PARAMETERS N,F(xiàn)LAG1

      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中將內(nèi)部過程PRIME和主程序放在同一個文件中,并放在主程序的后面,程序運行時從主程序開始,當執(zhí)行到命令DO PRIME WITH M,F(xiàn)LAG時,轉(zhuǎn)去執(zhí)行過程PRIME,其中PRIME是過程名。用外部過程實現(xiàn)時,主程序和外部過程分別存放在兩個程序文件中,主程序文件調(diào)用時使用命令DO P1.PRG WITH M,F(xiàn)LAG,其中P1.PRG是外部過程保存的文件名,另外在外部過程文件中不需要使用“PROCEDURE <過程名>”語句定義過程名,因為過程名不起作用,調(diào)用時使用的是文件名。

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

      1.3 函數(shù)

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

      自定義函數(shù)格式:

      [FUNCTION <函數(shù)名>]

      [PARAMETERS <參數(shù)表>]

      <命令組>

      RETURN [<表達式>]

      函數(shù)的調(diào)用形式是:

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

      例3:將例1用過程編寫的求素數(shù)的程序改寫成用函數(shù)來實現(xiàn)。

      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”命令給函數(shù)返回一個值,事實上在函數(shù)調(diào)用過程中通過RETURN命令最多只能返回一個值到函數(shù)調(diào)用處。若想返回多個結(jié)果只是使用RETURN命令是無法實現(xiàn)的。

      為了對比子程序、函數(shù)、過程三種結(jié)構(gòu)的異同,現(xiàn)將上述程序用子程序的方式來編寫,如下所示。

      例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中判斷數(shù)據(jù)M是否是素數(shù),然后修改局部變量FLAG的值,調(diào)用子程序“DO P2”后,判斷變量“FLAG”的值,返回為真時,M是素數(shù)。

      2 三種方式調(diào)用形式探討

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

      例5:

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

      INPUT TO R

      INPUT TO H

      V=0

      DO P3.PRG

      ?V

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

      V=PI()*R^2*H

      RETURN

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

      例6:

      *子程序采用函數(shù)的調(diào)用格式,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

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

      再將例6改成用函數(shù)實現(xiàn)求圓柱體的體積,代碼修改如下:

      例7:

      *函數(shù)一般調(diào)用格式:

      INPUT TO R

      INPUT TO H

      ?CYLINDER(R,H)

      FUNCTION CYLINDER

      PARA R,H

      V=PI()*R^2*H

      RETURN V

      例8:例7中的函數(shù)不變,將函數(shù)調(diào)用方式該為DO命令調(diào)用。

      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兩個程序,對于函數(shù)的調(diào)用也可使用“DO 函數(shù)名 WITH 參數(shù)表列”形式,但調(diào)用過程結(jié)束時,不能通過RETURN命令來返回運算結(jié)果,此時RETURN后的表達式不起作用。在該程序中采用了局部變量V,在函數(shù)調(diào)用過程中修改變量V的值來實現(xiàn)數(shù)據(jù)的傳遞。從這個例子中看出,雖然編寫的是函數(shù),但是在調(diào)用時用的是“DO”命令,此種調(diào)用方法不能通過RETURN命令來返回運算結(jié)果。

      例9:將該程序用過程形式實現(xiàn),修改如下:

      *過程一般調(diào)用格式

      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的過程調(diào)用方式改為“過程名(實參表列)”形式。

      INPUT TO R

      INPUT TO H

      ?CYLINDER(R,H)

      PROCEDURE CYLINDER

      PARA R,H

      V=PI()*R^2*H

      RETURN V

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

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

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

      3 結(jié)束語

      子程序、函數(shù)、過程本質(zhì)上是一樣的,在調(diào)用時都是通過變量的作用域和實參—形參數(shù)據(jù)傳遞兩種方式實現(xiàn)數(shù)據(jù)的傳遞的。調(diào)用時可以使用“DO”命令或“函數(shù)名(實參表列)”兩種形式。當調(diào)用形式不同時,程序也略有不同。經(jīng)過以上分析,作者認為雖然很多書中把模塊化的程序設(shè)計方式分成子程序、過程、函數(shù)三種,我們?nèi)匀豢梢园阉鼈兌伎闯墒亲映绦颍ㄒ驗樗鼈兌疾荒軌騿为氝\行)。這樣,子程序就包括兩種:一種是子程序單獨保存在一個程序文件中(即外部子程序),另一種是子程序和程序在同一個文件中(即內(nèi)部子程序),此時需要給子程序一個標志(即過程名或函數(shù)名)。

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

      表1外部子程序格式及其調(diào)用方式

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

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

      內(nèi)部子程序和主程序在同一個文件,子程序必須放在主程序的后面。內(nèi)部子程序格式和調(diào)用方式如表2所示。

      表2內(nèi)部子程序格式及其調(diào)用方式

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

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

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

      ]

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

      參考文獻:

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

      社,2005.

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

      社,2009.

      [3] 潘曉南.Visual FoxPro數(shù)據(jù)庫應(yīng)用技術(shù)[M].中國鐵道出版社,2004.

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

      [5] 張瑩.Visual FoxPro數(shù)據(jù)庫與程序設(shè)計教程[M].機械工業(yè)出版社,

      2007.

      猜你喜歡
      子程序函數(shù)過程
      二次函數(shù)
      第3講 “函數(shù)”復(fù)習精講
      二次函數(shù)
      函數(shù)備考精講
      描寫具體 再現(xiàn)過程
      臨終是個怎樣的過程
      在這個學習的過程中收獲最大的是哪些,為什么?
      Coco薇(2015年12期)2015-12-10 03:54:58
      淺談子程序在數(shù)控車編程中的應(yīng)用
      圓滿的過程
      子程序在數(shù)控車加工槽中的應(yīng)用探索
      准格尔旗| 靖远县| 云南省| 措勤县| 垣曲县| 射洪县| 宣威市| 桃江县| 鸡东县| 陆良县| 辰溪县| 神农架林区| 奉化市| 浦江县| 合山市| 北碚区| 南溪县| 民县| 广水市| 张家界市| 社会| 枞阳县| 江达县| 禄劝| 阜康市| 晋城| 阿鲁科尔沁旗| 丘北县| 聂拉木县| 遂宁市| 阿拉善盟| 桃园市| 沅陵县| 西畴县| 土默特右旗| 区。| 大竹县| 太保市| 宁津县| 安西县| 黄大仙区|