pascal循环嵌套
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
循环嵌套
如果一个循环语句的循环体中又包括另一个循环语句,这种形式就叫循环语句的嵌套。
循环的嵌套层数可以是任意的,一般嵌套2层、3层。
处于外部的循环叫作外循环,内部的循环叫作内循环,如果是3层,中间一层叫中循环。
在设计多层循环时,要注意外、内层循环之间层次关系,以及各语句先后的位置,不要交叉次序,引起混乱和错误。
特别注意多个for循环进行嵌套时,各循环控制变量名要各不相同,否则出现错误。
如下程序
var i,j:integer;
begin
for i:=1 to 3 do
for j:=1 to 3 do writeln(i,' ',j);
end.
以上是两层for循环结构,外循环控制变量名为i,内循环控制变量名为j。
内循环又是外循环的循环体。
运行结果是:
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
i的值变化过程j的值变化过程writeln(i,' ',j);
1 1
2
3 1 1 1 2 1 3
2 1
2
3 2 1 2 2 2 3
3 1
2
3 3 1 3 2 3 3
结论:外循环每执行一次,内循环都要完整的执行一遍。
外循环与内循环的执行过程即一次与一遍的关系。
一、例题
第1题:输出1-n之间的所有素数。
(d14-1.pas)
分析:我们可对1-n之间的每一整数i进行判断,而对于任意一个整数i,我们从2开始,到trunc(sqrt(i))为止,在这个范围内找i的约数,能找到则i不是素数。
若在这个范围内找不到i的一个约数,则i一定为素数(1除外)。
说明:sqrt叫平方根函数,如sqrt(9)=3,因为3的平方是9;36的平方根是6。
2的平方根约等于1.414,因为1.414*1.414=1.999396≈2。
trunc叫取整函数,如trunc(2.4)=2,trunc(3)=3,trunc(sqrt(10))=3,先求10的平方根约等于3.162,再取整就是3;trunc(sqrt(50))=7 ,trunc(sqrt(99))=9
双重for循环:
var i,j,f,n:integer;
begin
read(n);
for i:=1 to n do begin 控制检查范围1-n之间的每一整数i
f:=1; //f为记号变量名,f:=1假设i是素数
for j:=2 to trunc(sqrt(i)) do 在2到trunc(sqrt(i))之间找i的约数if i mod j=0 then begin f:=0;break;end; 找到一个约数就把记号改为0,退出if (f=1)and(i<>1) then write(i,' '); 记号是1,则i是素数(1除外)
end;
end.
输入:20 输出:2 3 5 7 11 13 17 19
第2题:(d14-2.pas)
输出1到n之间各位数字之和为7的倍数的自然数。
输入:45
输出:7 16 25 34 43
for i:=1 to n do begin 检查范围1到n之间所有的自然数
t:=i;s:=0; 设置替身变量,累加器清0
while t<>0 do begin 求当前自然数i的各位数字之和
s:=s+t mod 10;
t:=t div 10;
end;
if s mod 7=0 then write(i,' '); 判断并输出
end;
外循环控制检查范围1 to n,内循环求出每个自然数的各位数字之和,退出内循环后,立即判断此和是不是7的倍数,是则输出此自然数,继续往下检查,直到所有自然数检查完毕,退出外循环,整个程序结束。
特别注意:要设置替身变量,累加器每轮开始要清0
第3题:(d14-3.pas)
输入m和n的值,输出如下m行,每行有n个“*”组成的字符图形。
输入:4 9
输出:
*********
*********
*********
*********
分析:
①上面给出的图例共有m行(4行),我们可以用一个循环控制行数的变化;
②在每行中又有n列(9列),我们可以在前面控制行数的循环中再套一个循环来控制每列*号的个数。
双重for循环
var i,j,m,n:integer;
begin
read(m,n);
for i:=1 to m do begin {外循环i控制行数的变化}
for j:=1 to n do write('*'); {内循环j控制每行中*号的数量}
writeln; {换一行}
end;
end.
程序中的循环对于i的每个值都包含着一个(j:=1 to n)次的内循环,循环总数为:m*n 次,这种结构称双重for循环。
第4题:一个炊事员上街采购,用500元钱买了90只鸡,其中母鸡每只15元,公鸡每只10元,小鸡每只5元,正好把钱买完。
问母鸡、公鸡、小鸡各买多少只?输出所有的方案,每行输出一种方案。
(d14-4.pas)
分析:设母鸡i只,公鸡j只,小鸡为k只。
必须组合出所有可能的i,j,k值,看是否满足条件(i+j+k=90)and(15*i+10*j+5*k=500),意思是只数正好90,并且钱数正好500元。
这里i的值可以是0到33,j的值0到50,k的值0到90。
结果是:
0 10 80
1 8 81
2 6 82
3 4 83
4 2 84
5 0 85
三重for循环
var i,j,k:integer;
begin
for i:=0 to 500 div 15 do 控制母鸡的只数范围
for j:=0 to 500 div 10 do 控制公鸡的只数范围
for k:=0 to 90 do 控制小鸡的只数范围
if (i+j+k=90)and(15*i+10*j+5*k=500) then writeln(i,' ',j,' ',k);
end.
双重for循环
var i,j,k:integer;
begin
for i:=0 to 500 div 15 do
for j:=0 to 500 div 10 do begin
k:=90-i-j;
if 15*i+10*j+5*k=500 then writeln(i,' ',j,' ',k);
end;
end.
根据这种格式还可以实现多层循环嵌套,例如:
for i:=a1 to a2 do
for j:=b1 to b2 do
for k:=c1 to c2 do
for l:=d1 to d2 do begin
循环体语句;
end;。