第5回 何度も呼び出そう レポート課題 氏名 : 畠山貴衣 学籍番号 : C1101709 語学クラス : 英語6 コース(系) : 政策マネジメントコース [1]筆記問題 A. まず自分の名前を16進数に変換すると、 H = 0x48 a = 0x61 t = 0x74 a = 0x61 k = 0x6B e = 0x65 y = 0x79 a = 0x61 m = 0x6d a = 0x61 K = 0x4d i = 0x69 e = 0x65 となる。 これを10進数に変換すると、 48 = 4*16 + 8 = 0d64 61 = 6*16 + 1 = 0d97 74 = 7*16 + 4 = 0d116 61 = 6*16 + 1 = 0d97 6b = 6*16 + 11 = 0d107 #bはコード表より11 65 = 6*16 + 5 = 0d101 79 = 7*16 + 9 = 0d121 61 = 6*16 + 1 = 0d97 6d = 6*16 + 13 = 0d109 #dはコード表より13 61 = 6*16 + 1 = 0d97 4b = 4*16 + 11 = 0d75 #bはコード表より11 69 = 6*16 + 9 = 0d105 65 = 6*16 + 5 = 0d101 となる。 これを足すと、 64 + 97 + 116 + 97 + 107 + 101 + 121 + 97 + 109 + 97 + 109 + 97 + 75 + 105 + 101 = 1538 よって、名前の合計の10進数は、 0d1538 となる。 これを更に16進数に変換すると、 16)1538 ------ 16) 96 2 ------ 16) 6 0 ------ 16) 0 6 ------ よって、 0x602 となる。 これをもう1度10進数に変換してみると、 6*(16**2) + 0*16 + 2 = 1538 となり、数が一致する。 B. 日常の繰り返しの動作として、 朝布団から出るまでの動作をプログラム風に書きます。 def kishou(tokei1,tokei2,terebi,sutoretti) tokei1 を止める terebi を点ける mezamasi = tokei1 を止める mezame = tokei2 を止める sutoretti をする。 end # mezamasi が繰り返し kishou(毎5分, 8時 , 7時, 5分) print("活動開始っ!\n") -------------------------------------------------------------------------- [2]プログラム問題 A. (設定) クラスの中から何人か買い出しに行くということにし、クラス全員の人 数と、買い出しに行く人の人数を入力して貰って素の組み合わせを 計算するプログラムを作った。 (プログラムの内容) #!/usr/koeki/bin/ruby def factorial(m) #階乗を指示するdef if m == 1 # mが1だった場合の処理方 1 else m * factorial(m-1) #1以外の処理方(階乗の計算方法) end end def kaidasi(s,n) #組み合わせの計算を指示するdef if s < n #全体の人数より買いだし人数が多かった場合 print("そんなに人数はいません。\n") else factorial(s) / (factorial(n) * factorial(s-n)) #計算式 end end STDERR.print("クラスの中から何人か買い出しに行くことになりました。\n") STDERR.print("クラスの人数は何人ですか:\n") all = gets.to_i STDERR.print("何人買い出しに行かせますか:\n") kazu = gets.to_i printf("%d 人買い出しに行かせた場合の組み合わせは %d です。\n",kazu, kaidasi(all,kazu)) (変更点) 元にしたのは、def_factoria.rb で、階乗の計算ができるプログラムだったので、 さらに、組み合わせを計算する def を組み込んで作成した。 (実行結果) *ノーマル* pan{c110170}% ./def_combination.rb [~/Ruby] クラスの中から何人か買い出しに行くことになりました。 クラスの人数は何人ですか: 10 何人買い出しに行かせますか: 4 4 人買い出しに行かせた場合の組み合わせは 210 です。 *確かめ* pan{c110170}% bc -l [~/Ruby] 10*9*8*7 5040 4*3*2 24 5040/24 210.00000000000000000000 quit *間違えた場合* pan{c110170}% ./def_combination.rb [~/Ruby] クラスの中から何人か買い出しに行くことになりました。 クラスの人数は何人ですか: 5 何人買い出しに行かせますか: 12 そんなに人数はいません。 12 人買い出しに行かせた場合の組み合わせは 0 です。 (考察) def の意味が分からなかったので、最初に組み合わせを出す def を作った後、 階乗の計算をする def をコメント扱いにしてみたところ、下のようなエラーが 出た。 pan{c110170}% ./def_combination.rb [~/Ruby] クラスの中から何人か買い出しに行くことになりました。 クラスの人数は何人ですか: 4 何人買い出しに行かせますか: 1 ./def_combination.rb:21:in `kaidasi': undefined method `factorial' for main:Object (NoMethodError) from ./def_combination.rb:34 これより、上の def が必要であることが分かり、階乗が必要だと言うことも理 解した。 また、15行目に買い出し人数が全体よりも多くなった場合は計算しないという 指示を出した。これも正しく動いていたので、プログラムが正しく動いていると 言える。 -------------------------------------------------------------------------- C. (設定)写真館で写真を撮ってアルバムを作るまでのシュミレーションを作成しま した。 写真を撮る回数と、アルバムの種類や大きさ等全部で4回選択出来るよう に作成しました。 (プログラム) #!/usr/koeki/bin/ruby #写真撮影からアルバム作成までのシュミレーション k = 0 # 撮影回数を表す nedan = 0 def satuei(k) # 回数の"k" 2100 * k # 最終撮影料金 = 1回の撮影料 * 回数 end def ryoukin(nedan,satuei) #最終支払額 nedan + satuei end while true # 繰り返しのメソッド print("和装と洋装どちらも撮影しますか??\n") print("(するなら y , かたほうのみなら n と入力) : ") ans = gets.chomp.to_s if ans == "y" k += 2 elsif ans == "n" k += 1 else print("またお越し下さい。\n") break end print("次にアルバムを作成します\n\n") print("--------------種類--------------\n") print(" 表紙(顔あり) 大 : 35000円\n") print(" 表紙(顔あり) 小 : 25000円\n") print(" 表紙(顔なし) 大 : 20000円\n") print(" 表紙(顔なし) 小 : 15000円\n") print("--------------------------------\n\n") while true print("どちらのタイプにしますか??(数字を入力)\n") print("1.表紙に顔が入るver. \n") print("2.表紙に顔が入らないver.\n") hyosi = gets.to_i if hyosi == 1 print("アルバムの大きさはどうしますか??\n") print("1.大\n") print("2.小\n") size = gets.to_i if size == 1 nedan += 35000 break elsif size == 2 nedan += 25000 break elsif print("1か2を入力して下さい。\n") break end elsif hyosi == 2 print("アルバムの大きさはどうしますか??\n") print("1.大\n") print("2.小\n") size2 = gets.chomp.to_i if size2 == 1 nedan += 20000 break elsif size2 == 2 nedan += 15000 break elsif print("1か2を入力して下さい。\n") break end elsif print("もう1度入力して下さい。\n") redo end end print("もう1度撮影しますか??\n") print("はい : y いいえ : n \n") ans2 = gets.chomp.to_s if ans2 == "y" redo elsif ans2 == "n" break else print("入力間違いだけど、とりあえず終了します。\n") break end end print("\n") print("●本日のお会計●\n") print("------------------------\n") printf("撮影回数 %d 回\n",k) printf("撮影料金 %d 円\n",satuei(k)) printf("アルバム代 %d 円\n",nedan) print("\n") printf("計 %d 円\n",ryoukin(nedan,satuei(k))) print("------------------------\n") (変更点) 元にしたプログラムは無く、自分で1から作成しました。 ただ、def メソッドの使い方等は今回の授業ノート(def_factorial.rb)を 参考にしました。 (実行結果) *正しく入力した場合* pan{c110170}% ./def_sim.rb [~/Ruby] 和装と洋装どちらも撮影しますか?? (するなら y , かたほうのみなら n と入力) : y 次にアルバムを作成します --------------種類-------------- 表紙(顔あり) 大 : 35000円 表紙(顔あり) 小 : 25000円 表紙(顔なし) 大 : 20000円 表紙(顔なし) 小 : 15000円 -------------------------------- どちらのタイプにしますか??(数字を入力) 1.表紙に顔が入るver. 2.表紙に顔が入らないver. 1 アルバムの大きさはどうしますか?? 1.大 2.小 2 もう1度撮影しますか?? はい : y いいえ : n n ●本日のお会計● ------------------------ 撮影回数 2 回 撮影料金 4200 円 アルバム代 25000 円 計 29200 円 ------------------------ *確かめ* pan{c110170}% bc -l [~/Ruby] 2100*2 4200 25000+4200 29200 quit *間違えて入力した場合* pan{c110170}% ./def_sim.rb [~/Ruby] 和装と洋装どちらも撮影しますか?? (するなら y , かたほうのみなら n と入力) : y 次にアルバムを作成します --------------種類-------------- 表紙(顔あり) 大 : 35000円 表紙(顔あり) 小 : 25000円 表紙(顔なし) 大 : 20000円 表紙(顔なし) 小 : 15000円 -------------------------------- どちらのタイプにしますか??(数字を入力) 1.表紙に顔が入るver. 2.表紙に顔が入らないver. 2 アルバムの大きさはどうしますか?? 1.大 2.小 5 1か2を入力して下さい。 どちらのタイプにしますか??(数字を入力) 1.表紙に顔が入るver. 2.表紙に顔が入らないver. 2 アルバムの大きさはどうしますか?? 1.大 2.小 1 もう1度撮影しますか?? はい : y いいえ : n r 入力間違いだけど、とりあえず終了します。 ●本日のお会計● ------------------------ 撮影回数 2 回 撮影料金 4200 円 アルバム代 20000 円 計 24200 円 ------------------------ *確かめ* pan{c110170}% bc -l [~/Ruby] 2100*2 4200 15000+4200 19200 quit (考察) 今回は元にしたプログラムが無かったので、1から手探りで作成した。 1番悩んだのが while true の中にいくつか while true を入れたので、redoや breakを正しく指示するところである。 80行目の if文の中で、入力間違えが発生した際、前に戻りたかったため、1つ1 つに break を入れた。しかし、そうするとプログラムが見づらくなってしまう ので、他に手がないか、 while を無くしてみたり、違うところに付けてみたり したが、上手く作動しなかったため、このまま送ることにした。 また、最後の"本日のお会計"で選んだアルバムを表示出来るようにしたかった が、 数字で選んでもらったため、%S 等で表示の指示が出せなかったのが残念だっ た。 上記の問題点以外は、計算も正しくできているし、表示や redo も出来ている ので、プログラム全体は正しく機能していることが分かる。 [3]感想 ・子供が使うおもちゃの携帯電話などの、ボタンによって決められた音が鳴る仕 組みになっているもの。また、自動販売機なども決められた動作を繰り返してい ると思う。 ・今回の筆記問題は何度も計算してみたが正解が分からなかった。また、16進数 の計算の仕方はどの先生のページを見ても教科書を読んでも、分からなかったの で、解説してもらいたいと思った。 ・プログラムは def の使い方を理解してからスムーズに進んだので少し楽しかっ た。 [4]参考文献 本 : Ruby プログラミング基礎講座 広瀬雄二著 HP : 神田先生のページ 9回目 http://roy/~naoya/ruby/index.html 共同製作者 : 伊藤桜子 ・ 齊藤陽香 ----------------------------------- 東北公益文科大学  公益学部 公益学科 2年 畠山貴衣  c110170@f.koeki-u.ac.jp