《第五章循环结构程序设计》由会员分享,可在线阅读,更多相关《第五章循环结构程序设计(31页珍藏版)》请在金锄头文库上搜索。
1、第五章第五章 循环结构程序设计循环结构程序设计用用WHILE WENDWHILE WEND实现循环实现循环INPUT “n=”;nm=1p=1WHILE p=n m=m*P p=p+1WENDPRINT “m=”;mEND运行结果为:运行结果为:n=?5m=120即即5!=120用用DOLOOP结构实现循环结构实现循环(1)1、最简单的、最简单的DO循环循环DO 循环体LOOP循环体循环体见程序:见程序:LOOP1-1.BAS LOOP1-2.BASDO WHILE 条件条件 循环体LOOP前测试型前测试型DO 循环体LOOP WHILE 条件条件用用DOLOOP结构实现循环结构实现循环(2)
2、2、带、带WHILE子句的循环(子句的循环(当循环当循环)循环体循环体条件条件真真假假后测试型后测试型循环体循环体条件条件假假真真带带WHILE子句循环子句循环举例举例(1)例:求例:求50种商品的平均价格,种商品的平均价格,(N-S流程图见右)流程图见右)程序:程序:total=0i=1DO WHILE i= .00001 sum = sum + term i = i + 1 term = 1 / (i * i)LOOPpi = SQR(sum * 6)PRINT pi=; piEND程序(后测型):程序(后测型):sum = 0i = 1term = 1 / (i * i)DO sum =
3、 sum + term i = i + 1 term = 1 / (i * i)LOOP WHILE term = .00001pi = SQR(sum * 6)PRINT pi=; piEND带带WHILE子句循环子句循环举例举例(3)程序(前测型):程序(前测型):sum = 0i = 5DO WHILE i5 sum = sum + iLOOPPRINT sumEND执行结果:执行结果:0程序(后测型):程序(后测型):sum = 0i = 5DO sum = sum + iLOOP WHILE i5PRINT sumEND执行结果:执行结果:5前测试型和后测试型的循环结构有时是有区别的
4、,不一定能够互换!前测试型和后测试型的循环结构有时是有区别的,不一定能够互换!QBASIC保留保留WHILE-WEND循环主要是为了与循环主要是为了与GW-BASIC或或BASICA兼容。下面两个程序的作用相同。兼容。下面两个程序的作用相同。程序运行输出结果均为:程序运行输出结果均为: s=1683 n=33(a) (b) s=0 s=0 i=3 i=3 n=0 n=0 WHILE i=99 DO WHILE i=99 n=n+1 n=n+1 s=s+i s=s+i i=i+3 i=i+3 WEND LOOP PRINT s=;s,n=;n PRINT s=;s,n=;n END ENDDO
5、UNTIL 条件条件 循环体LOOP前测试型前测试型DO 循环体LOOP UNTIL 条件条件用用DOLOOP结构实现循环结构实现循环(3)2、带、带UNTIL子句的循环(子句的循环(直到型循环直到型循环)循环体循环体条件条件假假真真后测试型后测试型循环体循环体条件条件真真假假带带UNTIL子句循环子句循环举例举例 例例 求求20002050年之间年之间的所有闰年。的所有闰年。 闰年的条件是:闰年的条件是: 能被能被4整除,但不能整除,但不能被被100整除的年份都是闰整除的年份都是闰年;年; 能被能被100整除,又能整除,又能被被400整除的年份是闰年。整除的年份是闰年。 根据以上两条,根据以
6、上两条,2000年,年,2004年是闰年,年是闰年,2001年,年,2100年则不是闰年。年则不是闰年。 year=2000 DO UNTIL year2050 IF year MOD 4=0 then IF (year MOD 100)0 THEN leap=1 ELSEIF(year MOD 400)=0 THEN leap=1 ELSE leap=0 END IF ELSE leap=0 END IFIF leap=1 THEN PRINT yearyear=year+1LOOPENDFOR-NEXT循环结构循环结构 FOR-NEXT循环指由循环指由FOR语句、语句、NEXT语句的循环体
7、三者构成的循环,语句的循环体三者构成的循环,它是一般格式为:它是一般格式为:FOR = TO STEP 循环体循环体NEXT循环变量FOR语句称为语句称为“循环起始语句循环起始语句”或或“循环说明语句循环说明语句”,它的作用是,它的作用是确定循环变量的值如何变化,从而控制循环的次数。确定循环变量的值如何变化,从而控制循环的次数。“循环变量初值循环变量初值”、“循环变量终值循环变量终值”和和“循环变量增量循环变量增量”可以是可以是常数、变量或表达式。常数、变量或表达式。 NEXT语句是语句是“循环终断语句循环终断语句”,它的作用是标志循环结构的范围,它的作用是标志循环结构的范围,FOR-NEXT
8、循环结构执行过程循环结构执行过程如果有以下循环:如果有以下循环: FOR i=a TO b STEP c PRINT i NEXT i在执行此循环时,按以下步骤进行:在执行此循环时,按以下步骤进行:循环变量循环变量i取初值取初值a;将将i的值与终值的值与终值b比较,如果比较,如果i未超过未超过b,则接着执行步骤,则接着执行步骤到到,否则跳过步骤,否则跳过步骤到到,而直接执行步骤,而直接执行步骤;执行循环体执行循环体(PRINT i);NEXT语句,循环变量语句,循环变量i按步长按步长c增值;即增值;即i+ci。此时循环变量。此时循环变量i的值已发生了的值已发生了变化,由一个新值取代了原来的值。
9、变化,由一个新值取代了原来的值。“NEXT i”不是不是“取下一个值取下一个值i”的意思;的意思;返回执行步骤返回执行步骤;循环执行终止,接着执行循环执行终止,接着执行NEXT语句的下一个语句。语句的下一个语句。FOR-NEXT循环结构循环结构举例举例(1)FOR-NEXT循环结构循环结构举例举例(2)“水仙花数水仙花数”是指一个三位数,其各位数字的立方和等于该数,例如是指一个三位数,其各位数字的立方和等于该数,例如153=13+53+33,故,故153是一个是一个“水仙花数水仙花数”。请找出。请找出100999之间的所有之间的所有“水仙花数水仙花数”。 分析:分析: 题目的关键是如何将一个三
10、位数中的个位、十位和百位分离题目的关键是如何将一个三位数中的个位、十位和百位分离出来,假设出来,假设 i 代表一个由代表一个由a、b、c三个数字组成的三个数字组成的3位数,则:位数,则: (1)百位数百位数a: a=INT(i/100) (例如:例如:INT(342/100)=3) (2)十位数十位数b: b=INT(i-a*100)/10) (例如:例如:INT(342-3*100)/10)=4 (3)个位数个位数c: c= INT(i-a*100-b*10) (例如:例如:INT(342-3*100-4*10)=2 或:或: c= i-INT(i/10)*10 (例如:例如:342-INT
11、(342/10)*10=2 关于关于FOR-NEXT循环结构的说明循环结构的说明(1) FOR语句与语句与NEXT语句必须成对出现,缺一不可,语句必须成对出现,缺一不可,FOR语句必须在语句必须在NEXT语句之前语句之前 ;循环变量初值和终值可以是正值、负值或零循环变量初值和终值可以是正值、负值或零; FOR语句中的语句中的“循环变量循环变量”与与NEXT语句中的语句中的“循环变量循环变量”必须是必须是同一变量,例如同一变量,例如 FOR I=1 TO 3 STEP 1:?:?I:NEXT J ;步长可以是正值或负值。它们可以是整数或小数。但提倡用整数。如步长可以是正值或负值。它们可以是整数或
12、小数。但提倡用整数。如果步长为果步长为1,则,则“STEP”可以省略;当步长为零时,循环永不终止,成可以省略;当步长为零时,循环永不终止,成为为“死循环死循环”。下面程序运行时就是。下面程序运行时就是“死循环死循环”。 FOR x=2 TO 10 STEP 0 PRINT x NEXT 终止循环的条件是终止循环的条件是“循环变量的值超过终值循环变量的值超过终值”,而不是,而不是“循环变量循环变量的值等于终值的值等于终值”,例如,例如 FOR I=1 TO 3 STEP 1:?:?I:NEXT I. 循环次循环次数的计算可以通过公式计算:循环次数数的计算可以通过公式计算:循环次数=(循环终值(循
13、环终值-循环初值)循环初值)/步长步长+1;循环变量的作用主要是用来对循环进行控制,根据它的值决定何时终循环变量的作用主要是用来对循环进行控制,根据它的值决定何时终止循环过程。循环变量可以在循环体中被引用,也可以不在循环体中出止循环过程。循环变量可以在循环体中被引用,也可以不在循环体中出现(现(参见:参见:sanp5-17.bas)。)。 在循环体内一般不要对循环变量再赋值,否则将影响原有的循环控在循环体内一般不要对循环变量再赋值,否则将影响原有的循环控制状况。制状况。 流程可以从循环体内转移到循环体外,但不能从循环体外转到循环流程可以从循环体内转移到循环体外,但不能从循环体外转到循环体内。体
14、内。 FOR k=1 TO 10 s=s+k*k IF s200 GOTO a: NEXT k a: PRINT k END是合法的。但由于循环有两个出口,不符合结构化原则,故不提倡使用。是合法的。但由于循环有两个出口,不符合结构化原则,故不提倡使用。 (另参见:另参见:sanp5-15.bas) 。关于关于FOR-NEXT循环结构的说明循环结构的说明(2)FOR-NEXT循环结构循环结构举例举例(3)例:让计算机给小学生出例:让计算机给小学生出10道题目,要求是道题目,要求是100以内的两位整数相加,以内的两位整数相加,学生输入答案后自动判断它是否正确。最后输出学生的得分。(每题学生输入答案
15、后自动判断它是否正确。最后输出学生的得分。(每题10分)。分)。 题目分析:题目分析: 首先使要让计算机产生两个两位随机整数。在首先使要让计算机产生两个两位随机整数。在QB中有中有一个一个RND函数,可随机产生(函数,可随机产生(01)之间的一个随机小数,不包括)之间的一个随机小数,不包括0,1。如果将其放大。如果将其放大100倍再取整,即倍再取整,即INT(100*RND)是)是0,99,例如,例如随机产生一个随机产生一个0.256847,则,则INT(100*0.256847)=25; INT(10*RND) 得到一个得到一个 0,9的随机整数;的随机整数; INT(90*RND) 得到一
16、个得到一个 0,89的随机整数;的随机整数; INT(10*RND) +10 得到一个得到一个 10,99的随机整数,即两位整数;的随机整数,即两位整数; 利用循环产生利用循环产生10道题目道题目(参见:参见:sanp5-17.bas)!程序运行时,系统赋一个固定的程序运行时,系统赋一个固定的“随机化种子随机化种子”,通过该,通过该“随机化种随机化种子子”来产生随机数,所以如果程序每次运行不改变来产生随机数,所以如果程序每次运行不改变“随机化种子随机化种子”,就产生相同的随机数。就产生相同的随机数。FOR-NEXT循环结构循环结构举例举例(4)例:判断一个整数例:判断一个整数n是否是质数(除了
17、是否是质数(除了1和它本身不能再被其他整数和它本身不能再被其他整数数整除的数)。数整除的数)。1、利用循环从、利用循环从2n-1,分别判断每一个数是否能够整除分别判断每一个数是否能够整除n; flag=1 FOR I=2 TO n-1 IF n MOD I =0 THEN flag=1 NEXT I PRINT n;”is”; IF flag=1 THEN PRINT “NOT a prime number.” ELSE PRINT “ a prime number.” END 2、将、将n分解为表示为两个数的乘积时,则这两个数中其中的一个分解为表示为两个数的乘积时,则这两个数中其中的一个,而
18、而另另一一个个 。因因此此假假设设n不不是是一一个个素素数数的的话话,一一定定可可以以表表示示为为两两个个整整数数的的乘积,而其中一个一定小于乘积,而其中一个一定小于 ,所以循环的次数只有,所以循环的次数只有 。基本要求掌握WHILE-WEND循环、FOR-NEXT循环和DO-LOOP循环的使用在一个循环体内又完整地包含另一个循环,称为循环的嵌套。在一个循环体内又完整地包含另一个循环,称为循环的嵌套。前面介绍的几种类型的循环可以互相嵌套。前面介绍的几种类型的循环可以互相嵌套。循环的嵌套循环的嵌套举例:打印出乘法九九表举例:打印出乘法九九表 1 2 3 4 5 6 7 8 9 1 | 1 2 3
19、 4 5 6 7 8 9 2 | 2 4 6 8 10 12 14 16 18 3 | 3 6 9 12 15 18 21 24 27 4 | 4 8 12 16 20 24 28 32 36 5 | 5 10 15 20 25 30 35 40 45 6 | 6 12 18 24 30 36 42 48 54 7 | 7 14 21 28 35 42 49 56 63 8 | 8 16 24 32 40 48 56 64 72 9 | 9 18 27 36 45 54 63 72 81FOR b = 1 TO 9 PRINT TAB(b * 5); b;NEXT bPRINTFOR n =
20、1 TO 50 PRINT -;NEXT nPRINTFOR a = 1 TO 9 PRINT a; |; FOR b = 1 TO 9 t = a * b PRINT TAB(b * 5); t; NEXT b PRINTNEXT a在使用循环嵌套时,要注意:在使用循环嵌套时,要注意:内外循环不应交叉,如:内外循环不应交叉,如: FOR i FOR i FOR k FOR k NEXT k NEXT i NEXT i NEXT k 正确正确 不正确不正确 内外循环的循环变量名不应相同。例如:内外循环的循环变量名不应相同。例如: FOR k=1 TO 9 FOR k=1 TO 9 PRINT
21、$; NEXT kNEXT kEND循环的嵌套的两点说明循环的嵌套的两点说明有关循环的算法举例有关循环的算法举例(1)用字符组成图案:用字符组成图案:?输出由字符输出由字符“*”组成的金字塔图案,组成的金字塔图案,(参见(参见SAMP5-19.BAS)?输出由字符输出由字符“B”组成的兔子头图案,组成的兔子头图案,(参见(参见SAMP5-20.BAS)穷举法(测试所有的方案):穷举法(测试所有的方案): 例 百钱买百鸡:公元5世纪末,我国古代数学家张建丘在算经中提出了“问题”;“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?” 此题用代数方法是无法求解的。因
22、为有3个未知数,只有2个方程式。设公鸡x只,母鸡y只,小鸡z只,可以列出方程: x+y+z=100 5x+3y+z/3=100 由于无法直接用代数方法解,可以用“穷举法”来解此问题。 分析一下x,y,z的可能取值范围:公鸡最多能买20只,故0x20;母鸡最多能买33只,所以0y33;在x,y确定后,自然就得出z=100-x-y。 (参见参见SAMP5-21.BAS)有关循环的算法举例有关循环的算法举例(2)递推法:递推法: 所谓递推就是再前面一个或几个数的基础上推出下一个数的值。所谓递推就是再前面一个或几个数的基础上推出下一个数的值。 例:有一个数列,前两个数是1,1,第三个数是前两个数之和,
23、以后每个数都是其前两个数之和,此数列的前几个数为1,1,2,3,5,8要求输出前30个数。 (参见参见SAMP5-22.BAS)数列称为Fibonacii,斐波那契数列,他提出这样的问题:有一对兔子,从第三个月开始生一对兔子。生下的每一对兔子长道第3个月以后每月又生一对兔子。假设这些兔子都不死亡,问各月有多少对兔子。月月小兔子小兔子(1个月个月)中兔子中兔子(2个月个月)老兔子老兔子(3个月以上个月以上) 合计合计1100 12010 13101 24111 35212 563238有关循环的算法举例有关循环的算法举例(2)递推过程:递推过程: 112 358(第第1次次)f1f2+f3f1f
24、2+f1f2+f3f3f1f2+f3(第第2次次)(第第3次次)(第第4次次)有关循环的算法举例有关循环的算法举例(3)牛顿迭代法:牛顿迭代法: 对于一些复杂的函数,无法得到解析解,只能通过一定方法得到其近似对于一些复杂的函数,无法得到解析解,只能通过一定方法得到其近似的解,如的解,如ex-x=0等。这样一些方程的求解过程如下:等。这样一些方程的求解过程如下: (参见参见SAMP5-23.BAS)x1x2x37.重复以上步骤,直到重复以上步骤,直到|xn-xn-1|,此时可认为,此时可认为xn非非常常接近接近f (x)的根的根 。f (x1)f (x2)f (x3)1.任选一个根任选一个根x1
25、;2.由由x1求出求出f (x1);3.过过(x1,f (x1)做做f (x)的切线,的切线,交交x轴与轴与x2;4.由由x2求出求出f (x2);5.过过(x2,f (x2)做做f (x)的切线,的切线,交交x轴与轴与x3;6.再通过再通过x3求出求出f (x3);xyf (x)有关循环的算法举例有关循环的算法举例(3)x1x2x3f (x1)f (x2)f (x3)xyf (x)输入初始近似根输入初始近似根x1结束循环标志结束循环标志Flag=0求出对应求出对应x1的函数值的函数值f(x1) f求函数求函数f(x1)值值f(x1) d求下一个近似根求下一个近似根x2=x1-f/d输出输出n, x2, x1n=n+1|x2-x1|10-6x2 x1直到直到flag=1输出近似根输出近似根是是否否flag=1有关循环的算法举例有关循环的算法举例(4)定积分问题:定积分问题: 求函数在指定区间上的定积分。求函数在指定区间上的定积分。x1x2F(x)a=0FOR k=1 TO 100 a=(2-1)/100 b=sin(1+(k-1)*100) s=a*b a=a+sNEXT kPRINT “The area is:”,a基本要求掌握循环嵌套的使用及常用的有关循环的算法的使用。