情報科学概論
2003.7.22
Back to index page
- 本日の作業内容
- 期末試験解答用紙のダウンロード予行演習
期末試験は,いつもの授業と同じ形式で実施します.コンピュータを利用してメー
ルにより解答を提出しますが,体裁を揃えるために基本となる解答用紙をダウン
ロードして,エディタで記入する形式です.方法になれておくために,一度試し
てみて下さい.
解答用紙ダウンロード予行演習
- 配列(3)
- 指数
配列の要素を指定するためには,要素の
順番を「指数」として利用します.指数は0から始まることに注意が必
要でした.
ary = ["duel", "buster", "strike", "blitz", "aegis", "freedom", "justice"]
puts ary[1]
|
指数として負の数を入力すると,終わりから数えた順番で表示します.このとき
は,0から始まるのではなく,1から始まります.
ary = ["duel", "buster", "strike", "blitz", "aegis", "freedom", "justice"]
puts ary[-1]
|
for 文の範囲指定で利用している形式を利用すると,配列の中の範囲
も指定できます.
ary = ["duel", "buster", "strike", "blitz", "aegis", "freedom", "justice"]
puts ary[1..3]
|
配列の指数として,配列の数よりも大きな数を指定すると,値が無いために
nil を返しますが,上記の範囲指定で終わりの数を要素数以上に設定する
と,一番最後の数を指定したのと同じ動作になります.
ary = ["duel", "buster", "strike", "blitz", "aegis", "freedom", "justice"]
puts ary[10]
puts ary[4..10]
|
- 集合
配列の和は要素を結合したものになることを以前に紹介しました.論理演算を応
用して配列を集合として扱うことも可能です.
ary1 = ["duel", "buster", "strike", "blitz", "aegis", "freedom", "justice"]
ary2 = ["ginn", "sguu", "bacue", "freedom", "justice"]
aryand = ary1 & ary2
aryor = ary1 | ary2
arydiff = ary1 - ary2
p aryand, aryor, arydiff
|
- 文字列の配列化
スペースやカンマで区切られた文字列を自動的に配列に変換することが可能です.
Rubyでは,次のような方法で変換できます.
str = "A quick brown fox jumps over the lazy dog"
ary = str.split
p ary
|
上の例文のように区切りが明白な場合には空白により自動で分割されます.次の
例は,区切り記号を指定して実行する場合です.
str = "Kira Freedom:Athrun Justice:Mu Strike:Diakka Buster"
ary = str.split(/:/)
p ary
|
このような方法が役に立つのは,あらかじめ存在しているデータを活用して計算
を行うような場合です.表計算というジャンルのソフトウェアは事務処理などで
良く利用されますが,そのデータはCSVと言う形式でカンマ区切りのテキストデー
タに変換してやりとりされることが多くあります.それに似たデータを利用して
計算する例を次に考えてみましょう.
- 成績データ
例えば,10人の学生の試験成績データとして以下のようなものがあるとします.
このデータはダウンロード可能です.
Name,English,Mathematics,Physics
Athrun,100,100,100
Cagalli,80,60,60
Dearka,95,90,80
Kira,90,100,100
Lacus,100,50,50
Miriallia,80,80,75
Nicol,100,80,80
Ssigh,85,90,85
Tolle,80,85,85
Yzak,90,90,90
|
このデータを record.txt という名前で保存した場合に,次のような
スクリプトを実行してみましょう.
#list.rb
data = []
i = 0
while line = ARGF.gets
data[i] = line.chomp.split(/,/)
i += 1
end
p data
|
実行は,引数でファイル名を与えます.
$ ruby list.rb record.txt
これで各行の内容がカンマで分割され配列になり,さらに,その配列を要素とす
る配列 data が作成されています.なお,上で使っている chomp
というメソッドは行末の改行文字を切り捨てるために使用してい
るものです.
これを元に各種の計算を実行してみましょう.
- 平均点
各教科の平均点を出してみます.データを縦に見て行くと言うことは,特定の指
数のついた要素を選んで和を求めて行くことになります.
data = []
i = 0
while line = ARGF.gets
data[i] = line.chomp.split(/,/)
i += 1
end
sum_e = 0
for i in 1..10
sum_e += data[i][1].to_f
end
printf "英語の平均点は %1.1f です.\n", sum_e / 10
|
学生ごとの平均点はどうなるでしょうか.今度は横に見てゆきます.
data = []
i = 0
while line = ARGF.gets
data[i] = line.chomp.split(/,/)
i += 1
end
data[0][4] = "Average"
printf "%-9s\s%s\n", data[0][0], data[0][4]
for i in 1..10
data[i][4] = 0
end
for i in 1..10
for j in 1..3
data[i][4] += data[i][j].to_i
end
printf "%-9s\s%5.1f\n", data[i][0], data[i][4] / 3
end
|
- 実習作業
- 上の成績処理に関して,英語以外の平均点を求めるスクリプトを作成してみて下
さい.
- 各個人の平均点,各教科ごとの平均点,全体の平均点を表に追加して画面に
出力するスクリプトを作成してみましょう.例えば,次のように表示され
るとします.
Name English Mathematics Physics Average
Athrun 100 100 100 100.0
Cagalli 80 60 60 66.7
Dearka 95 90 80 88.3
Kira 90 100 100 96.7
Lacus 100 50 50 66.7
Miriallia 80 80 75 78.3
Nicol 100 80 80 86.7
Ssigh 85 90 85 86.7
Tolle 80 85 85 83.3
Yzak 90 90 90 90.0
Average 90.0 82.5 80.5 84.3
|
- 小テスト
授業の残り20分くらいでAクラスとBクラス別々の小テストを行いますので,アナウンス
に注意してください.
- 宿題
授業の最後にAクラスとBクラス別々の宿題の案内も出しますので,アナウンスに注意してください.
目次ページに戻る