410 likes | 655 Views
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 <=100 s = s + n
E N D
第 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 <=100 s = s + n n = n + 1 ENDDO THISFORM.Text1.Value = s 图5-2 求和 教学进程
【例5-2】非负整数n的阶乘定义如下: 输入整数n,求阶乘n!(如图5-4)。 图5-4 求阶乘n! 教学进程
设计步骤如下: 表单界面的设计参见前面章节,这里给出命令按钮的Click事件代码: n = THISFORM.Text1.Value t = 1 i = 1 DO WHILE i <= n t = t * i i = i + 1 ENDDO THISFORM.Text2.Value = t 教学进程
另外,为了防止数据溢出,限制输入的整数不超过20。为此,编写文本框Text1的事件代码如下:另外,为了防止数据溢出,限制输入的整数不超过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-3】输入两个正整数,求它们的最大公约数。如图5-6所示。 图5-6 求最大公约数 教学进程
设计步骤如下: 表单界面的设计参见前面章节,这里给出命令按钮的Click事件代码: 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 教学进程
【例5-4】输入一个正整数,利用“当型”循环判断是否素数。【例5-4】输入一个正整数,利用“当型”循环判断是否素数。 设计步骤如下: 表单界面的设计参见前面章节,这里给出命令按钮的Click事件代码: n = THISFORM.Text1.Value s = 0 i = 2 DO WHILE i <= SQRT(n) AND s = 0 IF n % i = 0 s = 1 ELSE i = i + 1 ENDIF ENDDO IF s = 0 a = '是一个素数' 教学进程
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)) 教学进程
● 步长型循环命令FOR 语法结构为: FOR〈内存变量〉=〈初值〉TO〈终值〉[STEP〈步长值〉] [〈命令列〉] [EXIT] [LOOP] ENDFOR | NEXT 教学进程
【例5-5】利用“步长型”循环判断素数的程序。【例5-5】利用“步长型”循环判断素数的程序。 只需修改命令按钮Command1的Click事件代码: n = THISFORM.Text1.Value s = 0 i = 2 FOR i = 2 TO SQRT(n) IF n % i = 0 s = 1 EXIT ENDIF ENDFOR IF 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 = 0 FOR n = 1 TO 20 t = 1 FOR m = 1 TO n t = t * m ENDFOR s = s + t ENDFOR THISFORM.Text1.Value = s 运行结果如图5-11所示。 图5-11 求和 教学进程
5.2 列表框与组合框控件 ●使用列表框 【例5-7】求从2000年到2100年之间的所有闰年。 设计步骤如下: (1) 设计表单界面和设置控件属性。 (2) 编写命令按钮Command1的Click事件代码为: THISFORM.List1.Clear FOR 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】利用循环结构和列表框控件,设计一个“选项移动”表单。【例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事件代码:●编写容器控件中命令按钮组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】显示文件目录的列表框程序。在列表框中选定文件后,用鼠标单击“打开选定文件”按钮可打开该文件进行察看或编辑。【例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所示。【例5-10】简易数学用表。显示整数1~100的平方、平方根、自然对数和e指数,如图5-18所示。 设计步骤如下: (1) 设计程序界面与设置对象属性 (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 图5-18 简易数学用表 教学进程
●使用组合框 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-13】“简易抽奖机”,在组合框中输入号码。按下“开始”按钮后,组合框中将不停变换随机得到的号码。单击“停止”按钮,号码停止变动,并得到中奖的号码。 图5-21 简易抽奖机 教学进程
设计步骤如下: (1) 表单界面的设计与控件属性的设置参见图5-21。在窗体中增加一个计时器控件Timer1,并将其Timer属性改为:50,Enabled属性改为:False。 (2) 编写代码。 编写Combo1的事件代码: ●KeyPress事件: 教学进程
LPARAMETERS nKeyCode, nShiftAltCtrl DO 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 ENDIF ENDCASE 教学进程
● 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.3页框 ● 5.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.31不带选项卡的表单 【例5-15】将例5-14中的页框架改为不带选项卡的形式,使用选项按钮组控制页面的选择。如图5-25所示。 教学进程
设计步骤如下:(在例5-15的基础上进行修改)设计步骤如下:(在例5-15的基础上进行修改) (1) 选择“打开”表单文件,进入表单设计器,删去选项按钮组控件OptionGroup1,增加一个“命令按钮组”控件CommandGroup1,并修改其属性。其中命令按钮组中的按钮Command1和Command2的Enabled属性改为:.F. – 假,参见图5-26所示。 (2) 编写命令按钮组CommandGroup1的Click事件代码: 教学进程
n = THIS.Value k = THISFORM.PageFrame1.ActivePage DO 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).Zorder ENDCASE k = THISFORM.PageFrame1.ActivePage THIS.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.) 教学进程
课外作业 (1) 阐述矢量图形与位图图像的区别。 (2) 图像分辨率的单位是什么?阐述其意义。 (3) 哪种格式的图像文件体积最小? (4) 练习使用图像浏览器ACDSee32。 (5) 练习获取Windows界面的方法。 ▲ 把Windows Media Player界面粘贴到Word文档中。 ▲ 把任意一个下拉式菜单粘贴到Word文档中。 (6) 使用PhotoShop改变图像的几何尺寸,并保存。 END 教学进程