第六章 循环结构程序设计
6.1 概述例如,一个简单的运算题:求 1× 2× 3× 4× 5
6.2循环结构语句
Visual FoxPro中只提供了,当型,,,步长型,和,表扫描型,3种循环语句:
( 1) DO WHILE…,ENDDO( 当型循环 )
( 2) FOR…,ENDFOR( 步长型循环 )
( 3) SCAN…,ENDSCAN( 表扫描型循环 )
6.2.1当型循环命令 DO WHILE
DO WHILE 条件 P &&循环起始及条件语句语句序列 S &&循环体
ENDDO &&循环终止语句当条件是否成立执行循环体
[例 6.1]编写计算 S=1+2+3+… +100的程序 。
写出程序:
s=0 &&变量 s为累加器,初值为 0
i=1 &&变量 i为计数器,初值为 1
do while i<=100 &&当 i值小于或等于 100时,执行循环体
s=s+i &&累加
i=i+1 &&计数器增 1
enddo
[例 6.2]计算 n的阶乘 。
计算按钮的 Click事件代码:
n=Thisform.Text1.Value &&输入 n的值
IF n<=0 &&如果 n的值小于或等于 0则不进行计算
Messagebox(“输入数据不正确 !,)
Return
ENDIF
n1=1 &&变量 n1用来保留每次乘积的结果
i=1 &&变量 i为计数器,初值为 1
DO While i<=n &&当 i的值小于或等于 n的值,执行循环体
n1=n1*i &&将 i每次自增后的值同前次乘积的结果相乘,并再次保存到 n1中
i=i+1 &&计数器 i自增
Enddo
Thisform.Text2.Value=n1 &&将 n的阶乘输出
Thisform.Refresh
6.2.2FOR循环语句格式:
FOR 变量 =初值 TO 终值 [STEP 步长 ]
语句序列
ENDFOR|NEXT 变量执行步骤如下:
(1)给变量赋初值;
(2)判断变量的值是否小于等于终值;
(3)若不是,则循环结束;
(4)若是,则执行语句序列;
(5)变量 =变量 +步长 ( 若省略 STEP,则步长 =1) ;
(6)转 ( 2) 。
[例 6.3]编写计算 S=1+2+3+… +100的程序 。
s=0
for i=1 to 100 &&从 1到 100,共执行 100次循环体
s=s+i
next
”s=”,s
[例 6.4]修改 [例 6.2],改用 FOR循环计算 n的阶乘 。
计算按钮的 click事件代码:
n=Thisform.Text1.Value
IF n<=0
Messagebox(“输入数据不正确 !,)
Return
Endif
n1=1
For i=1 To n
n1=n1*i
Endfor
Thisform.Text2.Value=n1
Thisform.Refresh
[例 6.5]判断 n是否素数程序如下:
输入 n &&见表单设计
s=0 &&变量 s是标志位,当程序结束时,s=0表示 n为素数
,s=1表示 n不是素数
For i=2 To n-1 &&从 2~ n-1寻找 n的约数
If n%i=0 &&如果 n和 i可以整除 ( 即余数为 0)
s=1 &&s=1表示找到约数
Exit &&提前退出循环
Endif
Endfor
If s=0 &&也可改为,if s=1
,素数,?”不是素数,
Else else
,不是素数,?”素数,
Endif endif
[例 6.6] 求前 20个 Fibonacci数列
Fibonacci数列是这样的一种数列:第一个数和第二个数是 1,从第三 个 数 开 始,后 面 一 个 数 是 其 前 面 两 个 数 之 和 。 例如,
1,1,2,3,5,8,13,……,
程序如下:
f1=1
f2=1
for i=1 to 10
f1,f2
f1=f1+f2
f2=f1+f2
endfor
6.2.3 SCAN循环语句格式:
SCAN [范围 ] [FOR 条件 ]
语句序列
ENDSCAN
[例 6.6]试编一程序,显示学生成绩册中 80分以上学生姓名首先要建立一个数据库表 student( 其中包含,成绩,,,姓名,
字段 ),输入学生成绩,然后才开始编程 。
程序如下:
use student
scan for 成绩 >=80
姓名
endscan
use
6.2.4循环辅助语句 LOOP和 EXIT
功能,LOOP:能使执行转向循环语句头部继续循环;
EXIT:用来立即退出循环
[例 6.7]编程计算 S=1+2+3+… +100,并求 1~100之间奇数之和 。
程序如下:
store 0 to i,s,t &&i是计数器,s是 1~100之和,t是奇数之和
do while i<=100 &&当 i<100时,循环继续
i=i+1 &&i从 1~100自增
s=s+i &&将 1~100依次加入到 s中
if int(i/2)=i/2 &&判断 i是否奇数,若不是,则不必加入到 t中
loop
endif
t=t+i
enddo
”1+2+3+… +100=”,s
”1~100奇数和为:”,t
6.2.5多重循环若一个循环语句的循环体内又包含其它循环,就构成了多重循环,
也称为循环嵌套。
循环当中还可以嵌套循环,两种循环语句可以互相嵌套,但是不能交叉。
[例 6.8]打印 100到 200间所有的素数见 EX6_8.prg
6.3列表框与组合框控件
6.3.1使用列表框列表框的属性与方法属性 说明
Column
Count
列表框的列数
ControlS
ource
用户从列表中选择的值保存在何处
MoverB
ars
是否在列表项左侧显示移动钮栏,这样有助于用户更方便地重新安排列表中各项的顺序
Multisel
ect
用户能否从列表中一次选择一个以上的项
RowSou
rce
列表中显示的值的来源
RowSou
rceType
确定 RowSource是下列哪种类型:一个值,
表,SQL语句,查询,数组,文件列表或字段列表方法程序说明
AddI
tem
给 RowSourceType属性为 0的列表添加一项
Clear 清除列表中的各项
Rem
oveIt
em
从 RowSourceType属性为 0的列表中删除一项
Requ
ery
当 RowSource中的值改变时更新列表
[例 6.9]求从 2000年到 2100年之间的所有闰年。
[例 6.10]利用循环结构和列表框控件,设计一个“选项移动”
表单。
对象 属性 属性值 说明
Label1 Caption Shift或 Ctrl+单击鼠标左键可选择多项 标签的内容
WordWrap,T.—真
Container1:
List1 Multiselect,T.—真 选择多项
List2 Multiselect,T.—真 选择多项
MoverBars,T.—真 可移动
Container1.CommandGroup1:
Command1 Caption > 标签的内容
FontBold,T.—真
Command2 Caption >> 标签的内容
FontBold,T.—真
Command3 Caption < 标签的内容
FontBold,T.—真
Enabled,F.—假
Command4 Caption << 标签的内容
FontBold,T.—真
Enabled,F.—假编写表单的 Init事件代码:
( 未 加 容 器 container1)
Thisform.List1.Additem(“one”)
Thisform.List1.Additem(“two”)
Thisform.List1.Additem(“three”)
Thisform.List1.Additem(“four”)
Thisform.List1.Additem(“five”)
Thisform.List1.Additem(“six”)
Thisform.List1.Additem(“seven”)
Thisform.List1.Additem(“eight”)
Thisform.List1.Additem(“nine”)
Thisform.List1.Additem(“ten”)
[例 6.11]显示文件目录的列表框程序。在列表框中选定文件后,用鼠标单击“打开选定文件”按钮可以打开该文件进行查看或编辑。
设计步骤如下:
( 1)选择新建表单,进入表单设计器。增加一个列表框 List1、一个命令按钮 Command1、两个形状按钮 Shape1和 Shape2、两个标签
Label1和 Label2及一个文本框 Text1,如上图所示。
( 1) 设置 List和 Text1的属性如表,其他控件的属性设置见其他章节。
表 6-5 属性设置对象 属性 属性值 说明
Text1 Value *.txt
List1 RowSourceType 7—文件
RowSource *.txt
[例 6.12]简易数学用表 。 显示整数 1~100的平方,平方根,自然对数和 e指数,如图 6-13所示:
6.3.2使用组合框有两种形式的组合框,即下拉组合框和下拉列表框,通过更改控件的 Style属性可选择所需要的形式。
下拉列表框(即 Style属性为 2的组合框控件 —下拉列表框)和列表框一样下拉组合框(即 Style属性默认为 0的组合框控件 —下拉组合框)则兼有列表框和文本框的功能。
属性 说明
ControlSource 指定用于保存用户选择和输入值的表字段
InputMask 对于下拉组合框,指定允许键入的数值类型
IncrementalSearch 指定在用户键入每一个字母时,控件是否和列表中的项匹配
RowSource 指定组合框中项的来源
RowSourceType 指定组合框中数据源类型
Style 指定组合框是下拉组合框还是下拉列表
[例 6.13]在文本框输入数据,按回车添加到列表框中,在列表框中选定项目,按回车后可以移去选定项。
编写表单的 Activate事件代码,
public a
a=1
This.Text1.SetFocus
编写 Text1的事件代码,
keypress事件:
LPARAMETERS nkeycode,nshiftaltctrl
if nkeycode=13
if !Empty(This.Value)
ThisForm.Combo1.AddItem(This.Value)
ThisForm.Combo1.DisplayValue=This.Value
endif
This.SelStart=0
This.SselLength=Len(Rtrim(This.Text))
a=0
endif
Text1的 Valid事件,
If a=1
return,T.
else
a=1
return 0
endif
Combo1的 RightClick事件代码
if This.ListIndex>0
ThisForm.Text1.Value=This.List(This.Li
stIndex)
This.RemoveItem(This.ListIndex)
This.Value=1
endif
[例 6.13]在上例中使用下拉组合框来代替文本框和列表框,实现同样的功能
6.4页框页框架( pageframe)刚被创建时,只有两个页面( page),用
( pagecount)属性来设置页面数。
[例 6.15] 在表单中设计一个带选项卡的页框架,其中有 3个页面,分别放上一些不同的控件。
设置属性对象 属性 属性值 说明
Text1
Alignment 2—中间 文本居中
Value =date() 使用日期函数
DateFormat 14—汉语 设置日期格式
Label1 Caption 今天是:
6.4计时器 与微调按钮
[例 6.16] 显示时间,刷新时间可调