10/7 条件分岐と繰り返し


前回までの補足

前回の感想,質問より

Q.
教科書には(g-c)で補助関数を用いよ、という指定があったが、具体的にどうすればいいのか分からなかった。
A.
solution1とsolution2の共通部分を取り出すと,
sqrt(det(a,b,c))
を別関数にするか,あるいは,ちょっとひねって
sqrt(det(a,b,c))/(2*a)
を別関数にするというのが教科書の意図だと思います.ただ,どちらもお勧めというわけではないので,「補助関数には拘らなくても良い.」とスライドには書きました
Q.
今回は、一部の問題で、できるだけコードを短くすることに挑戦してみた。
A.
あることを実行するなるべく短いプログラムを作成するという競技を「Code Golf」といいますが,RubyはCode Golferに好まれる言語の一つですね.競技としては面白いのですが,自分でも読めなくなるプログラムを書かないように気をつけて下さい.
Q.
イタリア国旗を表示するプログラムをmiで書いてロードしたのだが、表示ができなかった。
#イタリア国旗
italia=[[[0,0.6,0],[1,1,1],[1,0,0]],[[0,0.6,0],[1,1,1],[1,0,0]]]
isrb(main):028:0> load("./italia.rb")
true
srb(main):029:0> show(italia)
NameError: undefined local variable or method `italia' for main:Object
...
A.
Rubyでは他のファイル中で設定した(通常の)変数は,loadしても使えません.グローバル変数というのを使えばできるのですが,教科書では教育的な配慮からグローバル変数を使わずに,代わりに定数関数を導入するようにしています.今回の例でも定数関数を使って,
def italia()
 [[[0,0.6,0],[1,1,1],[1,0,0]],[[0,0.6,0],[1,1,1],[1,0,0]]]
end
という関数をitalia.rbに入れれば,load後にshow(italia()) で表示できます.
Q.
スペースを全角であけてしまうというミスもありました。
A.
このミスは,プログラムを見ただけでは見つけにくいのでTA泣かせですね.
Q.
isrb(main):007:0> load("./german.rb")
SyntaxError: /home04/3372856225/algo15/german.rb:3: syntax error, unexpected ','
  ,[[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0]]
  ^
元のファイルは、以下の通りです。どこが間違っているか教えてください。
def german ()
  [[[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]]
  ,[[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0]]
  ,[[1,1,0],[1,1,0],[1,1,0],[1,1,0],[1,1,0]]]
end
A.
元のプログラムのように,3, 4行目の「,」を行頭にすると,処理系が継続行(前の行の続き)だということを認識してくれないようです.以下のように「,」を前の行の行末に移動するとloadできるようです.
def german ()
  [[[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]],
  [[1,0,0],[1,0,0],[1,0,0],[1,0,0],[1,0,0]],
  [[1,1,0],[1,1,0],[1,1,0],[1,1,0],[1,1,0]]]
end

Q.
最後のquadratic関数をテストすると、「その他の誤りが起きました」とエラーが出てしまいました。 >自分で数値を入れて試してみるときちんと0になるのですが、何が問題なのでしょう。 >他の関数は全てパスしています。
def quadratic(a, b, c, x)
  a*(x-solution1(a, b, c))*(x-solution2(a, b, c))
end
A.
quadratic(17.0,3.0,2.0,1.0)
のようにf(x)=0に実数解がない二次式を与えた時に,負の数の平方根を取ろうとしてエラーが発生しているようです.
Q.
はじめ、平方根をsqrtで表していたのですが、なぜかうまくいかなかったので0.5条にするとうまくいきました。その理由は√の中が虚数になっていたからでした。sqrtは虚数の計算はできず、0.5乗だとできることを知りました。
A.
教育用計算機システムに入っているバージョンのrubyでは,負の数の0.5乗が複素数で計算できるのですね.なお,
require 'complex'
include(Math)
と書いておくと,
irb(main):003:0> sqrt(-1)
=> (0+1.0i)
のように,sqrtも複素数で結果を返すようになります.

前回の課題について


投票システム

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

今日の練習,投票

関連リンク


教科書の補足


今日の課題