Ruby



第4回分


見てる人いたら挙手!

今回は配列と、配列にモノを入れたりする処理の仕方についてやっていきます。
いつも思うんですけどほかのプログラミングの授業の1・5倍くらいの分量やってる気がします


配列


配列とはたくさんのものを1箇所にまとめた箱のようなもので
イメージとしてはルーズリーフをファイルに綴じまくるような感じです

Rubyでの配列は数字や文字列が混在してもいけます


ここで注意することは
配列の番号は 0 から始まるということです。
例えば array_test = [1,2,3,4] という配列があったとき、1という要素は
array_test[0] に格納されています




配列の操作



このあたりから課題のアレでそれを見ながらのほうが多分わかりやすいので
課題を見ながらやっていきましょう


配列操作


まず配列に格納された数字(文字列)を、ちゃんとした数値に変換する必要があります。
同じ12345678という数字でも文字列と数値では異なります


number and strings
数字と文字列の違い

同じように12345678と出力されましたが、中身が異なることは計算によって明らかに。
数値は計算されて出力されていますが、文字列は文字列の掛け算、つまり同じ文字列を3つ出力したことになります。
この文字列としての"数字"を数値に変換するメソッドが
.to_i
になります。
例はこの図を参照のほど


from string to number
文字列が数式になり、計算が行われた

このように数値化すると、例えば12345678という数字から12340000を引いてみたり
12340000で割った余りを出してみたり…という形で弄れるようになりますね。



配列中の要素の分割・結合


配列に入っている文字列などを分割していくつかの項目に分けたり、逆に結合して複数のものを1個にまとめるなどの操作を行います。


まず分割は
.split(' ')
と表記します。これはこの' 'で指定した文字が入っているところで文字列をぶった切って、その文字までを配列の1区画に入れる作業を示しています。
また分割と逆に結合させるものが
.join(' ')
で表されます。こちらは複数の文字をくっつける際に、間に' 'で指定した文字を追加しながら結合していきます。
例を見て頂きましょう。


join split example
結合・分解した結果

このように、元々あった文字列を分割し、" "で括っているので" "が消えていることに注意ですね。
それから結合の方は逆に"abc "+"aaa"+"def "という形で結合しています。
この分割した文字列を後でどのように使うかは自由なので、
例えば "鈴木 一郎" を "一郎鈴木" のように入れ替えたりするのも簡単です
今回の例で言えば split_array[0]~[2] だったのを split_array[2]~[0]のようにすればいいわけです




ファイル入出力(基礎)


今まではコマンドプロンプトやirbなどのように直接データを打ち込むか、プログラムファイルに書き込んだものを呼び出しているものばかりでした。
ここでは複数の異なるファイルなどが与えられると仮定した、いわゆる汎用的なプログラムを書きたいので、
別ファイルから読み込んで処理→結果を別ファイルに出力
というものを目的とします。


詳しいところは僕もわかりませんが
input_line = $_.chomp
のように表記すると読み込んだファイルの中身が1行読み込まれるようです。
そしていつものように.rbファイルを実行する際

ruby -n program.rb <input.txt >output.txt

のように表記することで
input.txt というファイルを読み込んで処理
<は ← 矢印のような感じで中身を引っ張り出してきますよーというイメージです。

逆に>は そのファイルにデータを入れますよーっていう感じで
直感的な感じは見え隠れしているかなと思います。

-n は繰り返しその処理を行うという意味を持っていて、
この場合ファイルを1行ずつ読み込んで処理し、それを最後の行まで繰り返すということになります。
このように書くことで、students.txtに書かれたデータを全て処理することができます。

結果としてこのような作業を1行分行うプログラムを書けばいいということです



まとめ



  1. 12345678という数字から"1234"を取り除く
  2. 漢字名をスペース無しに (分割→(結合))
  3. ローマ字は名前・苗字の順に → 分割して逆順に出力
  4. : や English などは普通に出力
  5. 点数は数字・文字のどちらでもいいが、平均は数字に変換して出す

というプログラムを上記のものを参考にしながら書いて貰えれば大丈夫です



# encoding: Shift_JIS
input_line = $_.chomp
input_fields = input_line.split(', ')

という書き出しで始めてください
これでファイルの読み込みはいけるはずです
この後に処理を行うプログラムを書き足してください