第 2 回 Ruby の基礎 / 計算が終ったら止まる問題 レポート課題 氏名:遠藤拓真 学籍番号:c1110281 語学クラス:英語2 コース:政策マネジメント 1A.筆記問題 1日目に1個の卵が孵化し、翌日から前日の3倍孵化していった。これを計算して 表にしてみると、 1 日目 1 個 2 日目 前日(1個)*3= 3個 3 日目 前日(3個)*3= 9個 4 日目 前日(9個)*3= 27個 5 日目 前日(27個)*3= 81個 6 日目 前日(81個)*3= 243個 7 日目 前日(243個)*3= 729個 となり、7 日目には 500 個 を越えます。 2A.プログラム問題 作成したプログラム #!/usr/koeki/bin/ruby #cording: euc - jp day = 1 # 卵が孵化した日 egg = egg1 = 1 # 1日目に孵化した卵の数 eggmax = 500 # カタツムリが産んだ卵の数 printf("%d 日目 \t %d 個\n" ,day ,egg) while egg < eggmax # 孵化する卵の数が産んだ卵の数を越えたら止める。 printf("%d 日目 \t %d 個\n",day += 1, egg *=3) # ある日の孵化した卵の数を表示する。1日ごとに3倍孵化する設定。 \t によって、「日目」と「個」の間が空き、見やすくなる。 end # while と合わせて最大値を越えたら止めるの「止める」役割 printf("%d 日目には 500 個 を越えます。\n",day) # 何日目に孵化する卵が産んだ卵を越えてしまう計算になるか表示する。 もとのwhile_meta.rbでは経過は1年単位だったがここでは1日単位である。 なので year ではなく day とした。また、孵化した卵の数を egg とした。 1日目に孵化した卵の数である初期値も、snail0 とした。 初期値は egg1 = 1 個である。 最大値であるeggmax は産んだ卵の数にした。 また、孵化する卵の数は、もとのプログラムではウエストなので小数点以下第1 位まで求めていたが、卵の個数は整数でなければおかしいので、文献を参考に10 進法の整数を表示させる %d に変更した。 1年経つごとに4%増加する設定だったのも、1日で3倍増加する設定にあわせて、 day += 1, egg *= 3 とした。 また、文字列も「日目」、「個」と変更した。 実行結果 pan{c111028}% ./print_snail.rb [~/Ruby] 1 日目 1 個 2 日目 3 個 3 日目 9 個 4 日目 27 個 5 日目 81 個 6 日目 243 個 7 日目 729 個 7 日目には 500 個 を越えます。 bc -l を使って調べた結果 pan{c111028}% bc -l [~/Ruby] 1 * 3 3 # 2日目 3 * 3 9 # 3日目 9 * 3 27 # 4日目 27 * 3 81 # 5日目 81 * 3 243 # 6日目 243 * 3 729 # 7日目 参考文献 基礎プログラミング I 第 2 回 (Ruby の基礎 / 計算が終ったら止まる問題) 「メタボリック症候群」 http://roy/~madoka/2012/r1/02/r1_02_09_theme_07_while_meta.html 作成者 西村まどか 神田直弥 - TIPS - mew利用方法 http://roy/~naoya/mew.htm 作成者 神田直弥 Ruby プログラミング基礎講座 著者 広瀬雄二 協力者名 齋藤康平、佐藤智久、土屋哲平 B.筆記問題 隊商の主は中東の瑠美姫に求婚した。瑠美姫に宝石を 1 つ献上した。翌日求婚 しにいくと、前日の倍宝石が欲しいというので、献上した。隊商の主が、宝石を 400 個持っている場合、何日求婚しつづけられるか? という設定を考え、解答を求めるプログラムwhile_snail.rbを作り計算した。 作成したプログラム #!/usr/koeki/bin/ruby #cording: euc - jp day = 1 # 宝石を献上した日 ruby = ruby1 = 1 # 1日目に献上した宝石の数 rubymax = 400 # 持っている宝石の数 printf("%d 日目 \t %d 個\n" ,day ,ruby) while ruby < rubymax # 献上する宝石の数が持っている宝石の数を越えたら止める printf("%d 日目 \t %d 個\n",day += 1, ruby *=2) # ある日の献上した宝石の数を表示する。1日ごとに2倍献上する設定。 end # while と合わせて最大値を越えたら止めるの「止める」役割 printf("%d 日目には 400 個 を越えます。\n",day) # 何日目に献上する宝石が持っている宝石の数を越えてしまう計算になるか表示 する。 もとのwhile_meta.rbでは経過は1年単位だったがここでは1日単位である。 なので year ではなく day とした。また、献上した宝石の数を ruby とした。 1日目に献上した宝石の数である初期値も、ruby1 とした。 初期値は ruby1 = 1 個である。 最大値であるrubymax は持っている宝石の数にした。 また、献上する宝石の数は、もとのプログラムではウエストなので小数点以下第 1位まで求めていたが、卵の個数は整数でなければおかしいので、文献を参考に 10進法の整数を表示させる %d に変更した。 1年経つごとに4%増加する設定だったのも、1日で2倍増加する設定にあわせて、 day += 1, ruby *= 2 とした。 また、文字列も「日目」、「個」と変更した。 実行結果 pan{c111028}% ./while_snail.rb [~/Ruby] 1 日目 1 個 2 日目 2 個 3 日目 4 個 4 日目 8 個 5 日目 16 個 6 日目 32 個 7 日目 64 個 8 日目 128 個 9 日目 256 個 10 日目 512 個 10 日目には 400 個 を越えます。 bc -l を使って調べた結果 pan{c111028}% bc -l [~/Ruby] 1 * 2 2 # 2日目 2 * 2 4 # 3日目 4 * 2 8 # 4日目 8 * 2 16 # 5日目 16 * 2 32 # 6日目 32 * 2 64 # 7日目 64 * 2 128 # 8日目 128 * 2 256 # 9日目 256 * 2 512 # 10日目 参考文献 基礎プログラミング I 第 2 回 (Ruby の基礎 / 計算が終ったら止まる問題) 「メタボリック症候群」 http://roy/~madoka/2012/r1/02/r1_02_09_theme_07_while_meta.html 作成者 西村まどか 神田直弥 - TIPS - mew利用方法 http://roy/~naoya/mew.htm 作成者 神田直弥 Ruby プログラミング基礎講座 著者 広瀬雄二 協力者名 齋藤康平、佐藤智久、土屋哲平 3.感想 まだイマイチ理解できてはいないが、レジメや参考書を見ながらならなんとか出 来るようにはなったと思う。今回も友人の力をたくさん借りたので、もうすこし 自分でもどうにか作業できるようになりたい。授業に若干ついていけないので、 もう少し進むスピードを緩くしてもらえるととても助かります。