情報科学概論
2001.6.26



  1. 本日の作業内容

    1. 式の結合順位と括弧
    2. 数値
      1. 数値リテラル
      2. 演算子
      3. 変換メソッド
      4. 繰り返し
      5. 数値に関するその他のメソッド
      6. 数学関数
    3. ループの意味再確認
    4. コマンドライン引数(その2)
    5. 本日の実習内容
    6. 宿題
    7. 次週の予定


  2. 式の結合順位と括弧

    教科書p.75

    2.1.4の表2.1にある結合順を意図的に操作するには括弧を用いることになる。その 時の用法が教科書には説明されているが、細かいことはあまり気にしなくても現時 点では構わない。注意することは代入は右から始まる結合であるが、演算子は左か ら始まることである。別の言い方をすると、例えば、

    a = b = c = d = 0

    のような代入は右から順に行われるが、

    a == 1 && b == 0 && c == 0

    は、a 1 かどうかを評価し、もし真であれば次に b の値を評価する。そこが偽であれば評価は取りやめとなり、真であれば c の値の評価に移る。順番を制御し たい場合には括弧を利用する。

  3. 数値

    教科書p.79

    今まで種々の数値計算を行ってきたが、それらは数値クラスを利用して行われてき た。通常の整数による演算では意識しないでいることも可能であるが、大きな数値 を扱う場合には知っておいたほうがよい知識もある。ただし、Rubyでは扱う数値が 大きくなると自動的にクラスを変更してくれるので、C言語などのように神経質になる 必要は無いようである。

    1. 数値リテラル

      教科書p.79

      今までにも整数、浮動小数点数は扱ってきた。また、浮動小数点数の場合には工学 分野のように有効数字が重要であるので、指数表示についても実習した。テキスト 処理などで文字コードなどを扱う必要が出てくると、16進数表示も使う必要が出て 来るかもしれない。文字のコードをそのまま見る ? などは今のところは知らなくて も構わない。

    2. 演算子

      教科書p.79

      すでに演算子は多数出てきているので、すべてについては紹介しないが、重要なも のについては以下に注意をしておく。

      • 割り算
        整数どうしの演算は答えを整数で表記するのがプログラム言語の決まりである。そ のため、割り算には注意が必要である。教科書のp.80にもあるように、2/3は0にな る。2か3かどちらかでも浮動小数であれば、答えは自動的に浮動小数へと変換され るので、2/3.0であれば、浮動小数になり、有効けたの範囲で正しい答えを与える。 これは、C言語でも同様であり、以前に紹介した温度変換の例でもそれを避けるた めに演算の順番が工夫されている。

      • 剰余
        行列の積の課題のヒントで紹介したものであり、しばしば利用される大事な演算子 である。特に、余りを利用することは重要な考え方なので知っておいて損はない。 簡単な例として以下のようなスクリプトを考える。この動作はコマンドライン引数 として与えられた整数の個数分だけ 2 3 4 の数字の表示を繰り返すものである。

        n = ARGV[0].to_i
        
        for i in 0..n-1
          print i % 3 + 2, " "
        end
        
        print "\n"

        動作は、

        $ ruby div.rb 7
        2 3 4 2 3 4 2
        $

        のようになる。

      • 単項演算子
        今までは余り使わなかったが、負の数を現すための-記号も演算子として解釈され る。これは一番強い結合なので注意が必要なことがある。

      • ビット演算子
        現在のところ必要とはしないが、ネットワークに関してIPアドレスとネットマスク との相関などを考える際などには必要になる考え方である。IPアドレスは32ビット の整数で表記されるが、ネットマスクとはその各ビットに1もしくは0をかけて同じ グループかどうかを判断するために準備されている定数である。詳しくは3年次に 開講されるコンピュータネットワーク基礎で紹介する予定である。

    3. 変換メソッド

      教科書p.81

      これもすでに扱っているが、文字列として読み込んだ数値を、演算できるように数 値として認識させるために必要なメソッドである。gets (や ARGV )などで取り込んだデー タに関しては文字列(を要素とする配列)として読み込まれているので、計算に使用するためには必ず .to_i .to_f が必要になる。

    4. 繰り返し

      教科書p.82

      for ループについては何度も紹介しているが、for を使う際に は変数の増分が1ずつとあらかじめ決まってしまう。奇数もしくは偶数につい て順に試すような操作であれば、step の方が便利になる。ただし 、ブロックつきメソッドとして使用しないといけない。以下に1から99までの 奇数の和を求める例を示す。

      odd = 0
      1.step(99,2){|x| odd += x}
      puts odd

      上と同様の計算を for ループで行うと以下のようになる。

      odd2 = 0
      for i in 0..49
        odd2 += 2 * i + 1
      end
      puts odd2

      この程度であればどちらが簡単かはあまり関係ないが、より直感的に使える方を選 択すればよい。

    5. 数値に関するその他のメソッド

      教科書p.83

      今までは種々の数値計算において桁数の指定などのみ行い、四捨五入などは考慮し なかった。必要に応じてp.83の表のメソッドを使えば四捨五入や絶対値を取る操作 などが行える。

    6. 数学関数

      教科書p.84

      いくつかの関数についてはすでに使用したことがある。基本的には普通の関数と同 じ表現になっているので理解できると思うが、atan2 はなじみがないと 思われるので説明しておく。この逆三角関数は引数を二つ取る形になっている。図 示すると、以下のようになる。

      図1 atan2 の説明図

      この関数を利用すると以下のように円周率πが簡単に計算で求まる。

      include Math
      
      puts 4 * atan2(1,1)

  4. ループの意味再確認

    ここまで何度か for while を使ったループについて説明し て来た。しかしながら、なぜ、そこまでループを強調するのか理解できていないケー スが多いようである。そこで、今回も改めて指摘しておくことにする。何度も言う ように計算機は人間が嫌いな同じことの繰り返しのような作業が得意である。そ のため、決 められたパターンに従ってひたすら処理を繰り返す作業にプログラムとして持って 行くことが大事である。例えば、階乗の計算を考える。以下に示すのはスクリプト の例である。

    n = ARGV[0].to_i
    fact = 1
    
    if n == 0
      fact = 1
    else
      for i in 1..n
        fact *= i
      end
    end
    
    puts fact

    このスクリプトの動かし方は、ターミナルにおいて階乗を求める整数をコマンドライン引数 として与えるようにする。すなわち、

    $ ruby fact.rb 10
    3628800
    $

    のようにする。ここで、言いたいことは引数として与える整数の数が変化してもス クリプトの長さが変化しないことである。先週の課題でコマンドライン引数に6つ の整数を与えた場合の平均の計算を指定したが、そのときに注意しないと行けない のは、引数の個数が変わってもスクリプトの長さ(行数)が変化しないようにするこ とである。たとえ、引数が1万個でも1億個でも長さが変わらないようにすることは 簡単にできる。

    人間は、繰り返し同じことを実行するよりも、公式や知識を駆使して簡単にする ことを望む場合が多いが、計算機に実行させるのなら、条件が多少変わっても同じ プログラムで動くようにしておき、処理の数が増えてもループを回す回数が増え るだけになるように初めに良く考えてからスクリプトを組む必要がある。(少なく とも初心者のうちは)

  5. コマンドライン引数(その2)

    先週は ARGV を使う例を復習した。今日は、 ARGF の場合につ いて考えてみる。 ARGV では実際に入力として読み込まれるのはコマン ドライン引数で与えられた文字そのものであった。一方、 ARGF では引 数として与えられたファイルの中身を参照する。違いは以下の二つのスクリプトを 実行して比較してみると分かる。

    #ARGV test
    while line = ARGV.shift
      puts line
    end
    

    上のスクリプトの実行は、

    $ ruby argv.rb fact.rb

    のように行う。一方、次に示すのは ARGF の例である。

    #ARGF test
    while line = ARGF.gets
      puts line
    end
    

    こちらは、

    $ ruby argf.rb fact.rb

    のようにする。引数として与えたのは階乗を求めるスクリプトにしている。実行結 果の違いを確認し、コマンドライン引数を扱う二つの重要な定数の違いについて理 解しよう。

  6. 本日の実習

    作業1
    教科書のスクリプト例を自分で試してみること。

    作業2
    webテキストに紹介した例も試してみること。

  7. 宿題

    授業の終わり頃に次回までに提出する課題を発表するのでアナウンスに注意すること。また、発表されたら課題を表示するためには、一度このページを再読み込みする必要があるのでNetscapeのボタンをクリックする。そうしないと、課題のページは表示されない。

  8. 次週の予定

    来週は、文字列に関する節に進む。文字列と正規表現、置換、変換などを中心に実 習を行う。


トップに戻る

目次ページに戻る