05 月 13 日のレポートについて 系:環境系 語学:中国語 学籍番号:C107XXXX 氏名:XXXXXXXX 1,筆記問題 A、10進数に直した場合 0b11101 = 2**4 が一つ 2**3 が一つ 2**2 が一つ 2**0 が一つ = 16 + 8 + 4 + 1 = 0d29 となる。 16進数に直した場合 0b11101 = 1 と 1101 に分けられる 1 は "1" 1101 は 10進数表示で "13" なため16進数表示では13番目の "d"。 "c"ではないかと思ったが、10進数表示は10で繰り上がる(つまり10が 存在していないということとも言える)ため、16進数では "10 を a と 表示する"。 なので 1101 は "d" 0b11101 = 0x1d となる。 参考文献:http://roy/~madoka/2008/r1/04/04-11blnary1.html B、うちのネコは素敵である。 いかに素敵かを理解するには、頭を片手で掴む(アイアンクロ−をする)と よくわかる。実際にやってみると 約5秒後に抗議の唸り声 約10秒後に手(前足)が出る 約12秒後に頭をすばやくずらし噛みついてくる、こうなると手を離すしかない。 これをプログラム風に書くと goukei = 掴んでいる時間 A = 唸り声 B = 前足 C = 噛みつく if goukei == 5 A #抗議するかのような唸り声を上げる elsif goukei == 10 B #両前足で、頭を掴んでいるこちらの手を逆に掴む elsif T == 12 C #噛みついてくる。危険なので手を離す else 掴み続ける end となる。いかに素敵かということが理解できたと思う。 2、プログラミング問題 A、gets method で変数 s に1から3の数値を入力し、その数値は 変数i を通り 変数 m へ入る。 変数 m の値が合計30になると到着のメッセージが表示される。 変数 m の値が合計30より多くなる場合、"s kgの石は無い"というメッセージが 表示され、m へ足された数値(変数s)と同じ値が引かれ、石を 投げられなかったことになる。 それ以外の数値を入力した場合は break文によって閉じられる。 #!/usr/koeki/bin/ruby s = 0 # 投げた石の重さ i = 0 m = 0 # 現在のボートの位置 smax = 3 mmax = 30 STDERR.print("ボートに乗り、30m向こう岸にまで辿り着きましょう。\n") STDERR.print("ボートには、1,2,3kgの石が合計30kg積んであります。\n") STDERR.print("石の重さは、進む距離に値します。\n") while true STDERR.print("[何kgの石を投げますか]\n") s = gets.chomp.to_i if s > smax STDERR.printf("%d kgの石はありません。\n", s) m -= s elsif s < 1 STDERR.printf("「真面目にやってください」\n") STDERR.printf("突如ボートの底に穴が開き、あなたはボートと共に沈んだ。\n") break end i = s.to_i s = s.to_i i = i.to_i m += i if m > 30 STDERR.printf("もうボートには%d kgの石は残っていない。\n", s) m -= s end if m == 30 STDERR.printf("「到着おめでとうございます」\n") STDERR.printf("あなたは無事向こう岸に辿り着いた。\n") break end printf("現在[%d m]の位置にいます。\n", m) end 先に2-Bから作成し、こちらはほぼそれを参考にして作った。 作成していた当初は、0以下の数値を入力された場合も、 if s > smax と同様 "◯kgの石はありません"と表示しようと 考えていたが、同じ方法ではうまくいかず、いっそのこと 真面目にやっていないと見なし沈んでもらうことにした。 [何kgの石を投げますか] 3 現在[24 m]の位置にいます。 [何kgの石を投げますか] 2 現在[26 m]の位置にいます。 [何kgの石を投げますか] 3 現在[29 m]の位置にいます。 [何kgの石を投げますか] 3 もうボートには3 kgの石は残っていない。 現在[29 m]の位置にいます。 [何kgの石を投げますか] 2 もうボートには2 kgの石は残っていない。 現在[29 m]の位置にいます。 [何kgの石を投げますか] 1 「到着おめでとうございます」 あなたは無事向こう岸に辿り着いた。 pan{c107200}% ./while_boat.rb [~/Ruby] ボートに乗り、30m向こう岸にまで辿り着きましょう。 ボートには、1,2,3kgの石が合計30kg積んであります。 石の重さは、進む距離に値します。 [何kgの石を投げますか] 0 「真面目にやってください」 突如ボートの底に穴が開き、あなたはボートと共に沈んだ。 暗算で可能なため、手計算の結果は省く。 こちらも、2-B同様二つ条件をつけることができる if文を使えれば もっと違った構造や結果になっただろうと思う。 B、筆記問題のBをプログラムにした。 正数を入力し続け、その合計(掴んでいる時間)によって反応が変わる。 if文を数パターン用意した。 1-Bにあるように、合計値が12を越えると噛みつかれるため 手を離す(強制終了する)ようにした。 #!/usr/koeki/bin/ruby t = 0 # t:頭を掴んでいる時間(秒) wa = 0 # wa:掴んだ時間の合計 goukei = 0 STDERR.print("Siroの頭を右手で掴んだ。q で手を離します。\n") while true STDERR.print("[何秒掴むつもりですか?]\n") t = gets.chomp if t == "q" STDERR.printf("Siroの頭から手を離した。\n") STDERR.printf("Siroは、こちらをにらみ去っていった。その後ろ姿も可愛い。\n") break if goukei >= 10 STDERR.printf("手をひっかかれてしまった。\n") STDERR.printf("Siroに逃げられてしまった。\n") break end if goukei >= 5 STDERR.ptintf("Siroは、頭をぶるっとふるわせるとすぐに去って行った。\n") break end if goukei <= 4 STDERR.printf("Siroは、しばらくこちらをじっと見つめると\n") STDERR.printf("ゆっくりと去っていった。\n") break end end wa = t.to_i t = t.to_i wa = wa.to_i goukei += wa printf("%d秒経ちました。 \n", goukei) # t = gets.to_i if goukei >= 12 STDERR.printf("手をひっかかれたうえに噛みつかれ思わず手を離した。\n") STDERR.printf("血が出ており、すぐに応急処置をする必要がある。\n") STDERR.printf("Siroに逃げられてしまった。\n") break end if goukei >= 10 STDERR.printf("Siroの両前足に手を掴まれてしまった。\n") STDERR.printf("そろそろ手を離すべきだろうか。\n") # if t == "q" # STDERR.printf("手をひっかかれてしまった。\n") # STDERR.printf("Siroに逃げられてしまった。\n") # break # end end if goukei >= 5 STDERR.printf("Siroは不機嫌そうな唸り声をあげている。\n") STDERR.printf("しかし、まだ掴んでいても大丈夫な気もする。\n") # if t == "q" # STDERR.printf("Siroは、頭をぶるっとふるわせるとすぐに去っていった。\n") # break # end end if goukei <= 4 STDERR.printf("Siroは尻尾を振っている。とても可愛い。\n") # if t == "q" # STDERR.ptintf("Siroは、しばらくこちらをじっと見つめると\n") # STDERR.printf("ゆっくりと去っていった。\n") # break # end end end 1-Bでは elsif を使用していたが、結局こちらでは if のみで作った。 ねこの名前が半角英数なのは、当初それも変数として、より変化を つけようとしたがうまくいかず諦めたなごりである。 本来は変数goukeiの値で途中で手を離したときの反応にも変化を 与えたかったが、条件Aを踏まえた上で条件Bの場合こうする… とする方法がわからなかっため無いということにした。elsif を 使用しなかったのは、元々この条件を elsif で表示しようとしたためである。 実行画面 pan{c107200}% ./c107200_04.rb [~/Ruby] Siroの頭を右手で掴んだ。q で手を離します。 [何秒掴むつもりですか?] 3 3秒経ちました。 Siroは尻尾を振っている。とても可愛い。 [何秒掴むつもりですか?] 5 8秒経ちました。 Siroは不機嫌そうな唸り声をあげている。 しかし、まだ掴んでいても大丈夫な気もする。 [何秒掴むつもりですか?] 2 10秒経ちました。 Siroの両前足に手を掴まれてしまった。 そろそろ手を離すべきだろうか。 Siroは不機嫌そうな唸り声をあげている。 しかし、まだ掴んでいても大丈夫な気もする。 [何秒掴むつもりですか?] 3 13秒経ちました。 手をひっかかれたうえに噛みつかれ思わず手を離した。 血が出ており、すぐに応急処置をする必要がある。 Siroに逃げられてしまった。 goukei >= 5 の場合と goukei >= 10 の場合が一緒に表示されてしまっている。 たとえば goukei が10と11になった場合このように両者とも表示されるのは 当然だろう。どちらの条件にも当てはまるのだから。 対策としては 「goukei が10以上11以下」という条件をつけることが できれば良いと思うのだが、うまくいかず結局両者とも表示されても 違和感のなさそうな文を表示するようにした。 3、感想 まだまだ各プログラムの書く位置を間違え手間取る。知識が足りないと 言うこともあるが、こちらの方がうまくいかない最大の要因だろう。 慣れるしかないだろうか。だとしたら、次はもっと時間を取り、確認しつつ 確実にやっていこうと思う。