循环结构

步长型循环(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.




原文地址:https://www.cnblogs.com/clnchanpin/p/6756394.html