930 likes | 1.11k Views
第 4 章 循环结构程序设计. 4.1 For-Next 语句 4.2 Do While—Loop 语句 4.3 Do—Loop While 语句 4.4 循环语句的嵌套 4.5 程序举例. 4.1 For-Next 语句. 【 例 4.1】For-Next 语句实例。在窗体上添加两个标签 (lblShow 和 lblValue) 和两个命令按钮 (cmdCal 和 cmdExit) 。. 单击时在标签中显示计算结果. 单击时结束程序. For i = 1 To 100. 概括. Next i. 从 1 变化到 100.
E N D
第4章 循环结构程序设计 4.1 For-Next 语句 4.2 Do While—Loop 语句 4.3 Do—Loop While 语句 4.4 循环语句的嵌套 4.5 程序举例
4.1 For-Next 语句 【例4.1】For-Next 语句实例。在窗体上添加两个标签(lblShow和lblValue)和两个命令按钮(cmdCal和cmdExit)。 单击时在标签中显示计算结果 单击时结束程序
For i = 1 To 100 概括 Next i 从1变化到100 算法分析:计算1+2+3+…+100的和 sum = 0 sum = sum + 1 sum = sum + 2 ┋ sum = sum + 100 sum = sum + i
变量 i 赋初值1 No i <= 100 变量 i 加1 Yes sum = sum + i For — Next 语句的执行过程
循环控制变量 For 语句 循环体语句 可省略 完整程序代码 Private Sub cmdCal_Click() Dim sum As Integer, i As Integer For i = 1 To 100 sum = sum + i Next i lblValue.Caption =sum End Sub
成对出现 步长为1时可省略 循环变量值介于初始值和终止值之间时反复执行 For – Next 循环的一般语法格式 For <循环变量> = <初始值>To <终止值> [ Step <步长> ] 循环体语句 Next [ <循环变量> ] 步长可取正或负数;步长为负数时应使终止值小于初始值
说明 • 循环体语句执行的次数: 次数=Fix( (终止值-初始值) / 步长)+1 • 可以使用Exit For语句提前结束循环 For i =1 To 10 Step 2 x = x + Int ( Rnd * 100 ) If x > 300 Then Exit For Next i Print x
图像框1 图像框2显示艺术字 标签,显示统计结果 【例4.2】掷50次骰子,统计点数6出现的次数。窗体中包含2个图像框、2个命令按钮和3个标签。
在程序的运行初期,使3个标签处于隐藏状态 主要程序代码 Private Sub Form_Load() lblText.Visible = False lblPoint.Visible = False lblCount.Visible = False End Sub
随机产生一个1~6间的整数 循环50次 将随机值dot转换成字符型并连接成串 Private Sub cmdStart_Click() lblText.Visible = True lblPoint.Visible = True lblCount.Visible = True imgText.Visible = False Randomize For i = 1 To 50 dot = Int(Rnd * 6) + 1 If dot = 6 Then n = n + 1 dotstr = dotstr & Str(dot) & " " Next i lblPoint.Caption = dotstr lblCount.Caption = "6出现数:" & Str(n) End Sub
思考: 利用计时器随机产生50个骰子点数 ? 添加Tmr1_Timer事件过程 If i = 50 Then Tmr1.Enabled = False dot = Int(Rnd * 6) + 1 If dot = 6 Then n = n + 1 dotstr = dotstr & Str$(dot) + " " lblPoint.Caption = dotstr lblCount.Caption = "6出现数:" & Str$(n) i = i + 1
超范围 【例4.3】计算1!+2!+……+n!的值。 (1≤n≤20) 文本框,输入n值并按“回车” 标签,显示计算结果
初值为1 算法分析 (1) 求阶乘运算:1×2×3×…×n s = 1 '存放乘积 For i=1 To n s = s * i Next i 连乘算法
求阶乘 求和 (2) 使用累加算法计算阶乘之和 For i = 1 To n s = s * i sum = sum + s Next i
输入字符时触发 输入回车键 MsgBox "数据输入错误,请重新输入!", vbOKOnly + vbDefaultButton1+ vbCritical, "数据错误" 返回键入字符的ASCII码 txtIn.Text = "" lblOut.Caption = "" txtIn.SetFocus 程序代码 Private Sub txtIn_KeyPress (KeyAscii As Integer) If KeyAscii = 13 Then n = Val(txtIn.Text) If n >= 1 And n <= 20 Then s = 1: sum = 0 计算阶乘之和并输出 Else 显示出错消息框 准备接受用户的再次输入 End If End If End Sub
Private Sub txtIn_Change() lblOut.Caption = "" End Sub 当文本框内容发生变化时立即清空标签
【例4.4】设计如下窗体。单击“最大值”按钮时立即产生10个1~100之间的随机整数显示在框架内的标签中,同时将它们中的最大值显示在下方的标签内。【例4.4】设计如下窗体。单击“最大值”按钮时立即产生10个1~100之间的随机整数显示在框架内的标签中,同时将它们中的最大值显示在下方的标签内。
随机产生数据a并作为最大值保存在dmax中 循环次数≤9 No Yes 随机产生新数据a a > dmax No Yes a作为最大值保存到dmax中 输出dmax的值 求最大值算法的流程图
调试方法介绍 —— 设置断点 通过设置断点,使程序运行到指定的代码行时暂时停止,并切换到中断模式,等待调试人员作进一步的分析和判断,从而确定出下一步的调试任务。
单击 单击 滚动显示 【例4.5】设计ASCII码对照表
FrmEx4_5_1窗体(显示数字的Ascii码) Private Sub Form_Activate() picDigit.Print Tab(2); "数 字"; Spc(3); "ASCII码" For i = 0 To 9 picDigit.Print Tab(2); i; Spc(5); Asc(i) Next End Sub
窗体级变量,存放欲输出字母的Ascii码 FrmEx4_5_2窗体(显示字母的Ascii码) Dim k As Integer Private Sub cmdU_Click() k = 65 tmrAlpha.Enabled = True End Sub cmdL_Click( )k = 97
使ch和k值在大写字母的Ascii值范围内 For i = 0 To 9 显示大写字母 ch = k + i If ch > 90 Then ch = ch - 26 picAlpha.Print Tab(3); Chr$(ch); Spc(6); ch Next k = k + 1 If k = 91 Then k = k - 26 显示小写字母? Private Sub tmrAlpha_Timer() picAlpha.Cls picAlpha.Print Tab(2); "字母"; Spc(3); "ASCII码" If k <= 90 Then 滚动显示10行大写字母 Else 滚动显示10行小写字母 End If End Sub 122 123
Private Sub cmdStop_Click() If cmdStop.Caption = "暂 停" Then tmrAlpha.Enabled = False cmdStop.Caption = "继 续" Else tmrAlpha.Enabled = True cmdStop.Caption = "暂 停" End If End Sub
Private Sub cmdReturn_Click() tmrAlpha.Enabled = False frmEx4_5_2.Hide frmEx4_5_0.Show End Sub
4.2 Do While — Loop 语句 • 循环次数已知 • 事先不知道循环次数 For-Next 循环 Do While – Loop 循环
【例4.6】用Do While – Loop 语句改写 例4.1 — 计算 1 + 2 + 3 + … + 100 的值。
改写后的代码 Private Sub cmdCal_Click() Dim sum As Integer Dim i As Integer i = 1 Do While i <= 100 sum = sum + i i = i + 1 Loop lblValue.Caption = sum End Sub
No i<=100 Yes sum = sum + i i = i + 1 Do While - Loop语句的执行过程
Do While – Loop 语句常被用于执行条件明确,但事前不知道循环次数的循环中 • 一般语法格式 Do While 循环条件 循环体语句 Loop 前测当型循环,条件为真时执行循环体;否则结束循环
说明: • 循环体有可能一次也不执行; • 进入Do While - Loop语句前应给循环控制变量设初值(如 i = 1; ),且循环体中必须包含使循环趋于结束的语句(如 i = i + 1;); • 循环体中可使用Exit Do语句随时跳出当前循环,即提前结束Do While - Loop语句。
单击 单击 显示总分、平均分 【例4.7】输入若干成绩(值为-1时结束输入),计算总分和平均成绩。窗体上有2个命令按钮(cmdInput和cmdCala)、5个标签(lblScore、lblAll、lblSum、lblAve、和lblAverage) 和 1个文本框。 反复输入(-1结束) 以每行3个形式显示成绩
算法分析 • 使用Do While - Loop语句循环执行成绩的输入、显示和累加操作 输入 sc = InputBox(.....) 显示 txtScore.Text =txtScore.Text & sc 累加 sum = sum + Val(sc) 循环条件 Do While Val( sc ) <> -1
算法分析 • 文本框中每行输出3个成绩 变量n:当前输入的成绩个数 每输入一个有效成绩: n = n + 1 txtScore.Text =txtScore.Text & sc If n Mod 3 = 0 Then txtScore.Text = … & Chr(13) & Chr(10) End If
为显示新数据做准备 程序代码 Dim sum As Integer ’ 统计总成绩 Dim ave As Single ’ 存放平均值 Private Sub cmdInput_Click() txtScore.Text = "" lblSum.Caption = "" lblAverage.Caption = "" sc = InputBox("请输入成绩(-1时结束)", " 成绩输入", -1)
按格式将输入的成绩连接成串 Do While Val(sc) <> -1 n = n + 1 scstr = scstr & Format(sc,"@@@@") If n Mod 3 = 0 Then scstr = scstr & Chr(13) & Chr(10) End If sum = sum + Val(sc) sc = InputBox("请输入成绩(-1时结束)", "成绩输入", -1) Loop
将成绩串输出到文本框中 txtScore.Text = scstr ave = Format(sum / n, "###.##") End Sub Private Sub cmdCala_Click() lblSum.Caption = sum lblAverage.Caption = Str$(ave) End Sub 计算平均值,并按格式赋予ave
画同心矩形或圆 【例4.8】绘制图形。窗体上有图片框和4个命令按钮。 随机产生100个点 随机画100条线
X轴 (0,0) (0,Width) (0, Height) ( Height ,Width ) Y轴 算法分析(一) • 确定绘图坐标系 • 缺省设置下,系统将容器左上角坐标视为(0,0),右(下)方向为x(y) 轴的递增方向。 系统坐标系 用户自定义坐标系
(0,0) (1,1) (100,100) • 通过Scale方法可为控件定义新的坐标系统,即用户自定义坐标系。 picShow.Scale (1, 1)-(100, 100)
(x1,y1) (0,y1) (x1,0) (0,0) (x2,0) (x2,y2) (0,y2) Scale方法的调用格式 [对象名].Scale (x1,y1)-(x2,y2)
算法分析(二) • 使用绘图方法绘制图形 • Pset方法画点 [对象名].PSet [Step](x, y), [color] 画点的位置 (x,y)为相对坐标 画点的颜色,缺省则为对象的前景色
相对坐标 (x1,y1) – (x2,y2) Step 直线的起始坐标及终点坐标 以(x1,y1)和(x2,y2)为对角绘制空心矩形 以(x1,y1)和(x2,y2)为对角绘制实心矩形 • Line方法绘制直线或矩形 [对象名].Line (x1,y1) – (x2,y2) , 颜色 , BF , B
(0,0) (10,10) 举例 Scale (0, 0)-(10, 10) Line (3, 1)-(1, 3) Line (1, 3)-Step(6, 0) Line -(9, 1) Line -Step(-6, 0) Line (1, 3)-(7, 9), , B Line -(9, 7) Line -Step(0, -6) Line (3, 5)-(5, 9), QBColor(9), BF
圆半径 圆心坐标 纵横比 起始角和终止角 ( 0到2 ) • Circle方法画圆、椭圆或弧 [对象名].Circle [Step](x, y) , radius [,color] , , , aspect , start , end , ★ 绘制椭圆 ★ 绘制圆弧 ★ 绘制扇形 在start或end前添加负号,将使圆心和圆弧端点连接
说明: • 调用Circle方法时可以省略语法中的某些参数,但参数前用于分隔各参数的逗号不能省 • 参数start和end使用的单位是弧度
算法分析(三) • 与绘图有关的属性设置 • DrawWidth —— 绘图线的宽度 picShow.DrawWidth = 2 设置图片框中所绘线条的宽度为 2个像素 • ScaleWidth和ScaleHeight —— 设置或返回对象内部水平和垂直方向的大小