第六章 程序设计基础

64
1 第第第 第第第第第第

description

第六章 程序设计基础. 本章重点掌握 : ( 1) 熟练掌握程序文件的建立、编辑以及程序文件的调用; ( 2 ) 掌握三种程序结构:顺序结构、分支结构(单向、双向、多向分支)、循环结构( “ 当 ” 型、 “ 计数 ” 型、 “ 指针 ” 型循环控制语句),并能根据程序设计的要求正确使用; ( 3 ) 掌握 多模块程序的设计和调用方法(主程序和子程序),过程文件的建立和调用; ( 4 ) 掌握自定义函数的建立和调用方法; ( 5 ) 掌握定义变量作用域的方法(全局变量、局部变量和私有变量)。. 内容目录. 6.1 vfp 的工作方式 - PowerPoint PPT Presentation

Transcript of 第六章 程序设计基础

Page 1: 第六章        程序设计基础

1

第六章 程序设计基础

Page 2: 第六章        程序设计基础

2

本章重点掌握 :

( 1) 熟练掌握程序文件的建立、编辑以及程序文件的调用;

( 2)掌握三种程序结构:顺序结构、分支结构(单向、双向、多向分支)、循环结构(“当”型、“计数”型、“指针”型循环控制语句),并能根据程序设计的要求正确使用;

( 3)掌握多模块程序的设计和调用方法(主程序和子程序),过程文件的建立和调用;

( 4)掌握自定义函数的建立和调用方法;

( 5)掌握定义变量作用域的方法(全局变量、局部变量和私有变量)。

Page 3: 第六章        程序设计基础

3

6.1 vfp的工作方式

6.2 程序文件的建立与编辑

6.2.1 基本概念

6.2.2 创建、修改、运行程序文件

6.2.3 程序书写规则

6.3 程序文件中的专用命令

6.4 程序文件的控制结构

6.4.1 程序基本结构

6.4.2 分支结构

6.4.3 循环结构

内容目录

Page 4: 第六章        程序设计基础

4

6.5 多模块程序

6.5.1 子程序

6.5.2 自定义函数

6.5.3 过程

6.6 变量的作用域

6.6.1 公共变量

6.6.2 本地变量

6.6.3 私有变量

6.7 程序调试方法

内容目录

Page 5: 第六章        程序设计基础

第 6 章 程序设计基础

6.1 VFP 6.0 的工作方式

1 、命令方式 在命令窗口中输入命令并执行。输入一条,执行一条。

3、程序文件方式将完成特定任务的命令序列存在程序文件( .prg )中,

需要时执行该程序文件即可。 有结构化程序设计和面向对象程序设计两种方法实现程序设计。

VFP 提供三种工作方式: 命令方式、菜单方式和程序文件方式。前两种方式为交互操作方式

2 、菜单方式 在系统菜单栏中,通过选择菜单项完成相应的操作。

Page 6: 第六章        程序设计基础

第 6 章 程序设计基础

6.2 程序文件的建立与编辑

6.2.1 基本概念

程序文件的特点 程序自动执行多条命令 程序可被修改并重新运行 ,且可多次运行 一个程序可调用其他程序

程序是能够完成某一具体任务的命令的有序集合。这组命令被存放在程序文件中。

程序设计是利用系统所提供的设计工具,按照程序语言的规范,编写程序的过程。

VFP 包含了过程化程序设计与面向对象程序设计

Page 7: 第六章        程序设计基础

第 6 章 程序设计基础

6.2.2 创建、修改、运行程序文件( .PRG )

创建 : “新建”按钮 MODIFY COMMAND < 程序文件名 >

修改 : “打开” /“ 修改”按钮 MODIFY COMMAND < 程序文件名 >

运行 : “运行”按钮 DO < 程序文件名 >

Page 8: 第六章        程序设计基础

第 6 章 程序设计基础

一行只能写一条命令,以回车结束 ;

一条命令可分为多行来写,但在行末要加续行符 (分号 )“;”

注释行以 “ *” 号开头,指出这一行不是命令 ;

注释也可以写在行末,以 “ &&” 开头,直到行末都是注释

6.2.3 程序书写规则

Page 9: 第六章        程序设计基础

第 6 章 程序设计基础 【例 JX6-1 】建立一个程序文件并执行它。 建立名为 JX6-1.PRG 的应用程序,使其能够打开表文件“ \

DATA\ STUDENT.DBF” ,根据键入的学生姓名在该表文件中查找并输出该学生的基本情况,然后关闭该文件。

(本教学过程中, VFP6.0 的默认路径设为 e:\VFP 教学 \示例)

e:\VFP 教学 \示例 \ DATA\STUDENT.DBF

e:\VFP 教学 \示例 \PROG\JX6-1.PRG

命令窗口: MODI COMM PROG\JX6-1.PRG 编辑窗口: *JX6-1.PRG SET TALK OFF USE DATA\STUDENT.DBF ACCEPT “请输入学生姓名:” TO XM LOCATE FOR 姓名 =XM ?学号 ,姓名 ,性别 , 所在系 USE SET TALK OFF RETURN

Page 10: 第六章        程序设计基础

第 6 章 程序设计基础

Page 11: 第六章        程序设计基础

第 6 章 程序设计基础

Page 12: 第六章        程序设计基础

第 6 章 程序设计基础

Page 13: 第六章        程序设计基础

第 6 章 程序设计基础

Page 14: 第六章        程序设计基础

第 6 章 程序设计基础

程序的逻辑性要完成数据处理过程,通常应包括三个部分:( 1)提出原始及其处理要求 → 输入 → r=3( 2)按指定要求进行数据处理 → 处理 → s=3.1416*r*r( 3)输入结果 → 输出 →“圆面积 =”, S 程序的通用性 程序应可反复执行,使程序的应用范围更广。通常可采用: ( 1) 参数传替 ( 2) 键盘输入

6.2.4 求解的基本逻辑与程序通用性

Page 15: 第六章        程序设计基础

第 6 章 程序设计基础

命 令 功 能 RETURN 终止程序执行,并返回上级程序继续执行,

如无上级程序则返回命令窗口。 CANCEL 使程序运行终止,清除程序的私有变量,并

返回到命令窗口 QUIT 退出 VFP 系统。返回到 Windows操作系统。

6.3 程序文件中的专用命令

6.3.1 程序结尾命令

Page 16: 第六章        程序设计基础

第 6 章 程序设计基础

ACCEPT

格式: ACCEPT [< 提示信息 >] TO < 内存变量 >

功能:从键盘上输入字符串并赋给内存变量。

INPUT

格式: INPUT [< 提示信息 >] TO < 内存变量 >

功能:从键盘上输入数据并赋给内存变量。注:数据可是字符型、数值型、逻辑型,内存变量的类型由输入的数据类型决定。

6.3.2 格式化输入 / 输出语句

Page 17: 第六章        程序设计基础

第 6 章 程序设计基础 WAIT

格式: WAIT [< 提示信息 >] [TO < 内存变量 > ]

功能:从键盘上输入单字符,可赋给内存变量。注:如命令中无选项 [< 提示信息 >] 屏幕将显示“按任意键继续…”

屏幕输入格式: @ < 行,列 > [SAY < 提示信息 >][GET < 变量名 >][DEFAULT < 表达式 2>]功能:从指定的屏幕位置开始显示提示信息,并接受键盘上输入的数据赋给内存变量。注:当执行了其后的第一个 READ 命令时赋值

Page 18: 第六章        程序设计基础

第 6 章 程序设计基础

6.4 程序的控制结构

VFP 程序控制基本结构有 3种: 顺序(顺序结构由语句行组成,执行时语句顺序执行) 分支(根据逻辑表达式的值选择执行不同程序语句)

IF……ELSE……ENDIF DO CASE……ENDCASE

循环(使得一组语句组重复执行若干次) DO WHILE……ENDDO FOR……NEXT/ENDFOR SCAN……ENDSCAN

6.4.1 程序基本结构

6.4.2 分支结构

Page 19: 第六章        程序设计基础

第 6 章 程序设计基础 1 、条件语句 (带 ELSE 、不带 ELSE)

不带 ELSE  带 ELSE

格式:IF < 条件 > < 命令序列 >ENDIF

格式:IF < 条件 > < 命令序列 1> ELSE < 命令序列 2> ENDIF

条件

命令序列

ENDIF 的下一条命令

N

Y

条件

ENDIF 的下一条命令

命令序列 1 命令序列 2

NY

Page 20: 第六章        程序设计基础

第 6 章 程序设计基础

【例 JX6-2 】从键盘上任意输入一个数,请判断是偶数还是奇数。

*jx6-2.prgSet talk offclearInput “ 请输入任意数” to nuIf int(nu/2)=nu/2

? “ 是偶数”Else

? “ 是奇数”EndifSet talk on

Page 21: 第六章        程序设计基础

第 6 章 程序设计基础

2 、多分支语句

语句格式 DO CASE

CASE < 条件表达式 1>

< 语句序列 1>

CASE < 条件表达式 2 >

< 语句序列 12 >

………….

CASE < 条件表达式 n>

< 语句序列 n >

[OTHERWISE

< 其他语句序列 >]

ENDCASE

Page 22: 第六章        程序设计基础

第 6 章 程序设计基础

【例 JX6-3 】 已知有 3个数据表,分别是 STUDENT 、 COURSE 和 SC,编写一个程序可在不同的选择下,使用这些数据表。

编写程序代码如下:

Page 23: 第六章        程序设计基础

第 6 章 程序设计基础

WAIT “请输入您的选择: (1~ 3)” TO choose DO CASE CASE choose=”1” USE data\student.dbf SHARED BROWSE LAST CASE choose=” 2” USE data\course.dbf SHARED BROWSE LAST CASE choose=” 3” USE data\sc.dbf SHARED BROWSE LAST ENDCASE use return

Page 24: 第六章        程序设计基础

第 6 章 程序设计基础

1 、条件循环

1)格式:

DO WHILE <条件表达式 >

<循环体语句序列 >

ENDDO

2 )功能:

该语句通过 <条件表达式 >的值来控制循环。执行语句时,反复判断 <条件表达式>的值,当 <条件表达式 >的值为“真”时,执行 <循环体语句序列 >;否则,结束循环并执行 ENDDO 后面的第一个命令

Y

N

6.4.3 循环结构

Page 25: 第六章        程序设计基础

第 6 章 程序设计基础 【例 JX6-4 】修改职工工资表文件( GZ.DBF )的内容:对所有职工的工资按要求进行相应调整。

USE GZ DO WHILE .NOT.EOF()

DO CASEcase 工资 <100

repl 工资 with 150case 工资 <300

repl 工资 with 工资 +80case 工资 <500

repl 工资 with 工资 +50case 工资 <700

repl 工资 with 工资 +30ENDCASESKIP

ENDDOUSEReturn

Page 26: 第六章        程序设计基础

第 6 章 程序设计基础 2 、步长循环

语句格式

FOR <循环变量 >=< 初值 > TO < 终值 > [STEP < 步长 >]

<语句组 >

ENDFOR / NEXTFOR

循环变量 =< 初值 >

判断循环变量是否大于终值.F.语句组

循环变量 = 循环变量 +< 步长 >

.T.

ENDFOR

Page 27: 第六章        程序设计基础

第 6 章 程序设计基础 【例 JX6-5 】

计算 100 以内的奇数和 S=1+3+5+……+99 , 100 的阶乘 P=1*2*3*……*100

*jx6-5.prg N=100 && 设置循环终值常

量 s=0 && 累加器,初始化

为 0 p=1 && 累乘器,初始化为 1

*** 以下循环计算 n 以内的奇数和 FOR i = 1 to N STEP 2 s = s + i ENDFOR ? N , “ 以内的奇数和 S=” ,S *** 以下循环计算 N 的阶乘 FOR I =1 TO N p = p * I ENDFOR ? N, “ 的阶乘 =”, p

Page 28: 第六章        程序设计基础

第 6 章 程序设计基础 3 、扫描循环

语句格式:

SCAN[〈范围〉][ FOR〈条件表达式 1〉]

〈命令行序列〉

ENDSCAN

语句功能:

该语句在指定的范围内,用数据记录指针来控制循环次数。执行语句时,首先判断函数 EOF ()的值,若其值为“真”,则结束循环,否则,结合〈条件表达式 1〉,执行〈命令行序列〉,记录指针移到指定的范围和条件内的下一条记录,重新判断函数 EOF ()的值,直到函数 EOF ()的值为真时结束循环。

Page 29: 第六章        程序设计基础

第 6 章 程序设计基础

【例 JX6-6 】用“指针”型循环控制语句,统计“ GZ”数据表中工资超过 1000元的人数。

编写程序代码如下:USE GZ.dbf EXCLUSIVE BROWSE LAST rc=0 SCAN ALL FOR 工资 >=1000 rc=rc+1 ENDSCAN CLEAR ? "工资在 1000元以上的人数: " ?? rcUSE

Page 30: 第六章        程序设计基础

第 6 章 程序设计基础 4 、循环辅助语句

在各种循环语句的循环体中可以插入 LOOP 和 EXIT 语句, LOOP 语句能使执行转向循环语句头部继续循环。

EXIT 语句用来立即退出循环,转去执行 ENDDO , ENDFOR或 ENDSCAN 后面的语句。

注意:在 FOR循环语句中执行 LOOP 语句,将会先修改循环变量的值,然后转向循环语句头部。在 SCAN 循环语句中执行 LOOP 语句,将会先移动记录指针,然后转去判断循环条件。 

Page 31: 第六章        程序设计基础

第 6 章 程序设计基础 【例 jx6-7】编程计算 S=1+2+3+…+100,并求 l~ 100之间奇数之和。

程序流程图如下:

Page 32: 第六章        程序设计基础

第 6 章 程序设计基础 编写程序代码如下:*jx6-7.prgSTORE 0 TO i, s, tDO WHILE i<100 i = i+1 s = s+i && 累加 i 值 IF INT(i / 2)<>i / 2 && i为偶数时条件值为 .

T. t = t+i && 累加奇数 ENDIF ENDDO?” 1+2+3+…+100 :”, s?” 1~ 100奇数和为:”, t

程序运行结果显示如下:1+2+3+…+100 :  50501~ 100奇数和为:   2500

Page 33: 第六章        程序设计基础

第 6 章 程序设计基础 P136习题 6 :已知成绩. DBF 含有学号、平时、考试、等级等字段,前三个字段已存有某班学生的数据,平时成绩、考试成绩均填入了百分制数。请以平时成绩 20%、考试成绩80%的比例确定等级并填入等级字段。等级评定办法是:90 分以上为优, 75~ 89为良, 60~ 74 为及格. 60 分以下不及格。要求用条件、步长、扫描 3 种循环语句分别编出程序。

*---------------------------------------------------* 程序  L6_6_1.prg ( 要求用条件循环语句编出程序。 )*----------------------------------------------------clearuse e:\vfp6\test\ 成绩do while .not. eof() cj= 平时 *0.2+ 考试 *0.8 do case case cj>=90 replace 等级 with " 优 " case between (cj,75,89) replace 等级 with " 良 "

Page 34: 第六章        程序设计基础

第 6 章 程序设计基础

case between (cj,60,74) replace 等级 with "及格 " case cj<60 replace 等级 with "不及格 " endcase skipenddo use

Page 35: 第六章        程序设计基础

第 6 章 程序设计基础 *------------------------------------------------------------------------------

* 程序  L6_6_2.prg( 要求用步长循环语句编出程序。 )

*------------------------------------------------------------------------------clearuse e:\vfp6\test\ 成绩for i=1 to reccount() cj= 平时 *0.2+ 考试 *0.8 do case case cj>=90 replace 等级 with " 优 " case between (cj,75,89) replace 等级 with " 良 " case between (cj,60,74) replace 等级 with " 及格 " case cj<60 replace 等级 with " 不及格 " endcase skip endfor use

Page 36: 第六章        程序设计基础

第 6 章 程序设计基础 *------------------------------------------------------------------------------* 程序  L6_6_3.prg( 要求用扫描循环语句编出程序。 )*------------------------------------------------------------------------------clearuse e:\vfp6\test\ 成绩scan all cj= 平时 *0.2+ 考试 *0.8 do case case cj>=90 replace 等级 with " 优 " case between (cj,75,89) replace 等级 with " 良 " case between (cj,60,74) replace 等级 with " 及格 " case cj<60 replace 等级 with “ 不及格” endcaseendscanuse

Page 37: 第六章        程序设计基础

第 6 章 程序设计基础

FOR I=1 TO 9FOR J=I+1 TO 10

IF A(I) > A(J) ; 比较T=A(I)A(I)=A(J)A(J)=T

ENDIFENDFOR

ENDFOR

交换

后一个数比前一个数小,则两个数调换位置,否则位置不变。为此使得小数在前,大数在后。 I=1 时,挑出最小的一个数,并把它放在最前一个位置 ; I=2 时……

【例 jx6-8】 (排序):将数组 A(10) 中的 10 个元素按升序进行排序。 (降序如何处理 ?)

Page 38: 第六章        程序设计基础

第 6 章 程序设计基础

I= 1 2 3 4 5 6 7 8 9

A(1)

15 9 9 9 1 1 1 1 1 1 1 1 1

A(2)

9 15 15 15 15 7 7 7 7 7 7 7 7

A(3)

20 20 20 20 20 20 9 9 9 9 9 9 9

A(4)

16 16 16 16 … 16 16 20 10 10 10 10 10 10

A(5)

7 7 7 7 9 15 16 20 15 15 15 15 15

A(6)

54 54 54 54 54 54 54 54 54 16 16 16 16

A(7)

10 10 10 10 10 10 15 16 20 54 18 18 18

A(8)

22 22 22 22 22 22 22 22 22 22 54 20 20

A(9)

18 18 18 18 18 18 18 18 18 20 22 54 22

A(10)

1 1 1 1 7 9 10 15 16 18 20 22 54

排序比较过程(冒泡比较法)

Page 39: 第六章        程序设计基础

第 6 章 程序设计基础 完整的程序

Page 40: 第六章        程序设计基础

第 6 章 程序设计基础

格式(以条件循环结构为例):

DO WHILE 〈条件表达式 1〉 〈语句行序列 11〉 DO WHILE 〈条件表达式 2〉 〈语句行序列 21〉 DO WHILE 〈条件表达式 3〉 〈语句行序列 31〉 …… ENDDO3 〈语句序列 22〉 ENDDO2 〈语句行序列 12〉 ENDDO1

5 、多重循环结构

Page 41: 第六章        程序设计基础

第 6 章 程序设计基础 【例 jx6-9】试用固定次数循环的嵌套格式编写一个打印九九乘法口诀表的程序。

Page 42: 第六章        程序设计基础

第 6 章 程序设计基础 SET TALK OFFCLEARFOR Y=1 TO 9

FOR X=1 TO Y Z= X * Y ??STR(X,1)+“*”+STR(Y,1)+“=”+STR(Z,2)+“ ” ENDFOR ?ENDFOR SET TALK ONRETURN

思考题:如果要输出倒梯形乘法表,其程序代码如何编写?

Page 43: 第六章        程序设计基础

第 6 章 程序设计基础

6.5 多模块程序 6.5.1 子程序

1 、概念

在程序设计中,常把重复书写的一段程序独立设计,这种具有相对独立性和通用性的程序段称为子程序。

子程序能被程序多次调用,而调用子程序的程序称为主程序。使用子程序设计,大大简化程序设计和调试过程。使程序结构

化,即模块化

Page 44: 第六章        程序设计基础

第 6 章 程序设计基础

调用子程序 :     DO <子程序名 > 返回上级调用程序: RETURN 返回最顶层主程序: RETURN TO MASTER

2 、子程序的调用与返回

主程序 A.prg

….

Do B

…..

…..

子程序 B.prg

….

Do C

…..

Return

子程序 C.prg

….

…..

Return

Page 45: 第六章        程序设计基础

第 6 章 程序设计基础

格式: DO <程序名 > [WITH < 参数表 >] 说明: < 参数表 >中参数为实际参数(实参),可以是表达式,但须为

确切值。 调用子程序时参数表中的参数要传送给子程序,被调用的子程序

的第一条语句也必须设置相应的参数接收语句 PARAMETERS 。

格式: PARAMETERS < 参数表 >功能:指定内存变量以接收 DO 命令发送的参数值,返主时把内存变量值回送给调用程序中相应的内存变量。

说明:( 1) < 参数表 >中参数为形式参数(形参),默认为私有变量,返

主时回送参数值后即被清除。( 2 ) 命令中的参数依次与调用命令 WITH子句中的参数相对应,故两者参数个数必须相同。

3 、带参数子程序的调用与返回

Page 46: 第六章        程序设计基础

第 6 章 程序设计基础

主程序: * E6-7.prg ymj=0 INPUT “bj=” to bj DO js WITH bj,ymj ?"ymj = ",ymj

RETURN

子程序:* js.prgPARAMETERS r,ss=PI()*r*r

RETURN

【例 jx6-10 】设计一个计算圆面积的子程序,并要求在主程序中带参数调用它。

当实参传给对应形参后,实参又随形参的变化而变化,这种传递称为引用

Page 47: 第六章        程序设计基础

第 6 章 程序设计基础 【例 jx6-11 】循环从键盘输入两个正整数 n, m,求两者的最大公约数,直到输入的 n 小于等于 0 。

* 主程序 jx6-11.prgcleardo while .t.

input "n=" to n

if n<=0 exit endif

input "m=" to m

k=1 do maxGys with n,m,k

? kenddo

输入 n

n>0 ?

求最大公约数

.F.

.T.

输入 m

打印最大公约数

* 子程序 maxGys.prgparameters n,m,kdo while .t. if n>m t=n n=m m=t endif

r=m%n

if r=0 exit

else

m=n

n=r endifenddok=nreturn

Page 48: 第六章        程序设计基础

第 6 章 程序设计基础

思考题:

编程计算 S=1!+2!+3!+……+100!,并显示计算结果。

Page 49: 第六章        程序设计基础

第 6 章 程序设计基础

6.5.2 自定义函数

1 、自定义函数的建立格式:

[FUNCTION <函数名 >][PARAMETERS < 参数表 >]

<语句序列 >RETURN <表达式 >

调用方式: <函数名 >(< 参数表 >)

说明:自定义函数与子程序概念基本相同,但其执行结束后必须要返回一个函数值。自定义函数不能与系统函数和内存变量重名。

默认的参数传递方式为传值,即形参的变化不影响实参;而过程的参数传递方式为引用

Page 50: 第六章        程序设计基础

第 6 章 程序设计基础

1 )将函数作为一个独立的文件主程序 funmain.prgclearset default to e:\vfp 教学 \示例 input “请输入第一条边的长度:” to ainput “请输入第二条边的长度:” to binput “请输入第三条边的长度:” to cresult=Fmj(a,b,c)   && 调用计算三角形面积的函数

?"面积为 :",resultreturn

* 计算三角形面积的自定义函数: Fmj.prgPARA A,B,CP=(A+B+C)/2S=SQRT(P*(P-A)*(P-B)*(P-C))RETURN S

2 、函数的使用

Page 51: 第六章        程序设计基础

第 6 章 程序设计基础

2) 将函数作为主程序中的一个程序段:

主程序 funmain1.prgclearinput " 请输入第一条边的长度: " to ainput " 请输入第二条边的长度: " to binput " 请输入第三条边的长度: " to cresult=mj(a,b,c)?"面积为 :",resultreturnfunction mj

PARA A,B,CP=(A+B+C)/2S=SQRT(P*(P-A)*(P-B)*(P-C))

RETURN S

Page 52: 第六章        程序设计基础

第 6 章 程序设计基础 当实参为变量时两种参数传递方式

1. 调用过程时为引用调用

实参的值随形参值的改变而改变;(实参如为表达式,则式中变量的值不变)

2. 函数调用时默认为传值调用

实参的值不随形参值的改变而改变;但在实参前加 @ 则为引用调用

do 过程名 with x , y , z

parameter a , b , c

函数名 ( x , y , z ) parameter a , b , c

Page 53: 第六章        程序设计基础

第 6 章 程序设计基础

6.5.3 过程

1 、 过程、过程文件的概念

在调用多个子程序时,运行速度下降,且打开的文件数也受限制。将多个子程序组合起来,组成一个过程文件,提高程序运行效率。过程文件中的每个子程序称为一个过程。

过程文件也是一个程序文件,其后缀为 .PRG 。一个过程文件中可以包含多个过程;

从前面的例子可以看到,有的子程序或函数与调用程序同处一文件中( P51 ),这种调用称内部调用;有的子程序或函数作为单独文件( P46 , P50 )的形式存放在磁盘中被调用时,称为外部调用,这种调用的子程序或函数越多,读取磁盘的操作就越频繁,将会影响程序的运行速度,这解决这一问题,可以建立过程文件。

Page 54: 第六章        程序设计基础

第 6 章 程序设计基础

格式:PROCEDURE <过程名 1> [PARAMETERS < 参数表 >] <过程 1语句序列 >RETURNPROCEDURE <过程名 2> [PARAMETERS < 参数表 >] <过程 2语句序列 > RETURN……

2 、 过程文件的建立、格式

说明:过程文件中的每个过程不再是一个单独的命令文件,而是这个过程文件中的一个程序段。

Page 55: 第六章        程序设计基础

第 6 章 程序设计基础

SET PROCEDURE TO <过程文件名 > && 打开过程文件

DO <过程名 > WITH < 参数表 > && 调用过程

关闭过程文件:SET PROCEDURE TO 或CLOSE PROCEDURE

说明:调用一个过程前必须将过程文件打开;任何一个时刻只能打开一个过程文件;当打开另一个过程文件时,原先打开的过程文件将自动关闭。

3、 过程文件的调用

Page 56: 第六章        程序设计基础

第 6 章 程序设计基础

【示例】过程的应用举例 主程序 mainproc.prg如下:

clearset procedure to subprocn=23m=10result=0 do add with m,n,result?result && 结果显示: 33

do sub with n,m,result?result        && 结果显示: 13

   do mul with m,n,result?result         && 结果显示: 230

   close procedurereturn

过程文件 subproc.prg如下:

procedure add para a,b,c c=a+breturn

  procedure sub para a,b,c c=a-breturn

procedure mul para a,b,c c=a*breturn

Page 57: 第六章        程序设计基础

第 6 章 程序设计基础

6.6 变量的作用域6.6.1 公共变量(全局变量)

在任何模块都可以使用的变量。公共变量要先用 PUBLIC命令建立后才可以使用:

PUBLIC < 内存变量表 >说明:( 1) 若下层模块中建立的内存变量要供上层模块使用,或某模

块中建立的内存变量要供并列模块使用,必须将这种变量说明成公共变量。

( 2) VFP 默认命令窗口中定义的变量都是公共变量,但这样定义的变量不能在程序方式下利用。

( 3) 程序终止执行时公共变量不会自动清除,而只能用命令来清除, RELEASE 命令或 CLEAR ALL命令都可用来清除公共变量。

Page 58: 第六章        程序设计基础

第 6 章 程序设计基础

6.6.3 私有变量

程序中自由定义的变量都是私有变量,它仅在定义它的模块及其下层模块中有效,而定义它的模块运行结束时自动清除。 如用 Private声明的私有变量,可以隐藏上级模块的同名变

量,直到声明它的模块执行结束后,才恢复使用先前隐藏的变量。

6.6.2 本地变量(局部变量) 本地变量只能在建立它的模块中使用,而且不能在上层或下层

模块中使用,该模块运行结束时本地变量就自动释放。要先用LOCAL命令建立后才可以使用:

定义格式: LOCAL < 内存变量表 >

注意: LOCAl不能缩写。

Page 59: 第六章        程序设计基础

第 6 章 程序设计基础   主程序 MAIN1.PRG

public i,j

i=1

j=0

do sub1

? "i=",i,"j=",j,"k=",k

return

子程序 SUB1.PRG

i=i*2

J=i+1

K=i+J

? "i=",i, "J=",J, "K=",K

RETURN

PUBLIC K

在上两个程序中存在一个错误?可究竟错在在那里?

Page 60: 第六章        程序设计基础

第 6 章 程序设计基础 稍微改动一下上面二个程序,看看结果有什么变?

主程序 MAIN2.PRGi=1J=0DO SUB2?“i=”,i,“J=”,J,“K=”,K,“(在 MAIN2.PRG 中的值 )”CANCEL

子程序 SUB2.PRGPUBLIC Kprive j

i=i*2J=i+1K=i+J?“i=”,i,“J=”,J,“K=”,K,“(在 SUB2.PRG 中值 )”RETURN i= 2 J=3 K=5 ( 在 SUB2.PRG 中

值 )

i= 2 J=0 K=5 ( 在 SUB2.PRG 中值 )

Page 61: 第六章        程序设计基础

第 6 章 程序设计基础

6.7 程序调试方法6.7.1 程序中常见的错误

1 、语法错误:输入不符合语法规范的命令。Input “输入姓名” to xm if zl>10 and zl<20 ?“结果为” zl && if…..endif

2 、逻辑错误:输入符合语法规范,但操作条件不具备, 或数据类型不匹配所产生的错误。

程序:clearb=123

accept “a=“ to a if a=b && 不同数据类型做比较 ? a

endif return

Page 62: 第六章        程序设计基础

第 6 章 程序设计基础

3 、系统错误:操作违反系统规定时所产生的错误,如:打开一个不存在的表文件,或打开表文件时所指定的路径错误。

4、算法错误:程序设计的思路不正确所产生的错误。

求从 1 加到 100 的和:cleari=1a=1 && 变量 a的初值应设为0

do while i<100 a=a+i

enddo? a return

i= i+1

Page 63: 第六章        程序设计基础

第 6 章 程序设计基础

思考题:1、注意调用程序和被调用程序间的参数传递,求出正确结果:

*主程序 MAIN.PRGCLEARSTOR 2 TO B,DSTOR 1 TO A,CDO SUB WITH A,B,C,D?DSTOR 3 TO A2,A4STOR 1 TO A1,A3DO SUB WITH A1,A2,A3,A4? A4DO SUB WITH 6,8,10,D+1? D

* 子程序 SUB.PRGPARAMETER A,B,C,DD=B*B-4*A*CDO CASE CASE D<0 D=100 CASE D>0 D=200 CASE D=0 D=10ENDCASERETURN

结果: 10 200 10

Page 64: 第六章        程序设计基础

第 6 章 程序设计基础 2 、根据内存变量的作用范围,求出正确结果:

CLEARPUBLIC X,YX=100Y=200DO GC1? “X=“,X,”Y=“,YK=300DO GC2? “Y=“,Y”K=“,KSET TALK ONPROCEDURE GC1PRIVATE YY=3DO GC3X=X*YRETURN

PROCEDURE GC3Y=2RETURNPROCEDUREGC2K=K+YDO GC3K=K+YRETURN

结果: X=200 Y=200 Y=2 K=502