1 第第第 第第第第第第
Jan 22, 2016
1
第六章 程序设计基础
2
本章重点掌握 :
( 1) 熟练掌握程序文件的建立、编辑以及程序文件的调用;
( 2)掌握三种程序结构:顺序结构、分支结构(单向、双向、多向分支)、循环结构(“当”型、“计数”型、“指针”型循环控制语句),并能根据程序设计的要求正确使用;
( 3)掌握多模块程序的设计和调用方法(主程序和子程序),过程文件的建立和调用;
( 4)掌握自定义函数的建立和调用方法;
( 5)掌握定义变量作用域的方法(全局变量、局部变量和私有变量)。
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 循环结构
内容目录
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 程序调试方法
内容目录
第 6 章 程序设计基础
6.1 VFP 6.0 的工作方式
1 、命令方式 在命令窗口中输入命令并执行。输入一条,执行一条。
3、程序文件方式将完成特定任务的命令序列存在程序文件( .prg )中,
需要时执行该程序文件即可。 有结构化程序设计和面向对象程序设计两种方法实现程序设计。
VFP 提供三种工作方式: 命令方式、菜单方式和程序文件方式。前两种方式为交互操作方式
2 、菜单方式 在系统菜单栏中,通过选择菜单项完成相应的操作。
第 6 章 程序设计基础
6.2 程序文件的建立与编辑
6.2.1 基本概念
程序文件的特点 程序自动执行多条命令 程序可被修改并重新运行 ,且可多次运行 一个程序可调用其他程序
程序是能够完成某一具体任务的命令的有序集合。这组命令被存放在程序文件中。
程序设计是利用系统所提供的设计工具,按照程序语言的规范,编写程序的过程。
VFP 包含了过程化程序设计与面向对象程序设计
第 6 章 程序设计基础
6.2.2 创建、修改、运行程序文件( .PRG )
创建 : “新建”按钮 MODIFY COMMAND < 程序文件名 >
修改 : “打开” /“ 修改”按钮 MODIFY COMMAND < 程序文件名 >
运行 : “运行”按钮 DO < 程序文件名 >
第 6 章 程序设计基础
一行只能写一条命令,以回车结束 ;
一条命令可分为多行来写,但在行末要加续行符 (分号 )“;”
注释行以 “ *” 号开头,指出这一行不是命令 ;
注释也可以写在行末,以 “ &&” 开头,直到行末都是注释
6.2.3 程序书写规则
第 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
第 6 章 程序设计基础
第 6 章 程序设计基础
第 6 章 程序设计基础
第 6 章 程序设计基础
第 6 章 程序设计基础
程序的逻辑性要完成数据处理过程,通常应包括三个部分:( 1)提出原始及其处理要求 → 输入 → r=3( 2)按指定要求进行数据处理 → 处理 → s=3.1416*r*r( 3)输入结果 → 输出 →“圆面积 =”, S 程序的通用性 程序应可反复执行,使程序的应用范围更广。通常可采用: ( 1) 参数传替 ( 2) 键盘输入
6.2.4 求解的基本逻辑与程序通用性
第 6 章 程序设计基础
命 令 功 能 RETURN 终止程序执行,并返回上级程序继续执行,
如无上级程序则返回命令窗口。 CANCEL 使程序运行终止,清除程序的私有变量,并
返回到命令窗口 QUIT 退出 VFP 系统。返回到 Windows操作系统。
6.3 程序文件中的专用命令
6.3.1 程序结尾命令
第 6 章 程序设计基础
ACCEPT
格式: ACCEPT [< 提示信息 >] TO < 内存变量 >
功能:从键盘上输入字符串并赋给内存变量。
INPUT
格式: INPUT [< 提示信息 >] TO < 内存变量 >
功能:从键盘上输入数据并赋给内存变量。注:数据可是字符型、数值型、逻辑型,内存变量的类型由输入的数据类型决定。
6.3.2 格式化输入 / 输出语句
第 6 章 程序设计基础 WAIT
格式: WAIT [< 提示信息 >] [TO < 内存变量 > ]
功能:从键盘上输入单字符,可赋给内存变量。注:如命令中无选项 [< 提示信息 >] 屏幕将显示“按任意键继续…”
屏幕输入格式: @ < 行,列 > [SAY < 提示信息 >][GET < 变量名 >][DEFAULT < 表达式 2>]功能:从指定的屏幕位置开始显示提示信息,并接受键盘上输入的数据赋给内存变量。注:当执行了其后的第一个 READ 命令时赋值
第 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 分支结构
第 6 章 程序设计基础 1 、条件语句 (带 ELSE 、不带 ELSE)
不带 ELSE 带 ELSE
格式:IF < 条件 > < 命令序列 >ENDIF
格式:IF < 条件 > < 命令序列 1> ELSE < 命令序列 2> ENDIF
条件
命令序列
ENDIF 的下一条命令
N
Y
条件
ENDIF 的下一条命令
命令序列 1 命令序列 2
NY
第 6 章 程序设计基础
【例 JX6-2 】从键盘上任意输入一个数,请判断是偶数还是奇数。
*jx6-2.prgSet talk offclearInput “ 请输入任意数” to nuIf int(nu/2)=nu/2
? “ 是偶数”Else
? “ 是奇数”EndifSet talk on
第 6 章 程序设计基础
2 、多分支语句
语句格式 DO CASE
CASE < 条件表达式 1>
< 语句序列 1>
CASE < 条件表达式 2 >
< 语句序列 12 >
………….
CASE < 条件表达式 n>
< 语句序列 n >
[OTHERWISE
< 其他语句序列 >]
ENDCASE
第 6 章 程序设计基础
【例 JX6-3 】 已知有 3个数据表,分别是 STUDENT 、 COURSE 和 SC,编写一个程序可在不同的选择下,使用这些数据表。
编写程序代码如下:
第 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
第 6 章 程序设计基础
1 、条件循环
1)格式:
DO WHILE <条件表达式 >
<循环体语句序列 >
ENDDO
2 )功能:
该语句通过 <条件表达式 >的值来控制循环。执行语句时,反复判断 <条件表达式>的值,当 <条件表达式 >的值为“真”时,执行 <循环体语句序列 >;否则,结束循环并执行 ENDDO 后面的第一个命令
Y
N
6.4.3 循环结构
第 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
第 6 章 程序设计基础 2 、步长循环
语句格式
FOR <循环变量 >=< 初值 > TO < 终值 > [STEP < 步长 >]
<语句组 >
ENDFOR / NEXTFOR
循环变量 =< 初值 >
判断循环变量是否大于终值.F.语句组
循环变量 = 循环变量 +< 步长 >
.T.
ENDFOR
第 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
第 6 章 程序设计基础 3 、扫描循环
语句格式:
SCAN[〈范围〉][ FOR〈条件表达式 1〉]
〈命令行序列〉
ENDSCAN
语句功能:
该语句在指定的范围内,用数据记录指针来控制循环次数。执行语句时,首先判断函数 EOF ()的值,若其值为“真”,则结束循环,否则,结合〈条件表达式 1〉,执行〈命令行序列〉,记录指针移到指定的范围和条件内的下一条记录,重新判断函数 EOF ()的值,直到函数 EOF ()的值为真时结束循环。
第 6 章 程序设计基础
【例 JX6-6 】用“指针”型循环控制语句,统计“ GZ”数据表中工资超过 1000元的人数。
编写程序代码如下:USE GZ.dbf EXCLUSIVE BROWSE LAST rc=0 SCAN ALL FOR 工资 >=1000 rc=rc+1 ENDSCAN CLEAR ? "工资在 1000元以上的人数: " ?? rcUSE
第 6 章 程序设计基础 4 、循环辅助语句
在各种循环语句的循环体中可以插入 LOOP 和 EXIT 语句, LOOP 语句能使执行转向循环语句头部继续循环。
EXIT 语句用来立即退出循环,转去执行 ENDDO , ENDFOR或 ENDSCAN 后面的语句。
注意:在 FOR循环语句中执行 LOOP 语句,将会先修改循环变量的值,然后转向循环语句头部。在 SCAN 循环语句中执行 LOOP 语句,将会先移动记录指针,然后转去判断循环条件。
第 6 章 程序设计基础 【例 jx6-7】编程计算 S=1+2+3+…+100,并求 l~ 100之间奇数之和。
程序流程图如下:
第 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
第 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 " 良 "
第 6 章 程序设计基础
case between (cj,60,74) replace 等级 with "及格 " case cj<60 replace 等级 with "不及格 " endcase skipenddo use
第 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
第 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
第 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 个元素按升序进行排序。 (降序如何处理 ?)
第 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
排序比较过程(冒泡比较法)
第 6 章 程序设计基础 完整的程序
第 6 章 程序设计基础
格式(以条件循环结构为例):
DO WHILE 〈条件表达式 1〉 〈语句行序列 11〉 DO WHILE 〈条件表达式 2〉 〈语句行序列 21〉 DO WHILE 〈条件表达式 3〉 〈语句行序列 31〉 …… ENDDO3 〈语句序列 22〉 ENDDO2 〈语句行序列 12〉 ENDDO1
5 、多重循环结构
第 6 章 程序设计基础 【例 jx6-9】试用固定次数循环的嵌套格式编写一个打印九九乘法口诀表的程序。
第 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
思考题:如果要输出倒梯形乘法表,其程序代码如何编写?
第 6 章 程序设计基础
6.5 多模块程序 6.5.1 子程序
1 、概念
在程序设计中,常把重复书写的一段程序独立设计,这种具有相对独立性和通用性的程序段称为子程序。
子程序能被程序多次调用,而调用子程序的程序称为主程序。使用子程序设计,大大简化程序设计和调试过程。使程序结构
化,即模块化
第 6 章 程序设计基础
调用子程序 : DO <子程序名 > 返回上级调用程序: RETURN 返回最顶层主程序: RETURN TO MASTER
2 、子程序的调用与返回
主程序 A.prg
….
Do B
…..
…..
子程序 B.prg
….
Do C
…..
Return
子程序 C.prg
….
…..
Return
第 6 章 程序设计基础
格式: DO <程序名 > [WITH < 参数表 >] 说明: < 参数表 >中参数为实际参数(实参),可以是表达式,但须为
确切值。 调用子程序时参数表中的参数要传送给子程序,被调用的子程序
的第一条语句也必须设置相应的参数接收语句 PARAMETERS 。
格式: PARAMETERS < 参数表 >功能:指定内存变量以接收 DO 命令发送的参数值,返主时把内存变量值回送给调用程序中相应的内存变量。
说明:( 1) < 参数表 >中参数为形式参数(形参),默认为私有变量,返
主时回送参数值后即被清除。( 2 ) 命令中的参数依次与调用命令 WITH子句中的参数相对应,故两者参数个数必须相同。
3 、带参数子程序的调用与返回
第 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 】设计一个计算圆面积的子程序,并要求在主程序中带参数调用它。
当实参传给对应形参后,实参又随形参的变化而变化,这种传递称为引用
第 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
第 6 章 程序设计基础
思考题:
编程计算 S=1!+2!+3!+……+100!,并显示计算结果。
第 6 章 程序设计基础
6.5.2 自定义函数
1 、自定义函数的建立格式:
[FUNCTION <函数名 >][PARAMETERS < 参数表 >]
<语句序列 >RETURN <表达式 >
调用方式: <函数名 >(< 参数表 >)
说明:自定义函数与子程序概念基本相同,但其执行结束后必须要返回一个函数值。自定义函数不能与系统函数和内存变量重名。
默认的参数传递方式为传值,即形参的变化不影响实参;而过程的参数传递方式为引用
第 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 、函数的使用
第 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
第 6 章 程序设计基础 当实参为变量时两种参数传递方式
1. 调用过程时为引用调用
实参的值随形参值的改变而改变;(实参如为表达式,则式中变量的值不变)
2. 函数调用时默认为传值调用
实参的值不随形参值的改变而改变;但在实参前加 @ 则为引用调用
do 过程名 with x , y , z
parameter a , b , c
函数名 ( x , y , z ) parameter a , b , c
第 6 章 程序设计基础
6.5.3 过程
1 、 过程、过程文件的概念
在调用多个子程序时,运行速度下降,且打开的文件数也受限制。将多个子程序组合起来,组成一个过程文件,提高程序运行效率。过程文件中的每个子程序称为一个过程。
过程文件也是一个程序文件,其后缀为 .PRG 。一个过程文件中可以包含多个过程;
从前面的例子可以看到,有的子程序或函数与调用程序同处一文件中( P51 ),这种调用称内部调用;有的子程序或函数作为单独文件( P46 , P50 )的形式存放在磁盘中被调用时,称为外部调用,这种调用的子程序或函数越多,读取磁盘的操作就越频繁,将会影响程序的运行速度,这解决这一问题,可以建立过程文件。
第 6 章 程序设计基础
格式:PROCEDURE <过程名 1> [PARAMETERS < 参数表 >] <过程 1语句序列 >RETURNPROCEDURE <过程名 2> [PARAMETERS < 参数表 >] <过程 2语句序列 > RETURN……
2 、 过程文件的建立、格式
说明:过程文件中的每个过程不再是一个单独的命令文件,而是这个过程文件中的一个程序段。
第 6 章 程序设计基础
SET PROCEDURE TO <过程文件名 > && 打开过程文件
DO <过程名 > WITH < 参数表 > && 调用过程
关闭过程文件:SET PROCEDURE TO 或CLOSE PROCEDURE
说明:调用一个过程前必须将过程文件打开;任何一个时刻只能打开一个过程文件;当打开另一个过程文件时,原先打开的过程文件将自动关闭。
3、 过程文件的调用
第 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
第 6 章 程序设计基础
6.6 变量的作用域6.6.1 公共变量(全局变量)
在任何模块都可以使用的变量。公共变量要先用 PUBLIC命令建立后才可以使用:
PUBLIC < 内存变量表 >说明:( 1) 若下层模块中建立的内存变量要供上层模块使用,或某模
块中建立的内存变量要供并列模块使用,必须将这种变量说明成公共变量。
( 2) VFP 默认命令窗口中定义的变量都是公共变量,但这样定义的变量不能在程序方式下利用。
( 3) 程序终止执行时公共变量不会自动清除,而只能用命令来清除, RELEASE 命令或 CLEAR ALL命令都可用来清除公共变量。
第 6 章 程序设计基础
6.6.3 私有变量
程序中自由定义的变量都是私有变量,它仅在定义它的模块及其下层模块中有效,而定义它的模块运行结束时自动清除。 如用 Private声明的私有变量,可以隐藏上级模块的同名变
量,直到声明它的模块执行结束后,才恢复使用先前隐藏的变量。
6.6.2 本地变量(局部变量) 本地变量只能在建立它的模块中使用,而且不能在上层或下层
模块中使用,该模块运行结束时本地变量就自动释放。要先用LOCAL命令建立后才可以使用:
定义格式: LOCAL < 内存变量表 >
注意: LOCAl不能缩写。
第 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
在上两个程序中存在一个错误?可究竟错在在那里?
第 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 中值 )
第 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
第 6 章 程序设计基础
3 、系统错误:操作违反系统规定时所产生的错误,如:打开一个不存在的表文件,或打开表文件时所指定的路径错误。
4、算法错误:程序设计的思路不正确所产生的错误。
求从 1 加到 100 的和:cleari=1a=1 && 变量 a的初值应设为0
do while i<100 a=a+i
enddo? a return
i= i+1
第 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
第 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