9 循环结构.docx

上传人:b****3 文档编号:4214004 上传时间:2023-05-06 格式:DOCX 页数:16 大小:47.37KB
下载 相关 举报
9 循环结构.docx_第1页
第1页 / 共16页
9 循环结构.docx_第2页
第2页 / 共16页
9 循环结构.docx_第3页
第3页 / 共16页
9 循环结构.docx_第4页
第4页 / 共16页
9 循环结构.docx_第5页
第5页 / 共16页
9 循环结构.docx_第6页
第6页 / 共16页
9 循环结构.docx_第7页
第7页 / 共16页
9 循环结构.docx_第8页
第8页 / 共16页
9 循环结构.docx_第9页
第9页 / 共16页
9 循环结构.docx_第10页
第10页 / 共16页
9 循环结构.docx_第11页
第11页 / 共16页
9 循环结构.docx_第12页
第12页 / 共16页
9 循环结构.docx_第13页
第13页 / 共16页
9 循环结构.docx_第14页
第14页 / 共16页
9 循环结构.docx_第15页
第15页 / 共16页
9 循环结构.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

9 循环结构.docx

《9 循环结构.docx》由会员分享,可在线阅读,更多相关《9 循环结构.docx(16页珍藏版)》请在冰点文库上搜索。

9 循环结构.docx

9循环结构

循环结构

循环结构就是重复结构,是指某些语句需要重复执行而设定的程序结构。

在PASCAL语言中,共有三种重复结构语句,功能各有不同。

直到循环(REPEAT-UNTIL)类型

直到循环语句的语法格式是:

repeat语句序列;

 (循环体)

until布尔表达式;

其作用是:

重复执行语句序列(循环体),直到布尔表达式的值为TRUE为止。

即,当执行完一次语句序列后,布尔表达式的值已经为TRUE了,这时循环将不会再被执行,而转向执行UNTIL语句以下的语句。

例:

计算M=1+2+3+4+……,直到M的值大于5050为止。

[例:

5、1]

varm,I:

integer;

begin

m:

=0;

I:

=0;

Repeat

I:

=I+1;

M:

=m+I;

Untilm>5050;

Writeln(I,’’,m);

End.

在上述程序中,我们使用了PASCAL中的两个作用强大的概念:

累加和循环。

累加:

我们在上述程序中没定了两个累加器:

I,M。

累加器初值我们在第一句中设定了为0,之后每次运行一次I:

=I+1后,I的值就比原来大1。

每运行一次M:

=M+I后,M的值就被M+I所替代。

循环:

这里我们使用的是直到循环,即重复执行循环体中的两个语句,直到M>5050这个条件满足为止(即这个布尔表达式的值为TRUE为止)。

上述程序运行后,会在输出屏幕上显示两个值:

1015151。

即当I的值为101时,这时所算得的M的值为5151。

亦即,1+2+3+……101=5151。

象上述这种X=1+2+3+……这种加法,我们就把它叫累加,这里的X就是累加器,一般初值为0。

而N=1*2*3*4*5*6*……这种乘法我们把它叫累乘,这里N就是累乘器,一般初值为1(为什么?

)。

一般的:

1*2*3*……N,我们把这个式子的结果叫做N的阶乘(N!

)。

如:

4!

=1*2*3*4。

例:

计算18!

[例5、2]

varI:

integer;

x:

longint;

begin

I:

=0;

X:

=1;

Repeat

I:

=I+1;

X:

=x*I;

UntilI=18;

Writeln(x);

End.

当程序开始时,I的初值被定为0,X的初值被定为1(累乘器)。

然而开始进入循环,每次I的值比原来增加1,然后再乘进X中去,直到I等于20时,最后一次把I乘进X后,这时I=20这个条件已经满足(I=20的值已经为TRUE),所以循环就被退出,而程序转向执行UBTIL以后的语句:

WRITELN(X);。

请大家想一想,为什么X要定义为LONGINT型。

练习:

1、输入一个正整数N,把它分解成质因子相乘的形式。

  如:

36=1X2X2X3X3;19=1X19

  (提示:

设因子为I,从2开始到N,让N重复被I除,如果能整除,则用商取代N,I为一个因子;如果不能整除,再将I增大,继续以上操作,直到I等于N。

当(WHILE)语句

当语句的语法格式是:

while布尔表达式dobegin

 语句序列;(循环体)

end;

其作用是,当布尔表达式的值为TRUE时,才会运行语句序列(循环体),否则循环将不会被执行,即从循环头部就退出,而转向执行END后的语句。

例:

计算18!

[例5、3]

varI:

integer;

x:

longint;

begin

I:

=0;

X:

=1;

WhileI<18dobegin

I:

=I+1;

X:

=x*I;

End;

Writeln(x);

End.

请大家把此程序与上一节的[例5、2]进行比较,看两种循环在运用时有何不同。

WHILE语句是在循环开始时就判断布尔表达式的值时否为TRUE,如果为TRUE,就进入循环,运行循环体,如果为FALSE,就不运行循环体,而直接转向执行END后的语句WRITELN(X);。

REPEAT与WHILE循环的示意框图如下所示:

从上述框图中可以看出,要使用循环语句时,必须要确定循环体及条件(布尔表达式)两个重要因素,亦即首要考虑的是:

我要重复执行哪些语句,我要重复到什么时候为止!

[例5、4],从键盘上输入两个整数M,N,求它们的最大公约数。

分析:

我们只需从M,N中更小的一个数开始,每次让其减1,直到这个数能同时被M和N数整除为止。

在下述程序中,我们在程序头部调用了CRT单元,是为了使用CLRSCR语句来清屏,即把输出屏幕上的字符清除干净。

Usescrt;{调用CRT单元}

Varm,n,x:

integer;

Begin

Clrscr;{清屏}

Write(‘Pleaseinput2numbers:

’)

Readln(m,n);

Ifm>nthenx:

=nelsex:

=m;

While(nmodx<>0)or(mmodx<>0)dobegin

x:

=x-1;

End;

Writeln(x);

End.

上述程序如果改用REPEAT语句来做的话,程序为:

usescrt;

varm,n,x:

integer;

begin

write(‘Pleaseinput2numbers:

’)

Readln(m,n);

Ifm>nthenx:

=n+1elsex:

=m+1;

Repeat

X:

=x-1;

Until(mmodx=0)and(nmodx=0);

Writeln(x);

End.

请大家考虑上述两个程序为何会有这样有不同之处。

练习题

  1、计算下列式子的值:

  

(1)1+3+……+99

  

(2)1+2+4+8+……+128+256

  2、输入一个整数,计算它各位上数字的和。

(注意:

是任意位的整数)

  3、输入一整数A,判断它是否质数。

(提示:

若从2到A的平方根的范围内,没有一个数能整除A,则A是质数。

  4、求两个数的最小公倍数和最大公约数。

(提示:

公约数一定小于等于两数中的小数,且能整除两数中的大数。

公倍数一定大于等于两数中的大数,且是大数的倍数,又能给两数中的小数整除。

  5、编写一个译码程序,把一个英语句子译成数字代码。

译码规则是以数字1代替字母A,数字2代替字母B,……,26代替字母Z,如遇空格则打印一个星号‘*’,英文句子以‘.‘结束。

  6、求水仙花数。

所谓水仙花数,是指一个三位数abc,如果满足a^3+b^3+c^3=abc,则abc是水仙花数。

  7、“百钱买百鸡”是我国古代的著名数学题。

题目这样描述:

3文钱可以买1只公鸡,2文钱可以买一只母鸡,1文钱可以买3只小鸡。

用100文钱买100只鸡,那么各有公鸡、母鸡、小鸡多少只?

与之相似,有"鸡兔同笼"问题。

FOR循环语句

 前面所计的两个语句都是在未知循环次数的情况下而用的循环语句,但在程序中,如果我们已经知道循环的次数而来编程序的话,就可以使用FOR循环语句,这也是PASCAL及其它高级语言中用得最多的语句。

其语法格式有两种,如下:

(1)增量为1:

for变量名:

=初值to终值dobegin

 语句序列(循环体);

end;

(2)增量为-1:

for变量名:

=初值downto终值dobegin

 语句序列(循环体);

end;

变量名的类型由程序头部中定义,而其初值、终值必须和它是同一类型。

该变量的类型是能是有序数据类型。

上述两种格式都是用变量的初值与终值来规定循环的次数。

如以下两个小程序:

VarI:

integer;

Begin

ForI:

=1to5dobegin

 Write(I);

End;

End.

运行结果:

12345

VarI:

integer;

Begin

ForI:

=5downto1dobegin

 Write(I);

End;

End.

运行结果:

54321

由上可以看出FOR循环的作用。

[例5、5]:

从键盘输入一个字符串,把它按正序及逆序分别输出:

usescrt;

vars:

string;

l,I:

integer;

begin

clrscr;

write(‘Pleaseinputthestring:

’);

readln(s);

l:

=length(s);

forI:

=1toldobegin

 write(s[I]);

end;

writeln;

forI:

=ldownto1dobegin

 write(s[I]);

end;

end.

[例5、6]计算

usescrt;

vars,a:

integer;

begin

clrscr;

s:

=0;

fora:

=1to10dobegin

 s:

=s+a*a;

end;

writeln(s);

end.

[例5、7]:

计算:

1+3+5+7+……101的值:

usescrt;

varm,n:

integer;

begin

clrscr;

m:

=0;

forn:

=0to50dobegin

 m:

=m+(2*n+1);

end;

writeln(m);

end.

请大家注意上述程序中的几个小技巧,一个是FORN:

=0TO50,共循环51次;一个是M:

=M+(2*N+1),其是的2*N+1得到的是一序列的奇数。

多重循环语句

多重循环语句即循环嵌套,也就是一个循环语句的循环体中还有循环语句。

[例5、8]编程序打印九九乘法表:

usescrt;

varI,j:

integer;

begin

clrscr;

forI:

=1to9dobegin

 forj:

=1to9dobegin

  write(j:

1,’*’,i:

1,’=’,I*j:

2);

 end;

 writeln;

end;

end.

运行结果:

1*1=1

2*1=2

3*1=3

4*1=4

5*1=5

6*1=6

7*1=7

8*1=8

9*1=9

1*2=2

2*2=4

3*2=6

4*2=8

5*2=10

6*2=12

7*2=14

8*2=16

9*2=18

1*3=3

2*3=6

3*3=9

4*3=12

5*3=15

6*3=18

7*3=21

8*3=24

9*3=27

1*4=4

2*4=8

3*4=12

4*4=16

5*4=20

6*4=24

7*4=28

8*4=32

9*4=36

1*5=5

2*5=10

3*5=15

4*5=20

5*5=25

6*5=30

7*5=35

8*5=40

9*5=45

1*6=6

2*6=12

3*6=18

4*6=24

5*6=30

6*6=36

7*6=42

8*6=48

9*6=54

1*7=7

2*7=14

3*7=21

4*7=28

5*7=35

6*7=42

7*7=49

8*7=56

9*7=63

1*8=8

2*8=16

3*8=24

4*8=32

5*8=40

6*8=48

7*8=56

8*8=64

9*8=72

1*9=9

2*9=18

3*9=27

4*9=36

5*9=45

6*9=54

7*9=63

8*9=72

9*9=81

注意:

循环有嵌套时,必须分清层次,切不可把循环进行交叉。

[例5、9]编程序分别打印以下三图:

(1)

Usescrt;

VarI,j:

integer;

Begin

Clrscr;

ForI:

=1to5dobegin

Forj:

=1to5dobegin

Write(‘*’);

End;

Writeln;

End;

End.

(2)

Usescrt;

VarI,j:

integer;

Begin

Clrscr;

ForI:

=1to5dobegin

Write(‘’:

20+i);

Forj:

=1to5dobegin

Write(‘*’);

End;

Writeln;

End;

End.

(3)

Usescrt;

VarI,j:

integer;

Begin

Clrscr;

ForI:

=1to5dobegin

Write(‘’:

20-I);

Forj:

=1to5dobegin

Write(‘*’);

End;

Writeln;

End;

End.

请大家注意看清上述三个小程序,其功能是分别打印出上述三个由“*”组成的小图形。

三个图形的不同之处是:

第一个直上直下,是个矩形;第二个是左斜的平行四边形;第三个是右斜的平行四边形。

所以三个对应的程序也就有所不同,第

(2)、(3)个程序比第

(1)个多了一句,即显示红色的那一句。

这两句的作用是使每一行开头打印几个空格,即让图形左或右斜。

WRITELN的作用是打印完一行后换行。

[例5、10]编程打印下列图形:

Usescrt;

VarI,j:

integer;

Begin

Clrscr;

ForI:

=1to5dobegin

 Write(‘’:

20-I);

 Forj:

=1to2*I-1dobegin

  Write(I:

1);

 End;

 Writeln;

End;

End.

清屏

打印每一行前的20-I个空格,这样每行都比上一行左移

每一行打印2*I-1列

打印该行行数

[例5、11]打印1—100间的所有素数:

素数,即为除了1和它本身外没有另外的因数的整数。

所以我们判断一个数N是否素数,可以用2至N-1所有数去除N,如果没有一个数能被N整除,则N为素数。

当然,其实我们可以不用用2至N-1这第多的数去除,而只需用2至不大于N的平方根的整数去除N即可(为什么)?

这里我们的程序就用2至TRUNC(SQRT(N))来判断,到后面我们还会谈到:

如果要判断一个数是否素数,可只用小于TRUNC(SQRT(N))的所有素数去除即可。

VarI,j:

integer;

P:

boolean;

Begin

ForI:

=2to100dobegin

 P:

=true;

 Forj:

=2totrunc(SQRT(I))do  begin

   IfImodj=0thenp:

=false;

  End;

 Ifpthenwrite(I:

5);

End;

End.

循环从2至100

再判断I是否素数前,先把判断器P的值设为TRUE

用2至trunc(SQRT(I))的数来除I

如果I能整除J,则P的值改为FALSE

如果P的值仍为TRUE,则I就是素数,打印出来

[例5、12]以下是A,B,C三人说的话:

A:

“B在说谎”;B:

“C在说谎”;C:

“A、B都在说谎”。

现在问,到底谁说真话,谁说谎?

分析:

A、B、C三人,要么说谎,要么说真话,即三个的状态要么为FALSE,要么为TRUE,所以,可让A、B、C三个变量进行循环,循环初值为TRUE,终值为FALSE。

而三个人所说的话即为三个逻辑表达式,其值也为TRUE或FALSE,并且与A、B、C的值是有关系的。

A、B、C三个所说的话转化为逻辑表达式即为:

A:

B=FLASE;

B:

C=FALSE;

C:

(A=FALSE)AND(B=FALSE)

以上三个逻辑表达式的值中,TRUE的个数应该与A、B、C三个变量中TRUE的个数相同。

并且,每一个变量的值应该与其对应的话的逻辑表达式的值相等。

如:

A应该等于(B=FALSE)这个逻辑表达式。

程序如下:

Vara,b,c:

boolean;

Begin

Fora:

=falsetotruedobegin

Forb:

=falsetotruedobegin

Forc:

=falsetotruedobegin

If(a=(b=false))and(b=(c=false))and(c=((a=false)and(b=false)))

thenBegin

Writeln(a:

10,b:

10,c:

10);

End;

End;

End;

End;

End.

练习:

  1、计算下列式子的值:

  

(1)1+2+……+100

  

(2)1+3+5+……+97+99

  2、输入一个四位数,求它各位上数字的和。

  3、求水仙花数。

所谓水仙花数,是指一个三位数abc,如果满足a^3+b^3+c^3=abc,则abc是水仙花数。

4、宰相的麦子:

相传古印度宰相达依尔,是国际象棋的发明者。

有一次,国王因为他的贡献要奖励他,问他想要什么。

达依尔说:

“只要在国际象棋棋盘上(共64格)摆上这么些麦子就行了:

第一格一粒,第二格两粒,……,后面一格的麦子总是前一格麦子数的两倍,摆满整个棋盘,我就感恩不尽了。

”国王一想,这还不容易,刚想答应,如果你这时在国王旁边站着,你会不会劝国王别答应,为什么?

练习

1、随机产生一些1—100之间的整数,直到产生的数为50为止。

2、计算1—1000之间能同时被3和5整除的整数的和。

3、打印下列图形:

4、一百匹马驮一百块瓦,一匹大马可以驮3块,一匹母马可驮2块,小马2匹可驮1块。

试编程求需要各种马多少匹?

5、有三种纪念邮票,第一种每套一张售价2元,第二种每套一张售价4元,第三种每套9张售价2元。

现用100元买了100张邮票,问这三种邮票各买几张?

6、赵、钱、孙、李、周五人围着一张圆桌吃饭。

饭后,周回忆说:

“吃饭时,赵坐在钱旁边,钱的左边是孙或李”;李回忆说:

“钱坐在孙左边,我挨着孙坐”。

结果他们一句也没有说对。

请问,他们在怎样坐的?

7、找数。

一个三位数,各位数字互不相同,十位数字比个位、百位数字之和还要大,且十位、百位数字之和不是质数。

编程找出所有符合条件的三位数。

注:

1.不能手算后直接打印结果。

2.“质数”即“素数”,是指除1和自身外,再没有其它因数的大于1的自然数。

8、选人。

一个小组共五人,分别为A、B、C、D、E。

现有一项任务,要他们中的3个人去完成。

已知:

(1)A、C不能都去;

(2)B、C不能都不去;(3)如果C去了,D、E就只能去一个,且必须去一个;(4)B、C、D不能都去;(5)如果B去了,D、E就不能都去。

编程找出此项任务该由哪三人去完成的所有组合。

9、输入一个字符串,内有数字和非数字字符。

如A123X456Y7A,302ATB567BC,打印字符串中所有连续(指不含非数字字符)的数字所组成的整数,并统计共有多少个整数。

10、A、B、C三人进入决赛,赛前A说:

“B和C得第二,我得第一”;B说:

“我进入前两名,丙得第三名”;C说:

“A不是第二,B不是第一”。

比赛产生了一、二、三名,比赛结果显示:

获得第一的选手全说对了,获得第二的选手说对了一句,获得第三的选手全说错了。

编程求出A、B、C三名选手的名次。

11、甲、乙、丙、丁四人共有糖若干块,甲先拿出一些糖分给另外三人,使他们三人的糖数加倍;乙拿出一些糖分给另外三人,也使他们三人的糖数加倍;丙、丁也照此办理,此时甲、乙、丙、丁四人各有16块,编程求出四个人开始各有糖多少块。

12、截数问题:

任意一个自然数,我们可以将其平均截取成三个自然数。

例如自然数135768,可以截取成13,57,68三个自然数。

如果某自然数不能平均截取(位数不能被3整除),可将该自然数高位补零后截取。

现编程从键盘上输入一个自然数N(N的位数<12),计算截取后第一个数加第三个数减第二个数的结果。

13、从键盘输入一段英文,将其中的英文单词分离出来:

已知单词之间的分隔符包括空格、问号、句号(小数点)和分号。

例如:

输入:

Thereareapples;orangesandpeachesonthetable.

输出:

there

are

apples

oranges

and

peaches

on

the

table

14、山乡希望小学收到一箱捐赠图书,邮件上署名是“兴华中学高二班”,山乡希望小学校长送来了感谢信,可是兴华中学高二年级有四个班,校长找来了四个班的班长,问他们是哪个班做的这件好事。

一班的班长说:

“是四班做的。

”二班的班长说:

“是三班做的好事。

”三班的班长说:

“不是我们班。

”四班的班长说:

“三班的班长说的不对。

四个班的班长都说不是自己班做的,这就难坏了校长,后来得知四个班的班长中有两个说得是真话,有两个没有说真话,请你利用计算机的逻辑判断编一个程序,找出究竟是哪个班做了这件好事。

不能手算后直接打印结果。

15、A,B,C,D,E五个人合伙夜间捕鱼,凌晨时都疲惫不堪,各自在河边的树丛中找地方睡着了,日上三竿,E第一个醒来,他将鱼数了数,平分成五分,把多余的一条扔进河中,拿走一份回家去了,D第二个醒来,他并不知道有人已经走了,照样将鱼平分成五分,又扔掉多余的一条,拿走自己的一份,接着C,B,A依次醒来,也都按同样的办法分鱼(平分成五份,扔掉多余的一条,拿走自己的一份),问五人至少合伙捕到多少条鱼。

也许你能用数学办法推出鱼的条数,但我们的要求你编出一个程序,让计算机帮你算出鱼的总数。

16、试编程找出能被各位数字之和整除的一切两位数。

17、一个正整数的个位数字是6,如果把个位数字移到首位,所得到的数是原数的4倍,试编程找出满足条件的最小正整数。

18、某本书的页码从1开始,小明算了算,总共出现了202个数1,试编程求这本书一共有多少页?

19、从键盘上输入两个不超过32767的整数,试编程序用竖式加法形式显示计算结果。

例如:

输入123,85

显示:

 123

  + 85

  -------------

   208

 

20、有30个男人女人和小孩同在一家饭馆进餐,共花了五十先令,其中男宾3先令,女宾2先令,小孩1先令。

试编程求出男人女人小孩各多少人?

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 成人教育 > 成考

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2