11/13 関数から「計算」へ


前回の感想,質問より

Q.
show(sphere(20))がうまくいきませんでした。
 irb(main):016:0> load("./sphere.rb")
 => true
 irb(main):017:0> show(sphere(20))
 NoMethodError: undefined method `show' for main:Object
 	from (irb):17
 	from ./sphere.rb:15
と表示されます…エラーの意味が分からず…授業終了間際だったのでTAには聞けませんでした(汗)
A(山田さん).
とんでもない! てか、そそくさと帰ってしまったかもしれなくて、ごめんなさい。

で、モヤモヤしているといけないので、さっそく回答しますが、これはですね、irbで実装 しているからなんです。

showが使えるのは、isrbなので、ターミナルから、isrbを起動していたら、できていたと思 います。

次回の授業までに試してみて、もし、それでもうまくいかなかったら、掲示板でも、授業の 前後でも、聞いてください!


Q
自分で各必要のないプログラムをターミナルでいちいち書いてしまって、時間をロスしたのでもう少しわかりや すくしてほしい。今回でいうと、例えばsphere.rbは既に存在していたが、気付かずに定義を書いてしまった。
A
スライドを改訂して,新規作成する必要のあるファイルは「ファイル名(新規作成)」のように明示するようにし ました.allcode.zipの中に含まれるファイルは「ファイル名」とだけ書いています.教材のところから「11/13改訂版」と書かれた章のスライドをダウンロードし直してください.
Q.
solutionsでa=b=c=0のときって解が無数 にあるんですがそれってどうすればいいんでしょうか。
A.
一応,無限大を表す数として Infinity があります.
 irb(main):004:0> b=Float::INFINITY
 => Infinity
 irb(main):005:0> b
 => Infinity
 irb(main):006:0> 10000 < b
 => true
 irb(main):007:0> 10000 > b
 => false
この問題ではそこまで想定していないので,「解が無数にある時は -1 を返す」などと決めた上で-1を返すプログラムなどで良いと思います.
Q.
()をつけないrubyの条件分岐ではelseを多くつなげると式が煩雑になり混乱してしまいます。何か良い解決方 法はないでしょうか?
A(山田さん).
よい条件分岐ということですが、境界事例までを網羅的に処理しようとすると、ある程度の 条件分岐が生じてしまうのは、しょうがないと思います。

個人的には、インデントを作り、#を使ってコメントアウトをした記録を残すことで、振り 返って作業のしやすいプログラムを書く礎であると思うのですが・・・いかがでしょう か・・・

A(田中).
講義の範囲を超えますが,Ruby言語のif文は,
 if 条件1
  式1
 else
  if 条件2
   式2
  else
   if 条件3
    式3
   else
    式4
   end
  end
 end
のようにelse部分にif文が来る多方向分岐を
 if 条件1
  式1
 elsif 条件2
  式2
 elsif 条件3
  式3
 else
  式4
 end
のように書くことができます.詳しくは,Ruby 1.8.7 リファレンスマニュアル制御構造を御覧ください.また,「elsif」のスペル に注意して下さい.

講義で扱わなかったのは,

ためと思われます.
Q.
Windows環境でbench.rbを動かすとtempファイルが作れずに失敗します。 TAさん解決策ないですか。
A.
TAではないのですが,回答します.tempファイルで失敗ということは,Windows版のgnuplotのインストールには成功しているということですね.だとしたら,bench.rbの38行目の
    @file = Tempfile.new("plotdata"+name, "/tmp")
   @file = Tempfile.new("plotdata"+name)
に変更すれば動くはずです.私の手元の環境では動きました.これはバグなので報告しておきます.

前回の課題について


投票システム

vote.rbをダウンロードして,ホームディレクトリに保存してください.ドックからターミナルを起動して,
ruby vote.rb 選択肢番号
のように使います.

今日の練習,投票

関連リンク


今回,次回の課題