目次に戻る  前のページへ  次のページへ


くり返し同じことをするために --for ループ--

  1. くり返しの必要性

    1から20までの数字を画面に順に表示しなさい,というような命令が下されたらどうし ましょうか.単純に考えて, 次のようなこと はもちろん出来るでしょう.

    puts 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
    

    しかし,これを100までの数に拡張すると,もうどうしようもありません.そこ で,同じ様なことをくり返し行うための手順がプログラミング言語には用意され ています. 次のスクリプト を試してみて下さい.

    n = 20
    
    for i in 1..n
      puts i
    end
    

    このようなくり返しは for ループと呼ばれるものです.開始と終了の 条件を与えて,その回数分だけくり返すものです.

  2. 文法

    for ループの基本的な使い方は図1のようになります.

    図1  for ループの構文

    今の例のスクリプトでは,変数 i について,範囲を1から20まで1ず つ増やして処理を実行するようになっています.範囲の指定はピリオドを用いて 表現しますが,例のようにピリオド二つ (..) の場合はそのままの範 囲ですが,ピリオドを3つにすると,例えば,1...20 とすると1から 19までと一つ少ない数まで実行します.フローチャートを図2に示します.

    図2 順番に数字を表示するフローチャート

  3. 応用例

    連続する整数の和を求めるスクリプトを最初に試しましたが,そのときには和の 公式を用いました.和の公式を知らなければどうやって求めれば良いのでしょう か.くり返しを使うと,いわば,力業のような方法で計算が出来ます. 次のスクリプト は公式を使うものに比べて非常に効率の悪い速度の遅いプログラムになっ ていますが,数学的な知識は必要なく計算が出来ます.

    n = 100
    sum = 0
    
    for i in 1..n
      sum += i
    end
    
    puts sum
    

    ポイントは自己代入です.1から100まで順番にその数を最初は値が0である 変数 sum にひたすら足して行きます.変数 n の値をものす ごく大きく取ると,大変に時間のかかる「悪い」スクリプトですが単純ですね. この応用として, 奇数だけの和や偶数だけの和 もさらに効率の悪い方法で計算できます.

    n = 100
    odd = 0
    even = 0
    
    for i in 1..n
      if i % 2 == 0
        even += i
      else
        odd += i
      end
    end
    
    printf "奇数の和は %d 偶数の和は %d\n", odd, even
    

    このようにfor 文のくり返しの中に条件分岐の if 文が入っ ているような構成も可能です.ここでは,出力に printf を使ってみ ました.いろいろな要素が登場してきますので,分からない場合には一つずつ確 認して行きましょう.

  4. 入れ子

    for ループは何重にでも重ねることが出来ます. 次の例 は3重にループが回るスクリプトです.

    for i in 1..3
      for j in 1..4
        for k in 1..5
          printf "i = %d, j = %d, k = %d\n", i, j, k
        end
      end
    end
    

    ループはトータルで60回回りますが,どのような順番でループが回っているかは 結果の方を良く見て下さい.kに関する一番内側のループが全部終わったらjの値 が一つ増えて行き,jが全部終わったらiが増えてまた順に実行して行くようになっ ているのが分かるかと思います.このようなループの回り方を理解しておくこと が大事です.

    先ほどの例をほんの少し改良してみましょう. 次のスクリプト ではどうなるでしょうか

    for i in 1..3
      for j in i..4
        for k in j..5
          printf "i = %d, j = %d, k = %d\n", i, j, k
        end
      end
    end
    

    どのような違いがあるのか,結果の方を良く見て下さい.


 目次に戻る  前のページへ  次のページへ