第 2 回 Ruby の基礎 / 計算が終ったら止まる問題 レポート課題 氏名:井上 宏美 学籍番号:C1110223 語学クラス:英語3 コース:政策マネジメント 1.筆記問題 A 1日目に一つの卵が孵化する。翌日では前日の3倍の卵が孵化する。 1日目の孵化した卵の数と足すと、2日目には1+3=4匹生まれる計算になる。 3日目は、2日目に3匹の卵が孵化しているので、3倍の9匹が孵化することになる。 つまり、3日間の合計では1匹+3匹+9匹=13匹になる。 この考え方から前の日に孵化した数の3乗ずつ孵化することになる。 表にすると次のようになる。 日 その日孵化した卵の数 その時点での合計 (3乗した数) 1日目 1 1 2日目 3 4 3日目 9 13 4日目 27 40 5日目 81 121 6日目 243 364 7日目 729 1103 この計算から答えは7日目で500匹が孵化することになる。 2.プログラム問題 A i)考えた設定 カタツムリの卵が孵化する日にちを表示するプログラムはprintを用いた。 ii)作成したプログラム #!/usr/koeki/bin/ruby #Ktermにこの一行を書くことでプログラムにインタプリタrubyの存在を示してい る。 #coding: euc-jp #これは、Ktermでプログラムの中で日本語を使用することを設定する一文である。 print("1日目に最初の1匹が孵化した。\n") print("2日目には3匹が孵化した。2日間合わせて4匹孵化した。\n") print("3日目には9匹が孵化した。3日間合わせて13匹孵化した。\n") print("4日目には27匹が孵化した。4日間合わせて40匹孵化した。\n") print("5日目には81匹が孵化した。5日間合わせて121匹孵化した。\n") print("6日目には243匹が孵化した。6日間合わせて364匹孵化した。\n") print("7日目には729匹が孵化した。この時点ですべての卵が孵化した。\n") #\nを使えば、改行する。 #printで("")を使えば、間に文字列を表示する。 iii)プログラムを実行した結果画面 pan{c111022}% ./print_snail.rb [~/Ruby] 1日目に最初の1匹が孵化した。 2日目には3匹が孵化した。2日間合わせて4匹孵化した。 3日目には9匹が孵化した。3日間合わせて13匹孵化した。 4日目には27匹が孵化した。4日間合わせて40匹孵化した。 5日目には81匹が孵化した。5日間合わせて121匹孵化した。 6日目には243匹が孵化した。6日間合わせて364匹孵化した。 7日目には729匹が孵化した。この時点ですべての卵が孵化した。 pan{c111022}% [~/Ruby] iv)bc -lで導き出された結果の考察 pan{c111022}% bc -l [~/Ruby] 1 * 3 3 3 * 3 9 9 * 3 27 27 * 3 81 81 * 3 243 243 *3 729 よってbc -lの試算により、プログラムの結果が明らかになる。 考察 printを使って、カタツムリが400匹孵化することを明らかにするだけでなく これを上手く利用すれば表などを作ることが出来ると考えた。 v)参考文献 roy/~madoka/2012/r1/02/r1_02_06_theme_04_chmod.html 西村まどか プログラムの作成と実行の手順 2 B.i)考えた設定 この場合、授業で行ったwhile_meta.rbに応用させる。 whlie_meta.rbのようにある数値までの上限を設ける。 この問題では筆記問題のように規則的に増加していく設定にすると meta.rbのように答えを導き出すことが出来るのではないかと考えた。 ii)作成したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp print("もし、隊商の主が宝石を400個持っている場合、瑠美姫に何日求婚し続けられるか?\n") day = 0 #日にちは0からスタートさせる。 hoseki = hoseki0 = 1 #最初に持っている数は1個からにする。 hosekimax = 400 #隊商が持っている宝石の数は400個という数に限りがある。 while hoseki < hosekimax #一日ずつ増えていく宝石の数がhosekimaxに代入する数になるまで行う。 printf("%d 日後 \t %d個\n",day +=1,hoseki *=2) #日にちは一日ずつ増やし、 それと同時にhosekiも2倍に増やす。 end printf("%d 日後には 400 個を%d個超えます\n",day,hoseki -400 ) #dayは日にち、 hosekiは宝石を表す。hosekiの数から400個を引く。 printf("つまり求婚し続けられるのは%d日です\n",day) #day、つまり日にちを表す。 iii)もとにしたプログラムから変更した点 授業で行ったmeta.rbではウエストだったところを宝石に変えた。 また、宝石の数は400個と上限があるため、最大値を設けた。 問題に合わせ、文字列を日にち、個数に変更した。 iv)プログラムを実行した結果画面 pan{c111022}% ./while_snail.rb [~/Ruby] もし、隊商の主が宝石を400個持っている場合、瑠美姫に何日求婚し続けられるか? 1 日後 2個 2 日後 4個 3 日後 8個 4 日後 16個 5 日後 32個 6 日後 64個 7 日後 128個 8 日後 256個 9 日後 512個 9 日後には 400 個を112個超えます つまり求婚し続けられるのは9日です v)bc -lで導き出された結果の考察 pan{c111022}% bc -l [~/Ruby] 2 * 2 4 4 * 2 8 8 * 2 16 16 * 2 32 32 * 2 64 64 * 2 128 128 * 2 256 256 * 2 512 よって、bc -lの試算により、プログラムの結果が明らかになる。 考察 whileを使うことによって求婚し続けられる数を倍に表すことでなく、この方法 はプログラムを変えれば授業で行ったようにメタボの数値を表すことも出来る活 気的なものだと考えた。 vi)参考文献 2012年度講義ノート -Mozilla Firefox 西村まどか http://roy/~madoka/2012/rpt/multipart.html 「Ruby プログラミング基礎講座」 広瀬雄二 著 値の型変換 p50 制御構造 p33 3.感想 今回の授業では、繰り返しの計算に必要な実行文の仕組みについて学んだ。 printfは、変数の中身を出力するものであり、変数の種類によって変数指定子は 異なる。 一方、while - - end をwhile文といい、条件を満たしている間に計算する方法である 反復文は上手く文字を入れなければ機能しないので苦戦した。 しかし、意味を理解するとスムーズに行うことが出来るので出来た時の喜びは大 きかった。 今回は2回目の授業ということで前回の反省点を生かしてわからないことはすぐ に質問するように心掛けた。授業中は、焦りのせいで何度もチェンジモードが上 手くいかずスペルのミスといった単純なミスが多かった。前回では理解すること の出来なかった点も先生の講義ノートを見て理解するように努めた。実際、bc -lのやり方がわからなくなり、途中つまづいてしまったが自分なりに試行錯誤を 繰り返した結果画面に正しい答えが出たときには本当に嬉しかった。 課題レポートを見たときには本当に期限まで終わるか不安だったけれど毎日時間 をみつけてコツコツととり組むようにした。わからなくなって、問題にとり組む ことが嫌になることもあったがレポートの完成形が見えてきたときには諦めなく て良かったと思うことが出来た。 回数を重ねていくうちに、授業の内容も難しくなっていくと思うが最後まで自分 のためと言い聞かせ、逃げずに頑張りたいと思った。 共同学習者 佐藤 咲