第十一章顺序和分支结构程序设计
一、Visual FoxPro 程序的建立与运行
1.建立和编辑程序文件
组成Visual FoxPro 程序文件的语句可直接在系统提供的“程序编辑器”窗口中输入 、编辑和修改,启动“程序编辑器”窗口有如下两种方式:
(1)执行“文件”菜单下的“新建”命令,在“新建”对话框中选择文件类型为“程序”,然后单击“新建文件”按钮。
(2)在命令窗口中输入:MODIFY COMMAND <程序文件名>。
MODIFY COMMAND MYPROC1.PRG
打开Visual FoxPro“程序编辑器”窗口,在窗口中可以输入程序代码:
SET TALK OFF&&设置是否显示命令在执行过程中的状态信息,默认值为ON
CLEAR&&清屏
INPUT "请输入圆的半径:" TO R&&输入圆的半径
C=2*PI()*R&&计算圆的周长
S=PI()*R^2&&计算圆的面积
?"圆的周长:",C,"圆的面积:",S
SET TALK ON&&设置是否显示命令在执行过程中的状态信息,默认值为ON
RETURN&&关闭程序
说明:调试命令与辅助命令(该部分内容来自徐红波老师上课用PPT)
(1)SET TALK命令
格式:SET TALK ON|OFF
功能:设置是否显示命令在执行过程中的状态信息,ON为显示信息(默认值),OFF为不显示信息。如:命令copy files 学生.* to 学生1.*,若选ON,则显示复制过程中复制的几个文件的信息。若选OFF,则无信息。
(2)CANCEL命令
格式:CANCEL
功能:终止程序运行,清除所有私有变量,返回到命令窗口
(3)RETURN命令
格式:RETURN
功能:结束当前程序执行,返回到调用它的上级程序,若无上级调用程序,则返回到命令窗口
(4)QUIT命令
格式:QUIT
功能:退出VFP系统,返回WINDOWS操作系统
2.程序的保存与打开
(1)保存程序
执行菜单“文件”/“保存”命令或按下“Ctrl+W”组合键可将“程序编辑器”窗口中的程序文件保存起来。
若按菜单方式创建新程序时,执行保存操作后需要指定保存位置、文件名,选择文件保存类型为“程序(*.prg)”。
(2)打开程序
打开原来已保存过的程序文件的方法如下:
①执行“文件”菜单下的“打开”命令,在“打开”对话框的“搜寻”列表中选择程序文件所在的位置,在“文件类型”列表中选择“程序”文件类型,在“文件名”框中输入程序文件名或在对话框列表中单击选择程序文件,单击“确定”按钮。
②在命令窗口中输入:MODIFY COMMAND<程序文件名>。
MODIFY COMMAND MYPROC1.PRG
3.程序的运行
①在“程序编辑器”窗口中打开要运行的程序,单击“常用”工具栏上的“运行”按钮。
②在命令窗口或程序中,按DO<程序文件名>的格式调用程序文件并执行。
DO MYPROC1.PRG
使用上面建立的程序,将圆的半径设为10,运行结果为:
说明:输入命令与输出命令(该部分内容来自徐红波老师上课用PPT)
(1)INPUT命令
格式:INPUT [<字符表达式>] TO [<内存变量>]
功能:从键盘输入数据,回车后将数据赋给内存变量
说明:
1)<字符表达式>为提示信息。
2)输入的数据可为,常量,变量,表达式。
3)输入C,L,D型常量时要用定界符。
(2)ACCEPT命令
格式:ACCEPT [<字符表达式>] TO [<内存变量>]
功能:从键盘输入字符串数据,赋给内存变量
说明:
1)<字符表达式>为提示信息。
2)输入的字符串不需加定界符,否则会将定界符作为字符串的一部分。
3)若不输入数据直接按回车键,将空串赋给变量。
(3)输出命令
格式:
@ <行, 列> [SAY<表达式>] [GET<变量名>] [DEFAULT<表达式>]
功能:在屏幕指定行列输出表达式的值并修改内存变量的值。
说明:
1)<行,列>中行自上而下编号,列自左至右编号,编号从0开始,行列可以使用小数精确定位。
2)省略SAY选项,GET变量值在行列指定位置开始显示。若选SAY选项,先显示表达式的值,然后再显示GET变量值。
3)GET中的变量必须有初值或用[DEFAULT<表达式>]中的<表达式>命令定值。
4)GET选项必须用READ命令激活。
二、顺序结构程序设计
1.将3位整数倒序输出
SET TALK OFF&&设置是否显示命令在执行过程中的状态信息,默认值为ON
CLEAR&&清屏
INPUT "请输入任意一个3位的整数:" TO X&&由用户输入需要倒序输出的3位整数
A=INT(X/100)&&求百位上的数字
B=INT((X-A*100)/10)&&求十位上的数字
C=MOD(X,10)&&求个位上的数字
Y=C*100+B*10+A&&倒序组合
?"所输入的3位整数是:",X
?"倒序后的3位整数是:",Y
SET TALK ON&&设置是否显示命令在执行过程中的状态信息,默认值为ON
运行结果为:
或
SET TALK OFF&&设置是否显示命令在执行过程中的状态信息,默认值为ON
CLEAR&&清屏
INPUT "请输入任意一个3位的整数:" TO X&&由用户输入需要倒序输出的3位整数
A=MOD(X,10)&&求个位上的数字
B=MOD(X-A,100)/10&&求十位上的数字
C=(X-A-10*B)/100&&求百位上的数字
Y=INT(A*100+B*10+C)&&倒序组合
?"所输入的3位整数是:",X
?"倒序后的3位整数是:",Y
SET TALK ON&&设置是否显示命令在执行过程中的状态信息,默认值为ON
运行结果为:
2.在STUDENT表中对输入的记录号进行逻辑删除
SET TALK OFF&&设置是否显示命令在执行过程中的状态信息,默认值为ON
USE XSDA&&打开XSDA数据库
CLEAR&&清屏
INPUT "输入所删除记录的记录号:" TO RECORDNO
GO RECORDNO&&将指针移动到需要逻辑删除的记录号
DELETE&&逻辑删除当前记录
USE&&关闭表
SET TALK ON&&设置是否显示命令在执行过程中的状态信息,默认值为ON
运行结果为:
3.向STUDENT表中添加新纪录
CLEAR&&清屏
SET CENTURY ON&&设置日期显示世纪
USE STUDENT&&打开STUDENT表
APPEND&&增加一条空记录
***************格式化输入与编辑新纪录***************
@2,10 SAY "请输入新学生的信息"
@3,10 SAY "学号:" GET 学号
@4,10 SAY "姓名:" GET 姓名
@5,10 SAY "性别:" GET 性别 VALID 性别="男"
@6,10 SAY "专业:" GET 专业
@7,10 SAY "出生日期:" GET 出生日期 VALID 出生日期<DATE() AND 出生日期>{^1980-1-1}
@8,10 SAY "是否为党员:" GET 是否为党员
@9,10 SAY "入学成绩:" GET 入学成绩 RANG 500,700
@10,10 SAY "籍贯:" GET 籍贯
READ&&激活各个字段变量
BROWSE&&浏览添加结果
USE&&关闭表
RETURN&&结束程序
运行结果为:
说明:
三、选择结构程序设计
1.根据姓名进行查找,有返回其学号、姓名、出生日期混合专业信息,否则显示“查无此人!”
***************源程序代码***************
CLEAR&&清屏
USE XSDA.DBF&&打开XSDA数据库
ACCEPT "请输入待查学生的姓名:" TO NAME&&将用户输入的待查找的学生姓名转递给NAME变量
LOCATE FOR 姓名=NAME&&顺序查找
IF FOUND()&&如果找到该条记录,则执行下一行显示学号,姓名,出生日期和专业的命令,这里需要注意的是用户输入的出生日期为字符串类型,需要转化为日期类型之后再进行显示。
?"学号:"+学号+"姓名:"+姓名+"出生日期:"+DTOC(出生日期)+"专业"+专业
ELSE
?"查无此人!"
ENDIF
USE&&关闭表
RETURN&&结束程序
运行结果为:
若将以上程序中的ACCEPT语句替换为INPUT:
需要注意的是此时再进行输入时需要对字符型变量使用定界符
运行结果为:
2.求3个数中的最大数
CLEAR
INPUT "请输入第一个数字:" TO NUM1
INPUT "请输入第二个数字:" TO NUM2
INPUT "请输入第三个数字:" TO NUM3
MAX_NUM = MAX(NUM1,NUM2,NUM3)&&求三个数中的最大者
?"三个数中最大的数为:"+STR(MAX_NUM)
RETURN
运行结果为:
不使用MAX()函数的版本:
CLEAR
INPUT "请输入第一个数字:" TO NUM1
INPUT "请输入第二个数字:" TO NUM2
INPUT "请输入第三个数字:" TO NUM3
MAX = NUM1
IF NUM2>MAX
MAX=NUM2
ENDIF
IF NUM3>MAX
MAX=NUM3
ENDIF
?"三个数中最大的数为:"+STR(MAX)
RETURN
运行结果为:
3.编写完成分段式函数计算的程序代码:
CLEAR
INPUT "请输入X的值:" TO X
IF X<1
Y=2*X-5
ENDIF
IF X>=1 AND X<10
Y=2*X
ENDIF
IF X>=10
Y=2*X+5
ENDIF
?"Y的值为:"+STR(Y)
RETURN
运行结果为:
使用DO CASE版本:
CLEAR
INPUT "请输入X的值:" TO X
DO CASE
CASE X<1
Y=2*X-5
CASE X>=1 AND X<10
Y=2*X
CASE X>=10&&改为OTHERWISE亦可
Y=2*X+5
ENDCASE
?"Y的值为:"+STR(Y)
RETURN
运行结果为:
4.对成绩进行评级
SET EXACT ON&&用于开启精准比对模式
CLEAR
ACCEPT "输入学生姓名:" TO SNAME
USE VFSCODE
INDEX ON 姓名 TAG XM
SET ORDER TO XM&&设置主控索引
SEEK SNAME&&索引查询
IF FOUND()
DO CASE
CASE 成绩>=90
?姓名+"优秀!"
CASE 成绩>=70
?姓名+"良好!"
CASE 成绩>=60
?姓名+"及格!"
CASE 成绩<60&&OTHERWISE
?姓名+"不及格!"
ENDCASE
ELSE
MESSAGEBOX("查无此人!",0,"提示信息")
ENDIF
USE
SET EXACT OFF
RETURN
运行结果为:
5.求解一元二次方程的实根
SET TALK OFF
CLEAR
INPUT "输入参数a:a=" TO a
INPUT "输入参数b:b=" TO b
INPUT "输入参数c:c=" TO c
IF b^2-4*a*c>=0
X1=(-b+sqrt(b^2-4*a*c))/(2*a)
X2=(-b-sqrt(b^2-4*a*c))/(2*a)
?"X1=",X1
?"X2=",X2
ELSE
MESSAGEBOX("方程无实根",0,"提示信息")
ENDIF
SET TALK ON
RETURN
运行结果为:
思考与练习
计算分段函数的值并输出结果
CLEAR
INPUT "请输入X的值:" TO X
IF X>20
Y=2*X+5
ENDIF
IF X=20
Y=8
ENDIF
IF X<20
Y=10*X-5
ENDIF
?"Y的值为:",Y
RETURN
运行结果为:
3.判断输入字符的类型,并给出相应的提示
CLEAR
ACCEPT "请输入一个字符:" TO A
X=ASC(A)
DO CASE
CASE X>=48 AND X<=57
?"所输入的字符是数字"
CASE X>=65 AND X<=90
?"所输入的字符是大写字母"
CASE X>=97 AND X<=122
?"所输入的字符是小写字母"
OTHERWISE
?"所输入的字符为特殊字符"
ENDCASE
RETURN
运行结果为:
4.利用DO CASE语句编写程序实现所输入月份对应季度的判断
CLEAR
INPUT "请输入月份:" TO MON
DO CASE
CASE MON<=3
?MON,"月为第一季度"
CASE MON<=6
?MON,"月为第二季度"
CASE MON<=9
?MON,"月为第三季度"
CASE MON<=12
?MON,"月为第四季度"
ENDCASE
RETURN
运行结果为: