《循环结构实验》PPT课件.ppt_第1页
《循环结构实验》PPT课件.ppt_第2页
《循环结构实验》PPT课件.ppt_第3页
《循环结构实验》PPT课件.ppt_第4页
《循环结构实验》PPT课件.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Visual Basic 程序设计教程,第三章,基本控制结构,顺序结构程序虽然比较容易理解,但是不可能处理复杂的问题。 计算机要处理的问题往往是复杂多变的,仅采用顺序结构是不够的。必须利用选择结构等来解决实际应用中的各种问题。VB中主要通过If条件语句和Select情况语句来实现。它们都是对条件进行判断,根据判断结果,选择执行不同的分支。 计算机最擅长的功能之一就是按规定的条件,重复执行某些操作。在实际应用中,经常遇到一些操作并不复杂,但需要反复多次处理的问题,比如要计算1+2+3+10000,直接把这个求和的表达式用手工输入显然是不现实的。这类问题都可通过循环结构来方便地实现。,VB中提供了主要两类循环语句: ForNext循环语句(一般已知循环次数); DoLoop条件型循环语句(一般未知循环次数)。 有时,在程序中必须强迫改变程序的流程已脱离循环, VB也提供了几个可以影响执行程序流程的语句: Exit For Exit Do Goto,3.4 循环结构程序设计,程序代码如下: Private Sub Command1_Click() Dim S% ,i% S=0 累加前变量S为0(清零) For i=1 to 100 S=S+i Next i Print “ S= “ ;S Print “循环控制变量 i=“; i End Sub,3.4.2 For Next循环语句,例题3.13:计算1+2+3+4+100之和。 程序分析:1到100的累加,可以看做从0开始,每次加一个数,重复加100次,i=1 S=1 i=2 S=3 i=3 S=6 i=4 S=10 i=100 S=5050 i=101 S=5050,求1-100之间奇数数之和,偶数之和;计算1*2*3*4*100,例题3.14:输出1-100中的能被3和5同时整除的整数的个数。 程序分析:可以利用循环语句依次枚举1-100中的每个数,再对每个数进行判断,设置计数器,满足条件则把计数器加1。,3.4.2 For Next循环语句,程序代码如下: Private Sub Form_Click() n = 0 累加前变量n为0(清零) Dim i As integer For i = 1 To 100 If (i Mod 3 = 0) And (i Mod 5 = 0) Then Print i; “能够被“; 3; “和“; 5; “整除“ n = n + 1 End If Next i Print “n=“; n End Sub,一般情况下, For Next 需要正常结束,即循环变量到达终值。但在某些情况下,可能在循环变量到达终值前需要退出循环,这可以通过Exit For 语句来实现。,Exit For,3.4.2 For Next循环语句,例如: Private Sub Form_Click() Dim i! ,j% For i=1 to 100 Step 0.1 j = j +1 If i*j5000 Then Exit For Next i Print “ j= “ ;j Print “循环控制变量 i=“; i End Sub,如果没有Exit For 语句,循环体应该被执行991次Int(100-1)/0.1+1),但在第220次循环时,i*j的值为232205000,满足条件而退出当前循环,所以循环体实际被执行了220次。,DoLoop循环语句 -比较,Do循环用于控制循环次数未知的循环结构。 格式1: Do While|Until 语句块 Exit Do 语句块 Loop 格式1为先判断后执行,有可能一次也不执行; 格式2为先执行后判断,至少执行一次。,格式2: Do 语句块 Exit Do 语句块 Loop While|Until ,例:求1+2+100的值,Private Sub Form_click() FontSize = 30 Sum = 0 n = 1 Do Sum = Sum + n n = n + 1 Loop Until n 100 Print Sum End Sub,Private Sub Form_click() FontSize = 30 Sum = 0 n = 1 Do Until n 100 Sum = Sum + n n = n + 1 Loop Print Sum End Sub,例:输出如下图形,1 2 2 2 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 思考:若将其中的数字改为*,应如何修改代码?,代码为: Private Sub Form_click() FontSize = 18 Dim a%, b% For a = 1 To 5 Print Tab(40 - 3 * a); For b = 1 To 2 * a - 1 Print a; Next Print Next End Sub,Private Sub Form_click() FontSize = 18 Dim a%, b% For a = 1 To 5 Print Tab(27 - a); s = “*“ For b = 1 To 2 * a - 1 Print “*“; Next Print Next End Sub,Private Sub Form_click() FontSize = 18 Dim a%, b% For a = 1 To 5 Print Tab(40 - 3 * a); For b = 1 To 2 * a - 1 Print a; Next Print Next End Sub,例:输出如下图形,1 2 2 2 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 7 7 7 7 7 8 8 8 9 思考:若将其中的数字改为*,应如何修改代码?,代码为: Private Sub Form_click() FontSize = 18 Dim a%, b% For a = 1 To 9 Print Tab(30 + 3 * Abs(5 - a); For b = 1 To 9 - 2 * Abs(5 - a) Print a; Next Print Next End Sub,Private Sub Form_Click() FontSize = 18 Dim a%, b% For a = 1 To 9 Print Tab(30 + Abs(4 - a); For b = 1 To 7 - 2 * Abs(4 - a) Print “*“; Next Print Next End Sub,代码为: Private Sub Form_click() FontSize = 18 Dim a%, b% For a = 1 To 9 Print Tab(30 + 3 * Abs(5 - a); For b = 1 To 9 - 2 * Abs(5 - a) Print a; Next Print Next End Sub,例题3.17:随机产生n个1100(包括1和100)的整数,求它们的最大值、最小值和平均值。 程序分析:设变量Max,用来存储最大值,先假设第一个数是最大的,把它赋给Max,以后输入的每一个数都与Max比较,把大的数存在Max中,最终Max中就存储了所有数的最大值,同样的方法可以求得最小值。平求均值只需要用累加和除以n 程序代码如下:,3.4.4应用举例,其他辅助控制语句,Go To 语句 无条件地转移到标号或行号指定的那行语句。 Go To 标号|行号 注意:标号是字符序列,首字符必须为字母,标号后应有冒号;行号是一个数字序列; 例 判断输入的数是否为素数 素数就是除1和本身以外,不能被其他任何整数整除的数。根据此定义,判别某数m是否为素数最简单的方法就是依次用i=2m-1去除,只要有一个数能整除m,m就不是素数;否则m是素数。,要求一定范围内的素数,只要将m作为外循环体变量。,Private Sub Form_Click() Dim n%, i%, min%, max%, s%, aver! n = Val(inputBox(“输入随机产生数据个数:“) s = int(Rnd * 100 + 1) 随机产生第一个数 max = s min = s aver = s Print “第1个数是:“ aver End Sub,3.4.4应用举例,例题3.18:求s=a+aa+aaa+aaaa+aa.a的值,其中a(1-9)中的一个数字。例如2+22+222+2222+22222 程序分析:我们可以用循环累加的方法来完成求和的计算,设s为累加和,t为每次要加的数(aaaaa)。则本题的关键在于如何计算每次要加的t,由于a、aa、aaa、 是一组有规律变化的数字,分析可知aaa=aa*10*a、 aaaa=aaa*10+a ,所以当前要加的t,可以由上一次加的t计算得出。,3.4.4应用举例,程序代码如下: Private Sub Form_Click() Dim n%, i% Dim s As Long, t As Long, a As Long s = 0 t = 0 a = inputBox(“请输入数据1-9 “) n = inputBox(“请输入n“) For i = 1 To n t = t + a s = s + t t = t * 10 Next i Print “a+aa+.aaaaaa=“; s End Sub,3.4.4应用举例,例题3.19:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,153=13+53+33。编程找出所有的水仙花数, 程序分析:可以用循环的方法依次判断所有的三位数。在每次循环中,取出一个三位数的个、十、百位按照水仙花数的定义公式进行判断。这种判断所有可能性的方法叫做穷举法。,3.4.4应用举例,程序代码如下: Private Sub Form_Click() Dim x%, y%, z%, n% For n = 100 To 999 测试所有可能的3位数 x = int(n / 100) 计算百位数 y = int(n - x * 100) / 10) 计算十位数 z = n - int(n / 10) * 10 计算个位数 If n = x 3 + y 3 + z 3 Then 判断是否满足水仙花数条件 Print Str(x) + “3“ + “+“; Str(y) + “3“ _ + “+“ + Str(z) + “3“ + “=“ + Str(n) + _ “是水仙花数“ 打印水仙花数 End If Next n End Sub,3.4.4应用举例,例题3.20 :求具有abcd=(ab+cd)2性质的四位数。例如:3025将它平分为二段,即30和25,使之相加后求平方,即(30+25)2,恰好等于3025 程序分析:与上例相同,可以采用穷举法,对所有四位数进行判断,从而筛选出符合这种性质的四位数。 程序代码如下: Private Sub Form_Activate() Dim n%, ab “)的平方“ End If Next n End Sub,3.4.4应用举例,例题3.21:在一个文本框中输入一个字符串,判断输入信息是否完全是数字形式。 程序分析:可以用循环语句从字符串中依次取出每个字符,对该字符进行判断,如果不是数字形式,则退出循环。最后通过循环是否正常结束来判断输入信息是否完全是数字形式。 程序代码如下: Private Sub Command1_Click() Dim p As String, q As String * 1 Dim i As integer p = Trim(Text1.Text) 获取输入字符串,3.4.4应用举例,For i = 1 To Len(p) 从输入字符串中自后向前依次取出每个字符 q = Mid(p, i, 1) If q = “9“ Then Exit For End If Next i If i Len(p) Then Text2.Text = “输入数据完全是数字“ Else Text2.Text = “输入数据不完全是数字“ End If End Sub,3.4.4应用举例,例题3.22:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 程序分析:逐一读取每一个字符,并对其类型进行判断。设置4个计数器分别记录字母、空格、数字的个数。 程序代码如下: Private Sub Form_Click() Dim c As String * 1, t As String Dim letters%, space%, digit%, others%, i% letters = 0 设置计数器初值为0 space = 0 digit = 0 others = 0,3.4.4应用举例,t = inputBox(“请输入字符串“) For i = 1 To Len(t) c = Mid(t, i, 1) If LCase(c) = “a“ And LCase(c) = “0“ And c = “9“ Then 判断是否是数字 digit = digit + 1 Else others = others + 1 其他字符 End If Next i Print “共有字符“; letters; “个“; “空格“; space; “个“; “数字“; _ digit; “个“; “其他符号“; others; “个“ End Sub,3.4.4应用举例,例题3.23:在窗体上输出9*9乘法表。 程序分析:可以用双重循环打印9*9表,外循环用来控制行变化,内循环用于控制列变化。 程序代码如下: Private Sub Form_Click() Dim i As integer, j As integer Print Tab(35); “9*9 乘法表“ For i = 1 To 9 For j = 1 To i Print Str(i) Next j Print Next i End Sub,3.4.4应用举例,例题3.24:输出三角形图案,要求第一层由字母A组成,第二层由字母B组成,依次类推。 程序分析:双重循环在程序中广泛使用,与例题3.23相同,打印图形一般用双重循环语句结构实现。 程序代码如下: Private Sub Form_click() Dim s As String * 1 Dim n As integer Do While True n = inputBox(“请输入打印要打印图形的行数1-26“) If n 1 And n 26 Then Exit Do End If Loop,3.4.4应用举例,For i = 1 To n 每一层图案上要显示的数字 Print Tab(25 - i); s = Chr(Asc(“A“) + i - 1) For j = 1 To 2 * i - 1 数组中元素存放对应的数字 Print s; Next j Print Next i End Sub,3.4.4应用举例,例题3.25:兔子繁殖问题:第1个月买来1对小兔子,两个月后,这对兔子就会生1对小兔子,以后每个月都会生1对小兔子;而生下来的这对小兔子,两个月后又会开始生1对小兔子。依次类推,试计算前30个月每月的兔子对数? 程序分析:仔细分析可以得出如下表: 月份 1 2 3 4 5 6 7 8 兔子对数 1 1 2 3 5 8 13 21 这是一组有规律变化的数字,假设第i月的兔子数对数为fi,第i-1月的兔子对数为f2,第i-2月兔子对数为f1,则fi=f1+f2。利用求得的数不断更新f1和f2的值就可以求出新的fi。这种不断用变量的旧值递推出新值的解决问题的方法叫做递推法。,3.4.4应用举例,程序代码如下: Private Sub Form_Click() Dim i As integer Dim f1 As Long, f2 As Long, fi As Long f1 = 1 f2 = 1 Print f1, Print f2, For i = 3 To 30 fi = f1 + f2 第i-1个数和第i-2个数相加得到第i个数 Print fi, 打印第i个数 f1 = f2 f2 = fi If i Mod 5 = 0 Then Print 每打印5个数字换行 Next i End Sub,3.4.4应用举例,例题3.26:猴子吃桃子。小猴在一天摘了若干个桃子,当天吃掉一半多一个;第二天接着吃了剩下的桃子的一半多一个;以后每天都吃尚存的桃子的一半多一个,到第7天早上要吃时只剩下一个了,问小猴第一天共摘下来多少个桃子。 程序分析:假设猴子第i天要吃时还有x个桃子,则第i-1天应该有(x+1)*2个桃子,可以利用递推法算出第一天猴子摘了多少桃子,3.4.4应用举例,程序代码如下: Private Sub Form_Click() Dim n%,i%,x% x=1 第7天还剩一个桃子 Print “第7天的桃子数为:1只“ For i=6 To 1 Step -1 求第6到第1天的桃子数 x=(x+1)*2 求第i天的桃子数 print “第“; i ;“天的桃子数为:“;x;“只“ Next i End Sub,3.4.4应用举例,例题3.27:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? 程序分析:假设球的某一次反弹高度为h ,则下一次反弹高度为h/2。把每次反弹与落下的距离累加得到经过的距离。,3.4.4应用举例,程序代码如下: Private Sub Form_Click() Dim s!, h!, n% s = 100 h = s / 2 求第一次反弹的高度 For n = 2 To 10 s = s + 2 * h 第n次落地时共经过的距离 h = h / 2 第n次反跳高度 Next n Print “小球经过的总的距离为“; Round(s, 2); “米“ Print “小球第十次反弹高度为“; Round(h, 2); “米“ End Sub,3.4.4应用举例,例题3.28:用辗转相除法求两个自然数m,n的最大公约数和最小公倍数 程序分析:辗转相除法,又称欧几里得算法。其原理为:两个整数的最大公约数等于其中较小的数和两数相除所得的余数的最大公约数。如 252 和 105的最大公约数(21)也是42(252除105的余数)和105的最大公约数。,3.4.4应用举例,程序代码如下: Private Sub Form_Click() Dim n%, m%, n1%, m1%, t%, r% n = inputBox(“输入第一个数“, “最大公约与最小公倍数“) 获取数据 m = inputBox(“输入第二个数“, “最大公约与最小公倍数“) n1 = n 保存数据 m1 = m If m 0) Print m1; n1; “的最大公约数为“; m 显示最大公约数 Print “最小公倍数=“; m1 * n1 / m 计算并显示最小公倍数 End Sub,3.4.4应用举例,例题3.29:利用牛顿迭代法求某个数a的平方根,要求精确到10-7。 程序分析:牛顿迭代法求f(x)=0的根是在根的附近找一个初值作为x0,过x0做方程的切线,与x 轴的交点为x1,再过x1作切线,交x轴于点x2,.如右图,可以知道,只要给定一个初始值x,通过以上操作,可不断的得到新的值x,并且x无限的接近函数在x轴的交点,即方程的根。所以经过若干次迭代后,可得到方程较高精度的近似根。牛顿切线法迭代公式为 xi+1 = xi f(xi)/f(xi) 其中:f(xi)是f(xi)的导数,当|xi+1-xi|或|f(xi)| 时, xi+1就作为方程的近似根。 对于求平方根,有如下条件: 1、迭代初值 x=0.5(估计) 2、求a的平方根迭代公式 3、迭代结束条件: | x1-x0|10-7,3.4.4应用举例,程序代码如下: Private Sub Form_Click() Dim x!, x0!, x1!, a! a = Val(inputBox(“请输入正数a“) If (a 0.0000001) x0 = x1 为下一次迭代作准备 x1 = 0.5 * (x0 + a / x0) Loop x = x1 End If Print a; “的平方根为“; x End Sub,3.4.4应用举例,例题3.30: 歌德巴赫猜想:任何一个大于或等于六的偶数都可以分解成两个素数之和。 程序分析:我们已经知道如何判断一个数是否是素数,那么我们可以将一个大于等于六的偶数表示为两个数的和,再判断这两个数是否都是素数。,3.4.4应用举例,程序代码如下: Private Sub Form_Click() Dim i As integer, j As integer, k As integer, m As integer Dim n As integer, m1 As integer, m2 As integer, num As integer num = Val(inputBox(“请输入要验证的整数范围最大值(MAX)“) For i = 6 To num Step 2 For j = 3 To i/2 k = int(Sqr(j) For m = 2 To k If j Mod m = 0 Then Exit For Next m If m k

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论