NOIP循环结构的程序设计.ppt
《NOIP循环结构的程序设计.ppt》由会员分享,可在线阅读,更多相关《NOIP循环结构的程序设计.ppt(43页珍藏版)》请在三一文库上搜索。
1、第四章 循环结构,第一节 循环语句(FOR语句) 第二节 当语句( WHILE语句) 第三节 直到循环(REPEAT语句) 第四节 多重循环结构,在实际应用中,会经常遇到许多有规律性的重复运算,这就需要掌握本章所介绍的循环结构程序设计。在Pascal语言中,循环结构程序通常由三种的循环语句来实现。它们分别为FOR循环、当循环和直到循环。通常将一组重复执行的语句称为循环体,而控制重复执行或终止执行由重复终止条件决定。重复语句是由循环体及重复终止条件两部分组成。,第一节 循环语句(FOR语句),for语句的一般格式,for := to do ; /递增型循环 for := downto do ;
2、/递减型循环 其中for、to、downto和do是Pascal保留字。表达式1 与表达式2的值称为初值和终值。 循环的语句格式: FOR 变量名 := 初值 TO 终值 DO 语句; 求1+2+3+N的和。如何编程呢? 【例】 S:=0; FOR I := 1 TO 10 DO S := S + I; Writeln(S =,S);,For语句执行过程,先将初值赋给左边的变量(称为循环变量); 判断循环变量的值是否“等于”终值,如已等于终值,则下次不再执行(本次是最后一次执行,循环变量的值也不更改),则跳到步骤; 如果小于等于终值,则执行do后面的那个语句(称为循环体); 循环变量递增(对t
3、o)或递减(对downto); 返回步骤; 循环结束,执行for循环下面的一个语句。,说明,循环变量必须是顺序类型。可以是整型、字符型、枚举型等,但不能为实型。 循环变量的值递增或递减的规律是:选用to则为递增;选用downto则递减。 循环体可以是一个基本语句,也可以是一个复合语句。 循环变量的初值和终值一经确定,循环次数就确定了。但是在循环体内对循环变量的值进行修改,常常会使得循环提前结束或进入死环。所以禁止在循环体中随意修改控制变量的值。如: for i : =1 to 10 do begin i : =2*i+1; /禁止类似的修改,Free Pascal中会提示语法错误 writel
4、n(i); end; 以上for循环是一个死循环,i永远等于2,不可能达到终止值10。 for语句中的初值、终值都可以是顺序类型的常量、变量、表达式。,应用举例,例4.1 输出1100之间的所有偶数。 程序如下: Program ex4_1; var i:integer; begin for i:=1 to 100 do if i mod 2=0 then write(i:5); end.,例4.2 编程计算1到100的累加和:s=1+2+3+100。 【分析】设i为循环控制变量,累加和放在s中,利用循环变量i的值从1变化到100的规律,不需要另外引进从1变化到100的其它变量,程序的流程图如
5、4-2所示。 程序如下: Program ex4_2; var s,i : integer; begin s := 0; for i := 1 to 100 do s := s+i; writeln(s); end. 运行结果: 5050 只要对程序稍加修改就可以计算出以下算式的值: s=1+1/2+1/3+1/100 s=12+22+32+1002 s=2+4+6+100等等。,例4.3 将顺序打印出26个小写英文字母 : “abczzcba“。 程序如下: Program ex4_3; var k : char; begin for k : =a to z do write(k); for
6、 k : =z downto a do write(k); writeln; end.,例4.4 N的阶乘是指1到N的累乘,即N!=1*2*3*N ,输入一个数,求这个数的阶乘? 程序如下: Program ex4_4; var n,i : integer; / i为循环变量 s : longint; /s存放阶乘的结果,类型为长整 型,防止结果太大 begin readln(n); s := 1; /这条语句少了,选手们思考一 下,会出现什么现象? for i := 2 to n do /从2到n累乘到s中 s := s*i; writeln(s); /输出n!的值 end. 虽然s定义成l
7、ongint,但输入12以上的数时,还是会出现错误的结果,说明结果超出了longint能够储存的范围,这时需要定义更大的类型,如int64,或干脆定义成实型变量用科学计数法来近似表示这个数,如real、extended。,上例中用到了“递推”算法。所谓递推算法是指在一个数的序列值中,下一项的值在前一项的值的基础上推算出来的,即下一项对前一项有某种依赖关系。例如,为求5!,应先知道4!的值,然后再乘以5;为求6!必先求出5!。也就是说,从1!可以推出2!,从2!可以推出3!,从3!可以推出4!,以此类推。求n!的递推公式为: a1=1 (n=1) an=n*an-1 (n1) a1=1是“初始条
8、件”或“边界条件”。只要找出递推关系,就可以由循环来处理,一项一项地推算出来以后各项。在程序中用同一个变量s来存储每一次推出来的值,由前一个s推出后一个s是递推。,例4.5 已知一对兔子,每个月可以生一对小兔,而小兔经过一个月生长后也可每月生一对小兔。即兔子的对数是:第一个月1对,第二个月2对,第三个月3对,第四个月5对,假设兔子的生育期是12个月,并且不死,问一年后,这对兔子有多少对活着的后代? 【分析】 根据题目给出的条件,得到算法:设当前月兔子有x对,它的前一个月有lastx对,前二个月有prevx对,明显存在一个递推关系,即x=lastx+prevx。 Program ex4_5; V
9、ar i,lastx,prevx,x : integer; begin prevx : =1; lastx : =2; for i : =3 to 12 do begin x : =lastx+prevx; prevx : =lastx; lastx : =x; end; writeln(x); end.,运行结果: 233,例4.6 一个两位数x,将它的个位数字与十位数字对调后得到一个新数y,此时y恰好比x大36,请编程求出所有这样的两位数。 【分析】 用for循环列举出所有的两位数,x为循环变量; 用公式a:= x div 10分离出x的十位数字; 用公式b:= x mod 10分离出x的
10、个位数字; 用公式y:= b*10+a合成新数y; 用式子y-x=36筛选出符合条件的数x并输出。 Program ex4_6; var a,b,x,y:integer; begin for x := 10 to 99 do begin a := x div 10; b := x mod 10; y := b*10+a; if y-x=36 then writeln(x); end; readln; end.,例4.7 把整数3025从中剪开分为30和25两个数,此时再将这两数之和平方,(30+25)2=3025计算结果又等于原数。求所有符合这样条件的四位数。 【分析】设符合条件的四位数为N,
11、它应当是一个完全平方数,用(a*a)表示。 为了确保N=(a*a)在四位数(10009999)范围内,可确定a在3299循环; 计算N=a*a;将四位数N拆分为两个数n1和n2; 若满足条件(n1+n2)*(n1+n2)N 就输出 N 。 Program ex4_8; Var n,a, x,n1,n2: integer; begin for a:=32 to 99 do begin n:=a*a; n1:= n div 100; /拆取四位数的前两位数 n2:= n-n1*100; /拆取四位数的后两位数 x:=n1+n2; if x*x=N then writeln (N); end; re
12、adln end.,例4.9 根据公式2/6=1+1/22+1/32+1/n2,计算圆周率的pai值。 【分析】此题是上例的一个变例,关键在于求出右边的累加和,变量n由键盘输入,n越大,圆周率的pai值就越精确。但是,i作为循环控制变量参加循环体的运算,它是整型数,那么当i=182时,i*i已经超过了正整数32767的范围,在Pascal系统里就把它变为-65536+i*i的整型数进行处理,当i=256时,-65536+i*i正好等于零,从面产生以零作除数的编译错误,所以我们在程序里应该把i定义为长整型,这样可以输入更大的n(不能大于46341,等于65536时,也会同样出现被0除的溢出错误)
13、。 Program ex4_9; var i,n : integer; /应该为longint(长整型) pai,s : real; begin readln(n); s : =0; for i : =1 to n do s : =s+1/(i*i) pai : =sqrt(6*s); writeln(pai : 8 : 6); end.,运行结果: 输入:1000 输出:3.132077 输入:10000 输出:3.141497,【上机练习4.1】,1、求12+22+32+1002 2、求s=1+1/2+1/3+1/100 3、计算100之内所有的奇数之和。 4、计算n!,其中n由键盘输入。
14、 5、求10个数中的最大值和最小值。 6、按字母表的顺序,从字母A到Z顺序打印输出。 7、求菲波拉契数列a0,a1,a2,a20。 a0=0,a1=1,a2=a1+a0,a3=a2+a1, an=an-1+an-2;如0,1,1,2,3,5,8,13,21,第二节 当语句( WHILE语句),WHILE循环,对于for循环有时也称为计数循环,当循环次数未知,只能根据某一条件来决定是否进行循环时,用while 语句或repeat语句实现循环要更方便。 while语句的形式为: while do ; 其意义为:当布尔表达式的值为true时,执行do后面的语句。,while语句的执行过程为: 判断布
15、尔表达式的值,如果其值为真,执行步骤2,否则执行步骤4; 执行循环体语句(do后面的语句); 返回步骤1; 结束循环,执行while的下一个语句。 说明:这里while和do为保留字。 当布尔表达式成立时,执行do后面的语句(循环体),当布尔表达式的值为false时,才结束循环,转去执行while语句的下一条语句,故又称此语句为“当”语句或“当型循环”。 while语句的特点是:先判断,后执行。,例4.10 求恰好使s=1+1/2+1/3+1/n的值大于10时n的值。 【分析】 “恰好使s的值大于10“意思是当表达式s的前n-1项的和小于或等于10,而加上了第n项后s的值大于10。从数学角度,
16、我们很难计算这个n的值。故从第一项开始,当s的值小于或等于10时,就继续将下一项值累加起来。当s的值超过10时,最后一项的项数即为要求的n。 程序如下: Program ex4_10; Var s : real; n : integer; /n表示项数 begin s : =0.0; n : =0; while s=10 do /当s的值还未超过10时 begin n : =n+1; /项数加1 s : =s+1/n; /将下一项值累加到s end; writlen(n=,n); /输出结果 end.,例4.11 求两个正整数m和n的最大公约数。 【分析】求两个正整数的最大公约数采用的辗转相除
17、法求解。以下是辗转的算法: 分别用m,n,r表示被除数、除数、余数。 求m/n的余数r. 若r=0,则n为最大公约数.若r0,执行第步. 将n的值放在m中,将r的值放在n中. 返回重新执行第步。 程序如下: program ex4_11; Var m,n,a,b,r:integer; begin write(Input m,n:); readln(m,n); a:=m; b:=n; r:=a mod b; while r0 do begin a:=b;b:=r; r:=a mod b; end; writeln(The greatest common divide is:,b:8); end.
18、,例4.12 利用格里高公式求。/4=1-1/3+1/5-1/7+,直到最后一项的值小于10-6为止。 【分析】解本题的关键就是求右边数值序列的和,序列有明显的特点:分母是从1开始的奇数,加、减号轮流出现,因此,我们可以用n=n+2表示序列数值的变化,用f=-f来设置它们知项的符号位。 程序如下: Program ex4_12; Var n,f : integer; t,pai : real; begin pai : =0; t : =1; n : =1; f : =1; while abs(t)=1e-6 do begin pai : =pai+t; n : =n+2; f : =-f; t
19、 : =f/n; end; pai : =pai*4; writeln(pai : 10 : 8); end.,运行程序会发现没有结果,为什么?因为布尔表达式abs(t)=1e-6,即1/n=1e-6,而程序的说明部分n是整型数,它的范围是-3276832767,条件永远成立,所以形成死循环,从而没有运行结果。while循环不需要用顺序型数据来控制循环的次数,改程序的说明部分中的n为实型数或说明为长整型即可,请同学们自己修正,以后要对变量的取值范围引起重视。,【上机练习4.2】,1、用WHILE循环完成如下3题: 求s=1+2+3+4+10 求s=1+1/2+1/3+1/100 计算n!,其中
20、n由键盘输入。 2、输入任一的自然数A, B, 求A , B的最小公倍数。 3、小球从100高处自由落下,着地后又弹回高度的一 半再落下。求第20次着地时, 小球共通过多少路程? 4、Faibonacci数列前几项为: 0,1,1,2,3,5,8,其规 律是从第三项起, 每项均等于前两项之和。求前30 项,并以每行5个数的格式输出。 5、鸡兔同笼,头30,脚90, 求鸡兔各几只?,第三节 直到循环(REPEAT语句),用while语句可以实现“当型循环”,用repeat-until 语句可以实现“直到型循环”。repeat-until语句的含义是:“重复执行循环,直到指定的条件为真时为止”。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NOIP 循环 结构 程序设计
链接地址:https://www.31doc.com/p-3098429.html