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

Back to index page



  1. 本日の作業内容

  2. 出席確認

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

    提出形式

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

  3. プログラムの流れ

    ここで,一度,プログラミング とは何をすることか,ということを考え直してみましょう.

    プログラミングとは,起りうるすべての場合を想定して,それぞれのケースに対 して処理を用意しておくことです.それは,人に買い物を頼む場合に似てい るかも知れません.たとえば,自動販売機で飲み物を買ってもらうとします.その場 合に想定するのは,次のようなことでしょうか.

    1. コーラがあればそれを買う
    2. コーラがなければスポーツドリンクにする
    3. スポーツドリンクもなければ冷たい緑茶にする
    4. 冷たい緑茶もなければ冷たいウーロン茶にする
    5. それもなければ,1ブロック先の自販機に行って上の作業を繰り返 す.

    他にも,自販機や飲料水のメーカを指定する場合があるかも知れませんが,とりあえず, 上のようなことが当然考えられます.ここで,重要なことは,あらかじめ想定さ れる場合を漏れなくあげることと,必要に応じて処理を繰り返すことです.

    このような流れを図1のように記述することもよく行われます.このような図を 「フローチャート」と言います.

    図1 自販機でのお使いの図

    コンピュータは全く融通が利かないので,大人に依頼するようにはいきません. よく,融通が聞かないことを「子供の使い」と言いますが,まさしく,そのもの です.ただし,コンピュータは疲れませんし,だだもこねません.言われたと おり,黙々と作業を続けます.間違って,いつまでも同じことを繰り返す処理を つくってしますと,プログラムが終わりません.(このようなものを「無限ルー プ」と言います.) そのため,本当に厳密に処理を考えておかないといけないわけです.ここではその中の場合 分けを扱う条件分岐について説明します.

  4. 真と偽

    条件を判断する上で,根拠となるのは「値」が「真」か「偽」かになります.プ ログラミング言語では,それらをtrueもしくはfalseとして表現します.このよ うな二者択一の値しか認めないものを「ブール型」と呼びます.真や偽の値の定 義は,言語 ごとに特徴があって,trueやfalseはそれぞれ「代表値」としてあつかわれます. Rubyでは,trueとはfalseやnilでは無いという意味になります.nilとは値が 「無い」ことを表す言葉です.例えば,次のような簡単な スクリプト で見てみましょう.

    puts a += 1
    

    このスクリプトを実行するとエラーが出ます.なぜなら,自己代入する先の変数 a の値がいくらなのか分からないままさらに1を足そうとし ているからです.なので,エラーメッセージの欄には,

    tmp.rb:1: undefined method `+' for nil (NameError)
    

    のように表示されます.即ち,値の無いもの,nil に対して足し算の メソッドを実行しようとしていることに問題があります.nilとはこのような値 の無いことを意味するものです.

  5. if

    最も基本的な条件判断を行うのが if 文です.「文」とはプログラム 中に記述されている命令で,「式」と呼ぶこともあります. 次の例 を見てみましょう.

    a = 1
    
    if a then
      puts "OK"
    else
      puts "NG"
    end
    

    if というのは英語の「もしも」ですから,意味はすぐに分かると思い ます.変数 a が何らかの値を持てばtrueですので,条 件が成立していることになり,OKが表示されます.しかし,値がなければtrueで はないので,else の方に処理が移ります.else は「それ以 外」の意味ですから,条件が成立しなかった場合の処理をそのあとに記述します. 条件文の最後は end をつけておきます.このスクリプトはこのままで は何回実行しても「OK」になります.そこで,次のように1行目を修正します.

    a = nil
    

    また,次のような例も試してみましょう.結果が理解できるでしょうか.

    a = "nil"
    

    処理の文は「字下げ」 をするのが通例です.Rubyでは,字下げは2文字分が推奨されています.そうなっ ていなくても別に動作に影響はありませんが,他の人に見てもらう場合には,き ちんと字下げをしておくのがマナーです.

    上の例の then はこのように行を分けて記述する場合には省略可能です.また,else の処理は無くても良ければ記述しなくても構いません.

    上の例のように,if 文は図2に示すような構文になります.

    図2 if 文の構造

  6. 比較演算

    上の例は,値が存在するかどうかにより場合分けしましたが,値自体を議論する ことももちろんあります.つまり,ある数値よりも大きいか,小さいか,という ような場合わけです.二つの値を比較するときに使用するのが比較演算子で,表 1のようなものがあります.

    表1 比較演算子の例

    == 等しい
    > 大きい
    < 小さい
    >= 以上
    <= 以下
    != 等しくない

    他にも複雑なものがありますが,とりあえず上のものを知っておくと良いでしょ う. 使った例 を以下に示します.

    x = rand(11) - 5
    
    print "x = ", x, "\nx is "
    
    if x >= 0
      puts "positive or zero."
    else
      puts "negative."
    end
    

    変数 x の値が正か負かを判断するスクリプトです.変数 x の値を変化させて実行してみてください.

  7. printf

    出力の回に一度紹介した printf は指定さ れた仮変数部分に後置された変数の値を入れて表示するものです.仮変数は表2 のような形式のものが使われます.

    表2 printf で使用する仮変数 (仮引数)

    %s文字列
    %d整数型の数値
    %f実数型の数値
    %e指数表現の数値

    この printf を使った例 を見てみます.

    num = rand(2)
    
    if num == 0
      name = "Destiny"
      code_num = 42
      code_char = "S"
    else
      name = "Strike Freedom"
      code_num = 20
      code_char = "A"
    end
    
    printf "ZGMF-X%d%s %s Gundam\n", code_num, code_char, name
    

    printf を使うと,二重引用符の対が一つですんでいます.すなわち, 表示したい文字列を一通り記述して,仮引数で置いている部分に後に書いて ある変数の値が入れられているのです.仮引数の順番と変数の順番が対応して いないとエラーになってしまいますので,注意して下さい.図3に printf を使う際に重要な対応関係を出力命令の2行目について示しておきます.

    図3 printf 文の構文

  8. 演習

    • 乱数によりサイコロの目を発生させます.その目を表示するとともに,その 目が偶数か奇数かを次のように表示するスクリプトを作成しましょう.

      サイコロの目: 3
      出た目は奇数
      

           解答例

    • 3桁の整数 num1 と1桁の正の整数 num2 をそれぞれ乱数によ り発生させます. num2 num1 の約数かどうかを判 定するスクリプトを作成しましょう.

           解答例

  9. 小テスト

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

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

  10. 宿題

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

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

  11. 本日の用語

    • ブール型の値で,true.Rubyにおいては偽やnilで無いこと.

    • ブール型の値で,false

    • if

      条件式が真であるか偽であるかによって以下の処理の流れを決めるための構文.

    • else

      〜以外,を意味する単語.if 文では条件式に合わなかったときに用意 する処理をここに記述する.

    • 比較演算

      ふたつの値の大小や合同を調べる演算.

    • printf

      フォーマット付き出力.

    • 仮引数

      変数や値を受け取るために内部的に処理される変数.引数とは関数に与えられる 値のこと.


目次ページに戻る