第5回 基礎プログラミング II レポート課題 氏名: 池田博哉 学籍番号: c1090147 語学クラス: 英語3 コース(系): 地域共創 1.筆記問題 A.「Ikeda Hiroya」なので、 ◯16進数表記 I … 0x49 H … 0x48 k … 0x6b i … 0x69 e … 0x65 r … 0x72 d … 0x44 o … 0x6f a … 0x61 y … 0x79 a … 0x61 16進数の計算では、15 以降は繰り上げで、16 で 0 に戻るので注意する。 0 1 2 3 4 5 6 7 8 9 a b c d e f(15) =>0 1 2 3 4... 4 9 + 6 11 → 0xb4 -------- 11 4 11 4 + 6 5 → 0x119 --------- 1 1 9 1 1 9 + 4 4 → 0x15d --------- 1 5 13 1 5 13 + 6 1 → 0x1be --------- 1 11 14 1 11 14 + 4 8 → 0x206 --------- 2 0 6 2 0 6 + 6 9 → 0x26f --------- 2 6 15 2 6 15 + 7 2 → 0x2e1 --------- 2 14 1 2 14 1 + 6 15 → 0x350 --------- 3 5 0 3 5 0 + 7 9 → 0x3c9 --------- 3 12 9 3 12 9 + 6 1 → 0x42a --------- ----- 4 2 10 16進数を10進数に変換する場合、右の桁から16の倍数を順に掛けて行く。 そして、それらを足していく。 「I」 4*16 + 9*1 = 64 + 9 = 73 「k」 6*16 + 11*1 = 96 + 11 = 107 「e」 6*16 + 5*1 = 96 + 5 = 101 「d」 4*16 + 4*1 = 64 + 4 = 68 「a」 6*16 + 1*1 = 96 + 1 = 97 「H」 4*16 + 8*1 = 64 + 8 = 72 「i」 6*16 + 9*1 = 96 + 9 = 105 「r」 7*16 + 2*1 = 112 + 2 = 114 「o」 6*16 + 15*1 = 96 + 15 = 111 「y」 7*16 + 9*1 = 112 + 9 = 121 「a」 6*16 + 1*1 = 96 + 1 = 97 73 + 107 + 101 + 68 + 97 + 72 + 105 + 114 + 111 + 121 + 97 = 1066 この計算が合っているか確認するため、16進数の合計を10進数に直す。 0x42a = 4*256 + 2*16 + 10*1 = 1024 + 32 + 10 = 1066 ◯Ktermで確認計算 pan{c109014}% bc -l [~] 73 + 107 + 101 + 68 + 97 + 72 + 105 + 114 + 111 + 121 + 97 1066 4 * 256 1024 1024 + 32 + 10 1066 答えは 0d1066 と変換され、これらの計算は正しいと言える。 B.毎日の風呂沸かしまでの作業をプログラム風に書き直します。 def wash(mizu, magiclean, shower) ofuro = ofuro の mizu を抜く ofuro = magiclean で洗う ofuro = shower で 流す end def furo(water, hotwater, timer) water を蛇口から出す hotwater も蛇口から出す bath = water と hotwater を混ぜる bath = bath の timer を準備する end ofuro(全部, 全部, 適量) bath(1回転, 1回転半, 10分30秒) #風呂を沸かすので呼び出す print("もう少しで風呂が沸くよー\n") 2.プログラム問題 A.◯考えた設定 数種類のお菓子を友達に配る場合、何通りの組み合わせが出来るかを求める プログラム。何個ずつの組み合わせにするかは、自分で入力するようにする。 ◯もとにしたプログラムからの変更点 講義で作成した「def_metabolic.rb」 「def_factorial.rb」 ◯プログラム本体「def_combination.rb」 -------------------------------------------------------------------------- !/usr/koeki/bin/ruby def fact(m) if m == 1 # もし、m が 1 なら 1 # 1 にする else # 他は m * fact(m-1) # m の階乗を計算 end end def kasi(type,kosu) if type == kosu # もし、菓子の数と配る数が同じ場合 1 # 1通りにしかならない elsif kosu == 0 # もし、組み合わせが 0 の場合 0 # 友達に配るお菓子は無い elsif type < kosu # もし、菓子の数よりも組み合わせの数が多い場合 print("「出来ません!」\n") exit # 終了 else fact(type) / (fact(kosu) * fact(type-kosu)) end end print("「たくさんあるお菓子を友達に配りたいと思います。」\n\n") STDERR.print("何種類のお菓子を配る? :") syurui = gets.to_i STDERR.print(" 一人に何個ずつ配る? :") kubaru = gets.to_i print("\n") printf("%d 種類のお菓子\n%d 個ずつ配る\n", syurui, kubaru) print("\t・\n") print("\t・\n") print("\t・\n") printf("組み合わせは%d通りになります。\n", kasi(syurui,kubaru)) -------------------------------------------------------------------------- ◯実行結果 -------------------------------------------------------------------------- pan{c109014}% ./def_combination.rb [~/Ruby] 「たくさんあるお菓子を友達に配りたいと思います。」 何種類のお菓子を配る? :4 一人に何個ずつ配る? :2 4 種類のお菓子 2 個ずつ配る ・ ・ ・ 組み合わせは6通りになります。 -------------------------------------------------------------------------- pan{c109014}% ./def_combination.rb [~/Ruby] 「たくさんあるお菓子を友達に配りたいと思います。」 何種類のお菓子を配る? :5 一人に何個ずつ配る? :3 5 種類のお菓子 3 個ずつ配る ・ ・ ・ 組み合わせは10通りになります。 -------------------------------------------------------------------------- pan{c109014}% ./def_combination.rb [~/Ruby] 「たくさんあるお菓子を友達に配りたいと思います。」 何種類のお菓子を配る? :1 一人に何個ずつ配る? :2 1 種類のお菓子 2 個ずつ配る ・ ・ ・ 「出来ません!」 -------------------------------------------------------------------------- ◯Ktermで計算 pan{c109014}% bc -l [~/Ruby] (4 * 3) / (2 * 1) 6.00000000000000000000 pan{c109014}% bc -l [~/Ruby] (5 * 4 * 3) / (3 * 2 * 1) 10.00000000000000000000 ◯考察 Ktermで計算した結果と実行結果が同じなので、この結果は正しいと言える。 個数よりも配る数が多い場合の結果もプログラムに入力した通りに表示さ れたので、正常に作動している。 3.感想 時計の一定感覚で針が動く仕組みが、機械的な動作を繰り返していると思う。 筆記問題が恐ろしく手間がかかってしまって、プログラミングが少し気が抜け てしまったので、次回からは集中力を持続させられるように頑張りたいです。 プログラムは仕組みが分かるとなかなか面白いと思いました。 4.参考文献 ◯2進数と16進数の計算 「http://www.geocities.co.jp/SiliconValley-SanJose/7769/hard/keisan.html」 ◯Rubyプログラミング基礎講座 著:広瀬雄二 P101〜106 共同学習者 藤井駿、遠藤孝之、佐藤裕康