zoukankan      html  css  js  c++  java
  • 循环结构

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




  • 相关阅读:
    CF850A Five Dimensional Points 题解
    AT3963 [AGC024F] Simple Subsequence Problem 题解
    jquery事件绑定机制
    前端初级词汇
    一个checkbox细节处理方式(checkbox与后面的文字对其)
    转 CSS hack:针对IE6,IE7,firefox显示不同效果
    想到的几点页面规范
    jQuery UI Dialog:Demo2:实用技巧
    zindex
    递归示例
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6756394.html
Copyright © 2011-2022 走看看