码迷,mamicode.com
首页 > 其他好文 > 详细

循环结构

时间:2015-07-20 16:47:52      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:for语句   while语句   repeat语句   多重循环   pascal入门   

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




版权声明:本文为博主原创文章,未经博主允许不得转载。

循环结构

标签:for语句   while语句   repeat语句   多重循环   pascal入门   

原文地址:http://blog.csdn.net/boyxiejunboy/article/details/46967459

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!