『情報科学入門 Rubyを使って学ぶ』の練習問題の解答例の他、授業スライドの練習問題の解答例や、プログラミングのポイント等を掲載します。他クラスの方の利用歓迎。改良・訂正箇所ありましたらご指摘ください。

2010/11/09

[教]練習問題(第一章)

 教科書「第一章・数の計算と関数」の練習問題の解答例です。

練習1.1 (数式の計算)
a) 56+97+33         結果:186
b) 47-38             結果:9
c) 35*22             結果:770
d) 34/15             結果:2
e) 34%15            結果:4
f) 34.0/15または 34/15.0  結果:2.26666666666667
g) 56**16            結果:9354238358105289311446368246
h) 56*56*56*56*56*56*56*56*56*56*56*56*56*56*56*56
                    結果:9354238358105289311446368246
i) 104/1.88**2        結果:29.4250792213671


練習1.2 (関数の定義)
a) def distance(x,y,u,v)
   sqrt((x-u)**2+(y-v)**2)
  end

b) def feet_to_cm(f,i)
   (f+i/12.0)*30.48
  end

c) def pound_to_kg(p,o)
   (p+0/16.0)*0.4536
  end


練習1.3 (ファイルからの呼込み)
練習1.2a)Emacsやテキストエディタに入力してdistance.rbとして、
同じくb)c)yardpound.rbとして保存する。んでターミナルでloadしてごらんって話。
load("./distance.rb")でdistance.rbが読み込める。


練習1.4 (もっと数式の計算)
a)  62.5/(171.5/100)**2  結果:21.2496493807852
   女 53.0/(159.0/100)**2  結果:20.9643605870021

b) 9/5.0*22+32        結果:(華氏)71.6(度)

c) (50-32)*5/9.0       結果:(セ氏)10.0(度)

d) 535800/93.91      結果:5705.4626770312(米ドル)

e) 12900*93.91       結果:1211439.0(円)

f) 11/6.825*93.91     結果:151.356776556777(円)

g) 175*1609.0/60**2   結果:78.2152777777778m/s)

h) 5459356 * (1+1.40/100)**10 / 1.27
                 結果:4939889.612497(円)


練習1.5 (数学関数) include(Math)の入力を忘れずに
a) sqrt(10)           結果:3.16227766016838
  sqrt(2)*sqrt(5)     結果:3.16227766016838
   sqrt(sqrt(5))      結果:1.49534878122122
   2**(1.0/12)        結果:1.0594630943593

b) sin30 sin(3.141592/6)        結果:0.499999905662436
  cos30 cos(3.141592/6)    結果:0.86602545825025
  tan30 tan(3.141592/6)     結果:0.577350123947459

c) log1000       log(1000)              結果:6.90775527898214
  log100100    log(100)/log(100)   結果:1.0
   log21000      log(1000)/log(2)      結果:9.96578428466209

d) 2.7*2.7*2.7*2.7*2.7*2.7*2.7*2.7*2.7*2.7
                                                        結果:20589.1132094649

e) -log(2)/log(1-0.0000320362394891)/60**2
                                            結果:6.00999999999806(時間)


練習1.6 (変数の利用)
a) w / (h/100.0)**2

b) 9/5.0*c+32

c) (f-32)*5/9.0

d) y/93.91

e) d*93.91

f) g/6.825*93.91

g) v*1609.0/60**2

h) d * (1+r/100.0)**y / p


練習1.7 (代入)
a) x=10
   y=x*(x-3)
   z=y*(y-3)
   z*(z-3)            結果:21982030 変数を使わず展開したら→大変だね!

b) (a) a=3
        b=5
        c=-7
    (b) d=b**2-4*a*c
    (c) p=(-b+sqrt(d))/(2.0*a)
        q=(-b-sqrt(d))/(2.0*a)
    (d) a*p**2+b*p+c 結果:0.0 どう考えてもゼロなのに、私ならなかったんだが
        a*q**2+b*q+c 結果:0.0


練習1.8 (代入の右辺の式)
練習1.6の関数bmi(height,weight)を定義したのちに、
bmi((5+9.4/12)*30.48,194.7*0.4536) 結果:28.4218683362331
bmi((5+4/12.0)*30.48,164.7*0.4536) 結果:28.2708758776893


練習1.9 (もっと関数の定義)
a) def celsius_to_fahrenheit(c)
     9/5.0*c+32
   end

b) def fahrenheit_to_celsius(f)
     (f-32)*5/9.0
   end

c) def ms_to_mph(v)
     v*60**2/1609.0
   end

d) def mph_to_ms(v)
     v*1609.0/60**2
   end

e) def wind_chill_index(t,v)
     35.74 + 0.6215*t – 35.75 * v**0.16 + 0.4275 * t * v**0.16
   end
   wind_chill_index(20,20) 結果:(華氏)4.24278159982046(度)

f) yardpound.rbに関数celsius_to_fahrenheit(c)fahrenheit_to_celsius(f)
   ms_to_mph(v)定義されているとする。
   また、すでに関数wind_chill_index(t,v)が定義されているとする。
  load(“./yardpound.rb”)
  def wind_chill_index_celsius(t,v)
   fahrenheit_to_celsius(
     wind_chill_index(celsius_to_fahrenheit(t),ms_to_mph(v)))
  end

g) (a) def det(a,b,c)
          b**2-4*a*c
        end
    (b) def solution1(a,b,c)
         (-b+sqrt(det(a,b,c)))/(2.0*a)
       end
    (c) def solution2(a,b,c)
         (-b-sqrt(det(a,b,c)))/(2.0*a)
       end
    (d) def quadratic(a,b,c,x)
         a*x**2+b*x+c
       end


練習1.10 (ヤード・ポンド法BMIの完成)


練習1.11 (局所変数の有効範囲)
実行してみるとわかるが、関数定義の中と外で使われている変数sは独立している。
つまり、局所変数の有効範囲は、関数定義の中に限られている。


練習1.12 (局所変数と補助関数)
def s(a,b,c)
 0.5*(a+b+c)
end
def heron_nlv(a,b,c)
 sqrt(s(a,b,c)*(s(a,b,c)-a)*(s(a,b,c)-b)*(s(a,b,c)-c))
end
要は、局所変数の変わりに補助関数を使いましょうってコト。


練習1.13 (わざと間違ってみる)

0 件のコメント:

コメントを投稿