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

Back to index page



  1. 本日の作業内容

  2. 出席確認

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

    提出形式

    宛先 justice@mag.shimane-u.ac.jp
    件名 AttendA11-28_ruby_s0540**
    AttendB11-28_ruby_s0540**
    (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まで,1000まで,10000までのようにに拡張すると,もうどうしようもありません.そこ で,同じ様なことをくり返し行うための手順がプログラミング言語には用意され ています. 次のスクリプト を試してみて下さい.

    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. 応用例

    この授業では,最初から実は for 文を扱うことを行って来ました.最 初に示したスクリプト例をもう一度確認してみましょう.

    for i in 1..20
      printf "Iteration time: %d\n", i
      printf "Number: %d\n\n", i+100
    end
    

    上の例を Number: の値が奇数のときだけ表示するように変えてみましょ う.

    for i in 1..20
      printf "Iteration time: %d\n", i
    
      if i % 2 == 1
        printf "Number: %d\n\n", i+100
      else
        printf "\n"
      end
    end
    

    このようにfor 文のくり返しの中に条件分岐の if 文が入っ ているような構成も可能です.

    制御構造が使われているときには,インデント(字下げ)に注意して下さい.ま た,end のつけ忘れも気をつけないといけないポイントです.

    また,代入の動作にも注意して下さい.11月14日の小テストにおいてかなりの人 が犯した間違いに,代入に伴うものとして,次のようなも のがありました.

    num = rand(10)
    
    for i in 0..9
      puts num
    end
    

    記号 = はプログラム言語においては代入ですので,変数 num は乱数を発生させるものではないことに注意しましょう.乱数を発生させ てその値を代入したものが変数 num の中身の値です.

    これまで,if 文における then や,今回の for 文の do のように,「省略可能」な予約語を紹介しています.省略可 能ならば,なぜ用意されているのかと言えば,「1行で表示するときに必要」だ からです.次の例を見てみましょう.このようなときには,上記の単語は省略で きません.というよりも,省略すると,それぞれのメソッドや変数の関係が分か らなくなります.

    
    num = rand(10) - 5
    
    printf "Obtained number: %d\n", num
    
    if num > 0 then puts "positive" elsif num == 0 then puts "zero" else puts "negative" end
    
    for i in 0..9 do puts rand(10) end
    

  6. 演習

    • 上の間違ったスクリプトを修正して,乱数を10回正しく発生させるようにし ましょう.

          解答例

    • 次のスクリプトを for 文を用いた繰り返しに変更しましょう.

      puts 2
      puts 5
      puts 10
      puts 17
      puts 26
      puts 37
      puts 50
      puts 65
      puts 82
      puts 101
      

           解答例

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

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

           解答例

      階乗の例: 5! = 1x2x3x4x5 = 120

    • さいころスクリプト

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

           解答例

  7. 小テスト

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

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

  8. 宿題

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

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

  9. 本日の用語

    • for

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

    • ループ

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

    • カウンタ

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


目次ページに戻る