循环结构FrWhileRepeat.docx
- 文档编号:26089843
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:17
- 大小:43.56KB
循环结构FrWhileRepeat.docx
《循环结构FrWhileRepeat.docx》由会员分享,可在线阅读,更多相关《循环结构FrWhileRepeat.docx(17页珍藏版)》请在冰豆网上搜索。
循环结构FrWhileRepeat
循环结构(For、While、Repeat)
循环结构就是重复结构,是指某些语句需要重复执行而设定的程序结构。
在PASCAL语言中,共有三种重复结构语句,功能各有不同。
直到循环(REPEAT-UNTIL)类型
直到循环语句的语法格式是:
repeat语句序列;
(循环体)
until布尔表达式;
其作用是:
重复执行语句序列(循环体),直到布尔表达式的值为TRUE为止。
即,当执行完一次语句序列后,布尔表达式的值已经为TRUE了,这时循环将不会再被执行,而转向执行UNTIL语句以下的语句。
例:
计算M=1+2+3+4+……,直到M的值大于5050为止。
[例:
五、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!
[例五、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型。
练习:
一、输入一个正整数N,把它分解成质因子相乘的形式。
如:
36=1X2X2X3X3;19=1X19
(提示:
设因子为I,从2开始到N,让N重复被I除,如果能整除,则用商取代N,I为一个因子;如果不能整除,再将I增大,继续以上操作,直到I等于N。
)
当(WHILE)语句
当语句的语法格式是:
while布尔表达式dobegin
语句序列;(循环体)
end;
其作用是,当布尔表达式的值为TRUE时,才会运行语句序列(循环体),不然循环将不会被执行,即从循环头部就退出,而转向执行END后的语句。
例:
计算18!
[例五、3]
varI:
integer;
x:
longint;
begin
I:
=0;
X:
=1;
WhileI<18dobegin
I:
=I+1;
X:
=x*I;
End;
Writeln(x);
End.
请大家把此程序与上一节的[例五、2]进行比较,看两种循环在运历时有何不同。
WHILE语句是在循环开始时就判断布尔表达式的值时否为TRUE,若是为TRUE,就进入循环,运行循环体,若是为FALSE,就不运行循环体,而直接转向执行END后的语句WRITELN(X);。
REPEAT与WHILE循环的示意框图如下所示:
从上述框图中能够看出,要利用循环语句时,必需要肯定循环体及条件(布尔表达式)两个重要因素,亦即首要考虑的是:
我要重复执行哪些语句,我要重复到何时为止!
[例五、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+3+……+99
(2)1+2+4+8+……+128+256
二、输入一个整数,计算它列位上数字的和。
(注意:
是任意位的整数)
3、输入一整数A,判断它是不是质数。
(提示:
若从2到A的平方根的范围内,没有一个数能整除A,则A是质数。
)
4、求两个数的最小公倍数和最大公约数。
(提示:
公约数必然小于等于两数中的小数,且能整除两数中的大数。
公倍数必然大于等于两数中的大数,且是大数的倍数,又能给两数中的小数整除。
)
五、编写一个译码程序,把一个英语句子译成数字代码。
译码规则是以数字1代替字母A,数字2代替字母B,……,26代替字母Z,如遇空格则打印一个星号‘*’,英文句子以‘.‘结束。
六、求水仙花数。
所谓水仙花数,是指一个三位数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]:
从键盘输入一个字符串,把它按正序及逆序别离输出:
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.
[例五、6]计算
usescrt;
vars,a:
integer;
begin
clrscr;
s:
=0;
fora:
=1to10dobegin
s:
=s+a*a;
end;
writeln(s);
end.
[例五、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取得的是一序列的奇数。
多重循环语句
多重循环语句即循环嵌套,也就是一个循环语句的循环体中还有循环语句。
[例五、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
注意:
循环有嵌套时,必需分清层次,切不可把循环进行交叉。
[例五、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的作用是打印完一行后换行。
[例五、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列
打印该行行数
[例五、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就是素数,打印出来
[例五、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+2+……+100
(2)1+3+5+……+97+99
二、输入一个四位数,求它列位上数字的和。
3、求水仙花数。
所谓水仙花数,是指一个三位数abc,若是知足a^3+b^3+c^3=abc,则abc是水仙花数。
4、宰相的麦子:
相传古印度宰相达依尔,是国际象棋的发明者。
有一次,国王因为他的奉献要奖励他,问他想要什么。
达依尔说:
“只要在国际象棋棋盘上(共64格)摆上这么些麦子就好了:
第一格一粒,第二格两粒,……,后面一格的麦子老是前一格麦子数的两倍,摆满整个棋盘,我就感恩不尽了。
”国王一想,这还不容易,刚想承诺,若是你这时在国王隔壁站着,你会不会劝国王别承诺,为何?
练习
一、随机产生一些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的自然数。
八、选人。
一个小组共五人,别离为A、B、C、D、E。
现有一项任务,要他们中的3个人去完成。
已知:
(1)A、C不能都去;
(2)B、C不能都不去;(3)若是C去了,D、E就只能去一个,且必需去一个;(4)B、C、D不能都去;(5)若是B去了,D、E就不能都去。
编程找出此项任务该由哪三人去完成的所有组合。
九、输入一个字符串,内有数字和非数字字符。
如A123X456Y7A,302ATB567BC,打印字符串中所有持续(指不含非数字字符)的数字所组成的整数,并统计共有多少个整数。
10、A、B、C三人进入决赛,赛前A说:
“B和C得第二,我得第一”;B说:
“我进入前两名,丙得第三名”;C说:
“A不是第二,B不是第一”。
比赛产生了一、二、三名,比赛结果显示:
取得第一的选手全说对了,取得第二的选手说对了一句,取得第三的选手全说错了。
编程求出A、B、C三名选手的名次。
1一、甲、乙、丙、丁四人共有糖若干块,甲先拿出一些糖分给另外三人,使他们三人的糖数加倍;乙拿出一些糖分给另外三人,也使他们三人的糖数加倍;丙、丁也照此办理,现在甲、乙、丙、丁四人各有16块,编程求出四个人开始各有糖多少块。
1二、截数问题:
任意一个自然数,咱们能够将其平均截取成三个自然数。
例如自然数135768,能够截取成13,57,68三个自然数。
若是某自然数不能平均截取(位数不能被3整除),可将该自然数高位补零后截取。
现编程从键盘上输入一个自然数N(N的位数<12),计算截取后第一个数加第三个数减第二个数的结果。
13、从键盘输入一段英文,将其中的英文单词分离出来:
已知单词之间的分隔符包括空格、问号、句号(小数点)和分号。
例如:
输入:
Thereareapples;orangesandpeachesonthetable.
输出:
there
are
apples
oranges
and
peaches
on
the
table
14、山乡希望小学收到一箱捐赠图书,邮件上签名是“兴华中学高二班”,山乡希望小学校长送来了感激信,可是兴华中学高二年级有四个班,校长找来了四个班的班长,问他们是哪个班做的这件好事。
一班的班长说:
“是四班做的。
”二班的班长说:
“是三班做的好事。
”三班的班长说:
“不是咱们班。
”四班的班长说:
“三班的班长说的不对。
”
四个班的班长都说不是自己班做的,这就难坏了校长,后来得知四个班的班长中有两个说得是真话,有两个没有说真话,请你利用计算机的逻辑判断编一个程序,找出究竟是哪个班做了这件好事。
不能手算后直接打印结果。
1五、A,B,C,D,E五个人合股夜间打鱼,凌晨时都疲惫不堪,各自在河边的树丛中找地方睡着了,日上三竿,E第一个醒来,他将鱼数了数,平分成五分,把多余的一条扔进河中,拿走一份回家去了,D第二个醒来,他并非明白有人已经走了,照样将鱼平分成五分,又扔掉多余的一条,拿走自己的一份,接着C,B,A依次醒来,也都按一样的办法分鱼(平分成五份,扔掉多余的一条,拿走自己的一份),问五人至少合股捕到多少条鱼。
也许你能用数学办法推出鱼的条数,但我们的要求你编出一个程序,让计算机帮你算出鱼的总数。
1六、试编程找出能被列位数字之和整除的一切两位数。
17、一个正整数的个位数字是6,若是把个位数字移到首位,所取得的数是原数的4倍,试编程找出知足条件的最小正整数。
1八、某本书的页码从1开始,小明算了算,总共出现了202个数1,试编程求这本书一共有多少页?
1九、从键盘上输入两个不超过32767的整数,试编程序用竖式加法形式显示计算结果。
例如:
输入123,85
显示:
123
+ 85
-------------
208
20、有30个男人女人和小孩同在一家饭馆进餐,共花了五十先令,其中男宾3先令,女宾2先令,小孩1先令。
试编程求出男人女人小孩各多少人?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 循环 结构 FrWhileRepeat