第九章程序设计基础.docx
《第九章程序设计基础.docx》由会员分享,可在线阅读,更多相关《第九章程序设计基础.docx(29页珍藏版)》请在冰豆网上搜索。
第九章程序设计基础
第九章程序设计基础
教学内容:
这节课将介绍VFP程序设计的基础知识、方法、技巧以及VFP程序设计中常用的命令。
在这章里,我们将利用VFP提供的程序设计命令和前几章所学的VFP命令,按照解决某一实际问题的要求,将所学的命令按一定的逻辑顺序组合起来,并以文件的形式将程序存储在磁盘中。
当我们调用这些程序时,计算机就能按照我们提供的命令序列自动连续地执行每一条命令,高效率的完成预定任务。
9.1VisualFoxPro的工作方式
1)应用程序:
为完成某项任务所需执行的命令序列,这些命令按照一定的结构有机地组合在一起,并以文件的形式存储在磁盘上,又称为命令文件。
2)应用程序的组成:
前言:
注释语句
设置区:
设置程序的运行环境,多由SET命令实现
程序体:
所有命令序列,一般包括数据的输入输出、数据的处理以及结果输出等命令
整理部分:
如关闭各种文件
程序的退出:
设置有关命令关闭文件返回到命令窗口状态或操作系统状态
9.1.1命令方式
在“命令”窗口中,可以操作命令完成对数据库的操作、系统环境的设置和建立、运行命令文件。
9.1.2菜单方式
通过系统菜单提供的菜单选项对数据库进行操作,对系统环境进行设置以及建立、运行命令文件。
9.1.3程序文件方式
程序文件(简称程序)也叫命令文件。
在VisualFoxPro环境下,利用程序文件方式进行数据库管理,是通过程序文件编辑工具,将对数据库操作的命令和对系统环境进行设置的命令,集中在一个以(.PRG)为扩展名的程序文件中,然后再通过菜单方式或命令方式运行该程序文件。
9.2程序文件的建立与编辑
9.2.1以命令方式建立、编辑程序文件
ModifyCommand<程序文件名>
菜单:
文件/新建/程序/新建文件
说明:
1.用于命令文件的建立与编辑,文件的扩展名系统默认.PRG。
2.文件编辑时输完一行,回车。
“ESC”放弃。
“^W”存盘。
3.插入新命令行,^N或回车。
9.2.2以菜单方式建立、编辑程序文件
9.2.3利用设计工具建立程序代码
9.3程序文件的调用
9.3.1以命令方式调用程序文件
Do<程序文件名>
命令方式:
DO〈应用程序名〉WITH<参数表>
说明:
1)在程序运行过程中执行到下述命令时将会中断运行而退出,它们退出后返回的系统状态分别是:
CANCEL:
命令窗口状态。
QUIT:
操作系统状态。
RETURN:
调用点或命令窗口状态。
2)在程序运行过程中,若按下ESC键可使运行强行中断。
这时系统显示警告,并给用户三种选择:
取消:
中断程序的运行。
此为缺省选项。
继续执行:
忽略ESC的中断作用,继续程序的执行。
挂起:
暂时中断程序的运行,返回命令窗口。
当再次运行时可以从中断处继续运行。
9.3.2以菜单方式调用程序文件
程序文件创建、运行的操作步骤
常用辅助命令
1.注释命令
格式I:
NOTE<注释内容>
格式II:
*<注释内容>
格式III:
……&&<注释内容>
说明:
1)注释命令为非执行语句
2)注释内容最后一个字符是分号(;),系统默认下一行内容仍为注释内容。
示例1:
NOTE打开学生表
USE学生表.DBF
……
示例2:
SETCONSOLEOFF&&取消窗口的输出显示
……
2.环境设置命令
SETTALKON/off设置是否在主窗口的状态栏中显示所有命令的执行结果。
SETCONSOLEON/off设置是否把输出信息在窗口上显示。
SETPRINTERon/OFF设置是否在打印机上输出信息。
SETSAFETYON/off设置在改写文件时,VFP是否显示对话框以确认改写有效。
SETHEADINGON/off设置在执行LIST、DISPLAY等命令时是否显示字段名。
SETSTATUSON/off设置是否显示状态行。
SETDEFAULTTO〈盘符〉指定默认的驱动器。
SETDEVICETOSCREEN把输出信息发送到VFP的窗口
/PRINTER屏幕或打印机。
3.清除命令
格式I:
CLEAR
说明:
清除当前屏幕上的所有信息
格式II:
CLEARALL
说明:
关闭所有文件,清除所有内存变量
格式III:
CLEARTYPEAHEAD
说明:
清除键盘缓冲区
4.关闭文件命令
格式I:
CLOSEALL
说明:
关闭所有的数据库、表以及索引文件
格式II:
CLOSE<文件类型>
说明:
文件类型
DATABASE数据库文件、索引文件、格式文件
INDEX当前工作区的索引文件
FORMAT当前工作区的格式文件
PROCEDURE当前工作区的过程文件
ALTERNATE文本输出文件
5.运行中断和结束命令
格式I:
QUIT
说明:
退出VFP,返回到操作系统状态
格式II:
CANCEL
说明:
结束本次程序的运行,返回到命令窗口状态
格式III:
RETURN[TOMASTER]
说明:
返回到调用点处。
6.文本显示命令
格式:
TEXT
<文本内容>
ENDTEXT
说明:
将文本内容原样输出
7.定位输出命令
格式:
@<行,列>SAY<数据>
说明:
在指定的行、列处输出数据
9.4程序的基本结构
1.顺序结构
顺序结构是在程序执行时,根据程序中语句的书写顺序依次执行的命令序列。
VisualFoxPro系统中的大多数命令都可以作为顺序结构中的语句。
但是,绝大多数问题仅用顺序结构是无法解决的,还要用到分支结构、循环结构和过程结构。
1)程序设计的过程:
分析问题、确定任务、划分模块、建立模型、组织数据、描述操作步骤、编写程序、上机调试、分析运行结果、写出程序说明书。
2)流程图:
就是运用一些特定的图形符号和必要的文字来描述解题步骤的图示。
3)三种基本程序结构流程图:
4)顺序结构程序:
自始至终严格按照程序中语句的先后顺序逐条执行,是最基本、最普遍的结构形式。
5)例1:
给退休职工增加基本工资20元。
Clear
Usegz
Replall基本工资with基本工资+20foryear(DATE())-year(出生日期)>=60
List
示例2:
编程,根据输入的半径值,计算出相应的圆的周长。
SETTALKOFF
CLEAR
INPUT“请输入圆的半径:
”TOR
L=2*3.1416*R
INPUT“圆的周长是:
”+STR(L,6,3)
SETTALKON
2).选择分支
格式:
IF<条件表达式>
<语句行序列1>
ELSE
<语句行序列2>
ENDIF
说明:
(1)条件为真(T),执行语句序列1。
(2)条件为假(F),执行语句序列2。
例1:
上题,男同学加10分,女同学加20分。
Settalkoff
Usestud
Accept“输入加分同学姓名:
”toxm
Locafor姓名=xm
If性别=“女”
Repl数学with数学+20
else
Repl数学with数学+10
Endif
例2:
求解一元二次方程AX2+BX+C=0,系数A,B,C的值由用户通过键盘输入,当方程有实根时,屏幕显示出两根的值;当方程无实根时,屏幕显示出“方程无实根!
”
SETTALKOFF
CLEAR
INPUT“A=”TOA
INPUT“B=”TOB
INPUT“C=”TOC
D=B*B-4*A*C
IFD>=0
X1=(-B+SQRT(D))/(2*A)
X2=(-B-SQRT(D))/(2*A)
?
“方程的两根是:
”STR(X1,2)+SPACE(4)+STR(X2,2)
ELSE
?
”方程无实根!
”
ENDIF
SETTALKON
RETURN
例3:
在表文件“分数.DBF”中查找学号为99020203的学生成绩,若其成绩满60分则显示其学号、课程号和成绩;否则显示此人的学号、课程号并通知其补考。
*L6.PRG
SETTALKOFF
USE分数.DBF
CLEAR
LOCATEFOR学号=“99020203”
IF成绩>=60
?
“学号:
”+学号
?
“课程号:
”+课程号
?
“成绩:
”+STR(成绩,6,2)
ELSE
?
“学号为”+学号+“的学生应参加补考的课程号为:
”+课程号
ENDIF
USE
SETTALKON
3).判断语句嵌套
IF语句多重嵌套示意结构如下:
IF<条件表达式1>
<语句行序列1>
ELSE
IF<条件表达式2>
<语句行序列2>
ELSE
IF<条件表达式3>
<语句行序列3>
ELSE
………
ENDIF3
………
ENDIF2
………
ENDIF1
注意:
(1)IF、ELSE(可不选)、ENDIF一一对应、互相匹配
(2)允许简单判断和选择判断语句自我嵌套或相互嵌套,但层次必须清楚,不得交叉
(3)最好采用缩格(锯齿形)的书写方式
例1:
键盘输入x,当x>=0或x<=1时,y=1。
当x>1或x<0时,y=0。
Settalkoff
Input“输入X的值:
”tox
Ifx>=0
Ifx<=1
y=1
else
y=0
endif
else
y=0
endif
?
”y=”,y
例2:
存款利率:
年限NX<1年,利率LL=2%
年限NX>=1年或NX<3年,利率LL=3%
年限NX>=3年或NX<5年,利率LL=4%
年限NX>=5年,利率LL=5%
settalkoff
input“请输入存款年限:
”tonx
ifnx<1
ll=0.02
else
ifnx<3
ll=0.03
else
ifnx<5
ll=0.04
else
ll=0.05
endif
endif
endif
?
”存款利率是:
”,ll
例3:
根据键入X的值,计算下面分段函数的值,并显示结果。
程序如下:
SETTALKOFF
CLEAR
INPUT“X=”TOX
IFX>0
IFX>10
Y=X*X+1
ELSE
Y=3*X*X-2*X+1
ENDIF
ELSE
Y=X*X+4*X-1
ENDIF
?
”分段函数值为:
”+STR(Y,10,2)
SETTALKON
RETURN
3.循环结构
顺序、分支结构在程序执行时,每个语句只能执行一次,循环结构则能够使某些语句或程序段重复执行若干次。
如果某些语句或程序段需要在一个固定的位置上重复操作,使用循环语句是最好的选择。
4.过程结构
在许多应用程序中,有一些程序段需要反复执行多次,这些程序段不是集中在一个固定的位置上重复执行,而是分散在程序的许多位置上重复执行。
通常将这样的程序段与嵌入它的程序分开,形成独立的程序序列,待使用时再调入程序中,以实现不同位置上的重复操作。
这样做增强了程序的可读性及模块化。
一般情况下,把这种具有独立的功能,并且可以被其他程序调用的程序序列称为过程,将调用过程的程序称为主程序。
9.5常用的交互输入语句
1.键入表达式命令
格式:
INPUT[<提示信息>]TO<内存变量>
功能:
暂停程序运行,等待键入表达式并将其值赋给指定的内存变量,待按回车键后,继续运行程序。
说明:
1)<提示信息>为可选项,其格式、功能与要求同ACCEPT命令。
2)命令中的<内存变量>的类型决定于键入数据的类型,但不得为M型数据。
3)若键入的是表达式,本命令将先计算出表达式的值,然后把其结果赋给<内存变量>。
4)若键入字符型常量或逻辑型常量时应带有定界符。
5)在响应该命令时,若键入了无效表达式或只按下回车键,系统将会给出“句法错”的提示信息。
示例:
试运行下述交互输入命令。
INPUT“请输入学生姓名:
”TOXM
INPUT“请输入其班级:
”TOBJ
INPUT“该人性别为:
”TOXB
2.键入字符串命令
格式:
ACCEPT[<字符串表达式>]TO<内存变量>
说明:
(1)[<字符串表达式>]为屏幕提示信息。
(2)键盘输入的字符串给内存变量赋值,回车结束。
(3)键盘输入的字符不用定界符。
示例:
编写可以打开任一例:
modicommchaxun.prg
usestud
accept“请输入查询同学的姓名:
”toxm
locafor姓名=xm
disp
use
dochaxun结果:
请输入查询同学的姓名:
李红
3.输入单字符命令
命令:
WAIT[“提示信息”][TO<内存变量>]
说明:
只能输入单字符给变量赋值,不须回车。
全部可选项缺省,击任意键继续。
例:
前面程序,继续查询。
usestud
accept“请输入查询同学的姓名:
”toxm
locafor姓名=xm
disp
wait“是否继续查询(Y/N)?
”toy1
ifuppe(y1)=”N”
quit
endif
9.6分支结构
9.6.1单向分支
单向分支语句,即根据条件表达式的值,决定某一操作是否执行。
If<条件表达式>
<命令行序列>
EndIf
说明:
(1)条件为真(T),执行语句序列。
(2)条件为假(F),执行ENDIF后面的语句。
(3)IF….ENDIF需成对出现。
例:
在“学生表”中查看“李尚清”的基本情况。
SETTALKOFF
CLEAR
USE学生表
LOCATEFOR姓名=”李尚清”
IFFOUND()
DISP
ENDIF
USE
SETTALKON
例:
输入一同学姓名,是女同学数学加10分。
Usestud
Accept“输入加分同学姓名:
”toxm
Locafor姓名=xm
If性别=“女”
Repl数学with数学+10
Endif
8.6.2双向分支
双向分支语句,即根据条件表达式的值,选择两个操作中的一个来执行。
If<条件表达式>
<命令行序列1>
Else
<命令行序列2>
EndIf
例:
上题,男同学加10分,女同学加20分。
Settalkoff
Usestud
Accept“输入加分同学姓名:
”toxm
Locafor姓名=xm
If性别=“女”
Repl数学with数学+20
else
Repl数学with数学+10
Endif
例:
求解一元二次方程AX2+BX+C=0,系数A,B,C的值由用户通过键盘输入,当方程有实根时,屏幕显示出两根的值;当方程无实根时,屏幕显示出“方程无实根!
”
SETTALKOFF
CLEAR
INPUT“A=”TOA
INPUT“B=”TOB
INPUT“C=”TOC
D=B*B-4*A*C
IFD>=0
X1=(-B+SQRT(D))/(2*A)
X2=(-B-SQRT(D))/(2*A)
?
“方程的两根是:
”STR(X1,2)+SPACE(4)+STR(X2,2)
ELSE
?
”方程无实根!
”
ENDIF
SETTALKON
RETURN
8.6.3多向分支
DoCase
Case<条件表达式1>
<命令行序列1>
……
Otherwise
<命令行序列n+1>]
EndCase
说明:
1.DOCASE与ENDCASE需成对出现。
2.满足CASE条件,执行下面语句后,跳出ENDCASE.
3.顺序判断,都不满足条件,执行OTHERWISE后的语句。
例1:
对利率重新编程。
settalkoff
input“请输入存款年限:
”tonx
docase
casenx<1
ll=0.02
casenx<3
ll=0.03
casenx<5
ll=0.04
otherwise
ll=0.05
endcase
?
”存款利率是:
”,ll
例2:
用DOCASE语句修改上面计算分段函数的例子。
SETTALKOFF
CLEAR
INPUT“X=”TOX
DOCASE
CASEX<=0
Y=X*X+4*X-1
CASEX>0.AND.X<=10
Y=3*X*X-2*X+1
CASEX>10
Y=X*X+1
ENDCASE
?
”分段函数值为:
”+STR(Y,10,2)
SETTALKON
RETURN
8.6.4使用分支语句应注意的几点
(1)If…EndIf和DoCase…EndCase必须配对使用,DoCase与第一个Case<条件表达式>之间不应有任何命令。
(2)<条件表达式>可以是各种表达式或函数的组合,其值必须是逻辑值。
(3)<命令行序列>可以由一个或多个命令组成,可以是条件控制语句组成的嵌套结构。
(4)DoCase…EndCase命令,每次最多只能执行一个<命令行序列>。
在多个Case的<条件表达式>值为真时,只执行第一个<条件表达式>值为真的<命令行序列>,然后执行EndCase的后面的第一条命令。
8.7循环结构
循环结构程序:
按照一定条件重复进行某种特定操作的程序称为循环结构程序。
8.7.1“当”型循环控制语句
“当”型循环控制语句,即根据条件表达式的值决定循环体内语句的执行次数。
DoWhile<条件表达式>
<命令行序列>
EndDo
说明:
结构组成:
循环起始语句、循环体、循环终端语句
注意:
在循环体内要设置修改循环条件的语句,避免死循环。
死循环示例:
X=1
S=0
DOWHILEX>=1
S=S+X
X=X+1
ENDDO
例1:
编程求和S=1+2+3+…+100。
SETTALKOFF
CLEAR
STORE0TON,S
DOWHILEN<=100
S=N+S
N=N+1
ENDDO
?
”累加和S=”,S
SETTALKON
RETURN
例2:
求12+22+32…..+502
settalkoff
s=0
k=0
dowhilek<=50
s=s+k*k
k=k+1
enddo
?
s
例3:
编程显示学生表中所有女生的记录。
SETTALKOFF
CLEAR
USE学生表
INDEXON性别TO学生表_性别
SEEK“女”
DOWHILE性别=”女”
DISP
SKIP
ENDDO
USE
SETTALKON
RETURN
例4:
令计算机从0开始计数,每计一个数,便判断该数是否为偶数,若是偶数则接着计下一个数;若是奇数则将其累加,若累加和大于250,则计数结束;若累加和不大于250则继续计数,编写程序。
SETTALKOFF
CLEAR
STORE0TOX,Y
DOWHILE.T.
X=X+1
DOCASE
CASEINT(X/2)=X/2
LOOP
CASEX+Y>250
EXIT
OTHERWISE
Y=X+Y?
”Y=”,Y
ENDCASESETTALKON
ENDDORETURN
例5:
编写程序能根据键盘输入的姓名,从学生表中查找该生的信息。
SETTALKOFF
CLEAR
ACCEPT“请输入姓名:
”TOXM
USE学生表
DOWHILE.NOT.EOF()
IF姓名=XM
DISP
EXIT
ELSE
SKIP
ENDIF
ENDDO
USE
SETTALKON
8.9内存变量作用域
作用域:
内存变量的作用范围。
1、全局变量
1)全局变量:
指在程序的任何嵌套中及在程序执行期间始终有效的变量。
2)格式:
PUBLIC<内存变量表>
例:
在过程调用中,运用全局变量传递数据。
主程序过程
*MAIN_3.PRG*SUB_3.PRG
SETTALKOFFPUBLICB,C
CLEARB=2
PUBLICAD=3
A=1?
“在过程中:
A,B,C,D=”,A,B,C,D
DOSUB_3RETURN
?
“返回主程序:
A,B,C,D=”,A,B,C,D
SETTALKON
2、局部变量
1)局部变量:
未经PUBLIC命令定义且只在建立它的过程及其下级过程中有效的内存变量。
2)局部变量的定义:
隐含定义方式:
过程中未经特殊说明的内存变量。
显示定义方式:
PRIVATE[ALL[LIKE/EXCEPT<通配符>]][<内存变量表>]
例:
在过程调用中局部变量的应用。
主程序
*MAIN_4.PRG
SETTALKOFF
A=1
B=2
?
“主程序中:
A=”,A,“B=”,B
DOSUB_4
?
“返主程序后:
A=”,A,“B=”,B,“C=”,C,“D=”,D
SETTALKON
过程
*SUB_4.PRG
PRIVATEB
PUBLICC
A=10
B=11
C=12
D=13
?
“在过程中:
A=”,A,“B=”,B,“C=”,C,“D=”,D
RETURN
2、局部变量
1)局部变量:
未经PUBLIC命令定义且只在建立它的过程及其下级过程中有效的内存变量。
2)局部变量的定义:
隐含定义方式:
过程中未经特殊说明的内存变量。
显示定义方式:
PRIVATE[ALL[LIKE/EXCEPT<通配符>]][<内存变量表>]
例:
在过程调用中局部变量的应用。
*主程序MAIN_4.PRG
SETTALKOFF
A=1
B=2
?
“主程序中:
A=”,A,“B=”,B
DOSUB_4
?
“返主程序后:
A=”,A,“B=”,B,“C=”,C,“D=”,D
SETTALKON
*过程SUB_4.PRG
PRIVATEB
PUBLICC
A=10
B=11
C=12
D=13
?
“在过程中:
A=”,A,“B=”,B,“C=”,C,“D=”,D
RETURN
过程的带参调用
1、带参过程调用命令
格式:
DO<过程名>WITH<参数表>
说明:
参数表中的参数也称实参,可以为常量、已赋值的变量或数值表达式。
2、接收参数命令
格式:
PARAMETERS<参数表>
说明:
参数表中的参数也称形参
形参与实参的数量应相等、类型要一致
例1:
利用带参