1、《Visual Basic语言》上机实验八 实验名称:循环结构程序设计(2学时) 一、实验目的 1. 掌握While…Wend和For语句的使用。 2. 掌握Do While/Until…Loop与Do…loop While/Until两种循环语句的使用。 3. 加深理解循环的概念,掌握循环的规则及其执行过程。 4. 学会如何控制循环条件,防止死循环或不循环。 二、背景知识 如果在指定的条件下多次重复执行一组相同的语句可以通过循环来实现,VB提供了下面几种形式的循环语句: 1.For循环语句 For 循环变量 = 初值 To 终值 [Step步长] 语
2、句块 [Exit For] 语句块 Next 循环变量 说明:在使用这种循环语句时,要求循环执行的次数预先可以确定。循环次数由初值、终值和步长值3个因素确定,计算公式为: 循环次数 = Int((终值–初值)/步长 + 1) 2.Do…Loop循环语句 格式1: Do While/Until <条件> 语句块 [Exit Do] 语句块 Loop 格式2: Do 语句块 [Exit Do] 语句块 Loop While/Until <条件> 说明: (1)在循环次数不能确定的情况下,就需要
3、用到Do…Loop循环语句。 (2)格式1是先判断循环条件是否成立,然后决定是否执行循环体;格式2是先执行循环体,再判断循环条件是否成立,也就是说,不管循环条件是否成立,格式2都至少执行一次循环体。 (3)在格式1和格式2中使用关键字While实现的循环称为“当型循环”,即当循环条件成立时,反复执行循环体,直到循环条件不成立时为止;使用关键字Until实现的循环称为“直到型循环”,即当循环条件不成立时,反复执行循环体,直到循环条件成立时为止。 3. While…Wend语句 While <条件> 语句块 Wend 说明:此语句是为了保持与低版本Visual Basic兼容
4、而保留的。在实际应用中,它与Do While…Loop结构非常相似。 三、实验举例 注:实验举例的内容不需要再上交作业。 实例1 求自然对数的底 e的近似值,要求其误差小于10-6,求e近似值的公式为: e = 分析:本实例涉及到程序设计中的两个重要的运算:累加和连乘。累加是在原有和的基础上逐次地加上一个数;连乘则是在原有积的基础上逐次地乘以一个数。 在本题中可以定义三个变量,s用来表示累加和,初值为0;i用来计数,表示第几项,初值为0(表示第1项,即加数“1”);t用来表示加数,初值为1,加数中用到连乘运算,容易找到后项与前项的关系为,编程时可先根据上一个加数计算出下一个
5、加数,然后进行累加,循环次数事先不能确定,可以采用Do…Loop循环语句来实现,将题目规定的误差范围作为循环条件。据此编写程序代码如下: Private Sub Form_Click() Dim s As Single, i As Integer, t As Double 图8.1 程序运行结果 s = 0: i = 0: t = 1 Do While t > 0.000001 s = s + t ' 累加和 i = i + 1 ' 为下一项作准备 t = t / i ' 计算出
6、下一项的值 Loop MsgBox "共计算了" & i & "项的和是" & s End Sub 程序运行时,单击窗体,运行结果如图8.1所示。 当然,本题也可以使用For循环语句来编程。但由于循环次数事先不能确定,因此需预设一个较大的循环次数(可以根据题目合理选择),然后在循环体内判断是否达到规定的误差,如果达到了可采用Exit For语句立即终止循环。据此编写程序如下: Private Sub Form_Click() Dim s As Single, i As Integer, t As Double s = 0: t = 1 For i = 1
7、 To 100 If t < 0.000001 Then Exit For ' 达到规定的误差就退出循环 End If s = s + t t = t / i Next MsgBox "共计算了" & i - 1 & "项的和是" & s End Sub 思考:比较用Do…Loop语句和For语句解决上面的问题在程序实现上有什么不同? 实例2 找出1000以下的能被13和7整除的最大的10个数并将它们输出。 分析:从1000开始,循环的找满足条件的整数,直到找到10个为止,因此应专门设一个变
8、量found来记录当前找到的数的个数,只要found的值小于10,说明还没有找够所有的数,循环就要继续进行。据此编写程序如下: Private Sub Form_Click() Dim a As Integer, found As Integer a = 1000: found = 0 While found <> 10 a = a - 1 If a Mod 13 = 0 And a Mod 7 = 0 Then found = found + 1 Print a End If Wend End Sub 实
9、例3 输入任意一个整数,将其反向输出。例如输入1234,则输出4321。 分析:实现任意一个整数的反向输出,首先应该将这个数的每个数字位给拆出,然后再把它们按照反序重新组合。假设整数a由文本框Text1获得,编写程序如下: Private Sub Form_Click() Dim a As Long, b As Integer, d As Long a = Val(Text1.Text) d = 0 Do While a <> 0 b = a Mod 10 ' 获得当前数的最低位 d = d * 10 + b ' 将得到的数
10、位组合到变量d中 a = a \ 10 Loop Print d End Sub 说明:在上面的程序中,循环的对任意一个数a进行了“Mod 10”和“整除10”的运算,目的是依次地得到整数的各个数位,得到一个数位后使用累加将其组合到新的变量中。 四、实验内容 1.从键盘输入10个数值,统计其中正数、负数和零的个数。 要求:窗体文件保存为Vbsy81.frm,工程文件保存为Vbsy81.vbp。 2.编写程序,找出1~100之间的全部同构数。所谓同构数是指一个自然数平方的最后几位正好是该自然数本身,例如52=25,252=625等。 提示:本题可利用字符串函数
11、Right和Len。根据自然数的长度取出其平方数的最后若干位进行比较。 要求:窗体文件保存为Vbsy82.frm,工程文件保存为Vbsy82.vbp。 3.利用公式求圆周率π,直到最后一项的绝对值小于10-4为止。 要求:窗体文件保存为Vbsy83.frm,工程文件保存为Vbsy83.vbp。 4.编写一个测试打字准确率的程序。首先由程序随机产生一段30个大写字母的范文,然后用户对照产生的范文进行输入,完成后显示输入准确率。在窗体上画3个名称分别为Label1~Label3的标签,再画3个名称分别为Text1~Text3的文本框和2个名称分别为Command1、Command2的命令按
12、钮。程序运行界面如图8.2所示。 图8.2 打字练习程序运行界面 程序运行后,单击“产生范文”(Command1)命令按钮,则在文本框Text1中生成30个大写字母的范文;在文本框Text2中输完30个字符后,单击“测试结果”(Command2)命令按钮,则在文本框Text3中显示出打字的准确率。据此填空,将下面的程序补充完整。 Private Sub Command1_Click() ' 产生30个字母的范文 Dim i As Integer, str As String * 1 Randomize Text1.Text = ""
13、 Text2.Text = "" Text2.SetFocus Text3.Text = "" For i = 1 To 30 str = ' 随机产生一个大写字母 Text1.Text = Text1.Text + str ' 将产生的字母连入范文框 Next i End Sub Private Sub Text2_Change() If Then ' 键入满30个字符 Command2
14、Enabled = True ' “测试结果”命令按钮激活 Else Command2.Enabled = False End If Text3.Text = "" ' Text2文本框内容改变时,应重新计算准确率 End Sub Private Sub Command2_Click() ' 完成打字准确率的计算 Dim y As Integer, i As Integer, r As Single y = 0 For i = 1 To 30
15、 ' 将两个文本框中的字符逐个比较 If Then End If Next i r = y / 30 * 100 Text3.Text = 0.1 * Int(10 * (r + 0.05)) & "%" ' 显示正确率,保留一位小数 End Sub 要求:窗体文件保存为Vbsy84.frm,工程文件保存为Vbsy84.vbp。 提示:(1)为保证程序正确运行,在属性窗口中应将文本框Text1和Text3的Locked属性设置为“True”,将文本框Text2的MaxLength属性设置为“30”,将命令按钮Command2的Enabled属性设置为“False”。(2)大写字母的ASCII值在整数65~90之间,知道了大写字母的ASCII值,可以利用Chr函数将其转换成对应的字符。






