情報科学概論(1年生)
2004.11.29

Back to index page



  1. 本日の作業内容

  2. 出席確認

    電子メールで出席確認をします.宛先など以下の情報を用いてメールを作成し, 出席申告してください.なお,キーワードは授業中に紹介します.

    提出形式

    宛先 justice@mag.shimane-u.ac.jp
    件名 AttendA11-29_ruby_s0440**
    AttendB11-29_ruby_s0440**
    (Aクラス)
    (Bクラス)
    本文 学生番号
    氏名
    キーワード
     
    (改行)
    (改行)
    キーワードは授業中に紹介
    注意 「件名」および「添付書類名」の**をそのままにしないで,必ず自分の学生番号 に修正して下さい.また,ABクラス別は指示にしたがって下さい.

  3. くり返しの必要性

    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 ループと呼ばれるものです.開始と終了の 条件を与えて,その回数分だけくり返すものです.

  4. 文法

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

    図1  for ループの構文

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

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

    ループの開始のための変数初期化やや終了の条件判断がフローチャートには入っ ていますが,for ループの便利なところはこれらを自動で行ってくれ るところです.初期化や条件判断は与えた範囲で勝手に規定されています.また, ループの範囲のところで定義される i のような変数を「カウンタ」と いうこともあります.この変数の値はループから出たときには最後の値が保持さ れることを次のスクリプトで確認してください.

    for i in 0..5
      puts i
    end
    
    puts i
    
    for i in 30..35
      puts i
    end
    
    puts i
    

    繰り返しを初めて学習するときには,動作を順を追って調べるようにすることも 重要です.このような練習をしておくと,実際に思ったような動作をしない場合 に,原因を特定するときに役に立ちます.次の簡単な例 を考えます.

    for i in 0..5
      print 5 - i, " "
    end
    
    print "\nFire!\n"
    

    このスクリプトの動作を実際に確かめてみましょう.自分でまずは頭の中で表示 結果を推測してください.そして,実際に動作させてみたときに,その通りになっ たかどうかを確認しましょう.また,実際の動作の概略を次のページで確かめて みましょう.

  5. 応用例

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

    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 を使ってみ ました.いろいろな要素が登場してきますので,分からない場合には一つずつ確 認して行きましょう.

  6. 演習

    これまでこの授業で試してきたスクリプトのいくつかは繰り返しによりスクリプ トがかなりすっきりするものがあります.次の例を考えてみて下さい.

    • 本日の最初に行った整数の和を求めるスクリプトで,求める整数を乱数で発 生させるように変更しましょう.

      解答例

    • 階乗を求めるスクリプト

      乱数により正の整数を発生させて,その数の階乗を求めてみましょう.

      解答例

    • さいころスクリプト

      ふたつのさいころを10回振って出た目の和と積を求めるスクリプトを作成してみ ましょう.

      解答例

  7. 小テスト

    授業の終わりに小テストを実施します.アナウンスに注意していて下さい.

    Aクラス小テスト
    Bクラス小テスト

  8. 宿題

    宿題に関する案内が授業の終わりに紹介されます.注意にしたがって提出してく ださい.

    Aクラス宿題
    Bクラス宿題

  9. 本日の用語

    • for

      "for a while" しばらくの間,のような「〜の間」を意味する前置詞のforから 来た構文.ある一定回数必要な作業を繰りかえすための重要なメソッド.

    • ループ

      繰りかえし処理をフローチャートで描くとわかるように,繰りかえしはある回路 を何度も回るような処理になっているため,その回路を「ループ」と言う.

    • カウンタ

      ループの処理の回数を保持するような変数.


目次ページに戻る