NOIP循环结构的程序设计.ppt
《NOIP循环结构的程序设计.ppt》由会员分享,可在线阅读,更多相关《NOIP循环结构的程序设计.ppt(43页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、NOIP循环结构的程序设计 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望在实际应用中,会经常遇到许多有规律性的重复运算,这就需要掌握本章所介绍的循环结构程序设计。在Pascal语言中,循环结构程序通常由三种的循环语句来实现。它们分别为FOR循环、当循环和直到循环。通常将一组重复执行的语句称为循环体,而控制重复执行或终止执行由重复终止条件决定。重复语句是由循环体及重复终止条件两部分组成。第一节第一节循环语句(循环语句(FOR语句)语句)for语句的一般格式语句的一
2、般格式for:=todo;/递增型循环for:=downtodo;/递减型循环其中for、to、downto和do是Pascal保留字。表达式1与表达式2的值称为初值和终值。循环的语句格式:FOR变量名:=初值TO终值DO语句;求1+2+3+N的和。如何编程呢?【例】【例】S:=0;FORI:=1TO10DOS:=S+I;Writeln(S=,S);For语句执行过程语句执行过程先将初值赋给左边的变量(称为循环变量);判断循环变量的值是否“等于”终值,如已等于终值,则下次不再执行(本次是最后一次执行,循环变量的值也不更改),则跳到步骤;如果小于等于终值,则执行do后面的那个语句(称为循环体);
3、循环变量递增(对to)或递减(对downto);返回步骤;循环结束,执行for循环下面的一个语句。说明循环变量必须是顺序类型。可以是整型、字符型、枚举型等,但不能为实型。循环变量的值递增或递减的规律是:选用to则为递增;选用downto则递减。循环体可以是一个基本语句,也可以是一个复合语句。循环变量的初值和终值一经确定,循环次数就确定了。但是在循环体内对循环变量的值进行修改,常常会使得循环提前结束或进入死环。所以禁止在循环体中随意修改控制变量的值。如:fori:=1to10dobegini:=2*i+1;/禁止类似的修改,FreePascal中会提示语法错误writeln(i);end;以上f
4、or循环是一个死循环,i永远等于2,不可能达到终止值10。for语句中的初值、终值都可以是顺序类型的常量、变量、表达式。应用举例应用举例例例4.1输出1100之间的所有偶数。程序如下:程序如下:Programex4_1;vari:integer;beginfori:=1to100doifimod2=0thenwrite(i:5);end.例例4.2编程计算编程计算1到到100的累加和:的累加和:s=1+2+3+100。【分析】设i为循环控制变量,累加和放在s中,利用循环变量i的值从1变化到100的规律,不需要另外引进从1变化到100的其它变量,程序的流程图如4-2所示。程序如下:程序如下:Pr
5、ogramex4_2;vars,i:integer;begins:=0;fori:=1to100dos:=s+i;writeln(s);end.运行结果:5050只要对程序稍加修改就可以计算出以下算式的值:s=1+1/2+1/3+1/100s=12+22+32+1002s=2+4+6+100等等。例例4.3将顺序打印出将顺序打印出26个小写英文字母个小写英文字母:abczzcba。程序如下:程序如下:Programex4_3;vark:char;beginfork:=atozdowrite(k);fork:=zdowntoadowrite(k);writeln;end.例例4.4N的阶乘是指的
6、阶乘是指1到到N的累乘,即的累乘,即N!=1*2*3*N,输入,输入一个数,求这个数的阶乘?一个数,求这个数的阶乘?程序如下程序如下:Programex4_4;varn,i:integer;/i为循环变量s:longint;/s存放阶乘的结果,类型为长整 型,防止结果太大beginreadln(n);s:=1;/这条语句少了,选手们思考一 下,会出现什么现象?fori:=2tondo/从2到n累乘到s中s:=s*i;writeln(s);/输出n!的值end.虽然s定义成longint,但输入12以上的数时,还是会出现错误的结果,说明结果超出了longint能够储存的范围,这时需要定义更大的类
7、型,如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是“初始条件”或“边界条件”。只要找出递推关系,就可以由循环来处理,一项一项地推算出来以后各项。在程序中用同一个变量s来存储每一次推出来的值,由
8、前一个s推出后一个s是递推。例例4.5已知一对兔子,每个月可以生一对小兔,而小兔经过一个月已知一对兔子,每个月可以生一对小兔,而小兔经过一个月生长后也可每月生一对小兔。即兔子的对数是:第一个月生长后也可每月生一对小兔。即兔子的对数是:第一个月1对,第对,第二个月二个月2对,第三个月对,第三个月3对,第四个月对,第四个月5对,对,假设兔子的生育期,假设兔子的生育期是是12个月,并且不死,问一年后,这对兔子有多少对活着的后代?个月,并且不死,问一年后,这对兔子有多少对活着的后代?【分析】【分析】根据题目给出的条件,得到算法:设当前月兔子有x对,它的前一个月有lastx对,前二个月有prevx对,明
9、显存在一个递推关系,即x=lastx+prevx。Programex4_5;Vari,lastx,prevx,x:integer;beginprevx:=1;lastx:=2;fori:=3to12dobeginx:=lastx+prevx;prevx:=lastx;lastx:=x;end;writeln(x);end.运行结果:233例例4.6一个两位数一个两位数x,将它的个位数字与十位数字对调后得到一,将它的个位数字与十位数字对调后得到一个新数个新数y,此时,此时y恰好比恰好比x大大36,请编程求出所有这样的两位数。,请编程求出所有这样的两位数。【分析】【分析】用for循环列举出所有的两
10、位数,x为循环变量;用公式a:=xdiv10分离出x的十位数字;用公式b:=xmod10分离出x的个位数字;用公式y:=b*10+a合成新数y;用式子y-x=36筛选出符合条件的数x并输出。Programex4_6;vara,b,x,y:integer;beginforx:=10to99dobegina:=xdiv10;b:=xmod10;y:=b*10+a;ify-x=36thenwriteln(x);end;readln;end.例例4.7把整数把整数3025从中剪开分为从中剪开分为30和和25两个数,此时再将这两数两个数,此时再将这两数之和平方,之和平方,(30+25)2=3025计算结
11、果又等于原数。求所有符合这样计算结果又等于原数。求所有符合这样条件的四位数。条件的四位数。【分析】【分析】设符合条件的四位数为N,它应当是一个完全平方数,用(a*a)表示。为了确保N=(a*a)在四位数(10009999)范围内,可确定a在3299循环;计算N=a*a;将四位数N拆分为两个数n1和n2;若满足条件(n1+n2)*(n1+n2)N就输出N。Programex4_8;Varn,a,x,n1,n2:integer;beginfora:=32to99dobeginn:=a*a;n1:=ndiv100;/拆取四位数的前两位数n2:=n-n1*100;/拆取四位数的后两位数x:=n1+n2
12、;ifx*x=Nthenwriteln(N);end;readlnend.例例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定义为长整型,这样
13、可以输入更大的n(不能大于46341,等于65536时,也会同样出现被0除的溢出错误)。Programex4_9;vari,n:integer;/应该为longint(长整型)pai,s:real;beginreadln(n);s:=0;fori:=1tondos:=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+10022、求s=1+1/2+1/3+1/1003、计算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语句的形式为:whiledo;其意义为:当布尔表达式的值为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,而加上了
16、第n项后s的值大于10。从数学角度,我们很难计算这个n的值。故从第一项开始,当s的值小于或等于10时,就继续将下一项值累加起来。当s的值超过10时,最后一项的项数即为要求的n。程序如下程序如下:Programex4_10;Vars:real;n:integer;/n表示项数begins:=0.0;n:=0;whiles=10do/当s的值还未超过10时beginn:=n+1;/项数加1s:=s+1/n;/将下一项值累加到send;writlen(n=,n);/输出结果end.例例4.11求两个正整数求两个正整数m和和n的最大公约数。的最大公约数。【分析】【分析】求两个正整数的最大公约数采用的辗
17、转相除法求解。以下是辗转的算法:分别用m,n,r表示被除数、除数、余数。求m/n的余数r.若r=0,则n为最大公约数.若r0,执行第步.将n的值放在m中,将r的值放在n中.返回重新执行第步。程序如下程序如下:programex4_11;Varm,n,a,b,r:integer;beginwrite(Inputm,n:);readln(m,n);a:=m;b:=n;r:=amodb;whiler0dobegina:=b;b:=r;r:=amodb;end;writeln(Thegreatestcommondivideis:,b:8);end.例例4.12利用格里高公式求利用格里高公式求。/4=1
18、-1/3+1/5-1/7+,直到最后一项的值小于,直到最后一项的值小于10-6为止。为止。【分析】【分析】解本题的关键就是求右边数值序列的和,序列有明显的特点:分母是从1开始的奇数,加、减号轮流出现,因此,我们可以用n=n+2表示序列数值的变化,用f=-f来设置它们知项的符号位。程序如下程序如下:Programex4_12;Varn,f:integer;t,pai:real;beginpai:=0;t:=1;n:=1;f:=1;whileabs(t)=1e-6dobeginpai:=pai+t;n:=n+2;f:=-f;t:=f/n;end;pai:=pai*4;writeln(pai:10:
19、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!,其中n由键盘输入。2、输入任一的自然数A,B,求A,B的最小公倍数。3、小球从100高
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NOIP 循环 结构 程序设计
限制150内