循环结构与数组_第1页
循环结构与数组_第2页
循环结构与数组_第3页
循环结构与数组_第4页
循环结构与数组_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、2021/8/141循环结构与数组2021/8/142循环结构 循环控制结构为计算机程序描述重复计算提供控制手段。一个循环控制结构需指明以下三件事情中的两件: 被循环执行的语句; 是否循环的条件; 详细指明循环方式。 在PASCAL语言,用while,repeat和for三种语句描述循环控制结构2021/8/143例:求S=1+2+3+100的值S:=S+1S:=S+2S:=S+100S:=S+i (i=1,2,100)分析:用S统计所有的和,如果每次加一个数值,需要做100次赋值。从上面的语句可以看出:上述这100个赋值语句有一个共同的特点,都可以抽象成S:=S+i的形式。其中i从1变化到1

2、00。为了简化程序设计,因此有必要采用可以用来重复运行某些语句段的程序结构这就是循环结构。2021/8/144计数循环For 语句For For 语句有两种形式,它们的格式分别是:语句有两种形式,它们的格式分别是:(1)递增循环:for 控制变量 := to do (2)递减循环:for 控制变量 := downto do 2021/8/145For循环语句使用说明:(1)我们一般把表达式1称为记数循环的初值,表达式2称为记数循环的终值。(2)for语句中的初值、终值、控制变量的数据都必须是顺序类型,且类型赋值相容。(3)当初值和终值确定后,循环的次数就确定不变了,并且在重复语句内不能对控制变

3、量施加任何赋值操作。(4)Do后面的语句可以是任何一种语句,我们一般称其为循环体。2021/8/146例:求S=1+2+3+100的值 程序代码段:Var i,s:integer;begin S:=0; For i:=1 to 100 do s:=s+i; Writeln(s=,s);End.S:=S+1S:=S+2S:=S+100S:=S+i (i=1,2,100)分析:用S统计所有的和,如果每次加一个数值,需要做100次赋值。从上面的语句可以看出:上述这100个赋值语句有一个共同的特点,都可以抽象成S:=S+i的形式。其中i从1变化到100。为了简化程序设计,因此有必要采用可以用来重复运行

4、某些语句段的程序结构这就是循环结构。2021/8/147 例:按正、反两种顺序输出26个大写英文字母var ch:char;begin for ch:= A to Z do write(ch); writeln; for ch:=Z downto A do write(ch);end.2021/8/148例:例:NocomachnsNocomachns定理定理任何一个n3一定可以表示成n个连续的奇数和。输入n(n100),输出n3对应的表达式。题解题解 设表达式中的最小奇数为x。 当n=1时,最小奇数x=1,1个奇数;n=2时,最小奇数x=3,2个奇数;n=3时,最小奇数x=7,3个奇数;当n

5、=k时,最小奇数x前已有1+2+k-1个奇数,第k个奇数x=12*2)1(*kk=k*(k-1)+1=n*(n-1)+1。var i,n,a:longint; 循环变量,连续的奇数个数,当前项,类型为长整型begin readln(n); 输入连续的奇数个数 a:=(n*(n-1)+1; 计算最小奇数 for i:=1 to n-1 do 输出表达式的前n-1项begin write(a,+);a:=a+2; end; writeln(a); 输出第n项 readln;end.main2021/8/149例:百鸡问题例:百鸡问题 一只公鸡值5钱,一只母鸡值3钱,而1钱可买3只小鸡。现有100钱

6、,想买100只鸡。问可买公鸡、母鸡、小鸡各几只? 我们通过两重for循环枚举出公鸡和母鸡的所有可能只数。在确定当前公鸡只数为i、母鸡只数为j的情况下, 计算小鸡只数k=100-i-j。然后通过下述布尔表达式i*5+j*3+k/3=100判断当前100只鸡的总价值是否为100钱。如果是,则输出i、j和k。var i,j,k:integer;beginfor i:=1 to 20 do for j:=1 to 33 do begin k:=100-i-j; if i*5+j*3+k/3=100 then writeln(i:5,j:5,k:5); end;for readln;end.main20

7、21/8/1410FOR循环上机练习题 1.求N!=1*2*3*N。(N7) 2.找出100以内所有被2、3、5除余数均为1的数 3.求100999之间的所有水仙花数。所谓水仙花数,是该数等于它各位数字的立方和。例如:153=13+53+33。习题一参考程序var i,n:integer; sum:integer;begin write(input n:); readln(n); sum:=1; for i:=1 to n do sum:=sum*i; writeln(n,!=,sum);end.习题2参考程序vari,n,s:integer;beginfor i:=1 to 100 do i

8、f (i mod 2=1) and (i mod 3=1) and (i mod 5=1) then writeln(i);end.var m,a,b,c:integer;beginfor m:=100 to 999 do begin a := m div 100; b := (m-a*100) div 10; c := m mod 10; if a*a*a + b*b*b + c*c*c = m then writeln(m) endend.2021/8/1411条件循环 For循环语句适用于已知次数的循环结构,但有时我们判断是否结束循环的依据是某个条件是否满足,比如“当时就做”,或者是“一

9、直做到时为止”,这种循环我们称之为条件循环。在Pascal中条件循环语句有两种,分别是While循环语句和Repeat循环语句。接下来我们就分别介绍这两种语句的使用方法。2021/8/1412while语句 while语句用于“当满足某一条件时进行循环”的情况,因此它也被称为“当型循环”。while语句的语法格式如下: while do while循环语句的执行流程如图。布尔表达式循环体falsetruewhile循环语句执行流程While语句使用说明:(1)当布尔表达式为true则执行循环体,若为false,则根本不进入循环体。(2)如果一开始布尔表达式的值就为假时,while循环就会一次循

10、环体都不执行。(3)相反的,如果布尔表达式永远是真的,那么循环就无法结束,从而成为“死循环”。为了避免这种情况的发生,在循环体中就一定要有能改变布尔表达式结果的操作。2021/8/1413repeat语句Repeat 语句用于“重复执行循环体,一直到指定的条件为真时为止”的循环结构,它又被称为“直到型循环”。Repeat语句的语法格式为: repeat 循环体语句 until 布尔表达式repeat循环语句的执行流程见图。布尔表达式循环体truefalse图 repeat循环语句执行流程Repeat语句使用说明:(1)先执行循环体,然后判断当布尔表达式的值,为false,则继续循环,为true

11、则终止循环。(2)为了能使repeat循环重复能终止,与while循环一样,循环体中一定要有影响布尔表达式的操作,否则该循就是一个死循环。(3)与while循环不一样的是,repeat循环不管布尔表达式是否成立,都会至少执行一次循环体。另外需要说明的是,由于while循环与repeat语句都属于条件循环语句,因此一般可以将这两种语句互相转换,而具体使用哪条语句时要看实际情况决定。2021/8/1414例:求某年后的第例:求某年后的第n(nn(n1)1)个闰个闰年年 输入y和n 输出y年后第n个闰年的年号题解题解 若y能被4整除但不能被100整除或y能被400整除,则y是闰年。由此得出判断y是闰

12、年的布尔表达式 (y mod 4=0) and (y mod 1000) or (r mod 400=0)开始时逐年判断。一旦确定y年为闰年的话,则下一个闰年为y+4*s(s1),即每相隔4年后才可能有一个闰年。因此设步长变量s。初值为1;当找到第一个闰年后,s改为4。2021/8/1415var y,n,s:integer; 年号、间隔的闰年数、布长值begin write(begining year and numbers:); readln (y,n); 输入年号和间隔的闰年数 s:=1; 步长值初始化 repeat if (y mod 4=0)and (y mod 1000)or (y

13、 mod 400=0) then begin 若y是闰年,则输出年号 writeln (y,year); _ s:=4; 步长值设为4 end;then _Until _end. mainvar y,n,s:integer; begin write(begining year and numbers:); readln (y,n); s:=1; while n0 do begin if (y mod 4=0)and (y mod 1000) or (y mod 400=0) then begin writeln (y,year); n:=n-1; s:=4; end;then y:=y+s;

14、endEnd.n:=n-1; 间隔的闰年数-1y:=y+s; 移至s年后n=0; 直至输出了n个闰年为止2021/8/1416例:计算Sum=1+3+5+n(n为大于1的奇数),求当Sum10000时,n的最大值Var n,sum,:integer;begin write(input a odd data:); sum:=0; n:=1; writeln(sum) end.while sum10000 dowhile sum=10000拓展:若求当SUMM时,n的最大取值呢2021/8/1417循环使用的一些说明循环的强制终止循环的强制终止一般来说,只要循环的条件及循环体描述得当,循环都能顺利

15、结束,不会产生死循环的。有时在程序运行中会有一些特殊的情况,需要终止当前循环的执行,如果将这个条件写到循环体外有不太方便,这时可以使用break来强制终止当前循环的执行。WhileWhile与与RepeatRepeat语句对比语句对比while和repeat语句一般情况下可以相互替换。它们的主要区别是:while是先判断后执行,而repeat是先执行后判断,因此while语句的循环体有可能一次也不执行,而repeat语句至少执行一次;前者是当条件满足时执行,而后者是当条件不满足时执行;前者的循环体是复合语句时要用begin、end,而后者却不一定要用。2021/8/1418条件控制循环练习1、

16、输入一串字符,以“?”结束,输出其中小写字母个数与数字个数。2、从2开始,输出50个素数3、利用泰勒公式求e的值,直到最后一项小于10-7为止。泰勒公式如下e=1+1/1!+1/2!+1/3!+1/n!var ch:char; n1,n2:integer;begin n1:=0;n2:=0; read(ch); while ch ? do begin if (ch=a) and (ch= 0) and (ch= 9) then n2:=n2+1; read(ch) end; writeln(number of letter:,n1); writeln(number of digit:,n2)e

17、nd.Var n,I,j:integer; flag:boolean;Begin n:=2;i:=1; while i=50 do begin flag:=false; j:=2; while j=trunc(sqrt(n) do beginend; if n mod j=0 then begin flag:=true; break; j:=j+1; end ; if flag=false then begin write(n:4); if (I mod 10=0) then writeln; i:=i+1; end; n:=n+1; end;End.var e,p:real; i:integ

18、er;begin e:=1;p:=1;i:=1; repeat p:=p/i; e:=e+p; i:=i+1 until p1e-7; writeln(e=,e)end.2021/8/1419利用循环输出各种规则图形任意输入一个大写的英文字母,按菱形的方式输出。图为输入D时的显示结果AABAABCBAABCDCBAABCBA ABAA2021/8/1420利用循环输出各种规则图形 对于平面规则图案的输出,一般用一个两重循环来实现,在实现时我们主要从以下几个方面来考虑: 有多少行,一般用外循环来控制;1.每一行的起始位置跟行有什么关系,通常是用write(:有关行的表达式)的形式来控制输出的空格

19、数;2.每一行有多少个输出项(列),用内循环来控制输出;3.具体一个输出项跟行、列有什么关系,直接输出相关输出项有关行和列的表达式。2021/8/1421数组在代数上我们常常这样写:a1,a2.ai.a100(0i101),通过i来指明具体的ai,如i=10时代表a10,在pascal语言里我们也希望能够类似地描述。从前面的变量名里我们已经知道,a1,a2.ai彼此之间是相互独立的,并没有必然的联系。如要象代数上那样,可以使用数组。数组其实是一组相同值类型的变量的集合,这些变量共用一个名,彼此之间通过下标来区别。如定义了数组a,它的下标可以从1到100,那么就可以直接通过ai来指明第i个量,如

20、i=10,ai指的是a10。数组的说明数组的说明可以先通过 type 标识符=array下标范围 of 值类型;然后再在变量说明里引用。 如:type array1=array1.100 of integer; var a,b:array1;也可以直接在变量说明里说明:变量名:array下标范围 of 值类型; 如:var a,b:array1.100 of integer; 描述下标范围一般通过离散(有序)类型,如从一个整数到另一个整数,或者从一个字符到另一个字符等。如: var a:array-5.5 of integer; c:array1.20 of char;d:arraya.z o

21、f integer;数组元素值类型本身也可以是复杂的自定义类型,如子界类型,数组类型,记录等2021/8/1422例:用筛法求100以内的素数分析:素数是除了1和它本身以外没有其它约数的数。用筛法求素数的方法是:用质数筛去合数:从第一个素数2开始,把它的倍数去掉;这样2以后的第一个非0数就一定也是素数,把它的倍数也删了重复这个删数过程,直到在所找到的素数后再也找不到一个非0数。把所有非0数输出。2021/8/1423例:计算灯的开关状态例:计算灯的开关状态 有N个灯放在一排,从1到N依次顺序编号。有N个人也从1到N依次编号。1号将灯全部关闭,2将凡是2的倍数的灯打开;3号将凡是3的倍数的灯作相

22、反处理(该灯如为打开的, 则将它关闭;如关闭的,则将它打开)。以后的人都和3号一样,将凡是自己编号倍数的灯作相反处理。试计算第N个操作后,哪几盏灯是点亮的。(0-表示灯打开,1-表示灯关闭)题解题解 设布尔数组a为n盏灯的状态。初始时,所有的灯打开,即a数组的每一个元素设为false。然后依次将每盏灯序号的倍数作取反处理,由此得出的a数组元素的序数值即为最后的灯状态。var k,n,i,j:integer;a:array1.100of boolean; N盏灯的状态begin readln (n); 读入灯的数目 for i:=1 to n do ai:=false; 初始时所有灯打开 for

23、 i:=1 to n do 依次进行n次操作 begin j:=i; 从第i号队员出发进行第i次操作 while j=n do begin aj:=not(aj);j:=j+i; 将凡是i的倍数的灯作取反处理 end;while end;for for i:=1 to n do write(ord(ai); 输出n次操作后的结果 writeln;end.main2021/8/1424字符串在Pascal中,字符类型只可以处理一个字符的内容,而实际生活中我们经常要处理到的是大量的字、词、句等文字信息。为了使程序能够处理这些文字信息,Turbo Pascal特别引入了字符串类型,即一组具有可变长度的字符序列。 字符串类型定义形式为: stringn或者string字符串可以参加的运算有:连接运算、关系运算和赋值运算三种。连接运算是用“+”符号将两个字符串连接成一个字符串,如:“Turbo”+“Pascal”的结果为“TurboPascal”。字符串的关系运算用于字符串的比较,字符串的比较是按字典顺序进行的,其结果是一个布尔值。以下字符串的关系运算结果均为true:ABC= ABCABCabcPascal

温馨提示

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

评论

0/150

提交评论