情報科学概論
2002.5-14



  1. 本日の作業内容

  2. 出席確認

    出席に関する注意事項を説明しますので,その注意を良く聞いてから,電子メールにより出席の申告をしてください.「件名」は

    gairon 5-14 attend s0240**

    のように自分の学生番号を使って下さい.なお,入力ミスがあると出席として認 められないことになりますので,慎重に行ってください.文 字はすべて1バイト文字 (半角英数字) です.途中に入るスペースは一度に一個だけと してください.スペースは全部で3個です.また,**の部分は自分の学生番号の下二桁 です.

  3. 制御構造 (条件分岐)

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

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

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

    コンピュータは全く融通が利かないので,人間に依頼するようにはいきません. 本当に厳密に処理を考えておかないといけないわけです.ここではその中の場合 分けを扱う条件分岐について説明します.

    • 真と偽

      条件を判断する上で,根拠となるのは「値」が「真」か「偽」かになります.プ ログラミング言語では,それらをtrueもしくはfalseとして表現しますが,言語 ごとに特徴があって,trueやfalseはそれぞれ「代表値」としてあつかわれます. Rubyでは,trueとはfalseやnilでは無いという意味になります.nilとは値が 「無い」ことを表す言葉です.たとえば,

      a = ARGV[0]
      puts a
      

      としてみましょう.ファイル名をtest.rbとして,これを実行する際に,

      $ ruby test.rb 1

      のようにすると,結果は,

      1
      

      となるでしょうが,引数をつけないで,

      $ ruby test.rb

      とすると,結果は,

      nil
      

      になるでしょう.ここでは,引数を何もつけないで実行したため, ARGVには何も値が入っていません.値がないので,出力すると,「値 が無い」と言うことになります.これが,nil です.

      さて,以下の実際の例で見ていくことにしま しょう.

    • if

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

      a = ARGV[0]
      
      if ARGV[0] then
        print "OK\n"
      else
        print "NG\n"
      end

      このスクリプトをターミナルで走らせてみます.

      $ ruby if.rb

      すると,結果は,

      NG

      となるでしょう.しかし,実行時に引数を何でも良いのでつけてみるとどうでしょ うか.

      if というのは英語の「もしも」ですから,意味はすぐに分かると思い ます.コマンドライン引数が何らかの値を持てば,すなわち,trueですので,条 件が成立していることになり,OKが表示されます.しかし,値がなければtrueで はないので,else の方に処理が移ります.else は「それ以 外」の意味ですから,条件が成立しなかった場合の処理をそのあとに記述します. 条件文の最後は end をつけておきます.また,処理の文は「字下げ」 をするのが通例です.

      上の例の then は省略可能です.また,else の処理は無くても良ければ記述しなくても構いません.

    • 論理演算

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

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

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

      a = ARGV[0].to_i
      
      if a > 0
        print "positive\n"
      else
        print "negative or zero\n"
      end

      値の大小を扱うことが出来るようになると,応用の範囲がぐっと広がります.

    • elsif

      if文の中身をさらに細かく分けて制御していくときに,elsif も使う ことができます.次の例を見てください.

      a = ARGV[0].to_i
      
      if a > 0
        print "positive\n"
      elsif a == 0
        print "zero\n"
      else
        print "negative\n"
      end

    • case

      3つ以上の場合分けが想定される場合に,上のように elsif を使うの も可能ですが,よりすっきりと記述するためにはこのcase 文の利用が 望ましいでしょう.例を次に上げてみます.

      a = ARGV[0]
      
      case a
      when /^[1-9]+/
        print "positive\n"
      when /^0/
        print "zero\n"
      else
        print "negative\n"
      end

      ここで,まだ勉強していない「正規表現」が使われていますが,それは今のとこ ろ気にしなくても構いません.特徴は,when はいくつあっても良いので,判断するものが一つで場合 がたくさんあるときに便利なことです.

    • unless

      英語の意味が分かれば,使い方が分かると思います.使用法は if と 同じで意味が逆になります.自分で,先ほどの if 文の例をこの unless で置き換えてみましょう.

  4. 数学関数

    数値に関することを扱い始めると,数学で使ってきた関数を使いたくなります. 基本的な関数はRubyにも用意されていますが,使うためには準備が必要です.ス クリプトの最初に必ず数学用のモジュールを呼び出すことをしてください.方法 は,

    include Math

    という記述を加えるだけです.これにより,数学関数の利用が可能になります. では,どのような関数が用意されているのでしょうか.以下に例を示します.

    関数atan2(x,y)逆正接
    cos(x)余弦
    sin(x)正弦
    tan(x)正接
    exp(x)指数
    log(x)自然対数
    log10(x)常用対数
    sqrt(x)平方根
    定数PI円周率
    E自然対数の底

    この中で,atan2(x,y) に関しては,説明が必要だと思いますので,別 ページを参考にしてください.また,三角関数を使用する際に,引数として 与える数値は弧度法によるラジアン単位のものです.注意してください.

    以下では,実際の例として,半径10の円において引数として与えた角度 (単位は 度) の弧の長さを求めてみましょう.

    include Math
    angle = ARGV[0].to_f
    
    print "Arc is ", 10 * angle * PI / 180, "\n"

    ここで,to_f は,与えられた文字を浮動小数 (実数のこと) に変換す るメソッドです.

    さて,以前に printf という出力命令を紹介しています.ここでは, それが print とどう違うのかを見てみましょう.fはフォーマット付 という意味ですが,そのフォーマットとは何でしょうか.表示する形式のことを 表します.すなわち,数値を表現するときであれば,小数以下を何桁で表示する のか,また,整数部も含めた有効数字をどうするのか,そのようなことを指定で きるのが printf です.先ほどのスクリプトを少し変更してみましょ う.

    include Math
    angle = ARGV[0].to_f
    arc = 10 * angle * PI / 180
    printf "Arc is %f \n", arc

    これではどうでしょうか.最後の行に注目してください.二重引用符で囲った文 字列の中に %f というこれまで見たことのないものが入っています. そして,実際に計算した弧の長さが,文字列の後ろに続いています.しかし,出 力結果は,

    Arc is 31.415927

    のように,普通に表示されているはずです.(上の例は角度として180を与えた場 合)

    結局,printf を使うと,二重引用符の中の文字列中に指定した形式で 数値やその他の値を表示できるわけです.先ほどの例では,数値は,%f という形式でしたが,これは浮動小数 (Floating point number) を表します. 整数で表示したければ,%d が使えます.dは decimal の略です.また,ただの %f では, 小数部分をデフォルトの6桁取るようになっています. 整数部分はあるだけ確保されます.小数部分の桁まで 指定したければ,たとえば, %1.3f のよう にすれば,小数部分は四捨五入して3桁になります.整 数部分を1桁と指定しても,あるだけ確保されるので無 視されます.

    実験値のように有効数字が問題になる場合には全部の桁を考慮しなければなりま せん.その場合には,%e が使えます.この場合には,桁指定が大事に なります.最後の行を

    printf "Arc is %e \n", arc

    に変えて先ほどの180度で実行すると,出力は,

    Arc is 3.141593e+01

    のようになり,整数部分を一桁とり,10の1乗をかけるという表現に変ります. ここでも,桁数の指定が可能で,%1.3e のようにして,有効数字を規 定することが出来ます.

  5. 実習作業

    上記の内容について,特に,if 文の使い方や,数学関数の利用法につ いて実習してください.自分で様々に変型したスクリプトをつくって試すのが良 いでしょう.

  6. 宿題

    授業の終りに宿題 (AクラスBクラス別々) について説明しますので,アナウンスに注意してください.


目次ページに戻る