Upload
amir-woods
View
114
Download
6
Embed Size (px)
DESCRIPTION
Visual FoxPro 程序设计教程. 第 5 章. 循环结构程序设计. 5.1 循环结构语句. ● 当型循环命令 DO WHILE. 当型循环的语法格式为: DO WHILE〈 条件 〉 [〈 命令列 〉] [EXIT] [LOOP] ENDDO. 【 例 5-1】 求 1 + 2 + 3 + … + 100 的值。如图 5-2 所示。. 设计步骤如下: 表单界面的设计参见前面章节,这里仅给出命令按钮的 Click 事件代码:. s = 0 n = 1 DO WHILE n
Citation preview
Visual FoxPro Visual FoxPro 程序设计教程序设计教程程
第 第 55 章章
循环结构程序设计
5.1 循环结构语句●● 当型循环命令当型循环命令 DO WHILEDO WHILE
当型循环的语法格式为:
DO WHILE 〈条件〉
[ 〈命令列〉 ]
[EXIT]
[LOOP]
ENDDO
教学进程教学进程
【例 5-1 】求 1 + 2 + 3 + … + 100 的值。如图 5-2 所示。
图 5-2 求和
s = 0n = 1DO WHILE n <=100 s = s + n n = n + 1ENDDOTHISFORM.Text1.Value = s
设计步骤如下:表单界面的设计参见前面章节,这里仅给出命令按钮的 Click事件代码:
教学进程教学进程
输入整数 n ,求阶乘 n! (如图 5-4 )。
【例 5-2 】非负整数 n的阶乘定义如下:
0
0
21
1!
n
n
nn
图 5-4 求阶乘 n!
教学进程教学进程
n = THISFORM.Text1.Value
t = 1
i = 1
DO WHILE i <= n
t = t * i
i = i + 1
ENDDO
THISFORM.Text2.Value = t
设计步骤如下:
表单界面的设计参见前面章节,这里给出命令按钮的 Click 事件代码:
教学进程教学进程
另外,为了防止数据溢出,限制输入的整数不超过 20 。为此,编写文本框 Text1 的事件代码如下: Valid 事件代码:a = THIS.Value
IF a < 0 OR a > 20
MESSAGEBOX(" 请输入不超过 20 的非负整数 !")
THIS.GotFocus
RETURN 0
ELSE
RETURN .T.
ENDIF
GotFocus 事件代码:THIS.SelStart=0
THIS.SelLength=LEN(THIS.Text)
教学进程教学进程
【例 5-3 】输入两个正整数,求它们的最大公约数。如图 5-6 所示。
图 5-6 求最大公约数
教学进程教学进程
m = THISFORM.Text1.Value
n = THISFORM.Text2.Value
IF n * m = 0
MESSAGEBOX(" 两数都不能为 0!")
RETURN
ENDIF
IF m < n
t = m
m = n
n = t
ENDIF
r = m % n
DO WHILE r != 0
m = n
n = r
r = m % n
ENDDO
THISFORM.Text3.Value = n
设计步骤如下:表单界面的设计参见前面章节,这里给出命令按钮的 Click 事件代码:
教学进程教学进程
【例 5-4 】输入一个正整数,利用“当型”循环判断是否素数。
n = THISFORM.Text1.Values = 0i = 2DO WHILE i <= SQRT(n) AND s = 0 IF n % i = 0 s = 1 ELSE i = i + 1 ENDIFENDDOIF s = 0 a = ' 是一个素数 '
设计步骤如下: 表单界面的设计参见前面章节,这里给出命令按钮的 Click事件代码:
教学进程教学进程
ELSE
a = ' 不是素数 '
ENDIF
= MESSAGEBOX(ALLT(STR(n)) + a, 64 + 0 + 0, " 信息 ")
THISFORM.Text1.SetFocus
● ● 编写 Text1 的 GotFocus 事件代码,使文本框得到焦点后,文本立即被选中:
THIS.SelStart = 0
THIS.SelLength = LEN(STR(THIS.Value))
教学进程教学进程
● ● 步长型循环命令步长型循环命令 FORFOR
语法结构为:
FOR 〈内存变量〉 = 〈初值〉 TO 〈终值〉 [STEP 〈步长值〉 ] [ 〈命令列〉 ] [EXIT] [LOOP]ENDFOR | NEXT
教学进程教学进程
【例 5-5 】利用“步长型”循环判断素数的程序。只需修改命令按钮 Command1 的 Click 事件代码:n = THISFORM.Text1.Values = 0i = 2FOR i = 2 TO SQRT(n) IF n % i = 0 s = 1 EXIT ENDIFENDFORIF s = 0 a = ' 是一个素数 'ELSE a = ' 不是素数 'ENDIF= MESSAGEBOX(ALLT(STR(n)) + a, 64 + 0 + 0, " 信息 ")THISFORM.Text1.SetFocus 程序的运行结果同例 5-4 完全相同。
教学进程教学进程
【例 5-6 】求 1! + 2! + 3! + … + 20! 的值。
其中命令按钮 Command1 的 Click 事件代码为:s = 0FOR n = 1 TO 20 t = 1 FOR m = 1 TO n t = t * m ENDFOR s = s + tENDFORTHISFORM.Text1.Value = s 运行结果如图 5-11 所示。
图 5-11 求和
教学进程教学进程
5.2 列表框与组合框控件 ●● 使用列表框使用列表框
【例 5-7 】求从 2000 年到 2100 年之间的所有闰年。 设计步骤如下:
(1) 设计表单界面和设置控件属性。 (2) 编写命令按钮 Command1 的 Click 事件代码为:THISFORM.List1.ClearFOR n = 2000 TO 2100 IF n % 4 = 0 IF n % 100 != 0 OR n % 400 = 0 L = 1 ELSE L = 0 ENDIF ELSE L = 0 ENDIF IF L = 1
教学进程教学进程
【例 5-8 】利用循环结构和列表框控件,设计一个“选项移动”表单。
设计步骤如下: (1) 建立应用程序用户界面。 (2) 设置对象属性
(3) 编写事件代码。 ●● 编写容器控件 Container1 的 Init 事件代码:THIS.List1.AddItem ("one")THIS.List1.AddItem ("two")THIS.List1.AddItem ("three")THIS.List1.AddItem ("four")THIS.List1.AddItem ("five")THIS.List1.AddItem ("six")THIS.List1.AddItem ("seven")THIS.List1.AddItem ("eight")THIS.List1.AddItem ("nine")THIS.List1.AddItem ("ten")
教学进程教学进程
●● 编写容器控件中命令按钮组 CommandGroup1 的 Click 事件代码:DO CASE CASE THIS.Value = 1 I = 0 DO WHILE I <= THIS.Parent.List1.ListCount IF THIS.Parent.List1.Selected(i) THIS.Parent.List2.Additem (THIS.Parent.list1.List(i)) THIS.Parent.List1.RemoveItem(i) ELSE I = I + 1 ENDIF ENDDO CASE THIS.Value = 2 DO WHILE THIS.Parent.List1.ListCount > 0 THIS.Parent.List2.AddItem(THIS.Parent.List1.List(1)) THIS.Parent.List1.RemoveItem(1) ENDDO CASE THIS.Value = 3
教学进程教学进程
I = 0
DO WHILE I <= THIS.Parent.List2.ListCount
IF THIS.Parent.List2.Selected(i)
THIS.Parent.List1.Additem (THIS.Parent.List2.List(i))
THIS.Parent.List2.RemoveItem(i)
ELSE
I = I + 1
ENDIF
ENDDO
CASE THIS.Value = 4
DO WHILE THIS.Parent.List2.ListCount > 0
THIS.Parent.List1.AddItem(THIS.Parent.List2.List(1))
THIS.Parent.List2.RemoveItem(1)
ENDDO
ENDCASE
教学进程教学进程
IF THIS.Parent.List2.ListCount > 0
THIS.Command3.Enabled =.T.
THIS.Command4.Enabled =.T.
ELSE
THIS.Command3.Enabled =.F.
THIS.Command4.Enabled =.F.
ENDIF
IF THIS.Parent.List1.ListCount = 0
THIS.Command1.Enabled =.F.
THIS.Command2.Enabled =.F.
ELSE
THIS.Command1.Enabled =.T.
THIS.Command2.Enabled =.T.
ENDIF
THISFORM.Refresh
教学进程教学进程
【例 5-9 】显示文件目录的列表框程序。在列表框中选定文件后,用鼠标单击“打开选定文件”按钮可打开该文件进行察看或编辑。 设计步骤如下: (1) 选择新建表单,进入表单设计器。增加一个列表框控件 List1 、一个命令按钮 Command1 、两个形状 Shape1~ Shape2 、两个标签 Label1 ~ Label2 和一个文本框 Text1 ,如图 5-16 所示。
图 5-16 文件目录列表
教学进程教学进程
(2) 设置 List1 和 Text1 的属性
(3) 编写事件代码。 ●● 编写表单的 Activate 事件代码:THISFORM.List1.SetFocus
●● 编写文本框 Text1 的 Valid 事件代码:THISFORM.List1.RowSource = ALLTRIM(THIS.Value)
THISFORM.List1.Requery
●● 编写“打开选定文件”按钮 Command1 的 Click 事件代码:a = THISFORM.List1.ListIndex
MODIFY FILE (THISFORM.List1.List(2)+THISFORM.List1.List(a))
教学进程教学进程
【例 5-10 】简易数学用表。显示整数 1 ~ 100 的平方、平方根、自然对数和 e 指数,如图 5-18 所示。 设计步骤如下: (1) 设计程序界面与设置对象属性
图 5-18 简易数学用表
(2) 编写 Command1 的 Click 事件代码:FOR n = 1 TO 100 s = ALLT(STR(n)) THISFORM.List1.AddlistItem(s,n,1) s = ALLT(STR(n^2)) THISFORM.List1.AddlistItem(s,n,2) s = ALLT(STR(sqrt(n),10,3)) THISFORM.List1.AddlistItem(s,n,3) s = ALLT(STR(LOG(n),10,4)) THISFORM.List1.AddlistItem(s,n,4) s = ALLT(STR(EXP(n),14,4)) THISFORM.List1.AddlistItem(s,n,5)ENDFOR
教学进程教学进程
●● 使用组合框
1 、下拉列表框【例 5-11 】在文本框输入数据,按回车添加到列表框中,在列表框中选定项目,按回车后可以移去选定项,如图 5-19 所示。
图 5-19 添加或移去文本
教学进程教学进程
设计步骤如下: (1) 选择新建表单,进入表单设计器,首先增加一个形状 Shape1 ,然后,在其中增加一个文本框 Text1 、一个组合框 Combo1 以及两个标签 Label1 ~ Label2 。 (2) 设置 Combo1 的属性
(3) 编写代码。 编写表单的 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.SelLength = LEN(RTRIM(THIS.Text))
a = 0
ENDIF
▲▲ Valid 事件:IF a = 1
RETURN .T.
ELSE
a = 1
RETURN 0
ENDIF
●● 编写 Combo1 的 RightClick 事件代码:IF THIS.ListIndex > 0
THISFORM.Text1.Value = THIS.List(THIS.ListIndex)
THIS.RemoveItem (THIS.ListIndex)
THIS.Value = 1
ENDIF
2 、下列组合框【例 5-12 】在上例中使用下拉组合框来代替文本框和列表框,实现同样的功能:输入数据,按回车后可添加到列表中,在列表中选定项目,单击鼠标右键可移去选定项,如图 5-20 所示。
图 5-20 下拉组合框
教学进程教学进程
设计步骤如下: (1) 表单界面的设计与控件属性的设置参见图 5-20
。 (2) 编写代码。 编写 Combo1 的事件代码: ●● KeyPress 事件:LPARAMETERS nKeyCode, nShiftAltCtrl
IF nKeyCode = 13
IF !EMPTY(THIS. DisplayValue)
THIS.AddItem (THIS.DisplayValue)
THISFORM.Text1.Value = THIS.ListCount
ENDIF
THIS.SelStart = 0
THIS.SelLength = LEN(ALLT(THIS.Text))
THIS.Tag = "N"
ENDIF
教学进程教学进程
●● RightClick 事件:IF THIS.ListCount > 0
THIS.RemoveItem (THIS.ListIndex)
THIS.Value = 1
THISFORM.Text1.Value = THIS.ListCount
ENDIF
●●Valid 事件:IF THIS.Tag = "Y"
RETURN .T.
ELSE
THIS.Tag = "Y"
RETURN 0
ENDIF
教学进程教学进程
【例 5-13 】“简易抽奖机”,在组合框中输入号码。按下“开始”按钮后,组合框中将不停变换随机得到的号码。单击“停止”按钮,号码停止变动,并得到中奖的号码。
图 5-21 简易抽奖机
教学进程教学进程
设计步骤如下:
(1) 表单界面的设计与控件属性的设置参见图 5-21 。在窗体中增加一个计时器控件 Timer1 ,并将其 Timer 属性改为: 50
, Enabled 属性改为: False 。
(2) 编写代码。
编写 Combo1 的事件代码:
●● KeyPress 事件:
教学进程教学进程
LPARAMETERS nKeyCode, nShiftAltCtrlDO CASE CASE nKeyCode = 13 IF !EMPTY(THIS.DisplayValue) THIS.AddItem (THIS.DisplayValue) THISFORM.Text1.Value = THIS.ListCount ENDIF THIS.SelStart = 0 THIS.SelLength = LEN(ALLT(THIS.Text)) THIS.Tag = "N" CASE nKeyCode = 27 && 按 Esc 键后可以移去选项 IF THIS.ListCount > 0 THIS.RemoveItem (THIS.ListIndex) THIS.Value = 1 THISFORM.Text1.Value = THIS.ListCount ENDIFENDCASE
教学进程教学进程
●● Valid 事件:IF THIS.Tag = "Y"
RETURN .T.
ELSE
THIS.Tag = "Y"
RETURN 0
ENDIF
●● 编写计时器控件 Timer1 的 Timer 事件代码,使之可以随机地抽取奖号:n = THISFORM.Text1.Value
a = INT(RAND() * n) + 1
THISFORM.Combo1.ListIndex = a
教学进程教学进程
●● 编写命令按钮 Command1 的 Click 事件代码:THISFORM.Timer1.Enabled = .NOT.(THISFORM.Timer1.Enabled)
a = " 按“停止”按钮,可得中奖号码 "
b = " 中奖号码是: " + THISFORM.Combo1.Text
IF THISFORM.Timer1.Enabled
THIS.Caption = " 停止( \<S ) "
THISFORM.Label1.Caption = a
ELSE
THIS.Caption = " 开始( \<S ) "
THISFORM.Label1.Caption = b
ENDIF
教学进程教学进程
●● 5.35.3 页框页框●● 5.315.31 带选项卡的表单带选项卡的表单
【例 5-14 】在表单中设计一个带选项卡的页框架,其中有三个页面,分别放上一些不同的控件。
设计步骤如下: (1) 选择新建表单,进入表单设计器,设计成具有三个页页的页框,编辑页框 1 。如下图所示
教学进程教学进程
(2) 编辑 Page2 ,如下图所示
(3) 编辑 Page3 ,如下图所示
(4) 编写事件代码。 编写第二页中 Timer1 的 Timer 事件代码:
教学进程教学进程
IF HOUR(DATETIME()) >= 12
THIS.Parent.Label1.Caption = ' 下午 '
ELSE
THIS.Parent.Label1.Caption = ' 上午 '
ENDIF
IF HOUR(DATETIME()) > 12
hh = HOUR(DATETIME()) – 12
ELSE
hh = HOUR(DATETIME())
ENDIF
THIS.Parent.Text1.Value = STR(hh) + SUBSTR(TIME(),3)
教学进程教学进程
【例 5-15 】将例 5-14 中的页框架改为不带选项卡的形式,使用选项按钮组控制页面的选择。如图 5-25 所示。
●● 5.315.31 不带选项卡的表单不带选项卡的表单
教学进程教学进程
教学进程教学进程
设计步骤如下:(在例 5-15 的基础上进行修改)
(1) 选择“打开”表单文件,进入表单设计器,删去选项按钮组控件 OptionGroup1 ,增加一个“命令按钮组”控件 CommandGroup1 ,并修改其属性。其中命令按钮组中的按钮 Command1 和 Com
mand2 的 Enabled 属性改为: .F. – 假,参见图 5-2
6 所示。
(2) 编写命令按钮组 CommandGroup1 的 Click
事件代码:
教学进程教学进程
n = THIS.Valuek = THISFORM.PageFrame1.ActivePageDO CASE CASE n=1 THISFORM.PageFrame1.Pages(1).Zorder CASE n=2 THISFORM.PageFrame1.Pages(k-1).Zorder CASE n=3 THISFORM.PageFrame1.Pages(k+1).Zorder CASE n=4 THISFORM.PageFrame1.Pages(3).ZorderENDCASEk = THISFORM.PageFrame1.ActivePageTHIS.Command1.Enabled = IIF(k = 1, .F., .T.)THIS.Command2.Enabled = IIF(k = 1, .F., .T.)THIS.Command3.Enabled = IIF(k = 3, .F., .T.)THIS.Command4.Enabled = IIF(k = 3, .F., .T.)
ENDEND
(1) (1) 阐述矢量图形与位图图像的区别。阐述矢量图形与位图图像的区别。
(2) (2) 图像分辨率的单位是什么?阐述其意义。图像分辨率的单位是什么?阐述其意义。
(3) (3) 哪种格式的图像文件体积最小?哪种格式的图像文件体积最小?
(4) (4) 练习使用图像浏览器练习使用图像浏览器 ACDSee32ACDSee32 。。
(5) (5) 练习获取练习获取 WindowsWindows 界面的方法。界面的方法。
▲▲ 把把 Windows Media PlayerWindows Media Player 界面粘贴到界面粘贴到 WordWord 文档中。文档中。
▲▲ 把任意一个下拉式菜单粘贴到把任意一个下拉式菜单粘贴到 WordWord 文档中。文档中。
(6) (6) 使用使用 PhotoShopPhotoShop 改变图像的几何尺寸,并保存。改变图像的几何尺寸,并保存。
课外作业课外作业
教学进程教学进程