学时安排:
理论教学6学时,实验教学4学时。
实验目的:
1. 理解Visual FoxPro命令,理解Visual FoxPro命令文件的建立和执行;
2. 掌握Visual FoxPro中程序设计的三种结构(顺序、选择和循环);
3. 理解过程文件,掌握过程文件的建立和使用;
4. 掌握程序调试器的使用。
实验要求:
1. 每人一机,独立完成实验。
2. 对书本上的程序案例进行输入、编译与运行并记录程序运行结果。自由编写程序,并进行程序运行。对程序通过多种数据进行测试。
3. 每次实验完成将结果存入自己的U盘,或上传至信息中心个人网络U盘中保存。
实验设备:
硬件配置:计算机实验教学示范中心机房计算机。
软件配置:Windows操作系统,Visual Foxpro6.0系统。
实验内容及步骤:
一、顺序结构程序设计
1. 仔细阅读并研究下列程序,然后将该程序输入到计算机内建立一个程序文件,并运行之。
*求解一元二次方程X^2+4*X+3=0
A=1
B=4
C=3
D=B*B-4*A*C
X1=(-B+SQRT(D)/(2*A)
X2=(-B-SQRT(D)/(2*A)
? “X1=”,X1,”X2=”,X2
RETURN
2. 依照上述程序,编写一个求解一元二次方程:3X2 +5x-4=0的程序,并输入到计算机中运行。
3.编写一个按姓名查找工资的程序,程序如下:
SET TALK OFF && 置命令输出为关
USE GZ && 打开工资库
CLEAR && 清屏
ACCEPT "请输入欲找姓名 " TO CZ
LOCATE FOR 姓名=CZ && 查找该姓名同志
DISPLAY && 显示该同志工资数
SET TALK ON
RETURN
二、分支结构程序设计
1、单分支结构程序
(1)将上例完善一些,如找到显示该记录。程序如下:
SET TALK OFF && 置命令输出为关
USE GZ && 打开工资库
CLEAR && 清屏
ACCEPT "请输入欲找姓名 " TO CZ
LOCATE FOR 姓名=CZ && 查找该姓名同志
IF FOUND() && 如找到
DISPLAY && 显示该同志工资数
ENDIF
SET TALK ON
RETURN
(2)乘客乘坐出租车,2km以内需付费3元,2km以上每公里加付1.0元。试编写一个计费程序。
CLEAR
SET TALK OFF
INPUT“请输入行驶里程:” TO X
Y=3
IF X>2
Y=(X-2)*1.0+3
ENDIF
? “应付费:”,Y, “元”
SET TALK ON
RETURN
2、双分支结构程序
(1)试编写一个检验用户输入密码的程序。
CLEAR
SET TALK OFF
ACCEPT”请您输入密码” TO MM
IF UPPER(MM)<>”ABC”
? “您是非法用户,无权使用本系统!”
QUIT
ELSE
? “您是合法用户,欢迎使用本系统!”
ENDIF
SET TALK ON
RETURN
(2)IF语句嵌套
* 计算电费程序
INPUT "请输入用电量" TO X
IF X<=1000 && 当用电量小于一千度电
Y=X*0.58
ELSE && 大于一千度电
IF X<=2000 && 当用电量小于二千度电
Y=(X-1000)*0.68+1000*0.58
ELSE && 当用电量大于二千度电
Y=(X-2000)*0.88+1000*0.58+1000*0.68
ENDIF
ENDIF
? "电费 = ",Y
RETURN
(3)输入一个学生成绩,判断学生成绩的等级。假设成绩等级划分为5等:[0,60 ]为不及格,[60,70 ]为及格,[70,80 ]为良,[80,90 ]为好,[90,100]为优。
SET TALK OFF
CLEAR
INPUT "请输入学生成绩" TO p
IF p<60
? "不及格"
ELSE
IF p<70
? "及格"
ELSE
IF p<80
? "良"
ELSE
IF p<90
? "好"
ELSE
?"优"
ENDIF
ENDIF
ENDIF
ENDIF
SET TALK ON
RETURN
3、DO CASE—ENDCASE命令
(1)编写一个判定当前日期所属季节的程序
CLEAR
SET TALK OFF
YUE=MONTH(DATE())
DO CASE
CASE INLIST(YUE,3,4,5)
JJ=“春天”
CASE INLIST(YUE,6,7,8)
JJ=“夏天”
CASE INLIST(YUE,9,10,11)
JJ=“秋天”
CASE INLIST(YUE,12,1,2)
JJ=“冬天”
ENDCASE
WAIT “当前是&JJ” WINDOUS
SET TALK ON
RETURN
(2) 例:用DO CASE语句重新编制计算电费的程序。程序如下:
* 计算电费程序
INPUT "请输入用电量" TO X
DO CASE
CASE X<=1000 && 当用电量小于一千度电
Y=X*0.58
CASE X<=20 && 当用电量小于二千度电
Y=(X-1000)*0.68+1000*0.58
OTHERWISE && 当用电量大于二千度电
Y=(X-2000)*0.88+1000*0.58+1000*0.68
ENDCASE
? "电费 = ",Y
RETURN
三、循环结构程序设计
1、DO WHILE —ENDDO命令
(1)例:求N个数之和。
* N个数累加
SET TALK OFF
INPUT "输入欲累加数个数" TO N
S=0
I=1
DO WHILE I<=N
INPUT "X=" TO X
S=S+X
I=I+1
ENDDO
? "S= ",S
SET TALK ON
RETURN
(2)试编一程序,将若干个数累加,当输入“0”时结束累加。
* 遇到结束标记停止累加模块
SET TALK OFF
S=0
DO WHILE .T. && 用真循环
INPUT "X=" TO X && 输入欲加数
IF X=0 && 是结束标记
EXIT && 跳出循环
ENDIF
S=S+X && 累加
ENDDO
? "S= ",S
SET TALK ON
RETURN
(3)逐条输出“RS.DBF”中1980年出生的记录
CLEAR
USE RS
LOCATE FOR YEAR(出生日期)=1980
DO WHILE .NOT. EOF( )
DISPLAY
WAIT
CONTINUE
ENDDO
RETURN
2、FOR—ENDFOR命令
(1)使用FOR循环语句改写S=1+2+3+…+100的程序
SET TALK OFF
CLEAR
S=0
FOR I=1 TO 100
S=S+I
ENDFOR
? “S=”,S
SET TALK ON
RETURN
(2)编程求S=1!+2!+3!+…+10!的和
SET TALK OFF
CLEAR
S=0
FOR I=1 TO 10
F=F*I
S=S+F
ENDFOR
?“S=”,S
SET TALK ON
RETURN
3、SCAN—ENDSCAN命令
显示RS表中性别为女的全部记录。
SET TALK OFF
USE RS
SCAN
IF 性别= “男”
Loop
ENDIF
ENDSCAN
USE
RETURN
4、多重循环
(1)例:编写打印乘法口诀表程序。
* 打印乘法口诀表
SET TALK OFF
FOR X=1 TO 9 STEP 1
FOX Y=1 TO 9 STEP 1
S=X*Y && 乘积
? STR(X,1)+"*"+STR(Y,1)+"="+STR(S,2)+" " && 不换行打印
ENDFOR
? "" && 换行
ENDFOR
SET TALK ON
RETURN
(2)例:编程打印此图案
*
***
*****
*******
*********
①解法1
SET TALK OFF
FOR X=1 TO 5
?SPACE(15-X)
FOR Y=1 TO 2*X-1
?? “X”
ENDFOR
ENDFOR
SET TALK ON
RETURN
②解法2
SET TALK OFF
X=1
DO WHILE X<=5
Y=1
? SPACE(15-X)
DO WHILE Y=2*X-1
?? “*”
Y=Y+1
ENDDO
ENDDO
SET TALK ON
RETURN
(3)打印0-99内平方根表,要求保留二位小数。
*EX5_23.PRG
* 打印平方根表
SET TALK OFF
? " 平 方 根 表"
? " ──────────"
? " 0 1 2 3 4 5 6 7 8 9"
FOR X=0 TO 9 && 十位数循环
? STR(X,2)+" " && 打印列头
FOX Y=0 TO 9 && 个位数循环
?? STR(SQRT(X*10+Y),4,2)+" " && 打印平方根
ENDFOR
ENDFOR
SET TALK ON
RETURN
(4)找出0-999之间的所有“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如,153=1**3+5**3+3**3,故153是水仙花数。
SET TALK OFF
FOR X=0 TO 9 && 百位数循环
FOR Y=0 TO 9 && 十位数循环
FOR Z=0 TO 9 && 个位数循环
S1=X*100+Y*10+Z
S2=X**3+Y**3+Z**3
IF S1=S2 && 是水仙花数
? "X=",X,"Y=",Y,"Z=",Z
ENDIF
ENDFOR
ENDFOR
ENDFOR
SET TALK ON
RETURN
四、子程序与过程调用
1、编写一个计算长方形面积的子程序,在主程序中用带参数的DO语句调用它。
SET TALK OFF SUB1.PRG
S=0 PARA A,B,C
INPUT “长=” TO L C=A*B
INPUT “宽=” TO W RETURN
DO SUB1 WITH L,W,S
? “面积=”,S
SET TALK ON
RETURN
2、内部过程
① 判断下面程序的执行结果
****EXAMPL.PRG****
num1=1
num2=2
? num1,num2
do SWAP with num1,num2
? num1,num2
Do SWAP with (num1),(num2)
? num1,num2
PROCEDURE SWAP
PARAMETERS X,Y
T=X
X=Y
Y=T
ENDPROC
②用主程序MAIN.PRG实现对过程文件SUB.PRG中的两个过程文件SUB1.PRG和SUB2.PRG的调用。
*主程序文件
CLEAR
SET PROCEDURE TO SUB
?“***过程调用示例***”
? “##################”
DO SUB1
? “##################”
DO SUB2
CLOSE PROCEDURE
RETURN
*过程文件名:SUB.PRG
PROCEDURE SUB1
? “& & & & & & & & & & &1”
RETURN
PROCEDURE SUB2
? “& & & & & & & & & & &2”
RETURN
ENDPROC
3、自定义函数
①建立一个自定义函数,求半径为3,4,5的3个圆面积之和.
FUNCTION QSYM
PARAMETERS R
S=3.14159*R*R
RETURN S
调用:
? QSYM(3)+QSYM(4)+QSYM(5)
②定义一函数,可以根据输入的年,月,计算出本月的最后一天的日期。程序RQ.PRG
FUNCTION RQ
PARAMETERS Y,M
SET TALK OFF
D="31"
Y=VAL(Y)
M=VAL(M)
DO CASE
CASE M=4.OR.M=6.OR.M=9.OR.M=11 && 为小月
D="30"
CASE M=2
IF INT(Y/4)=Y/4.AND.(INT(Y/100)#Y/100.OR.INT(Y/400)=Y/400)
D="29"
ELSE && 为平月
D="28"
ENDIF
ENDCASE
③定义一函数,可以将百亿以内的阿拉伯数字金额转换为中文大写数字。RMB.PRG
FUNCTION RMB
PARAMETERS N
SET TALK OFF
NC=STR(N,14,2)
C1="零壹贰叁肆伍陆柒捌玖"
C2="佰拾亿仟佰拾万仟佰拾元 角分"
ND=""
SW=.T.
FOR K=1 TO 14
IF K#12
ND=ND+SUBS(C1,VAL(SUBS(NC,K,1))*2+1,2)
ND=ND+SUBS(C2,K*2-1,2)
ENDIF
ENDFOR
ND=ND+"整"
RETURN ND