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

Back to index page



  1. 本日の作業内容

  2. 出席確認

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

    提出形式

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

  3. ゴミファイル削除

    S@pphireを使用して無限ループを実行してしまった際に,saphireディ レクトリにNFSサーバが作成したログが記録されます.このログファイルは無用 のものですが,容量がやたら大きくて場合によっては数GBにもなります.これが サーバに負荷をかけて授業中にパソコンの操作が困難になっている要因の一つで す.まずは,これまでに出来てしまったファイルを削除しておきましょう.ディ レクトリ内のファイルをまず確認してください.

    $ ls -a ~/sapphire

    としてみて,結果の表示の中に .nfs0023d2720000001f のような .nfs で始まる名前のファイルがあればそれがゴミです.それを削除してお きましょう.

    $ rm -f ~/sapphire/.nfs*

  4. S@pphireアップデート

    S@pphireを使用して無限ループを実行してしまった際にサーバに負荷をかけてし まうことを避けるために,スクリプトの実行ディレクトリを変更したバージョン のS@pphireを作成しました.これで,動作がうまく行くか,まだわかりませんが, そちらのバージョンにアップデートしてください.バージョン0.1.7を再ダウン ロードするだけで,他の設定はそのままで使用できます.

    ダウンロードページへ移動

  5. printf による文字幅指定

    前回の授業で printf を利用した文字幅指定を一部使用しました.今 回はもう少し詳しく説明しておきますので,今後は参考にしてください.

    まずは,次のスクリプトの動作結果を確認してみましょ う.

    i = 0
    
    while i < 20
      a = i / 3.0
      b = i / 123456.7
      
      printf "%4d %-4d %7.1f %7.3f %e %8.1e\n", i, i, a, a, b, b
    
      i += 1
    end
    

    最初の二つの列は整数型の表示ですが,4文字分の幅を確保した上で,最初は右 寄せ,次は左寄せで表示しています.このようにマイナス符号をつけると左寄せ となります.

    次の二つの列は浮動小数点型の表示ですが,用意する文字幅はいっしょでも小数 部の桁数を変えています.このように,小数点を %f につけることに より小数部の桁数指定が可能です.

    最後が指数表示で,桁数が大きい数を有効数字と指数に別けて表示するものです. 小数部の桁数指定は %f のときと同じです.

  6. while ループの活用

    長さの分からない文字列において,特定の文字が何回出てくるか,というような 処理は while ループに向いた処理ですので,その例を試してみましょ う.次の例を見て下さい.

    n = rand(10) + 10
    str = ""
    
    for i in 0..n
      str += rand(100).to_s
    end
    
    printf "String: %s\n", str
    
    counter = 0
    
    while str.length > 0
      if str[0].chr == "0"
        counter += 1
      end
    
      str = str.reverse.chop
    end
    
    printf "Occurrence of 0: %d\n", counter
    

    前半部分で行っていることは,数字からなる不定の長さの文字列生成です.後半 の while ループで生成した文字列の中に数字の「0」が何回出てくる かを数えています.これまでの授業で学習して来たメソッドを使用することを前 提にしていますので,ちょっとややこしい処理になっています.文字列の先頭の 文字が「0」かどうかを比較して,マッチすれば変数 counter の値を 1増やします.しかし,先頭文字列を一文字除去する方法が無いので,文字列の 順番を reverse メソッドで逆にし,chop メソッドで末尾の 文字を取り除きます.なので,while ループの中では文字列が毎回反 転しています.終了条件は文字列の長さが0になったときです.

    上のスクリプトは次のようにしても出来ます.各種の 言語にはいろいろ便利なメソッドや関数がありますので,勉強すればするほど短 くてすっきりしたプログラムが書けるようになります.

    n = rand(10) + 10
    str = ""
    
    for i in 0..n
      str += rand(100).to_s
    end
    
    printf "String: %s\n", str
    
    before = str.length
    after = str.delete("0").length
    
    printf "Occurrence of 0: %d\n", before - after
    

    for ループだけでも実現できます.以下のように なり,実はこっちの方がすっきりしているようです.しかし, while にも慣れておきましょう.それには,使うことが 一番です.

    n = rand(10) + 10
    str = ""
    
    for i in 0..n
      str += rand(100).to_s
    end
    
    printf "String: %s\n", str
    
    counter = 0
    
    for i in 0..str.length-1
      if str[i].chr == "0"
        counter += 1
      end
    end
    
    printf "Occurrence of 0: %d\n", counter
    

    もう一つ例を考えてみましょう.今度は,意図的に無限ループを作り,特定の条 件が成立したときにループから抜け出るものです.次の例 をを見て下さい.

    i = 1
    
    while i
      num = rand(100) + 700
    
      if num == 777
        break
      end
    
      i += 1
    end
    
    printf "777が出たのは%4d 回目\n", i
    

    無限にくり返すループを作れるのは while ループですので,ユーザか らの応答を待ってアクションをおこすようなプログラムでは実は重要な概念です.

    さて,このスクリプトで大事なのは新たに出てきたメソッド break です.こ れは,while ループに限らずその他のループにおいても,ループを抜 け出すメソッドです.必要に応じて使うと便利なメソッドです.

  7. until ループ

    while ループは条件が真の間回り続けるループでしたが,if に対する unless と同じように,条件が逆になったループも存在 します.ここで紹介する until ループは条件式が偽の間回ります.単 語の意味的には,「真になるまで」回るということで until です. 使いかたの例を見てみましょう.

    n = 20
    i = 1
    
    until i > 20
      puts i
      i += 1
    end
    

  8. 演習

    • 前回の授業で作成したすごろくスクリプトを改良して,上がるためにはちょ うどぴったりの目のときだけになるようにしてみましょう.

      結果表示は以下のようなものとしてみます.

      スタート
      サイコロの目: 4,進んだコマ数:  4
      サイコロの目: 6,進んだコマ数: 10
      サイコロの目: 2,進んだコマ数: 12
      サイコロの目: 6,進んだコマ数: 18
      サイコロの目: 1,進んだコマ数: 19
      サイコロの目: 5,進めず
      サイコロの目: 5,進めず
      サイコロの目: 6,進めず
      サイコロの目: 3,進めず
      サイコロの目: 3,進めず
      サイコロの目: 3,進めず
      サイコロの目: 1,進んだコマ数: 20
      サイコロの目: 1,ゴール!
      

          解答例

    • 上のスクリプトをさらに改造していきます.ゴール直前にサイコロの目がの こりのマスの数よりも多い場合には,余りの分だけ戻ってやりなおし,ちょ うどのときだけ上がるようにしてみましょう.

      サイコロの目: 2,現在位置:  2,ゴールまであと: 19
      サイコロの目: 2,現在位置:  4,ゴールまであと: 17
      サイコロの目: 6,現在位置: 10,ゴールまであと: 11
      サイコロの目: 1,現在位置: 11,ゴールまであと: 10
      サイコロの目: 6,現在位置: 17,ゴールまであと:  4
      サイコロの目: 1,現在位置: 18,ゴールまであと:  3
      サイコロの目: 5,残念!現在位置: 19,ゴールまであと:  2
      サイコロの目: 4,残念!現在位置: 19,ゴールまであと:  2
      サイコロの目: 3,残念!現在位置: 20,ゴールまであと:  1
      サイコロの目: 4,残念!現在位置: 18,ゴールまであと:  3
      サイコロの目: 2,現在位置: 20,ゴールまであと:  1
      サイコロの目: 1,ゴール!
      

          解答例

    • 2番目の演習問題の現在位置を絵として画面に次のように表示するスクリプ トに改造してみましょう.

      Start       1---5---10---15---20
      Dice: 4    |   *                |
      Dice: 4    |       *            |
      Dice: 3    |          *         |
      Dice: 3    |             *      |
      Dice: 4    |                 *  |
      Dice: 1    |                  * |
      Dice: 6    |                *   |
      Dice: 6    |                  * |
      Dice: 5    |                 *  |
      Dice: 5    |                  * |
      Dice: 1    |                   *|
      Dice: 5    |                *   |
      Dice: 1    |                 *  |
      Dice: 6    |                 *  |
      Dice: 4    |                   *|
      Dice: 2    |                   *|
      Dice: 6    |               *    |
      Dice: 5    |                    * Goal!
      

      ヒント:文字列には積の演算が可能.スペースを何個置くと良いかを考える.

          解答例

  9. 小テスト

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

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

  10. 宿題

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

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

  11. 本日の用語

    • %3d, %5.3f のような%表記法

      printf を用いて出力する際の出力文字幅指定.浮動小数では小数点以 下の桁数も指定.

    • length

      文字列の長さ(バイト数)を返すメソッド.

    • reverse

      文字列や配列の順序を反転するメソッド.

    • chop

      文字列の末尾の文字を一文字削除するメソッド.

    • delete

      指定した文字を文字列から取り除くメソッド.

    • break

      ループから抜け出すメソッド.

    • until ループ

      条件式が真になるまで繰りかえすループ.


目次ページに戻る