第2回 基礎プログラミング I レポート課題 XXXXXXXX C109XXX 英語3 政策マネジメント 1-A. 1*4=4 4*4=16 16*4=64 64*4=256 A.全ての卵が孵化するには4日間かかる。 2-A a) while_meta.rb をもとにプログラムを作成した。 while_meta.rb では初期値から4%ずつの増加であった。 この問題では4倍ずつの増加である。すなわち400%ずつの増加と考えた。 このようにもとのプログラムと同じように規則をもって増加する設定であるから、 最大値や文字列を変えたり結果を10進法整数で表示するようにするなど、 入力数値の変更できちんと解答が得られるプログラムになるのではないかと考え、 print_snail.rbを作成した。 b)作成したプログラム #!/usr/koeki/bin/ruby day = 0 # 卵が孵化した日 snail = snail0 = 1 # 1日目に孵化した卵の数 snailmax = 200 # 持っている卵の数 while snail < snailmax # 孵化する卵の数が持っている卵の数を越えたら止め る。 printf("%d 日後 \t %d [個]\n", day += 1, snail *= 4) # ある日の孵化した卵の数を表示する。一日ごとに4倍孵化する設定。 \t によって、「日後」と「個」の間が空き、見やすくなる。 end # while と合わせて最大値を越えたら止めるの「止める」役割。 printf("%d 日後には 200 [個] を %d [個] 越えます。 \n", day, snail - 200) # 何日後に孵化する卵が持っている卵を越えてしまう計算になるか表示する。 c) もとのwhile_meta.rbo では経過は1年単位だったがここでは1日単位である。 なので year ではなく day とした。また、孵化した卵の数を snail とした。 1日目に孵化した卵の数である初期値も、snail0 とした。 初期値は snail0 = 1 個である。 最大値であるsnailmax は持っている卵の数にした。 また、孵化する卵の数は、もとのプログラムではウエストなので %2.1f と、 小数点以下第1位まで求めていたが、卵の個数は整数でなければおかしいので、 文献を参考に10進法の整数を表示させる %d に変更した。 1年経つごとに4%増加する設定だったのも、1日で4倍増加する設定にあわせて、 day += 1, snail *= 4 とした。 文字列も問題にあわせ、「日後」、「個」と変更した。 d) 結果 1 日後 4 [個] 2 日後 16 [個] 3 日後 64 [個] 4 日後 256 [個] 4 日後には 200 [個] を 56 [個] 越えます。 e) bc -l を使って調べた結果 pan{c109046}% bc -l [~/Ruby] 1 * 4 4 # 1日目 4*4 16 # 2日目 16*4 64 # 3日目 64*4 256 # 4日目 f) 参考文献 「Ruby プログラミング基礎講座」 広瀬雄二 著 p50 「値の型変換」 2-B a) この場合も、ある上限を設け、規則的に増加する設定を考えれば、 while_meta.rb のように解答を得られるプログラムが書けるのではないかと考え、 「トレーニングを始めたときに走ることができたのは 1km であった。 1ヶ月に 50% ずつ走行可能距離が増える場合、 フルマラソン 42,195km を走れるようになるのは何ヶ月後か。」 という設定を考え、解答を求めるプログラム while_snail.rb を作成した。 b)作成したプログラム #!/usr/koeki/bin/ruby month = 0 # トレーニングを始めた月 marathon = marathon0 = 1 # 最初の走行可能距離(km) marathonmax = 42.195 # 目標であるフルマラソンの距離(km) while marathon < marathonmax # 走行可能距離が 42.195(km) を越えたら止める。 printf("%d ヶ月後 \t %5.2f [km]\n", month += 1, marathon *= 1.5) # ある月の走行可能距離を計算する。1ヶ月に50%ずつ増えるという設定で、 小数点以下第2位まで表示する。 また、\t によって「ヶ月後」と「km」の間が空き、見やすくなる。 end # while と合わせて、最大値を越えたら止めるの、「止める」役割。 printf("%d ヶ月後には 42.195 [km] を %5.2f [km] 越えます。 \n", month, marathon - 42.195) # 何ヶ月後に走行可能距離がフルマラソンの距離を越えるか計算する。 こちらも四捨五入した小数点以下第2位までを表示する。 c)まず求めたい経過単位が月単位なので、year をmonth に変更した。 走行可能距離を marathon とし、最初の走行可能距離である初期値も marathon0 とした。初期値は marathon =1である。 最大値もフルマラソンの距離 42.195 に変更した。 各月の走行可能距離も、小数点第2位まで表示するのが妥当だと考えたので、 %5.2f とした。またひと月に 50% 増えるという設定から marathon * 1.5 とした。 d)結果 1 ヶ月後 1.50 [km] 2 ヶ月後 2.25 [km] 3 ヶ月後 3.38 [km] 4 ヶ月後 5.06 [km] 5 ヶ月後 7.59 [km] 6 ヶ月後 11.39 [km] 7 ヶ月後 17.09 [km] 8 ヶ月後 25.63 [km] 9 ヶ月後 38.44 [km] 10 ヶ月後 57.67 [km] 10 ヶ月後には 42.195 [km] を 15.47 [km] 越えます。 e)bc -l を使って調べた結果 pan{c109046}% bc -l [~/Ruby] 1 * 1.5 1.5 # 1ヶ月目 1.5 * 1.5 2.25 # 2ヶ月目 2.25 * 1.5 3.375 # 3ヶ月目 3.375 * 1.5 5.0625 # 4ヶ月目 5.0625 * 1.5 7.59375 # 5ヶ月目 7.59375 * 1.5 11.390625 # 6ヶ月目 11.390625 * 1.5 17.0859375 # 7ヶ月目 17.0859375 * 1.5 25.62890625 # 8ヶ月目 25.62890625 * 1.5 38.443359375 # 9ヶ月目 38.443359375 * 1.5 57.6650390625 # 10ヶ月目 3. 感想 今回の講義では while --end 文という実際に計算を行うプログラムを書いた。 while -- end はある条件になるまで計算を繰り返す文である。 初期値、最大値、値の変化の規則がある設定であれば、 数値を変更したり調整を行うことで解答を得るプログラムを書くことが出来る。 一番重要なのは while の後に書く不等号の向きと、 printf のカッコの中ではないかと思う。 不等号は計算を終了させる条件、printf の中は計算の設定なのだが、 両方ともよく考えて入力しないと検討違いの答えが出るか、 計算を延々と繰り返すことになるので注意が必要だとわかった。 実際にレポートを作成していて苦戦したのはこの部分だった。 しかし何度か変更を試すうちに、文の構成が段々わかってきて、 最初のとても難解な印象が薄れて来たのがうれしかった。 また、チェンジモードに何度か失敗したり、実行を繰り返すことで、 今までよくわからなかった UNIX の中にも慣れて来た。 講義で学んだ bc -l での計算も、Windowsのようにアクセサリから起動せず、 実行した結果の下で計算確認ができるのでとても便利だと感じた。 正直、課題の内容を見たときは出来る気が全くしなくて絶望したけれど、 立ち向かってみるとなんとかできました。 最後の方は書いていて楽しくなって来ました。 これから難しくなっていくと思いますが、怖いと思わないで取り組んで いきたいと思います。 参考文献 基礎プログラミング I 第2回 「Ruby の基礎 / 計算が終わったら止まる問題」 西村まどか http://roy/~madoka/2010/r1/02/ 共同学習者:笹原千珠子