步长型循环(For语句)
for 语句用来描写叙述已知反复次数的循环结构。
for 语句有两种形式:
(1) for 循环变量:=初值 to 终值 do 语句。
(2) for 循环变量:=初值 downto 终值 do 语句;
例:计算1+2+3+……+99+100的和
program jia; var
i,n,sum:integer;
begin
sum:=0;
for i:=1 to 100 do
begin
sum:=sum+i;
end;
writeln(sum);
readln
end.
For 语句
第一种形式的for 语句是递增循环。
首先将初值赋给控制变量。接着推断控制变量的值是否小于或等于终值,若是,则运行循环体,在运行了循环体之后,自己主动将控制变量的值变为它的后继值。并又一次推断是否小于或等于终值。
当控制变量的值大于终值时,退出for循环,运行for语句之后的语句。
另外一种形式的for 语句是递减循环。
首先将初值赋给控制变量,接着推断控制变量的值是否大于或等于终值,若是,则运行循环体,在运行了循环体之后。自己主动将控制变量的值该为它的前趋值。并又一次推断是否大于或等于终值。当控制变量的值小于终值时,退出for循环,运行for语句之后的语句。
说明
①循环控制变量必须是顺序类型。
比如,能够是整型、字符型等,但不能为实型。
②循环控制变量的值递增或递减的规律是:选用to则为递增;选用downto则递减。
③循环体能够是一个基本语句。也能够是一个复合语句。
④循环控制变量的初值和终值一经确定,循环次数就确定了。可是在循环体内对循环变量的值进行改动,经常会使得循环提前结束或进入死环。建议不要在循环体中任意改动控制变量的值。
不同意在循环体内再对循环控制变量赋值。
a:=10;
b:=50;
for k:=a to b do
begin
k:=k+1;{这一句是错误的!
!!
。!}
writeln (k);
end;
例题1
输入整数n,输出1——n之间的偶数和
思路:
1、枚举1到n之间的每一个整数,
2、推断该整数是否为偶数
3、假设为偶数,则累加起来
program ex3_1;
var
n,i,sum:integer;
begin
sum:=0;
readln(n);
for i:=1 to n do
begin
if then
sum:=sum+i;
end;
writeln(sum);
end.
练习1
1、输入N。求N!(N!=1*2*3*…*N) ,这里N不大于10,输出N!的值
2、编程计算并输出1+1/2+1/3+……+1/100的和
3、编程计算12+22+32+……+1002
例题2
一个两位数x,将它的个位数字与十位数字对调后得到一个新数y。此时y恰好比x大36,请编程求出全部这种两位数。
思路:
1、枚举全部的两位数x,从10到99
2、对该两位数进行数位分离,
ge:=x mod 10
shi:=x div 10
3、组成一个新数nx
y:=ge*10+shi
4、将新数与原数进行比較
y-x=36
5、假设条件成立,则输出
program ex3_2;
var
x,y,ge,shi:integer;
begin
for x:=10 to 99 do
begin
ge:= ;
shi:= ;
y:=ge*10+shi;
if then
writeln(x);
end;
end.
练习2
1、编程输出1000以内(包含1000)全部既能被3整数又能被5整数的自然数
2、在自然数中。假设一个三位数等于自身各位数字之立方和,则这个三位数就称为是水仙花数。如: 153=1^3+5^3+3^3。所以153是一个水仙花数。求全部的水仙花数
例题3
输入10个数,打印出最大的数
思路:
1、设定变量max,将其赋值为最小值
2、循环读入10个数,每读入一个数x,都将其跟max变量比較
3、假设x>max。则将x赋值给max
4、比較全然部数后,max所存储的则是最大的数,将其输出。
program ex3_3;
var
max,x,i:integer;
begin
max:=-32768;
for i:=1 to 10 do
begin
read(x);
if x>max then
;
end;
writeln(max);
end.
练习3
1、编写一个评分程序,接受用户输入10个选手的得分(0-10分)。然后去掉一个最高分和一个最低分,求出某选手的最后得分(平均分)。
例题4
编程输入一个自然数x(x<=10000),求这个自然数的全部约数(包含1和x本身)的个数。
思路:
1、对于输入整数x,推断其约数的方法为:枚举1至x之间的全部整数i(思考:是不是一定要从1枚举到x)
2、假设x能被i整数。则累计其个数
program exam4;
var
x,sum,i:integer;
begin
sum:=0;
readln(x);
for i:=1 to x do
begin
if x mod i=0 then
sum:=sum+1;
end;
writeln(sum);
end.
练习4
输入一个整数。判读其是否为素数,假设是则输出‘YES’,不是则输出‘NO’(不含引號)
思路:
1、素数亦称质数。是指仅仅能被1和它本身整除的自然数。
2、对于输入整数x。推断其是否为素数的方法为:枚举2——x-1的全部自然数i。将x整除i,假设能够整除,则x不是素数。假设对于全部的i,x都不能整除,则x是素数。
program ex3_4;
var
x,i:integer;
f:boolean;
begin
f:=true;
readln(x);
for i:=2 to x-1 do
begin
if x mod i=0 then
f:=false;
end;
if f=true then writeln('YES')
else writeln('NO');
end.
练习5
1、求2-1000中的守形数(若某数的平方,其低位与该数相等。则称守形数。
如:25的平方等于625,625的低位与25同样。故25是守形数。
)
2、求菲波拉契数列第n项的值(n不大于30)。
菲波拉契数列是这种数列: a0=0, a1=1, a2=a1+a0, a3=a2+a1,……,ai=ai-1+ai-2; 如0,1,1,2,3,5,8,13,21,……。
要求输出n。输出an的值
当(while)语句
当语句的语法格式是:
while 布尔表达式 do
begin
语句序列;(循环体)
end;
其作用是,当布尔表达式的值为 TRUE时,才会运行语句序列(循环体),否则循环将不会被运行。即从循环头部就退出,而转向运行 END后的语句。
while语句的运行过程为:
这里while和do为保留字,while语句的特点是先推断,后运行。
当布尔表达式成立时。反复运行do后面的语句(循环体)。
while语句用于“当满足某一条件时进行循环”的情况,也就是说while循环是是属于当型循环。为了能使while反复能终止,循环体中一定要有影响布尔表达式的操作,否则该循就是一个死循环。
例题1
求恰好使s=1+1/2+1/3+…+1/n的值大于10时n的值
思路:
1、能不能用for循环解决这个问题
2、循环的终止条件:n>10
3、假设n<=10,则不断累加
var
n:integer;
s:real;
begin
n:=0;
s:=0;
while s<=10 do
begin
n:=n+1;
s:=s+1/n;
end;
writeln(n);
end.
例题2
求两个正整数m和n的最大公约数
思路1:枚举出1至m、n之间的数i,将假设m、n能同一时候整除i且i最大。则i为m、n的最大公约数
var
m,n,i,min,gcd:integer;
begin
readln(n,m);
if n>m then min:=m else min:=n;
for i:=1 to min do
begin
if (m mod i=0) and (n mod i=0) then
gcd:=i;
end;
writeln(gcd);
end.
思路2:利用辗转相除法求最大公约数
var
m,n,r:integer;
begin
readln(n,m);
r:=n mod m;
while r<>0 do
begin
n:=m;
m:=r;
r:=n mod m;
end;
writeln(m);
end.
例题3
输入一个自然数M,请分离出它各位上的数字。并按个位、十位、百位……顺序输出。
输入例子:
79823
输出例子:
3 2 8 9 7
思路:
1、分离出个位,输出
2、原数去掉个位
3、循环1、2步,直到原数为0
var
n,g:integer;
begin
readln(n);
while n<>0 do
begin
g:=n mod 10;
write(g,' ');
n:=n div 10;
end;
end.
练习
1、编程求出满足下列式子的n的最大值:22+42+62+…+n2<1500
2、小球从100高处自由落下,着地后又弹回高度的一半再落下。求第20次着地时, 小球共通过多少路程?
3、输入随意的自然数a、b,求a、b的最小公倍数
4、输入一个数,假设该数是7的倍数或者含有7的数字。则输出‘yes’,否则输出‘no’
repeat-until语句(直到循环)
repeat 语句用于“反复运行循环体,一直到指定的条件为真时为止”。语法格式为:
repeat
语句1;
……
语句n;
until 布尔表达式;
当中Repeat、until是Pascal保留字。repeat与until之间的全部语句称为循环体。
注意
①repeat语句的特点是:先运行循环,后推断结束条件。因而至少要运行一次循环体。
②repeat-until是一个总体,它是一个(构造型)语句。不要误觉得repeat是一个语句,until是还有一个语句。, repeat 和until已经起了begin和end的作用,不需用begin和end把它们包起来。
③repeat语句在布尔表达式的值为真时不再运行循环体。且循环体能够是若干个语句。while循环和repeat循环是能够相互转化的。
求sum=1+2+3+......+n 的和
program he;
var
n,i,sum:integer;
begin
readln(n);
sum:=0;
i:=1;
repeat
sum:=sum+i;
i:=i+1;
until i>n;
writeln (sum);
end.
例题1
求1992个1992的乘积的末两位数是多少?
var
a,t : integer;
Begin
a := 1;
t := 0;
repeat
t := t+1;
a := (a*92) mod 100;
until t=1992;
writeln(a);
End.
练习
1、用repeat语句求两个数的最大公约数
2、找出被2、3、5除时余数为1的最小十个数
3、将一根长为369cm的钢管截成长为69cm和39cm两种规格的短料。在这两种规格的短料至少各截一根的前提下,怎样截才干余料最少。
多重循环结构
当一个循环的循环体中又包括循环结构程序时,我们就称之为循环嵌套。
例题1
求1!+2!+…+10!的值
program ex4_5;
var
t,s:real;
i,j,n:integer;
begin
s:=0;
for n:=1 to 10 do
begin
t:=1;
for j:=1 to n do t:=t*j;
s:=s+t;
end;
writeln(‘s=’,s:0:0);
end.
program ex4_5;
var
t,s:real;
i,j,n:integer;
begin
s:=0;
t:=1;
for n:=1 to 10 do
begin
t:=t*n;
s:=s+t;
end;
writeln(‘s=’,s:0:0);
end.
例题2
一个炊事员上街採购,用500 元钱买了90 仅仅鸡, 当中母鸡一仅仅15 元,公鸡一仅仅10 元,小鸡一仅仅5元,正好把钱买完。问母鸡、公鸡、小鸡各买多少仅仅?
programr ex4_6;
var
i,j,k:integer;
begin
for i:=1 to 33 do
for j:=1 to 50 do
for k:=1 to 100 do
if 15*i+10*j+5*k=500 then
writeln(i:5,j:5,k:5);
end.
programr ex4_6;
var
i,j,k:integer;
begin
for i:=1 to 33 do
for j:=1 to 50 do
begin
k:=90-i-j;
if 15*i+10*j+5*k=500 then
writeln(i:5,j:5,k:5);
end;
end.
例题3
求100-200之间的全部素数
programr ex4_7;
var
i,x :integer;
begin
for i:=100 to 200 do
begin
x:=2;
while (x<=trunc(sqrt(i)))and(i mod x<>0)do
begin
x:=x+1;
end;
if x>trunc(sqrt(i)) then write(i:8);
end;
end.
练习
1、求s=11+22+33+..+NN
2、把一张一元钞票换成一分。二分和五分的硬币,每种至少一枚。问有哪几种换法?
3、输出一列图形(数字金字塔)
1
1 1
1 2 1
. .
1 2 3 ……3 2 1
4、编写一程序。验证角谷猜想。所谓的角谷猜想是:“对于随意大于1的自然数n,若n为奇数,则将n变为3*n+1,否则将n变为n的一半。经过若干次这种变换,一定会使n变为1。”
5、有一堆100多个的零件,若三个三个数。剩二个;若五个五个数,剩三个;若七个七个数,剩五个。请你编一个程序计算出这堆零件至少是多少个?
循环控制语句
continue;
继续下一步循环
break;
退出当前循环
Halt;
Exit;
求素数(标准版)
var
n,i:integer;
f:boolean;
begin
readln(n);
f:=true;
for i:=2 to trunc(sqrt(n)) do
begin
if n mod i=0 then
begin
f:=false;
break;
end;
end;
if f then writeln('yes') else writeln('no');
end.