第 5 回 何度も呼び出そう レポート課題 氏名:佐藤 千香 学籍番号:C1101069 語学クラス:英語6 コース(系):地域共創コース 1、筆記問題 A、 S = 0x53 a = 0x61 t = 0x74 o = 0x6f C = 0x43 h = 0x68 i = 0x69 k = 0x6b a = 0x61 10 進 数 16 進 数 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 a 11 b 12 c 13 d 14 e 15 f 16 10 まず、この16進数を10進数に直す。 また上の表をもとに文字の16進数を数の10進数に直していく。 0x53 = 16 × 5 + 3 = 83 0x61 = 16 × 6 + 1 = 97 0x74 = 16 × 7 + 1 = 116 0x6f(15) = 16 × 6 + 15 = 111 0x43 = 16 × 4 + 3 = 67 0x68 = 16 × 6 + 8 = 104 0x69 = 16 × 6 + 9 = 105 0x6b(11) = 16 × 6 + 11 = 107 0x61 = 16 × 6 + 1 = 97 10進数に直したものを全て合計する。 83 + 97 + 116 + 111 + 67 + 104 + 105 + 107 + 97 = 887 次に 887 を16進数に直す。 16 ) 887 7 ------ 16 ) 55 7 ------ 16 ) 3 3 ------ 0 887 = 0x377 となる。 今度は16進数ですべて足していく。 1の位、10の位にわけて計算する。 16以上になる場合は次の位に繰り上がる。 0x53 + 0x61 = 0xb4 5 3 6 1 ------- 11 4 11 = b 0x74 + 0x6f = 0xe3 7 4 6 f(15) ----------- 13 19 となるが、19 ÷ 16 = 1 あまり 3 7 4 6 f(15) ----------- 14 3 14 = e 0x43 + 0x68 = 0xab 4 3 6 8 ----------- 10 11 10 = a 11 = b 0x69 + 0x6b = 0xd4 6 9 6 b(11) ------------ 12 20 となるが、20 ÷ 16 = 1 あまり 4 6 9 6 b(11) ------------ 13 4 13 = d となる。 この方法ですべて足していくと、 0xb4 + 0xe3 = 0x197 0xab + 0xd4 = 0x17f 0x197 + 0x17f = 0x316 0x316 + 0x61 = 0x377 0x377となり、上の答えと同じになる。 参考文献:ウェブページ 神田 直弥 基礎プログラミングI 「16進数・ASCIIコード」http://roy/~naoya/ruby/9.html B、 朝ごはんを作るまでの過程をプログラム風にしてみた。 def breakfast (bread,butter,jam) bread を焼く butter とりだす jam とりだす dish = bread に butter を塗る dish = dish に jam を塗る end def tea (hotwater,teabag,suger) hotwater を沸かす teabag をとりだす suger をとりだす cup = hotwater を注ぎ teabag をいれる cup = cup に suger をいれる end breakfast(1枚,スプーン1杯,スプーン2杯) # 朝ごはんを作るので呼び出す tea(150cc,1パック,スプーン1杯) # ティーを作るので呼び出す print("朝ごはんの時間よ!!\n") 2、プログラム問題 A、 a、考えた設定 全体の数と選び出す数を入力してもらい、組合せが何通りあるか算出するプログラム b、プログラム #!/usr/koeki/bin/ruby def factional(a) # 関数 factional とし引数は a とする if a == 1 # if文で a が1の場合 1 # 1とする else # a が1以外の場合 a * factional(a-1) # 一つ少ない数字をかける end # if に対する end end # def に対する end def combination(zentai,erabu)# 関数 combination とした if zentai == erabu # zentai(全体の数)とerabu(選び出す数)が同じ数の場合 1 # 1とする else # それ以外の場合 factional(zentai)/(factional(erabu) * factional(zentai-erabu)) # mCn = m!/(n!(m-n)) の公式を使う end # if に対する end end # def に対する end while true # while true で繰り返しをもとめた STDERR.printf("\n全体の数を入力して下さい:") z = gets.to_i # 全体の数の入力を指示。to_iで整数とする。 STDERR.printf("\n全体の中から選び出す数を入力して下さい:") e = gets.to_i # 全体の数の入力を指示。to_iで整数とする。 if z < e # if 文で e(選び出す数)が z(全体の数)より大きくなる場合 print("\n計算できません。もう一度入力して下さい。\n") # 行う操作 redo # 繰り返しの先頭に戻る else # それ以外の場合 printf("\n全体の数%dから%d選ぶ組合せは%d通りです。\n",z,e,combination(z,e)) # 行う操作(結果を表示) break # 繰り返しから抜ける end # if に対する end end # while に対する end c、実行結果 pan{c110106}% ./def_combination.rb [~/Ruby] 全体の数を入力して下さい:6 全体の中から選び出す数を入力して下さい:12 計算できません。もう一度入力して下さい。 全体の数を入力して下さい:12 全体の中から選び出す数を入力して下さい:6 全体の数12から6選ぶ組合せは924通りです。 pan{c110106}% ./def_combination.rb [~/Ruby] 全体の数を入力して下さい:6 全体の中から選び出す数を入力して下さい:6 全体の数6から6選ぶ組合せは1通りです。 pan{c110106}% ./def_combination.rb [~/Ruby] 全体の数を入力して下さい:12 全体の中から選び出す数を入力して下さい:8 全体の数12から8選ぶ組合せは495通りです。 d、もとにしたプログラムからの変更点 授業のプログラムをもとに作成した。 ・引数の変更 ・選び出す数が全体の数を上まわる場合、while を用いて再入力をもとめた e、考察 bc -l で計算が合っているか確かめた。 ・全体の数12から6選ぶ組合せ pan{c110106}% bc -l [~/Ruby] (12*11*10*9*8*7)/(6*5*4*3*2) 924.00000000000000000000 で924通りである。 ・全体の数6から6選ぶ組合せ pan{c110106}% bc -l [~/Ruby] (6*5*4*3*2*1)/(6*5*4*3*2*1) 1.00000000000000000000 で1通りである。 ・全体の数12から8選ぶ組合せ pan{c110106}% bc -l [~/Ruby] (12*11*10*9*8*7*6*5)/(8*7*6*5*4*3*2*1) 495.00000000000000000000 で495通りである。 計算の答えはすべて合っている。 また選び出す数が全体の数を上まわる場合、 再入力をもとめているので、このプログラムは正しいといえる。 B、 a、考えた設定 ハンバーガー、ポテト、ドリンクの数を入力してもらい、合計金額を算出する プログラム。またハンバーガーは5個以上のときは1割り引きする。 b、プログラム #!/usr/koeki/bin/ruby def hamburger(a) # 関数を hamburger とし引数を a とする if a >= 5 # if文で5個以上の場合 ((a*320)*0.9).to_i # 1割り引きにし、to_iで整数にする else # その他の場合 a*320 # 個数 × ハンバーガーの価格 end # if に対する end end # def に対する end def potato(b) # 関数を potato とし引数を b とする b*210 # 個数 × ポテトの価格 end # def に対する end def drink(c) # 関数を drink とし引数を c とする c*150 # 個数 × ドリンクの価格 end # def に対する end print("\n") print("いらっしゃいませ!\n") print("---------MENU---------\n") print("ハンバーガー 320円\n") print("ポテト 210円\n") print("ドリンク 150円\n") print("-----------------------\n") print("ただいまキャンペーン中で") print("ハンバーガーを5個以上買うと1割り引きになります!!\n") print("\n") print("ハンバーガーをいくつ買いますか?\n") h = gets.to_i # 入力を指示。to_iで整数にする print("ポテトを何個買いますか?\n") p = gets.to_i # 入力を指示。to_iで整数にする print("ドリンクをいくつ買いますか?\n") d = gets.to_i # 入力を指示。to_iで整数にする print("\n") printf("ハンバーガー:%2d個 %4d円\n",h,hamburger(h)) printf("ポテト :%2d個 %4d円\n",p,potato(p)) printf("ドリンク :%2d個 %4d円\n",d,drink(d)) total = hamburger(h)+potato(p)+drink(d) # 合計金額を算出する printf("\n合計金額は%d円です\n",total) # 行う操作(結果を表示) c、実行結果 pan{c110106}% ./two_methods.rb [~/Ruby] いらっしゃいませ! ---------MENU--------- ハンバーガー 320円 ポテト 210円 ドリンク 150円 ----------------------- ただいまキャンペーン中でハンバーガーを5個以上買うと1割り引きになります!! ハンバーガーをいくつ買いますか? 10 ポテトを何個買いますか? 2 ドリンクをいくつ買いますか? 3 ハンバーガー:10個 2880円 ポテト : 2個 420円 ドリンク : 3個 450円 合計金額は3750円です pan{c110106}% ./two_methods.rb [~/Ruby] いらっしゃいませ! ---------MENU--------- ハンバーガー 320円 ポテト 210円 ドリンク 150円 ----------------------- ただいまキャンペーン中でハンバーガーを5個以上買うと1割り引きになります!! ハンバーガーをいくつ買いますか? 3 ポテトを何個買いますか? 5 ドリンクをいくつ買いますか? 6 ハンバーガー: 3個 960円 ポテト : 5個 1050円 ドリンク : 6個 900円 合計金額は2910円です d、もとにしたプログラムからの変更点 授業のプログラムをもとに作成した。 ・関数、引数の変更 ・ハンバーガーを5個以上買うと1割り引きになる e、考察 bc -l で計算して確かめた。 ・ハンバーガー 320 × 10 (5個以上なので1割り引き) ポテト 210 × 2 ドリンク 150 × 3 pan{c110106}% bc -l [~/Ruby] 320*10*0.9+210*2+150*3 3750.0 合計金額は 3750円である。 ・ハンバーガー 320 × 3 ポテト 210 × 5 ドリンク 150 × 6 pan{c110106}% bc -l [~/Ruby] 320*3+210*5+150*6 2910 合計金額は 2910 円である。 どちらの答えも合っているので」このプログラムは正しいといえる。 3、感想 機械的に繰り返すものは身近に多くあると感じた。例えば自動販売機はお金を 入れて、商品を選んでもらい、おつりを出す。RPGのゲームの戦闘などでも、敵のター ン、自分のターンといった繰り返しであると思う。機械的な操作の繰り返しはさ まざまな場所で活用されていると思った。 また今回は筆記問題が難しかったため、友だちと協力して課題に取り組んだ。 4、参考文献:ウェブページ 西村まどか プログラミングII 第5回 何度も呼び出そう http://roy.e.koeki-u.ac.jp/~madoka/2011/r2/05/r2_05_07_theme_05_factorial.html 神田 直弥 プログラミングI 第5回 制御構造[2] http://roy/~naoya/ruby/5.html 共同学習者: 伊藤 桜子・齊藤 陽香・畠山 貴衣 5、添付 Bのプログラムだけ添付します。