情報科学概論
2001.7.10
最終回の講義なので、授業に関するアンケートをとる。初めに用紙を配布するので、
この時間内に記入して提出すること。
複数のオブジェクト(データ)に通し番号をつけて管理できる配列は非常に便利な物
である。もう一度、復習をして是非とも使えるようになっておこう。
配列は要素を代入することにより作成できるし、空の配列を定義しておいて後から
値を代入して作ることもできる。空の配列は、例えば、
array = []
のようにすると、要素の数を気にしないで作成できる。ただし、二重になった配列
などはその多重の度合を示すように定義しないと行けない。例えば、
[[1,2],[3,4],[5,6]]
のような配列になることが分かっていれば、
array = [[],[],[]]
のように定義しておく。また、sizeオブジェクトにより配列の要素の数
を調べることができるが、上のような多重の配列の場合には、トップレベルの要素
の数しか分からない。たとえば、
puts array.size
のようにしてみると分かる。また、
puts array[0].size
のような使い方もすることがある。
さて、教科書のp.103に出ているnewメソッドを利用した配列の作成について、補足
が必要なので紹介しておくと、二番目に出ている
Array.new(3, "10")
の注釈の意味が分かりづらいことである。まず、大文字で始まる Array
はクラス定義を行うためのもので、変数や定数とは違っている。そして、そこでは、単純に三つの"10"を要素とす
るのではなく、3つの要素とも同じオブジェクトであることが書かれている。意味
を試すには、以下のようなスクリプトが役に立つかも知れない。ここで、id
メソッドはオブジェクトのIDを知るための物である。また、
replace は字のごとく置き換えを行うメソッドであり、p.113に
説明がある。
同一のオブジェクトを指していると言うことは、どれか一つでも入れ換えると要素
の全てが入れ替わることになる。それが、上のスクリプトで実感できただろうか。
この節は、まず、要素の順番の記述に注意が必要である。配列の要素を指す数は0
から始まるが、日本語では通常、最初のものを一番目と呼ぶ。教科書では、
その一番目を0番目と書いてあるので、感覚的に一つ分ずれている。
教科書p.104
この授業では for ループを使う例を多く紹介して来た。しかし、教科書
の方では for ループに関する説明はあまりされていない。理由の一つは
この節にあるように、each メソッドを利用して、ブロックなどで処理を
するのがRubyらしいことにある。初めのうちは、それでは構造が分かりにくいので、
意図的に for ループを使ってみたが、この節で紹介されている
transpose.rb についても for ループによる置き換えを試してみる。
m = m || mat[0].size
の省略形である。意味は、m が真なら m に m を代
入、偽であれば、|| の右側を代入で
ある。
どちらが分かりやすいかは、センスや慣れの問題もあるが、今のところは
for の方
ではないだろうか。
配列の要素を指し示すインデックスの表記法の説明が行われている。スクリプト中
で便利な物を利用すれば良い。p.106の一番下に3つのピリオドで作ったRangeオブ
ジェクトが紹介されているが、それを利用すると先程のスクリプト中で for
ループに関する部分は以下のように少し簡単になる。
配列にも種々の演算子が使用できる。ここで注意するのは + による単純
な連結と、p.110で紹介されている concat を使用したものの違いである。concat では、
配列そのものを変更するのに対して、+ は元の配列はそのままで新たに
別のものを作成することになっている。
collect! メソッドの説明には succ が使用されているが、それ
は教科書のp.83の表に説明がある。整数を1だけ大きくするのだが、ここ
ではどのような動作になっているのだろうか。試しに、要素を数字に変え
てみたりzなどにしてみる
と良い。
今日のwebテキストの初めの方で、入れ子になっている配列の要素の数は
size メソッドでは分からないと書いた。実際に多重の配列の要素の個数を求めるに
は、flatten を使えばできそうである。以下のスクリプトの動作はどの
ようになるか、確認してみよう。
今までは、数値計算のために配列の要素を数値に変更する to_i や
to_f をしばしば利用した。ここでは、逆に文字列に変換する
to_s が紹介されている。配列を文字列に変更する際には、教科
書の例のように、区切り記号を自分の好きなものにすることが可能である。
何らかの区切りが無いと配列要素の関係が良く分からなくなるので、適宜
使用すれば良い。
普通の英数字などの文字についての表現はその文字そのものであるので、比較的簡単であるが、
空白などの特殊文字や文字列を一般化するための表現などには工夫が必要である。詳細
は、教科書のp.225の表を参照するしか無い。例えば、行の先頭にある大文字
のDと言うときには、/^D/のようにスラッシュで囲んで、行頭を表す
^ を使って表現する。アルファベットの小文字全て、となると、
/[a-z]/のようになる。また、0回以上の繰り返しを意味する*と1回以上の
繰り返しの + など覚えておく必要がある。
知っておくべきメソッドには代表的なものにgsubがある。正規表現を利用してマッ
チする部分を別の文字列に置き換える動作をする。空の文字列に置き換えれば、そ
れはすなわち、特定文字列の消去になる。もう一度、教科書のp.93を振り返ってみ
るのも良い。
作業1
作業2
作業3
教科書p.102array0 = ["10", "10", "10"]
for i in 0..2
puts array0[i].id
end
array1 = Array.new(3, "10")
p array1
for i in 0..2
puts array1[i].id
end
array1[1].replace "20"
p array1
array1[1] = "20"
p array1
教科書p.103その前に、まず、p.105にあるスクリプトの中に出て来る ||= について
であるが、これはある種の自己代入的な表現で、
さて、for に置き換えるスクリプトは次のようになる。matrix = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
tm = [[],[],[]]
for i in 0..matrix[0].size-1
for j in 0..matrix.size-1
tm[i][j] = matrix[j][i]
end
end
p tm
教科書p.105for i in 0...matrix[0].size
for j in 0...matrix.size
tm[i][j] = matrix[j][i]
end
end
教科書p.107
教科書p.112
教科書p.113array = [[[0,1],2],3,[4,5]]
p array.flatten.size
正規表現は文字列を処理する際に必ず必要となる考え方であり、特定の文字列をど
のように表現するかを統一したフォーマットで行うものである。例えば、行の最初
や、行末、スペースやタブで区切られた文字列の特定部分などを抜きだして、別の
文字列に置き換えるときなどに利用される。この授業でも、先週のコマンドの課題
のように、拡張子が.rbであるファイルに対する処理を行おうと思うと、行末の
.rbのように指定する必要があり、正規表現が使用されている。
アンケートに記入し提出すること。
webで紹介した部分の教科書のスクリプト例を自分で試してみること。
正規表現についても実習してみること。
授業の終わり頃に次回までに提出する課題を発表するのでアナウンスに注意すること。また、発表されたら課題を表示するためには、一度このページを再読み込みする必要があるのでNetscapeのボタンをクリックする。そうしないと、課題のページは表示されない。
来週は、課題を仕上げ
るための実習時間に当てる。来週以降、課題の提出状況ページに暫定的な成績評価もあ
わせて表示するので、評価を上げたい場合には17日は必ず出席のこと。最終的な課題の提出締切は7月27日(金)の予定である。
トップに戻る