情報科学概論
2001.6.26
2.1.4の表2.1にある結合順を意図的に操作するには括弧を用いることになる。その
時の用法が教科書には説明されているが、細かいことはあまり気にしなくても現時
点では構わない。注意することは代入は右から始まる結合であるが、演算子は左か
ら始まることである。別の言い方をすると、例えば、
a = b = c = d = 0
のような代入は右から順に行われるが、
a == 1 && b == 0 && c == 0
は、a が 1 かどうかを評価し、もし真であれば次に b
の値を評価する。そこが偽であれば評価は取りやめとなり、真であれば
c の値の評価に移る。順番を制御し
たい場合には括弧を利用する。
今まで種々の数値計算を行ってきたが、それらは数値クラスを利用して行われてき
た。通常の整数による演算では意識しないでいることも可能であるが、大きな数値
を扱う場合には知っておいたほうがよい知識もある。ただし、Rubyでは扱う数値が
大きくなると自動的にクラスを変更してくれるので、C言語などのように神経質になる
必要は無いようである。
今までにも整数、浮動小数点数は扱ってきた。また、浮動小数点数の場合には工学
分野のように有効数字が重要であるので、指数表示についても実習した。テキスト
処理などで文字コードなどを扱う必要が出てくると、16進数表示も使う必要が出て
来るかもしれない。文字のコードをそのまま見る ? などは今のところは知らなくて
も構わない。
すでに演算子は多数出てきているので、すべてについては紹介しないが、重要なも
のについては以下に注意をしておく。
動作は、
$ ruby div.rb 7
のようになる。
これもすでに扱っているが、文字列として読み込んだ数値を、演算できるように数
値として認識させるために必要なメソッドである。gets (や ARGV
)などで取り込んだデー
タに関しては文字列(を要素とする配列)として読み込まれているので、計算に使用するためには必ず .to_i や
.to_f が必要になる。
for ループについては何度も紹介しているが、for を使う際に
は変数の増分が1ずつとあらかじめ決まってしまう。奇数もしくは偶数につい
て順に試すような操作であれば、step の方が便利になる。ただし
、ブロックつきメソッドとして使用しないといけない。以下に1から99までの
奇数の和を求める例を示す。
上と同様の計算を for ループで行うと以下のようになる。
この程度であればどちらが簡単かはあまり関係ないが、より直感的に使える方を選
択すればよい。
今までは種々の数値計算において桁数の指定などのみ行い、四捨五入などは考慮し
なかった。必要に応じてp.83の表のメソッドを使えば四捨五入や絶対値を取る操作
などが行える。
いくつかの関数についてはすでに使用したことがある。基本的には普通の関数と同
じ表現になっているので理解できると思うが、atan2 はなじみがないと
思われるので説明しておく。この逆三角関数は引数を二つ取る形になっている。図
示すると、以下のようになる。
図1 atan2 の説明図
この関数を利用すると以下のように円周率πが簡単に計算で求まる。
このスクリプトの動かし方は、ターミナルにおいて階乗を求める整数をコマンドライン引数
として与えるようにする。すなわち、
$ ruby fact.rb 10
のようにする。ここで、言いたいことは引数として与える整数の数が変化してもス
クリプトの長さが変化しないことである。先週の課題でコマンドライン引数に6つ
の整数を与えた場合の平均の計算を指定したが、そのときに注意しないと行けない
のは、引数の個数が変わってもスクリプトの長さ(行数)が変化しないようにするこ
とである。たとえ、引数が1万個でも1億個でも長さが変わらないようにすることは
簡単にできる。
人間は、繰り返し同じことを実行するよりも、公式や知識を駆使して簡単にする
ことを望む場合が多いが、計算機に実行させるのなら、条件が多少変わっても同じ
プログラムで動くようにしておき、処理の数が増えてもループを回す回数が増え
るだけになるように初めに良く考えてからスクリプトを組む必要がある。(少なく
とも初心者のうちは)
先週は ARGV を使う例を復習した。今日は、 ARGF の場合につ
いて考えてみる。 ARGV では実際に入力として読み込まれるのはコマン
ドライン引数で与えられた文字そのものであった。一方、 ARGF では引
数として与えられたファイルの中身を参照する。違いは以下の二つのスクリプトを
実行して比較してみると分かる。
$ ruby argv.rb fact.rb
のように行う。一方、次に示すのは ARGF の例である。
$ ruby argf.rb fact.rb
のようにする。引数として与えたのは階乗を求めるスクリプトにしている。実行結
果の違いを確認し、コマンドライン引数を扱う二つの重要な定数の違いについて理
解しよう。
作業1
作業2
教科書p.75
教科書p.79
教科書p.79
教科書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"
2 3 4 2 3 4 2
$
今までは余り使わなかったが、負の数を現すための-記号も演算子として解釈され
る。これは一番強い結合なので注意が必要なことがある。
現在のところ必要とはしないが、ネットワークに関してIPアドレスとネットマスク
との相関などを考える際などには必要になる考え方である。IPアドレスは32ビット
の整数で表記されるが、ネットマスクとはその各ビットに1もしくは0をかけて同じ
グループかどうかを判断するために準備されている定数である。詳しくは3年次に
開講されるコンピュータネットワーク基礎で紹介する予定である。
教科書p.81
教科書p.82odd = 0
1.step(99,2){|x| odd += x}
puts odd
odd2 = 0
for i in 0..49
odd2 += 2 * i + 1
end
puts odd2
教科書p.83
教科書p.84include Math
puts 4 * atan2(1,1)
ここまで何度か 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
3628800
$ #ARGV test
while line = ARGV.shift
puts line
end
上のスクリプトの実行は、#ARGF test
while line = ARGF.gets
puts line
end
こちらは、
教科書のスクリプト例を自分で試してみること。
webテキストに紹介した例も試してみること。
授業の終わり頃に次回までに提出する課題を発表するのでアナウンスに注意すること。また、発表されたら課題を表示するためには、一度このページを再読み込みする必要があるのでNetscapeのボタンをクリックする。そうしないと、課題のページは表示されない。
来週は、文字列に関する節に進む。文字列と正規表現、置換、変換などを中心に実
習を行う。
トップに戻る