资源描述
1,提要 多重循环 常用算法 重点 多重循环 常用算法,第4章 Visual Basic语言基础5,2,4.7.5 多重循环循环嵌套,For I= 1 to 5 Step 1 Next I,For J= 1 to 3 Step 1 Next J,一个循环结构的循环体内包含了另一个循环结构. 嵌套一层称为二重循环 多重循环中遇Exit For(Do),只跳出当前一层循环.,3,讨论多重循环,内、外循环的循环变量不可同名. 内、外循环不可交叉 (外循环完全包含内循环). 执行次数 当外循环执行一次,内循环全部执行. 内循环执行总次数=外循环次数内循环次数,错误,正确,4,For i=1 to 6 step 1 Print Next i,For i=1 to 6 step 1 Print ; Next i,问题1: 要求利用循环结构在一列打印6个“”,问题2:要求利用循环结构在一行打印6个“”, 如何修改?,归纳:分隔符“;”使多个内容一个个紧跟着打印输出,5,For k=1 To 3 Next k,For i=1 to 6 Print ; Next i Print,问题3: 打印3行,每行6个“”,如何解决?,For i = 1 To 6 Step 1 Print ; Next I Print For i = 1 To 6 Step 1 Print ; Next i Print For i = 1 To 6 Step 1 Print ; Next i,循环嵌套结构,结论 单层循环:控制一行上的所有列,采用“紧凑”方式输出; 双层循环:内循环控制一行上的所有列,外循环控制所有行.,6,For I = 1 To 9 For J= 1 To 9 Next I End Sub,For J= 1 To 9 Print J; x; 1; =; 1*J; Next J,示例: 打印九九乘法表.,Print J; x; 1; =; 1*J;,Print J; x; I; =; I * J;,Print,输出一行所有列之后能换行,7,For I = 1 To 9 For J= 1 To 9 Print J; x; I; =; I * J; Next J Print Next I,思考: 打印上三角或下三角程序如何改动?,Print Tab(12 * (J - 1); J; x; I; =; I * J;,说明:Tab(n)函数后项内容在第n个字符位上输出,I,8,课后任务: 打印金字塔_(选做),Private Sub Form_Click() For i = 0 To 8 Print Tab(27 - 3 * i); For j = 1 To i Print j; Next j For j = i + 1 To 1 Step -1 Print j; Next j Print Next i End Sub,9,课堂思考,素数是一个大于2且只能被1和本身整除的整数. 判别一个数n是否为素数的方法: 对于n 从 i=2,3,n-1判别n能否被i整除,只要有一个能整除,n不是素数,否则n是素数。 算法1: 素数不能被2n-1的其中一个整数整除 优化算法1 :素数不能被2n/2的其中一个整数整除 优化算法2 :素数不能被2Sqr(n)的其中一个整数整除,问题: 判断一个数n是否为素数,10,判断一个数n是否为素数?,For i=2 to n-1 if n mod i=0 then Exit For 被整除 Next i,Exit For 退出当前循环,If i n-1 then Print n;“是素数” Else Print n;“是非素数” End if,11,For n = 101 To 300 Step 2 Next n,要求:输出100300之间的所有素数.,For i = 2 To Int(Sqr(n) If n Mod i = 0 Then Exit For Next i If i Int(Sqr(n) Print n;“是素数”,课后任务1,12,1.最大、最小值 课本P12 (打擂台) 若干数求最大值, 一般先假设第一个数为最大值初值; 然后将剩余的每一个数与最大值比较, 若该数大于最大值, 将该数替换为最大值;依次逐一比较.(求最小值:方法相同),Dim x%,Max% x = Int(Rnd * 101 + 100 ) Max = x For i = 2 To 5 x = Int(Rnd * 101 + 100 ) If x Max Then Max = x Next i Print 最大值=; Max,问题: 随机产生5个100200之间的整数,求最大值.,4.8 常用算法,若求最小值和平均值?,13,计算1100的3或7的倍数的和,计算310的乘积,思考:若把变量 S 的初值语句放置在循环体内的首行位置,程序运行时会产生什么情况?S = ?,2.累加、连乘、计数_课本P12,S= 0 For I = 1 To 100 If I Mod 3 = 0 Or I Mod 7 = 0 Then S = S + I k = k + 1 End If Next I Print S,k,S= 1 For I =3 To 10 S = S * I Next I Print S,计数器,累加器,连乘器,S= 0 If I Mod 3 = 0 Or I Mod 7 = 0 Then S = S + I k = k + 1 End If,14,分析: 每一项和每次累加之和都是变化量 因此,需要两个变量 用T表示每一项的值:T=T+1 用S表示累加之和:S=S+T 循环终止条件: 循环次数n 初始化: S=0,回顾: 计算 s=1+2+3+n,Private sub Form_Click( ) Dim I% , S%, T%,n% T为每一项 n=val(Inputbox(“n=”) S=0 For I=1 To n T=T+1 S=S+T Next I Print “S=”;S End Sub,T=I,S=S+I,s=1234 n,S=n!,S=1 For I=1 To n S=S* I Next I,由此可见 累加问题: 公式 S=S+T ;初值 S=0 连乘问题: 公式 S=S*T ; 初值 S=1,15,例: 计算 s=11/21/3 1/n,分析: T表示每一项: T = 1/n S 表示连乘的值: S = S * T 初始化: S= 1 思考: 能否交换两者次序 即: 先连乘,后产生新一项? 而令初值T=第一项,S=,T=,S * T,S=,T=,S * T,B=1: A=n,课堂思考,S=,T=,S * T,T可理解为通式,16,课后任务2_(实验),要求:计算的近似值,的计算公式为:,S=,T=,S * T,观察 当n=10时,p = ? ;当n=50时,p = ? ;当n=100时,p = ?; 当n=10000时,p = 比较精确. 可见该公式收敛较慢.,(2*n)2 / (2*n-1)*(2*n+1),B=(2*n)2 : A=(2*n-1)*(2*n+1),从第二项开始才有规律可循,思考: 初值S=? T=?,17,Private Sub Form_Click() Dim S#, T#, i 各项逐项相加(累加): S=S+T 某一项T=B/A : B=-B , A=A+2,S=,T=,S + T,B=-B : A=A+2,Do While Abs(T) = 0.0001,Loop,A=1: B=1: T=? : S=?,课堂思考,19,例:求自然对数e的近似值,要求直到最后一项t的值小于0.00001,近似公式为:,分析: 循环结束:根据最后一项 T0.00001来控制 各项逐项相加(累加): S=S+T 某一项T=B/A : B=1 A=I! (A=A*I :I=I+1),S=,T=,S+T,A=A*I : I=I+1,思考: 初值T=? : s=?,从第二项开始才有规律可循,20,Private Sub Form_Click() Dim i%, n S End Sub,21,累加/连乘算法_小结,累加 初值:S=0, T=第一项 通用公式: S=S+T : :T=B/A 连乘 初值:S=1, T=第一项 通用公式: S=S*T : :T=B/A 说明: T=B/A中的A或B均可为常量或变量表达式 若A=1, 则T=B 若B=1, 则T=1/A,22,设小鸡x只、公鸡y只、母鸡z只,列出方程: x+y+z=100 0.5x+2y+3z=100 可见,三个未知数,两个方程,此题有若干个解。 可穷举X、Y、Z的每一种取值,符合就是其中一种方案,3.穷举法课本P12: 列举各种可能情况,找出符合要求的,Private Sub Form_click() For x = 1 To 100 For y = 1 To 100 For z = 1 To 100 If x * 0.5 + y * 2 + z * 3 = 100 And x +y + z = 100 Then Print x, y, z End If Next z Next y Next x End Sub,问题: 100元买100只鸡, 小鸡每只0.5元,公鸡每只2元, 母鸡每只3元, 可买公、母、小鸡各多少只?,23,课外思考 勾股定理中3个数的关系是:a2+b2=c2。编写程序,输出20以内满足上述关系的整数组合,例如3,4,5就是一个整数组合。,24,4.递推法 (课本P11),猴子吃桃子问题:猴子摘下若干个桃子,第一天吃了桃子的一半多一个,以后每天吃了前一天剩下的一半多一个,到第十天吃以前发现只剩下一个桃子,问猴子第一天共摘了几个桃子?,Dim day As Integer, x As Integer, y As Integer x = 1 For day = 9 To 1 Step -1 y = (x + 1) *2 前一天的桃子数是第2天桃子数加1的2倍 x = y Next day Print x,分析:此问题属于“倒推”问题,先从最后一天推出倒数第二天的桃子,再从倒数第二天的桃子推出倒数第三天的桃子 设第n天的桃子为x,第n-1天的桃子为y, 前一天的桃子数为: y=(x+1)2,25,1. 多重循环的内外循环之间的联系 2. 常用算法:累加、最值、穷举、素数等,本节小结,26,循环控制结构常见错误,1.不循环或死循环的问题 主要是循环的条件、初值、终值、步长的设置有问题 2.循环结构中缺少配对的结束语句 For 缺少配对的Next 3.循环嵌套时,内外循环交叉 4.累加、连乘时,存放累加、连乘的变量赋初值问题,27,课后任务3,课后习题P56一.选择题 P61二.填空题 P66三.编程题(3 4) 实验四 P21实验案例一 P22 三.实验内容(3),
展开阅读全文