Ruby 第6回分
最終更新 : 21:12 2011/11/10
第6回分
プレゼン発表的な授業が集まると死ぬ
これは紛れも無い事実である
繰り返し
繰り返しは今までのプログラムでやっていた -n のようなものを
プログラムの中で書いてしまおうということです
繰り返しには while を使います
例えば出席番号順に並んでいる時に番号が50までの人を処理したい時には、
番号が50以下のとき、という条件をつけてやればいいということになります
このようにnum=0という条件から始まり
numが10以下の間
numを出力し
numを1増やして
その作業を繰り返す
ということになります。
今までは -n を使用して、1行のみ作業するプログラムを繰り返し処理していましたが、 今回は-nを利用せず、プログラムを呼び出して処理させるだけで、全ての行を処理するプログラムに変更します。
プログラムの処理全体をwhileで囲み、1行読み込むのを$_.chompからgetsに変更します。
whileをつけるので他の部分を全てインデントを1個下げてやってください
そして配列に格納する時にchompを使ってやります。
これでwhileに変更して処理できることにはなります。
配列の配列
配列の配列はただの配列中に別の配列が入ってるだけの配列です
言い換えると配列が配列の中に入っていて別の配列として配列が
例を見ると有名人という配列の中に8種類の項目を持った配列があるということがいえます。
このように用いれば、同じようなデータを持つものをまとめて表記できるので色々と楽になるということです
ああっ特に言うことがない
配列の配列を参照する場合には、今までは array[数字] という形で数字の位置にあるものを呼び出していました。
配列の中の配列には、 array[数字][数字] という形で2つの配列の場所を指定してやります
1個目の配列の4個目(4)、2個目の配列の2個目の数字(6)、そして1個目の配列の3番目×3個目の配列の4個目(3×12)という計算がされました。
資料の例なら[0][6]で"トリプルフリップ"が参照されることになるでしょう
イテレータ
イテレータ!そういうのもあるのか
利用法としては例えば変数を整数に直すメソッドを使う時や
配列にこの変数を入れますよーっていうfamous.rbの4~8行目のような命令を
イテレータを使って書いてみることができます。
色々省略した感はありますが大体こんな感じです
まずinput_data_arrayの全ての行に対して
そしてinput_fieldsという配列にもりもりぶち込んでいきます
そして身長体重を計算するために数値に直してBMI計算をさせます。
最後にinput_fieldsにbmiを追加します
これを繰り返していくということになります
念のため、配列に追加したモノがちゃんとしているかを確認するには
name ⇒ input_fields[0]
bmi ⇒ input_fields[8]
のように配列の位置で指定してやればあら不思議
↑の画像と同じような出力が帰ってきます。ちゃんとしてたらね。
というわけでイテレータをちょっとだけ触ってみました。
これでもBMIの計算までは出来るので次は並べ替えです
まずは資料をご覧ください
sorted_data_arrayという配列に
input_data_arrayを
height_text.to_i (身長を数字に直したもの)で並べ替えて入力する
イテレータです
sorted_data = input_data_array.sort_by do |input_fields| name, yomi, age_text, height_text, weight_text, job, special, hobby, bmi, danger = input_fields weight_text.to_i end課題なら体重で並び替えるのでweight_text.to_iになりますね
そして発展課題の低体重、などは上記の追加 << を追加して
条件文でこの数値ならコレ、という形でやってみてください
- ファイルから入力
- bmiを追加
- (分岐で判定して低体重などの判定追加)
- 体重で並べ替える
- 名前、身長、体重、BMI、(判定)を出力
この4つのイテレータが必要になります。
やりようによっては減らせるかもしれませんがそれぞれを別に考えた方が
後々楽になるかもしれません。
どの段階がおかしいのかという部分がはっきりわかるからです
まとめ
イテレータはサンプルを見ながら書き換えたりするのが楽かもしれません
- whileを使った繰り返し
- 配列の中に配列を入れることができる
- eachを使った繰り返し(イテレータ)
- sort_byを使った並べ替え(イテレータ)