配色: 字号:
《Visual Basic程序设计教程(第3版)》第5章 循环结构程序设计
2023-05-25 | 阅:  转:  |  分享 
  
采用循环程序可以解决一些按一定规则重复执行的问题。例如,统计一个班几十名学生,甚至全校几千名学生的学期成绩,如求平
均分、不及格人数等 本章主要内容 第5章 循环结构程序设计Do循环语句 F
or循环语句退出循环出口语句(Exit)循环语句多重循环列表框与组合框常用算法程序举例 循环是指在指定的条件下多次重复执
行一组语句 被重复执行的一组语句称为循环体 VB提供的循环语句有 For循环(For.
..Next) Do循环(Do...Loop) While循环(While...Wend)
For Each...Next 最常用的是 For循环语句和Do循环语句 5.1.1 For循环语句
按指定次数执行循环体。 格式: For 循环变量=初值 To 终值 [Step 步长值]
循环体 Next 循环变量 功能:本语句指定循环变量取一系列数值,并且对循环变量的每一个
值把循环体执行一次。 初值、终值和步长值都是数值表达式,步长值可以是正数(称为递增循环),也可以是负数(称
为递减循环)。 若步长值为1,则 Step 1 可以省略。5.1 循环语句 Private Sub Form_lo
ad() Dim k As Integer Show For k = 2 To 10 Step 2
Print k k Next k End Sub 程序运行结果:例5.1 在窗体上
显示2至10各偶数的平方数。例5.14163664100 循环变量 k 的初值、终值和步长值分别为2,10和2,即从 2 开始,
每次加 2,到 10 为止。 控制循环5次。 每次循环都将循环体(Print kk)执行一次。循环次数: 第1次 第2次
第3次 第4次 第5次 k 的 值: 2 4 6 8 10 显 示 :
4 16 36 64 100 例5.2 求S = 1 + 2 + 3 + … 8,把结果显示
在窗体上。 s = 0 ''累加器初值为0 For k = 1 To
8 s = s + k ''累加器,在原有和的基础上每次加一个数 Next
Print "s= "; s 程序执行结果是:s=36 分析 例5.2 采用Print直接在窗体上输出结果,程
序代码: Private Sub Form_Load() Show t = 1
For c = 1 To 8 t = t c Next c
Print "T="; t End Sub 程序运行结果是: T=40320
语句 t=tc 称为乘法器。先将t置1(不能置0)。 在循环程序中,常用累加和累乘来完成各种计算任务例5.3 求T = 8
! = 1×2×3×…×8例5.3 分析例5.3程序 求解 T = 8! = 1×2×3×… 8
t = 1 ''累乘器初值为1 For c = 1 To 8
t = t c ''累乘器,在原有积的基础上每次乘一个数 Next Print "T
="; t 程序执行结果是:T=40320 分析 Private Sub Form_Load() Show Di
m pi As Single, c As Integer, s As Integer pi = 0 s = 1
''s表示加或减运算 For c = 1 To 9999 Step 2
pi = pi + s / c s = -s ''交替改变加、减号
Next c Print "π="; pi 4 End Sub 程序运行结果是: π=3.141397例
5.4 用π/4=1 - 1/3 + 1/5 - 1/7 + ……级数求π的近似值
(取前5000项来进行计算)例5.4 For...Next循环主要是用在知道循环次数的情况下,若事先不知道循环次
数,可以使用当型循环Do...Loop。 Do...Loop两种格式:前测型循环结构和后测型循环结构。 前测型Do
while...Loop循环格式: Do While 条件 循环体 L
oop 功能:当条件成立(为真)时,执行循环体;当条件不成立(为假时),终止循环。5.1.2 Do循环语句
Private Sub Form_Load() Dim n As Integer, s As Long
Show n = 1: s = 0 Do While n <= 100 s
= s + n n n = n + 1 Loop Print "s=";
s End Sub 程序运行结果: S=338350例5.5 利用Do While...Loop语句求
S=12 + 22 + … + 1002例5.5 用上述公式求π/4的近似值,即逐项进行累加,直到某项 1
/ n (1 / 2 ^ n + 1 / 3 ^ n)<10为止(该项不累加)。程序代码: Dim pi As S
ingle, n As Long Dim t As Single, s As Integer Show
pi = 0: s = 1 ''s表示符号 n = 1
‘n表示变动值,第1项时n=1,第2项时n=3,… t = (1 / 2 + 1 / 3) ''t
表示累加项。先取第1项的值 Do While t >= 10^(-5) ''逐项累加的条件,累加到t<10^(-5)为
止 pi = pi + s t ''把当前项进行累加 s = -s
''交替改变正、负号 n = n + 2
''变动值n加2 t = 1 / n (1 / 2 ^ n + 1 / 3 ^ n) ''求当前项
的绝对值 Loop Print "π="; pi 4 程序运行结果:
π=3.141562例5.6 用 级数,求π的近似值。当最
后一项的绝对值小于10-5时,停止计算例5.6算法:通常采用重复运算来解决问题 累加、累乘等 如用级数 π/4=
1 - 1/3 + 1/5 - 1/7 + ……来求π设置循环变量 使每次运算变量值有所不同控制循环 计数控制或条件控
制 循环结构程序的实现求 S = 1 + 2 + 3 + … + 8 s = 0 For k = 1 To 8
s = s + k Next k Print "s="; s 把长式子改为8次加
For...Next循环主要是用在知道循环次数的情况下;若事先不知道循环次数,可以使用当型循环Do...Loop 1
. For...Next循环语句 (计数控制) For 循环变量=初值 To 终值 [Step 步长值]
循环体 Next 循环变量 2. Do While...Loop语句 (条件控制) Do [
{While|Until} 条件] 循环体 Loop比较两种循环语句(计数控制或条件控制)
以求解 S = 1 + 2 + 3 + … + 8 为例 s = 0 For k = 1 To 8
s = s + k Next k Print "s="; s 程序运行结果如下:
s=36 n = 1: s = 0 Do While n <= 8 s =
s + n n = n + 1 Loop Print "s="; sK为循环变量专
设变量n来控制循环 For t = 1 To 3 If t <= 1 Then a = 3
If t <= 2 Then a = 2 If t <= 3 Then
a = 1 Print a; Next t Print t A. 3
3 3 3 B. 1 2 3 4 C. 3 2 1 4
D. 1 1 1 4 下列程序的运行结果是?思考题D
For t = 1 To 3 If t >= 1 Then a
= 3 If t >= 2 Then a = 2
If t >= 3 Then a = 1 Print a;
Next t Print t A. 3 3 3 4
B. 1 2 3 4 C. 3 2 1 4 D.
1 1 1 4 下列程序的运行结果是?思考题C 运行下面程序后,循环体执行了______
次。 i = 0: n = 1 Do While i < 32
i = (i + 1) (i + 1) n = n
+ 1 Loop Print n A. 2
B. 3 C. 4 D. 5 请回答
问题思考题C s = "ABCDEFGHIJ": c = "" For k = 2 To Len(s)
Step 3 a = Mid(s, k) c = c + Left(a, 1)
Next k Print c A. BDF B. CFI
C. BEH D.BEI 下列程序的运行结果是?思考题C “
辗转相除法”算法:求出m/n余数p,若p=0,n即为最大公约数;若p非0,则把原来的分母n作为新的分子m,把余数p作为新的分母n继
续求解 设计步骤如下: (1)创建应用程序的用户界面和设置对象属性例5.7 输入两个正整数,求它们的最
大公约数例5.7 编写的“计算”按钮Click事件过程代码如下: Private Sub Command1_C
lick() Dim m As Integer, n As Integer, p As Integer
m = Val(Text1.Text) : n = Val(Text2.Text)
If m <= 0 Or n <= 0 Then MsgBox ("数据
错误!") Exit Sub End If
Do p = m Mod n m = n
n = p Loop While p <> 0
Text3.Text = m End Sub 若输入的m和n的值为85和68,则运行结果如上图 语句格式:
While 条件 循环体 Wend 功能:当条件成立(为真)时,执行循环体;当条件不成
立(为假)时,终止循环。 本语句与上述Do While...Loop循环语句相似,其差别是:While...Wend语句中不能
使用Exit语句跳出循环。5.1.3 While...Wend循环语句  用于提前退出循环。 格式: Exit
{For|Do} 功能:直接从For循环或Do循环中退出。 当程序运行时遇到Exit语句时,就不再执行循环体中
的任何语句而直接退出,转到循环语句(Next、Loop)的下面继续执行。 5.1.4 循环出口语句 把每次输
入的数累加。当输入-1时结束程序的运行。 Private Sub Form_Load() Show S
um = 0 Do While True ''条件为真,循环无终止进行下去
x = Val(InputBox("请输入要加入的数(-1表示结束)", "输入数据"))
If x = -1 Then Exit Do End If
Sum = Sum + x Text1.Text = Sum Loop Msg
Box ("累加运算结束")End Sub 以-1作为“终止循环标志”例5.8 设计一个“加法器”程序例5.8 多重
循环是指循环体内含有循环语句的循环 例5.9 多重循环程序示例 程序运行结果
Private Sub Form_Load()  1
5 Show
1 6 For i = 1 To 3
‘外循环 1 7 For j =
5 To 7 ’内循环 2 5
Print i, j
2 6 Next j
2 7
Next i
3 5 End Sub
3 6 

3 7 注意内、外循环层次要分清,不能交叉 5.2 多 重 循 环例5.9
本例可采用两重循环来实现。外循环控制输出7行,内循环控制每行输出要求的字符数。 在进入内循环之
前,使用Print Tab()来对起始输出位置定位,退出内循环后,使用Print来控制换行。例5.10 编一程序,输出下列所示的图
形例5.10 采用Print直接在窗体上输出结果,程序代码如下: Private Sub Form_Load()
Show For i = 1 To 7 Pr
int Tab(10 - i); For j = 1 To 2 i - 1
Print Chr(i + 48); Next j
Print Next i End Sub
Print Chr(i+48)与Print i有所不同 (1)分析:设一元硬币为a枚,二元硬币为b枚,五
元硬币为c枚,可列出方程 a+b+c=10 a+2b+5c=25 采用两重循环
,外循环变量a从0~10,内循环变量b从0~10 (2)创建应用程序的用户界面例5.11 取一元、二元、五元的硬币共十枚
,付 给25元钱,有多少种不同的取法?例5.11 (3)编写程序代码
程序通过Print方法把处理结果输出在标签的下方。 Private Sub Form_Load()
Show CurrentX = 0 : CurrentY =
1500 ''确定开始显示的坐标 Print , "五元", "二元", "一元"
n = 0
''记录解的组数 For a = 0 To 10
For b = 0 To 10 c =
10 - b - a If a + 2 b + 5 c
= 25 And c >= 0 Then n =
n + 1 Print "("; n; ")",
c, b, a End If Ne
xt b, a End Sub 执行下列程序段后,变量t 的值是______。 t = 0
For x = 2 To 3 n = 1 Do While n<=x
t = t + n n = n + 1 Loop
Next x A. 8 B. 9 C.10 D. 11
请回答问题思考题B 请回答问题思考题显示结果
为: 16执行下列程序段后,显示的结果是______ s = 0 For m = 1 To 4
Step 2 n = 1 Do While n<=m s
= s + n n = n + 1 Loop Next m
Print s + m + n例5.12a 5.3 列表框与组合框 列表框和组合框都能为用户提供若干个选项,供用户
从中任意选择 5.3.1 列表框(ListBox) List属性:字 符型数组, 存放列表框的表项 数组的下标从0开始
。 例如,List1.List(0)的值为“教授”,List1.List(1)的值为“副教授” 。 Lis
tCount属性:表项数目 Text属性:当前选定表项的文本内容 ListIndex属性:返回已选定表项的顺序
号(索引)。若未选定任何项,则ListIndex的值为-1 Selected属性:逻辑型数组,表示列表框中某一表项是否被
选中例5.12b 假设列表框List1中有四个表项,并已选定第2项,则 有: List1.ListIndex 为1
List1.Text的值为”副教授” List1.Selected(1)为True 方法
(1) AddItem方法:用于把一个列表项加入列表框 格式: [对象.]AddItem 列表项[,索引]
举例:List1.AddItem "海南省" ,28 (2) Clear方法:用于清除列表框中的所有项目
(3) RemoveItem方法:用于删除指定的列表项 采用以下方法,可为列表框List1赋值: (1)在
属性窗口中设置 (2)利用AddItem赋值 (3) 利用List属性赋值 Li
st1.AddItem “教授” List1.List(0
)= “教授” List1.AddItem “副教授” L
ist1.List(1)= “副教授” List1.AddItem “讲师”
List1.List(2)= “讲师” List1.AddItem “助教”
List1.List(3)= “助教” 列表框表项的输出
(1) 用鼠标单击列表框内某一表项,则该表项值存放在Text属性中。 例如:x =
List1.Text ′把表项值存放在x变量中 (2) 指定索引号来取表项的内
容,例如: List1.ListIndex = 3 x = List1.T
ext (3) 直接从数组List()中读取,例如: x = List1.List(
5) (1)分析:判别条件为 (n Mod 14=0) And (n Mod 10=8) (2)创建应用程序的用户界
面和设置对象属性 例5.12 设计一程序,找出三位数中能被14整除且个位数为8的自然数,把这些自然数显示在列表框中,其个数显示在
标签中。例5.12 (3)编写程序代码 编写的“显示”按钮Click事件过程代码: Private Sub Comman
d1_Click() ′“显示” List1.Clear For n = 100 To 800
If (n Mod 14 = 0) And (n Mod 10 = 8) Then Lis
t1.AddItem n End If Next n Label1.Caption = "符
合条件的自然数的个数为:" _ & List1.ListCount End Sub (1)
创建应用程序的用户界面和设置对象属性 用户先在左列表框(List1)选择一个或多个选修课,当单击“显示”按
钮时,在右列表框(List2)中将显示出用户选中的所有课程。单击“清除”按钮时,将清除右列表框中的内容 (2)编写程序代码
例5.13 设计一个选课程序MultiSelect属性值为2例5.13Private Sub Form_Load()
List1.AddItem "电子商务" List1.AddItem "网页制作" List1.
AddItem "Internet简明教程" List1.AddItem "计算机网络基础" List
1.AddItem "多媒体技术“ End SubPrivate Sub Command1_Click()
''"显示"按钮单击事件 List2.Clear
''清除列表框的内容 For i = 0 To Li
st1.ListCount - 1 ''逐项判断 If List1.
Selected(i) Then ''真时为选定
List2.AddItem List1.List(i) End If Next iE
nd SubPrivate Sub Command2_Click() ''"清除"按
钮单击事件 List2.ClearEnd Sub 允许从已有的选项中进行选择,还允许输入列表中不包括的内容
列表框和文本框的组合 具有列表框和文本框的大部分属性和方法。独有的一些属性: (
1)Style属性:该属性取值为0,1或2,分别决定了组合框的三种不同类型 下拉组合框(Dropdown Co
mbo):允许选择或输入新数据 简单组合框(Simple Combo): 允许选择或输入新数据
下拉列表框(Dropdown List): 只允许选择,不能输入新数据5.3.2 组合框
(2)Text属性:该属性是用户所选定项目的文本或直接从文本框输入的文本 (1)创建应用程序的用户界面
和设置对象属性 窗体上含有Combo1,Combo2,Combo3三个组合框,其Style属性从
左至右分别为0、1和2,即除了“内存”容量大小只能从列表中选择外,其余内容既可以从列表中选择,也可以由用户输入。 在
属性窗口中输入相关数据 例5.14 在窗体上设置3个组合框,用于选择微机部分配置,
包括CPU/主频、硬盘及内存。 设计界面运行界面例5.14(2)编写程序代码 Private Sub Form_Load(
) Combo1.Text = Combo1.List(0) Combo2.Text = Combo2
.List(0) Combo3.Text = Combo3.List(0) End Sub Private
Sub Command1_Click() ''“确定”按钮的事件过程 Picture1.Cls
Picture1.Print "微机的基本配置" Picture1.Print String(20, "="
) Picture1.Print "CPU:"; Combo1.Text Picture1.Print
"硬盘(GB):"; Combo2.Text Picture1.Print "内存(MB):"; Combo3.T
ext End Sub5.4 常用算法 算法是对某个问题求解过程的描述。 常用的算法有:穷举法、递推法、排序
法、查找法、递归法等。 1. 累加、连乘和计数 累加(如s=s+k)是在原有和的基础上一次一次地每次加一个数
,连乘(如t=tc)则是在原有积的基础上一次一次地每次乘一个数。计数通常每次增加的值不是一个加数(如n=n+1),而是1。2.穷
举法 “穷举法”也称为“枚举法”,它是计算机解题常用的一种方法。其做法是:从所有可能解中,逐个进行试验,若满足条件,就得到一
个解,否则不是。直到条件满足或判别出无解为止。 例5.15 用100元买100只鸡,母鸡3元1只,小鸡1元3只,问各
应买多少只? 下面采用穷举法来解此题。对于此题,令母鸡为x只,小鸡为y只,根据题意可知y=100-x,开始先让x初值
为1,以后逐次加1,求x为何值时,条件3x+y/3=100成立。如果当x达到30时还不能使条件成立,则可以断定此题无解。因为买的母
鸡数不可能超过30,超过30就不能买到100只鸡。100元买100只鸡Private Sub Form_Load() Dim
x As Integer, y As Integer Show For x = 1 To 30 y = 10
0 - x If 3 x + y / 3 = 100 Then Print “母鸡只数为:”
; x, Print “小鸡只数为:”; y End If Next xEnd Sub例5.
153. 递推法 “递推法”也称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都从旧值的
基础上递推出新值,并由新值代替旧值。 通过InputBox函数输入a值,并以a作为x的初值。要求前后两次求出的x的差
的绝对值小于10-5。 分析:这是一个“递推”问题,先从a推出第一个x值 [即(a+a/a)/2→x],再以该x值(旧值)
推出x的新值 [即(x+a/x)/2→x],依次向前推,每次以x旧值推出x的新值 [即(x+a/x)/2→x]。当x旧值与新值之差
的绝对值小于10-5时,此时的x新值为所求。例5.16Private Sub Form_Load() Dim a As Si
ngle, xn0 As Single, xn1 As Single Show
''用xn0表示旧值,xn1表示新值 a = Val(InputBox("请输入一个正数")) xn1 = a
''以a作为x的初值 Do xn0 = xn1
''确定旧值 xn1 = (xn0 + a / xn0) / 2 ''计算新值 Loop
While Abs(xn0 - xn1) >= 0.00001 ''判断 Print a; "的平方根为"; x
n1End Sub 如果输入的a值为3,程序运行结果是: 3的平方根为 1.732051例5.165.5 程序
举例 例5.17 从键盘输入一个正整数,然后把该数的每位数字按逆序输出。例如:输入3485,则输出5843;输入10
0000,则输出000001。 以下采用两种不同解法。 (1)数值处理方法 ①通过表达式
x Mod 10取出该整数x的个位数并输出,如对于x=3485,则取出5;② 利用赋值语句x = x \ 10截去x的个位数, 如
对于x=3485,处理后x=348;③重复执行①和②,直到x<10和最后输出一次x。 Dim x As Long
x = Val(InputBox("请输入一个正整数")) Do While x >= 10
Print x Mod 10; x = x \ 10 Loop例5.17A(2)字符串处理方法
把该整数作为一个数字字符串,从字符串后部往前逐个取出字符,即可实现按逆序输出。 Dim x As String
x = InputBox("请输入一个正整数") ''把该数以字符串方式赋给变
量x For k = Len(x) To 1 Step -1 Print Mid(x, k, 1);
''从后部往前逐个取出字符并显示 Next k例5.17B例5.18 求解s
= 1! + 2! + 3! + … + 10!的值 采用两种不同解法 (1)解法一:采用两重循环,外循环10
次,每次循环计算一次阶乘,把每次阶乘值累加起来,即得求解结果。 Dim s As Long, t As Long
s = 0 For j = 1 To 10 ''计算10个阶乘
t = 1 ''计算1个阶乘前,先赋初值
For k = 1 To j ''计算j!,需要循环j次
t = t k ''连乘j次 Next k
s = s + t ''把每次计算得到的阶乘值t累加 Next
j Print s例5.18A(2)解法二 这10个阶乘有一个特点,后一个阶乘为上一个阶乘再乘以一个
数,如2!=1!2,3!=2!3,4!=3!4,…,k!=(k-1)!k 。根据这一特点,程序只须采用单重循环就可以求解。
把该整数作为一个数字字符串,从字符串后部往前逐个取出字符,即可实现按逆序输出。 Dim s As Long, t A
s Long s = 0 t = 1 For k = 1 To 10
''循环10次,每次求1个阶乘 t = t k
''求k!,其值等于(k-1)!k,即tk s = s + t
''每次加入一个阶乘值t Next k Print s例5.18B
(1)创建应用程序的用户界面 (2)设置对象属性 组合框的Style属性为0,TabIndex(键序)为0
两个标签;四个命令按钮; 一个文本框Text1,用来显示当前的选修课总课程数例5.19 编制程序,把一批课程名放入组合框
中,再对组合框进行项目显示、添加、删除、全部删除等操作例5.19 (3)编写程序代码 Private Sub
Form_Load() Combo1.AddItem "电子商务"
Combo1.AddItem "网页制作" Combo1.AddItem "Internet简明教程" Combo1.AddItem "计算机网络基础" Combo1.AddItem "多媒体技术" Combo1.Text = "" ''置空值 Text1.Text = Combo1.ListCount ''表项个数 End Sub Private Sub Command1_Click() ''”添加” If Len(Combo1.Text) > 0 Then Combo1.AddItem Combo1.Text Text1.Text = Combo1.ListCount End If Combo1.Text = "" Combo1.SetFocus End Sub Private Sub Command2_Click() ‘“删除” Dim ind As Integer ind = Combo1.ListIndex If ind <> -1 Then ''-1表示无表项 Combo1.RemoveItem ind ''删除已选定的表项 Text1.Text = Combo1.ListCount End If End Sub Private Sub Command3_Click() ‘“全清” Combo1.Clear Text1.Text = Combo1.ListCount End Sub Private Sub Command4_Click() End End Sub
献花(0)
+1
(本文系大高老师原创)