pascal循环讲义.docx
- 文档编号:18403834
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:18
- 大小:21.64KB
pascal循环讲义.docx
《pascal循环讲义.docx》由会员分享,可在线阅读,更多相关《pascal循环讲义.docx(18页珍藏版)》请在冰点文库上搜索。
pascal循环讲义
信息学讲义循环与数组(课程由老师自行设置,仅提供一个建议)
第1—2课计数循环(for)语句
是一种已知循环次数(如班级中的总人数)的循环结构
通过计数来控制重复语句的执行次数
分为两种:
递增型循环
递减型循环
一、递增型for循环
格式:
for循环控制变量:
=初值to终值do
循环体语句;{可以是复合语句}
例:
fori:
=5to10dowrite(i);
或写成:
fori:
=5to10do
write(i);
二、功能与执行流程
先把初值赋给循环控制变量;
再将初值与终值进行比较:
当初值小于等于终值时,执行循环体;
功能与执行流程
再使循环控制变量在其原值基础上加1,继续与终值比较。
若仍然小于等于终值,则再次执行循环体;GOTO3;
否则(即此时循环变量已大于终值),循环结束,执行循环语句的下一条语句
注意:
如果循环体中有多条语句,可以将其设计成复合语句(即用begin和end括起来)
循环变量的初值和终值可以是常量、变量或表达式,如:
n:
=5;
fori:
=nton*ndo……;
循环变量必须与初值、终值的数据类型相同,并且必须是有序(整型、字符型、布尔型等,不能是实型,因为循环控制变量是按序变化的)
在递增型for结构中,循环控制变量按SUCC(x)函数规律变化;在递减型for结构中,按PRED(x)函数规律变化。
例如:
当x为整型值时,后续值为原值加1,前趋值为原值减1;
x为字符型数据时,其前趋或后继值按ASCII码顺序计算,如‘k’的前趋是‘j’,后继是‘l’
循环体中可以是单个语句,也可以是复合语句,如:
fori:
=10to30do
begin
m:
=m+i;
writeln(m,’‘,i);
end;
初值与终值在开始重复之前计算,在重复执行的过程中,其值不受影响;
在循环中,一般情况下,不要对循环控制变量进行赋值操作
在递增型for循环中,如果一开始初值就大于终值,则不执行循环,即循环的次数为0;
循环控制变量的步长为1或-1
问题:
循环结束时,循环控制变量的值是多少?
该如何来调整循环控制变量的步长?
例题
例4-22:
计算1+2+3+…+100之和。
(见教材P50)
思考题:
见蓝书教材P51(上机编程练习)
例4-23:
键入一个自然数,求出这个自然数的所有约数之和。
(见教材P50)(上机练习)
例4-24:
编程找出四位整数abcd中满足下述关系的数:
(ab+cd)(ab+cd)=abcd
三、递减型for循环
指每次执行for语句时,循环变量减1
格式:
for循环控制变量:
=初值downto终值do
循环体语句;
例:
fori:
=25downto2dowriteln(i);
或写成:
fori:
=25downto2do
writeln(i);
问题:
该循环一共执行了多少次?
输出结果如何?
例6-3大侦探柯南非常喜欢观察问题和分析问题,他为取得罪犯能否在现场出现的证据,亲自实践罪犯可能的行走路线。
第一条路线他用了92min,第二条路线用了82min。
他在每一条路线上用的时间都比上一条路线少10min,直到第九条路线,他用了12min。
问柯南走完这九条路线共用了多长时间?
问题分析
已知:
这九条路线的用时分别是92、82、72、62、52、42、32、22、12分钟。
求:
t=12+22+32+……+92
采用for循环语句:
将t作为累加器
循环控制变量为i,它从1变到9
t和i两者之间的关系为:
t:
=t+10*i+2
programe6_3(input,output);
vari,t:
integer;
begin
t:
=0;
fori:
=1to9do
t:
=t+10*i+2;
writeln(t);
end.
上机练习:
编写计算s=1+3+5+7+…+99的程序。
问题分析与主要思路
fori:
=1to50do
s:
=s+2*i-1;
writeln(s)
例6-4求水仙花数。
所谓水仙花数,即指这样的一种三位数abc,它满足:
a3+b3+c3=abc
例如,153=13+53+33,因而153就是一个水仙花数。
问题分析
可以利用for循环来解决这个问题
由于水仙花数是三位数,因而,循环控制变量可以从100开始变化,终值是999
对100~999之间的每一个三位数进行检查,看它是否满足上面的关系式。
这种算法称为“穷举法”
如何将一个三位数的各位取出来呢?
看一个三位数的例子345:
345=3*100+4*10+5
345整除100的结果即为百位数字3
345–3*100=45;45整除10的结果即为十位数字4
用原数除10取余数,即得到个位数字5
programe6_4(input,output);
vari,a,b,c,k:
integer;
begin
fori:
=100to999do
begin
a:
=idiv100;{取出百位数a}
b:
=idiv10–10*a;{取出十位数b}
c:
=imod10;{取出个位数c}
k:
=a*a*a+b*b*b+c*c*c;
ifk=ithenwriteln(“水仙花数是”,i);
end;
End.
第3-4课当型循环(while)语句
第3课
使用for循环语句编程时,需要预先知道循环次数
对于预先不能确定循环次数的问题,可以用“当型”(while)语句来解决
格式:
while布尔表达式do
语句;
while语句的执行流程
首先,求“布尔表达式”的值,当其值为真(true)时,进入循环执行do后面的语句(称为“循环体”);否则,转步骤3;
然后,执行完循环体后,再返回开头(步骤1)求布尔表达式的值;
不执行循环,执行while语句的下一条语句
一个问题:
如果首次计算“布尔表达式”时,其值就不为真,那么循环体还会被执行吗?
while语句的用法举例
例6-5求s=2+6+10+…+98的值。
问题分析
此问题尽管也可以用for语句来实现,但我们在此处用while语句来实现,即不是利用预先确定的循环次数来控制循环,而是利用一个条件(布尔)表达式来控制循环的结束,该表达式就是x<=98
问题分析
采用累加的方法,即定义一个变量s,用它来存放累加的和
用变量x表示待累加的数据,它的初值为2,每次循环后加4
programe6_5(input,output);
vars,x:
integer;
begin
x:
=2;
s:
=0;
whilex<=98do
begin
s:
=s+x;
x:
=x+4;
end;
writeln(‘s=’,s);
end.
有关while语句用法的说明
为了使while循环能正常结束(而不致造成死循环),布尔表达式中所含变量的值在循环中一定要有所更改(如上例中的x:
=x+4)
While循环中do后面可以是一个简单语句,也可以是用begin和end括起来的复合语句
如果首次计算布尔表达式时,其值就为假,则循环体一次也不做
【例4-25】输出1~100之间的奇数
programp4_25(input,output);
varx:
integer;
begin
x:
=1;
whilex<100do
begin
write(x:
5);
x:
=x+2;
end
end.
【例4-26】输入若干个字符,它的终止字符是’#‘。
计算输入的字符中字母’a’(包括大小写)出现的次数。
programp4_26;
varch:
char;
i:
integer;
begin
i:
=0;
read(ch);
whilech<>‘#’do
begin
if(ch=‘a’)or(ch=‘A’)theni:
=i+1;
read(ch);{能否写成elseread(ch)?
}
end;
writeln(‘i=’,i);
readln
end.
【例4-27】求输入的一个整数的各位数字之和。
分析及问题:
如何求出一个整数的各个数位?
这个整数的长度确定吗?
如果该整数的长度不确定,则该如何来求取它的各个数位?
programp4_27;
varx,t,s:
integer;
begin
readln(x);
s:
=0;
whilex<>0do
begin
第4课
【例4-28】
求两个自然数m、n的最小公倍数。
解法分析
可以利用以下公式来求m、n的最小公倍数:
[m,n]=(m*n)div(m,n)
这样一来,可以将原问题转化求m、n的最大公约数。
之所以做这一转化,是因为我们原来对求两个数的最大公约数这一问题及解法比较熟悉。
求两个数的最大公约数的算法
辗转相除
辗转相减
穷举法
求两个数的最大公约数:
辗转相除法
repeat
r:
=mmodn;
m:
=n;
n:
=r;
untilr=0;
求两个数的最大公约数:
辗转相减法
Whilem<>ndo
ifm>nthenm:
=m–n
elsen:
=n–m;
求两个数的最大公约数:
穷举法
ifm>=nthengcd=nelsegcd=m
while(mmodgcd<>0)and(nmodgcd<>0)do
gcd:
=gcd–1;
或者,也可以采用穷举法来直接求两个数m、n的最小公倍数,分析如下
解法思路分析
先设一个变量i,让它的值从1开始按自然数增长
将i与m相乘的积存入变量s中,这样s就是m的倍数了。
由于i是从最小的自然数开始的,因而,s也就是从最小的值开始的
解法思路分析
再用每一个s除以因子n,若能整除,则s就是m与n的公倍数。
第一个能整除n的就是最小公倍数
programp4_28(input,output);
varn,m,i,s:
longint;
begin
write(‘请输入两个自然数’);
readln(m,n);
i:
=1;
s:
=m*i;
whilesmodn<>0do
begin
i:
=i+1;
s:
=m*i;
end;
writeln(‘m和n的最小公倍数是’,s);
end.
上机练习:
计算1+2+4+8+…+128+256
{用for循环或while循环实现}
直到型循环(repeat)语句
repeat
语句1;
语句2;
…
语句n;
until布尔表达式;
repeat语句的执行流程
首先执行循环体(至少执行一次);
然后,对布尔表达式进行判断:
如果为假,则继续执行循环体;
否则(即“直到布尔表达式成立”时),结束循环,执行repeat循环语句的下一条语句;
问题:
repeat循环与while循环有什么区别?
【例4-30】用repeat语句改写【例4-26】
programp4_26(input,output);
varch:
char;
i:
integer;
begin
i:
=0;
read(ch);
whilech<>’#’do
begin
if(ch=‘a’)or(ch=‘A’)then
i:
=i+1;
read(ch);
end;
writeln(‘i=‘,i)
end.
programp4_30(input,output);
varch:
char;
i:
integer;
begin
i:
=0;
repeat
read(ch);
if(ch=‘a’)or(ch=‘A’)theni:
=i+1;
untilch=‘#’;
writeln(‘i=‘,i)
end.
第5课
多重循环结构
前面学习的循环结构称为单重循环
如果循环语句中又嵌套了循环语句,称为多重循环。
外层的称为外循环,内层的称为内循环
根据嵌套的层数,可以有两重循环,三重循环等
【例4-31】求100~999之间的水仙花数,即满足abc=a3+b3+c3的数,如153=13+53+33。
programp4_31;
vara,b,c:
integer;
begin
fora:
=1to9do
forb:
=0to9do
forc:
=0to9do
ifa*a*a+b*b*b+c*c*c=a*100+b*10+c
thenwrite(a*100+b*10+c);
readln
end.
【例4-32】编程输出如下图形:
###########
#########
#######
#####
###
#
分析
解决字符图形打印问题的要点:
图形的特点
行数
每行的起始位置
根据图形的特点而做的其他特殊处理(如上下对称、左右对称等)
分析
在该问题中,打印出来的图形行数与每行的“#”号字符个数之间存在着一定的关系
可以采用双重循环:
外层循环变量(i)控制行数(从1到5变化)
内层循环变量(j)控制每行“#”号的个数和位置
每行是由‘#’和空格组成的
每行的组成规律
每行前面的空格(即该行的起始位置)是行数减1
每行中的“#”号数是11–2*(i-1)
programp4_32(input,output);
vari,j,k:
integer;
begin
fori:
=6downto1do
begin
forj:
=1to6-ido
write(‘’,30-i);{输出空格}
{以下是输出#号的循环}
fork:
=2*i-1downto1do
write(‘#’);{输出#号后不换行}
writeln;{换行}
end;
readln
end.
【例4-33】四个学生上地理课时,回答我国四在淡水湖的大小时是这样说的。
甲说:
“最大洞庭湖,最小洪泽湖,鄱阳湖第三”;乙说:
“最大洪泽湖,最小洞庭湖,鄱阳湖第二,太湖第三”;丙说:
“最小洪泽湖,洞庭湖第三”;丁说:
“最大鄱阳湖,最小太湖,洪泽湖第二,洞庭湖第三”。
其中每个人仅答对了一个,请编程确定各个湖有大小顺序。
问题及解法分析
如何表示每个湖及每个人说的话?
该采用怎样的策略来解决本题?
programp4_33;
vardong,hong,bo,tai:
integer;
begin
fordong:
=1to4do
forhong:
=1to4do
ifdong<>hongthen
forbo:
=1to4do
if(dong<>hong)and(hong<>bo)then
begin
tai:
=10-dong-hong-bo;
if(ord(dong=1)+ord(hong=4)+ord(bo=3)=1)and
(ord(hong=1)+ord(dong=4)+ord(bo=2)+ord(tai=3)=1)
and(ord(dong=3)+ord(hong=4)=1)and
(ord(bo=1)+ord(tai=4)+ord(hong=2)+ord(dong=3)=1)
then
writeln(‘dong:
’,dong,‘hong:
’,hong,’bo:
’,bo,’tai:
’,tai);
end;
readln
end.
上机练习:
编程计算
E=1+1/2!
+1/3!
+…+1/n!
第6课
转向(goto)语句
注意:
goto语句中使用的标号必须在程序说明部分的最前面进行说明,格式如下:
label标号1,标号2,…;
(数字)标号的范围一般是1~9999
goto语句只能从一个语句结构中转出来,而不能转到一个语句结构中去。
例如,可以在循环语句中,通过goto语句来跳出循环,但不能从循环语句的外部,利用goto语句来转到循环语句的内部去
此外,记住应少用或不用goto语句
【例】计算下列函数
programeg(input,output)
label2,one;{说明了两个标号2和one}
varx,y:
real;
begin
readln(x);
ifx<=2thengoto2
elsey:
=x–1;
writeln(y);
gotoone;
2:
y:
=x+3;
write(y);
one:
end.
goto语句的应用
【例4-34】求出3~100之间的所有质数。
参考程序及其修改版本见教材P60
综合应用
【例4-35】某班共有50名学生,已知他们的其中考试的数学成绩,现需要统计100分、90~99分、80~89分、70~79分、60~69分与不及格成绩分别有多少人。
参考程序见教材P61
【例4-36】用5元钱买100只钮扣,其中金属扣每只5角,有机玻璃扣每只1角,小揿扣1分钱买3个,编程求出各种钮扣各买了多少只?
问题分析
用x、y、z表示金属钮扣、有机玻璃钮扣和小揿扣的只数。
依题意可得如下方程组:
x+y+z=100
(1)
50x+10y+z/3=500
(2)
可用穷举法来搜索求解。
参考程序见教材P62
程序的优化
缩小循环控制变量的初值、终值之间的范围
减少循环的重数
问题:
可否如QB中那样,增加步长?
【例4-37】用尼考曼彻斯法(Nicomanchas法,即辗转相减法)求两个自然数a和b的最大公约数。
参考程序见前面或教材P64
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pascal 循环 讲义
![提示](https://static.bingdoc.com/images/bang_tan.gif)