VFP第4、5、6部分(程序算法、顺序分支循环)
vfp第2章第4,5,6节(程序)

试编程完成下列功能。从键盘上随机输入一个正数,以此数为 半径,求圆面积和球体积,并输出结果。 程序如下: 程序中的第一行为注释行,说明 此程序文件名;第四行的功能是 *L2.PRG 不显示命令处理信息,第十行的 CLEAR 功能是恢复显示命令处理信息。 SET TALK OFF INPUT "半径=" TO R 在命令窗口中执行: S=PI()*R*R DO L2 V=4/3*PI()*R**3 屏幕显示 输入10后 ? "圆面积=",S 按Enter键 半径=10 ? "球体积=",V SET TALK ON 显示结果 RETURN 圆面积= 314.16 球体积= 4188.790205
例:根据键入X的值,计算下面分段函数的值,并显示结果。 程序如下: X2+4X-1 (X≤0) SET TALK OFF 3X2-2X+1 (0<X≤10) Y= CLEAR X2+1 (X>10) INPUT “X=” TO X IF X>0 IF X>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) SET TALK ON RETURN
Name
说明:程序中第四句使用了宏代换函数,这是由于Name本身 不是文件名,而其内容才是文件名。 (2)通用数据接收命令 ACCEPT语句只能给字符型内存变量提供数据。如果用户想给 其它类型的内存变量提供数据,可以使用下列命令: 格式:INPUT [<提示信息>] TO <内存变量名>
功能:用于接收从键盘上输入的任意类型的表达式(必须符合 VFP的语法要求),并将计算结果存入指定的内存变量或数组元 素中。 参数描述: [<提示信息>]:提示信息,提示用户输入数据。 [<内存变量名>]:指定一个内存变量或数组元素,存储从键盘 输入的数据。如果指定的内存变量或数组元素不存在,VFP将自 动创建该内存变量或数组。 说明: INPUT语句与ACCEPT语句的执行过程相同,功能相似。 <内存变量名>的数据类型取决于输入数据的类型。可以为数 字型、字符型、日期型和逻辑型等等。 INPUT语句与ACCEPT语句的区别是: ACCEPT命令只能接收字符串,而INPUT语句可以接收任意 类型的VFP表达式;如果输入的是字符串,ACCEPT语句不要使 用字符型定界符,而INPUT语句必须用定界符括起来。 INPUT命令不可以不输入任何内容就按回车键。
vfp程序设计 第7讲 循环

另一种循环: 另一种循环:SCAN … ENDSCAN
格式: 格式:
SCAN [ 范围 ] [ FOR<条件表达式 ][WHILE<条件表达式 条件表达式1> 条件表达式2>] 条件表达式 条件表达式
< 语句序列 > [ EXIT ] [ LOOP] ENDSCAN 功能:对当前打开的表文件在指定范围, 功能:对当前打开的表文件在指定范围,满足条件的记录中 进行自上而下逐个扫描操作,随着记录指针的移动,SCAN循 进行自上而下逐个扫描操作,随着记录指针的移动,SCAN循 环允许对指定的每条记录执行相同的< 操作。 环允许对指定的每条记录执行相同的< 语句系列 >操作。 说明:SCAN循环能自动移动指针 按条件指定记录, 循环能自动移动指针, 说明:SCAN循环能自动移动指针,按条件指定记录,避免在 循环体内重复执行表文件查询命令。 WHILE循环也可以 循环体内重复执行表文件查询命令。用DO WHILE循环也可以 实现对表文件的逐个扫描操作,但它需要借助函数BOF() BOF()或 实现对表文件的逐个扫描操作,但它需要借助函数BOF()或 EOF()测试状态 测试状态, SKIP命令移动指针 不如SCAN循环方便。 命令移动指针, SCAN循环方便 EOF()测试状态,用SKIP命令移动指针,不如SCAN循环方便。
y="零壹贰叁肆伍陆柒捌玖 零壹贰叁肆伍陆柒捌玖" 零壹贰叁肆伍陆柒捌玖 p=substr(y,2*x+1,2) ?x,"->",p input "a=" to a input "b=" to b input "c=" to c d=max(a,b,c) e=min(a,b,c) f=a+b+c-d-e ?d,f,e
VFP 第四章 程序设计01课件

26
• 例8、随机产生一个70~80之间的数(例8 .PRG) • 例9、从2开始,计算偶数之和,直到和大于10000为止,并显示最后一个
在VFP环境下,通过系统提供的菜单命令,来完成各种操作。 3、程序文件方式
程序文件(简称程序),也叫做命令文件。将对数据库资源进行 操作管理的命令和对系统环境进行设置的命令,集中在一个扩展名 为(.PRG)的命令文件中,然后在运行该命令文件。
2
程序文件的建立与编辑
• 在VFP环境下,建立和编辑程序文件有两种方式:命令方式和菜单 方式 1、命令方式:在命令窗口中输入
• 实际上VFP只运行目标程序。对于新建的或已被修改的 VFP程序,执行DO命令是,VFP会自动对它编译并产生 与主名相同的目标程序,然后执行该目标程序。(例如 ,执行 DO QH时,将先编译产生 QH.FXP,然后运行 QX.FXP。)
• 目标程序的扩展名因源程序而异,.PRG的目标程序名是 .FXP,查询程序的目标扩展名为.QPX。
14
例3:对JS表,找到gh为‘A0002’的记录,如果此人的基本工资少于600,就将基本工 资增加100元(例3.PRG)
双向分支结构
• 根据一逻辑表达式的值,有条件的执行一组命令。语法:
IF 逻辑表达式 程序组1
ELSE 程序组2
ENDIF • 逻辑表达式代表一逻辑值,如果这逻辑值为真,系统执行程序组1,否则执
例: WAIT “请检查输入内容” WINDOW AT 12,20 TIMEOUT 10
(整理)VFP程序步骤

第一部分:程序入门一级一、选择结构(IF- ELSE - ENDIF)语句格式:IF〈条件〉〈语句序列1〉[ ELSE〈语句序列2〉]ENDIF说明:IF和ENDIF必须配对使用,而ELSE可选。
三个语句应各占一行。
若省略ELSE子句,条件为真时,则执行〈语句序列1〉,然后再执行ENDIF后的语句;否则,若条件为假,即执行ENDIF后的语句。
二、循环结构1、条件循环:语句格式:DO WHILE 〈条件表达式〉〈语句序列1〉[LOOP]〈语句序列2〉[ EXIT ]〈语句序列3 〉ENDDO说明:系统执行该语句时,先测试条件表达式的值,若为真,则执行循环体,在循环体中修改循环条件,直到条件为假时,脱离循环,执行循环体ENDDO后的语句。
若遇到LOOP 语句,则直接返回执行DO语句,测试条件以决定是否继续循环。
若执行循环体时遇到EXIT 语句,则不执行下面的语句,直接跳出循环,执行ENDDO后面的语句。
注意:DO WHILE必须和ENDDO配合使用,两者缺一不可,DO WHILE语句前一定要有条件变量的初始值。
2、计数循环FOR〈循环变量〉=〈循环初值〉TO〈循环终值〉[STEP〈步长〉]〈语句序列1〉[LOOP]〈语句序列2〉[EXIT]〈语句序列3〉ENDFOR/NEXT说明:使用和DO WHILE 基本一致,注意步长和ENDFOR语句。
三、程序举例:A. 简单整除,求和求个数。
Eg:求出[10,100]内所有能被2整除的整数的和(2530),个数(46)set talk offclearn=0 &&设置计数变量s=0 &&设置求和变量for i=10 to 100if mod(i,2)=0n=n+1 &&满足条件计数变量加1s=s+i &&满足条件,求和变量增加endifendfor? n,sset talk onreturnA1.求出[10,100]内所有能被7和9中至少一个数整除的整数的个数(22),和(1250).A2.求出[10,100]内所有能被7但不能被9整除的整数的个数(12), (665)A3.求出[10,100]内所有能被7和9中的一个且只有一个数整除的整数的个数(21),(1187)A4.编写程序,求出1~7000以内能被3或者7整除的数的个数(3000)。
2019-2019-2VFP第4部分 共44页

i=1
for i=1 to n step k
do while i<=n
<命令序列>
<命令序列>
endfor|next
i=i+k
endddo
【练习1】求100以内的奇数和。 请同学们自 己写出流程 图和程序
A=1+3+5+…+99
循环变量 初值n=1
循环条件n<100
循环变量的变化 趋势n=n+2
循环体累加语句:A=A+n
涉及数据表的循环, 第6章介绍
1)条件循环(do while循环)
格式:
教材P62
流程图:
条件 N
Y 语句序列
Enddo之后的语句
【例】计算1+2+3+…+100
第 1 步, 计算 0+1;
第 2 步, 计算 (0+1)+2; 第 3 步, 计算 (0+1+2)+3;
递归 算法
………
第 i 步, 计算 (0+1+…+i-1)+i;
……….
第 100 步,计算 (0+1+…+99)+100;
前i-1次累加和
第i次累加项
算法: s=1+2+3+…+100
确定循环变量i并赋初值为1
定义s存放累加和,初值为0
确定循环条件 i<=100
s=s+i
递推公式
确定循环变量的变化趋势i=i+1
输出结果s
三个“确定” 循环三要素
在条件循环中如何 体现的??
vfp循环语句

一、条件循环语句 ( 当型循环语句)
DO WHILE <条件表达式> 〈条件表达式值为真时需反复执行 的语句系列〉 ENDDO
循环说明部分
DO WHILE<条件表达式> 〈条件表达式值为真时 需反复执行的语句系列〉 ENDDO
循环体 循环结束部分
条件? 条件? Y
N
循环体
功能:当条件表达式值 ENDDO后面的语句 为真时反复执行循环体, 直到条件表达式值为假 时为止。
三、扫描循环语句
模式一: … USE〈表文件〉 … GO TOP !EOF() DO WHILE EOF()=.F. 〈处理一条记录的命令序列〉 NOT EOF() SKIP ENDDO USE …
例:将jsdn.dbf中所有职称为 教授的基本工资增加100元, 副教授增加70元,讲师增加 50元,助教增加30元。
解法二:
use gs do while !eof() i=2 store 得分1 to m,n,x do while i<=8 j=str(i,1) m=max(m,得分&j) n=min(n,得分&j) x=x+得分&j i=i+1 enddo replace 最后得分with (x-m-n)/6 skip enddo use
例:编程显示26个大写英文字母 和它们的ASCII码值,每行显示 10个字母。
例:编程程序,建立并输出一个 10×10的矩阵,该矩阵两条对角 线元素为1,其余元素均为0。
例:若一个三位自然数的值等 于该数各位数字的立方和,则 这个自然数叫做“水仙花数”, 例如153=1^3+5^3+3^3,153是 一个水仙花数,请编写程序求 出所有水仙花数。
VFP第4、5部分(循环结构)

fac=1
for i=1 to n
输入n i=1,fac=1 i<=100 fac=fac*i i=i+1 输出s 求n!的N-S图
fac=fac*i
endfor
?n,"!=",fac
return
例:求所有的水仙花数。(所谓水
仙花数是指一个三位数,其各位数 字的立方和等于该数本身。
求1000以内的 “水仙花数”。所谓“水 仙花数”是指一个3位数,其各位数字的立 方和等于该数本身。例如,153=13+53+33, 故153是水仙花数。
例:求n的阶乘
当循环
步长循环
input “请输入终值:” to n
input “请输入步长:” to k
i=1 do while i<=n <命令序列> i=i+k
for i=1 to n step k
<命令序列> end for | next
end ddo
Clear
input "请输入n:" to n
方法二: set talk off clea for I=1 to 9 for j=0 to 9 for k=0 to 9 if I^3+j^3+k^3=100*I+10*j+k ? 100*I+10*j+k endif endfor endfor endfor return
表单设计
“文件”→“新建”→“表单” 单击 打开或关闭 标签 (label) 命令按钮 (command) 右键单击表单中的对象, 选择“属性” 文本框 (text)
x=thisform.text1.value 例:输入一个数,判断奇偶性。 if mod(x,2)=0 &&判断奇偶性的条件 bel2.caption="该数为偶数" else bel2.caption="该数为奇数" endif
VFP第4、5、6部分(程序算法、顺序分支循环)

l ( a b c) / 2
(其中a,b,c为三角形的三边,area为三角形的面积)
“计算”按钮的“Click”事件代码如下: a=thisform.text1.value 数据输入 b=thisform.text2.value c=thisform.text3.value l =(a+b+c)/2 数据处理 area=sqrt( l *( l -a)*( l -b)*( l -c)) thisform.text4.value=round(area,1)
“求解”命令按钮的“Click”事件代码如下: a=thisform.text1.value b=thisform.text2.value c=thisform.text3.value if a=0 messagebox("二次项系数为0,这不是一个一元二次方程") thisform.text1.setfocus else d=b^2-4*a*c if d>=0 x1=round((-b+sqrt(d))/(2*a),2) x2=round((-b-sqrt(d))/(2*a),2) thisform.text4.value=x1 thisform.text5.value=x2 else messagebox("该方程没有实数根!") endif endif
l
(教材P54) 【例3-4】设计如图3-13所示表单,其中 文本框Text1中可以接受日期型数据,运行表单后在 Text1中输入日期:08/25/11,单击命令按钮 “Command1”,则标签Label2显示什么?其中 command1控件的click事件代码: 填什么? d=thisform.text1.value y=year(d) IF ____________________ y1="是" ELSE y1="不是" ENDIF bel2.caption=y1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Y
A
条件p
N B
T
F
A
B
(a)流程图
(b)N-S图
•
循环结构:是指重复执行某些操作, 重复执行的部分称为循环体。N 条件P Y A 条 NhomakorabeaPA
(a)流程图
(b)N-S图
常用输入输出控件
R=thisform.text1.value fas=thisform.text1.value
1)输入控件 文本框 2)输出控件
【例】计算1+2+3+…+100
第 1 步, 计算 0+1; 第 2 步, 计算 (0+1)+2; 递归 第 3 步, 计算 (0+1+2)+3; 算法 ……… 第 i 步, 计算 (0+1+…+i-1)+i; ………. 第 100 步,计算 (0+1+…+99)+100;
前i-1次累加和 第i次累加项
教师:李盛瑜
QQ:1845470460
第三、四、五讲 要点:
程序设计(1)
1.算法的概念及特点 2.掌握程序3种基本结构的表示
3.掌握利用分支结构编程
4.掌握利用循环结构编程 5.常用控件
算法及算法的表示
一、算法的概念及特点
所谓算法就是对解决问题所采用的 方法和步骤的描述。
二、算法的描述
算法的描述方法有很多,为直观、 准确地表示一个问题的处理方法和步骤, 通常采用流程图的方法。
“求解”命令按钮的“Click”事件代码如下: a=thisform.text1.value b=thisform.text2.value c=thisform.text3.value if a=0 messagebox("二次项系数为0,这不是一个一元二次方程") thisform.text1.setfocus else d=b^2-4*a*c if d>=0 x1=round((-b+sqrt(d))/(2*a),2) x2=round((-b-sqrt(d))/(2*a),2) thisform.text4.value=x1 thisform.text5.value=x2 else messagebox("该方程没有实数根!") endif endif
【例】表单运行后,在文本框Text1 中输入 月份值,单击“输出”按钮,可以弹出提示框显 示对应季节的中文名字,如图所示。(文本框 Text1 的Value 初值为0)
“输出”命令按钮的click事件代码: yf=thisform.text1.value do case case yf=3 or yf=4 or yf=5 jj="春季" case yf=6 or yf=7 or yf=8 jj="夏季" case yf=9 or yf=10 or yf=11 jj="秋季" case yf=12 or yf=1 or yf=2 jj="冬季" Endcase _____________________
l
(教材P54) 【例3-4】设计如图3-13所示表单,其中 文本框Text1中可以接受日期型数据,运行表单后在 Text1中输入日期:08/25/11,单击命令按钮 “Command1”,则标签Label2显示什么?其中 command1控件的click事件代码: 填什么? d=thisform.text1.value y=year(d) IF ____________________ y1="是" ELSE y1="不是" ENDIF bel2.caption=y1
判断某一年是否是闰年
假如年份用y表示,判断y是否是闰年 的方法是:若y能够被400整除或y能够被4 整除并且不能够被100整除
提示:判断一个整数M能否被另一个整数N整除,一 般采用三种方法,判断: ①MOD(M,N)是否等于0 ②INT(M/N) 是否等于M/N ③M%N=0 若等于,则表明M能被N整除。
EXM 4:比较任意三个数的大小, 并输出较大数。
输入三个数a,b,c Y N
a>b?
Y
c>a?
N
Y
输出c 结束
c>b?
N
输出b
输出c
输出a
4)多分支语句
格式: (见教材58页) 流程图: 条件1 命令序列1
条件2
条件N
otherwise
命令序列2
命令序列N 命令序列Q
ENDCASE后面的语句
【修改例3-6】输入月份值,显示对应季节的中文名 字(3,4,5月为春季,6,7,8月为夏季,9,10,11月为 秋季;12,1,2月为冬季)。
3.循环结构
循环结构能够使某些语句或程序段重 复执行若干次。 如果某些语句或程序段需要在一个固 定的位置上重复操作,使用循环是最好的 选择。
常见的循环结构有:
条件循环 步长循环 扫描循环
涉及数据表的循环, 第6章介绍
1)条件循环(do while循环) 格式: 流程图:
教材P62
条件
N
Y 语句序列 Enddo之后的语句
属于“累加器”类型问题
基本方法:
(1)在进入累加前先给累加器赋初值(求和一般为0)
(2)用循环语句实现累加
循环变量赋初值;循环条件;循环变量的改变规律
(3)循环体语句的设计
累加器当前值=累加器原值+循环当前值
s=1+2+3+…+100 算法: 确定循环变量i并赋初值为1 定义s存放累加和,初值为0 确定循环条件 i<=100 递推公式 s=s+i 确定循环变量的变化趋势i=i+1 输出结果s
EXM2:输入两个数,比较大小,并 输出较大数。
方法一:双分支
输入两个数a,b Y
?a
a>b?
N
?b
结束
方法二:单分支
输入两个数a,b
Y
把b的值赋给a
a<b?
N
?a
EXM3:输入两个数,比较大小,并 按从大到小的顺序输出。
使用单分支结构:
输入两个数a,b
Y
交换a,b的值
a<b?
N
?a,b
赋值
“计算”按钮的“Click”事件代码如下: fas=thisform.text1.value cels=5*(fas-32)/9 thisform.text2.value=round(cels,1)
什么意思?
〖描述方法1〗用自然语言表示 步骤1:输入华氏温度fas。 步骤2:按照公式,计算摄氏温度cels。
“输出”命令按钮的click事件代码: yf=val(thisform.text1.value) do case case yf=3 or yf=4 or yf=5 jj="春季" case yf=6 or yf=7 or yf=8 jj="夏季" case yf=9 or yf=10 or yf=11 jj="秋季" case yf=12 or yf=1 or yf=2 jj="冬季" endcase bel3.caption=jj
5 ( fas 32 ) cels 9
步骤3:输出摄氏温度。
〖描述方法2〗 用流程图表示如图所示。
开始 输入fas 计算cels 输出cels 结束
〖描述方法3〗用N-S流程图如图所示。
一个算法应该具有以下特点:教材P52
①确定性。
②有穷性。
③有效性。 ④输入。 ⑤输出。
任何一个问题能否让计算机处理, 关键在于能否设计出合理的算法,有 了合适的算法,再使用合适的计算机 语言来编写程序。 VFP就是一种语言工具。要用VFP 编写出高质量的程序,一方面要构建 合理的算法,另一方面要掌握VFP的语 法规则,它是实现算法的基础。
l ( a b c) / 2
(其中a,b,c为三角形的三边,area为三角形的面积)
“计算”按钮的“Click”事件代码如下: a=thisform.text1.value 数据输入 b=thisform.text2.value c=thisform.text3.value l =(a+b+c)/2 数据处理 area=sqrt( l *( l -a)*( l -b)*( l -c)) thisform.text4.value=round(area,1)
命令有一定的书写规则: 1、命令分行。 程序中每条命令都以回车键结尾, 一行只能写一条命令。若命令需分行 书写,应在一行终了时键入续行符 “;”,然后按回车键。
2、命令注释。
程序中可以插入注释,以提高程序的 可读性。 注释语句 格式:
NOTE|* 注释部分 && 注释部分
单命令的行 尾注释 行首注释
1 、C = A
赋值
2
1
3
2 、A = B
容器A 容器C 容器B
赋值
3 、B = C
交换
思考:输入3个数a,b,c,比较 大小,并按从大到小的顺序 输出。
分支的嵌套
(教材P53) 【例3-5】已知一元二次方程的3个系数, 求一元二次方程的根。求根公式 :
b b 2 4ac x1,2 2a
标签、文本框
bel3.caption= thisform.text2.value=round(cels,1) alltrim(str(s,8,1))
程序设计实例
顺序结构程序实例
分支(选择)结构程序实例 循环结构程序实例
1.顺序结构
教材P53