第 5 回 何度も呼び出そう レポート課題 氏名:高田美咲 学籍番号:C1110909 語学クラス:英語1 コース:政策マネジメント ( 再提出 ) 訂正点:プログラム問題Cを追加した。 1. A alphabet t a k a d a / m i s a k i ASCII 0x74 0x61 0x6b 0x61 0x64 0x61 / 0x6d 0x69 0x73 0x61 0x6b 0x69 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 10進数 0d116 0d97 0d107 0d97 0d100 0d97 /0d109 0d105 0d115 0d97 0d107 0d105 ---------------------------------------------------------------------------- < 16進数の計算 > takada と misaki にわけて計算する。 まず、それぞれを足す。 16でひとつ上の位にあがる。 -- takada -- 7 4 6 1 6 11 6 1 6 4 +)6 1 --------- 0x2 6 6 -- misaki -- 6 13 6 9 7 3 6 1 6 11 +)6 9 --------- 0x2 7 e < 10進数の計算 > takada と misaki にわけて計算する。 それぞれを足す。その後、出た答えを16進数に変換する。 -- takada -- 1 1 6 9 7 1 0 7 9 7 1 0 0 +) 9 7 ---------- 6 1 4 614 / 16 = 38 余り 6 38 / 16 = 2 余り 6 2 / 16 = 0 余り 2 余りの部分を下から並べると 0d614 = 0x266 -- misaki -- 1 0 9 1 0 5 1 1 5 9 7 1 0 7 +)1 0 5 ---------- 6 3 8 638 / 16 = 39 余り 14 14 = eに変換 39 / 16 = 2 余り 7 2 / 16 = 0 余り 2 余りの部分を下から並べると 0d638 = 0x27e 結果、同じ答えになる。 B 携帯でメールを送信するまでをプログラム風に書き直した。 def kei(rock,touch,mozi) 携帯の rock をはずす mail = 画面を touch して mozi を打つ end #返すのはmail kei(19057,触る,おはよう) #呼び出す print("あとは送信するだけ!!\n") 2. A < 設定 > 基数、指数を入力すると結果が表示される。 < プログラム > def_power.rb #!/usr/koeki/bin/ruby # coding: euc-jp def power(base,index) if base == 1 #基数が1なら何乗でも1 1 elsif index == 0 #指数が0なら何乗でも1 1 else base ** index #累乗計算 end end STDERR.print("基数を入力: ") #入力部分 base = gets.to_i #数値で取りこむ STDERR.print("指数を入力: ") #入力部分 index = gets.to_i #数値で取りこむ printf("%d の %d 乗は %d です。\n",base,index,power(base,index)) #結果表示 < もとにしたプログラム、変更点 > def_fact.rbともとにして、基数と指数を入力する設定に変更した。 < 実行結果1 > -- 基数が1の場合 -- pan{c111090}% ./def_power.rb [~/Ruby] 基数を入力: 1 指数を入力: 5 1 の 5 乗は 1 です。 < 実行結果2 > -- 指数が0の場合 -- pan{c111090}% ./def_power.rb [~/Ruby] 基数を入力: 3 指数を入力: 0 3 の 0 乗は 1 です。 < 実行結果3 > -- 指定無し -- pan{TAKADA Misaki}% ./def_power.rb [~/Ruby] 基数を入力: 3 指数を入力: 4 3 の 4 乗は 81 です。 < 考察 > 確認のため3つの実行の確かめ算をする。 pan{c111090}% bc -l [~/Ruby] 1 * 1 * 1 * 1 * 1 1 3^0 1 3 * 3 * 3 * 3 81 quit 計算に間違いがなかったため正しく機能している。 しかし、プログラムには指数が0の場合と基数が1の場合を通常とは別にif文で設 定していた。その部分を取り除いても式の設定自体が乗のため正常に機能した。 よって必要無かったと思われる。 < 修正プログラム > #!/usr/koeki/bin/ruby # coding: euc-jp def power(base,index) base ** index #累乗計算 end STDERR.print("基数を入力: ") #入力部分 base = gets.to_i #数値で取りこむ STDERR.print("指数を入力: ") #入力部分 index = gets.to_i #数値で取りこむ printf("%d の %d 乗は %d です。\n",base,index,power(base,index)) #結果表示 < 実行結果 > pan{c111090}% ./def_power.rb [~/Ruby] 基数を入力: 1 指数を入力: 5 1 の 5 乗は 1 です。 pan{c111090}% ./def_power.rb [~/Ruby] 基数を入力: 8 指数を入力: 0 8 の 0 乗は 1 です。 pan{c111090}% ./def_power.rb [~/Ruby] 基数を入力: 3 指数を入力: 3 3 の 3 乗は 27 です。 < 確認計算 > pan{c111090}% bc -l [~/Ruby] 1*1*1*1*1 1 8^0 1 3*3*3 27 quit B < 設定 > 個数によって価格を変化させて表示する。 < プログラム > two_methods.rb #!/usr/koeki/bin/ruby # coding: euc-jp def eat(hum,potato) if potato >= 10 #フライドポテトが10個以上なら wari =-20 #20円割り引き else wari = 0 #通常の個数なら end hum * 100 + potato * (170 + wari) #計算式 end print("[ハンバーガー 100円 フライドポテト 170円]\n\n") print("フライドポテト10個以上お買い上げのお客様は1個150円になりますよ!!\n\n") STDERR.print("ハンバーガーを何個買う? :") #入力部分 hum = gets.to_i #数値で取りこみ STDERR.print("フライドポテトを何個買う? :") #入力部分 potato = gets.to_i #数値で取りこみ print("---- 会計 ----\n") printf("ハンバーガー %d 個\n",hum) #結果表示 printf("フライドポテト %d 個\n",potato) printf("合計 %d 円\n",eat(hum,potato)) print("--------------\n") < もとにしたプログラム、変更点 > def_meta.rb をもとにして、テーマをハンバーガーとフライドポテトに変更した。 < 実行結果1 > -- 割り引き前 価格 -- pan{c111090}% ./two_methods.rb [~/Ruby] [ハンバーガー 100円 フライドポテト 170円] フライドポテト10個以上お買い上げのお客様は1個150円になりますよ!! ハンバーガーを何個買う? :5 フライドポテトを何個買う? :5 ---- 会計 ---- ハンバーガー 5 個 フライドポテト 5 個 合計 1350 円 -------------- < 実行結果2 > -- 割り引き後 価格 -- pan{c111090}% ./two_methods.rb [~/Ruby] [ハンバーガー 100円 フライドポテト 170円] フライドポテト10個以上お買い上げのお客様は1個150円になりますよ!! ハンバーガーを何個買う? :2 フライドポテトを何個買う? :20 ---- 会計 ---- ハンバーガー 2 個 フライドポテト 20 個 合計 3200 円 -------------- < 考察 > 確認計算を行う。 pan{c111090}% bc -l [~/Ruby] 100 * 5 + 170 * 5 1350 100 * 2 + 150 * 20 3200 quit 結果、フライドポテトの購入数が10個未満の場合は170円で計算された。 10個以上の場合、150円で計算された。 よってこのプログラムは正しく機能している。 C < 設定 > ショッピングモールの増設と予算について表示する。 < プログラム > def_sim.rb #!/usr/koeki/bin/ruby # coding: euc-jp def tenpo(kazu,mise) #店舗を増やす式 kazu += (mise + 1) #お店の数を増やす end def money(en,mise) #減少させる式 if en > 0 #enが0でなければ en -= 2 * mise #お店の数の2倍分、円が減る else return 0 #お金は負の数にならないように end end print("新しいショッピングモールが建設されました。\n") print("予算内であれば随時、敷地を広くし新しい店舗がオープンします。\n") shop = 3 #店舗数 i = i0 = 0 #増設回数 yosan = 80 #予算 STDERR.printf("予算: %d 億円\n",yosan) while true #条件がそろっている限り続ける yosan = money(yosan,shop) #予算はmoneyの設定で計算 shop = tenpo(shop,i) #お店の数はtenpoの設定で計算 if yosan > 0 #予算が0でなければ STDERR.printf("増設回数 %d回\t残り予算 %d億円\t店舗数 %d\n",i +=1,yosan,shop) else #それ以外は print("これ以上の増設は予算オーバーのためできません。\n") break end end < もとにしたプログラム、変更点 > def_firefly.rb をもとにして、methodの変数部分を変更した。 < 実行結果 > pan{c111090}% ./def_sim.rb [~/Ruby] 新しいショッピングモールが建設されました。 予算内であれば随時、敷地を広くし新しい店舗がオープンします。 予算: 80 億円 増設回数 1回 残り予算 74億円 店舗数 4 増設回数 2回 残り予算 66億円 店舗数 6 増設回数 3回 残り予算 54億円 店舗数 9 増設回数 4回 残り予算 36億円 店舗数 13 増設回数 5回 残り予算 10億円 店舗数 18 これ以上の増設は予算オーバーのためできません。 < 考察 > 予算と店舗数の数値が正しいか確認する。 -- 予算について -- pan{c111090}% bc -l [~/Ruby] 80-2*3 74 74-2*4 66 66-2*6 54 54-2*9 36 36-2*13 10 quit -- 店舗数 -- pan{c111090}% bc -l [~/Ruby] 3+1 4 4+2 6 6+3 9 9+4 13 13+5 18 quit どちらも正確に計算され機能している。 3 感想 在宅ワークの組立作業は同じことを繰り返すため機械的だと思う。 今回の課題はプログラム問題Bの方は個数によって価格を変更できた。 しかし10個までは170円、11個目から150円という設定までは出来なかったので 少し残念だっかがひとます3つのプログラムを完成出来て良かった。 4 参考資料 西村まどか 基礎プログラミングII 第5回 何度も呼び出そう 「脱メタボリック計画」 http://roy/~madoka/2012/r2/05/r2_05_01_theme_01_diet.html 「体力があがったら」 http://roy/~madoka/2012/r2/05/r2_05_02_theme_02_deccelate.html 「階乗計算」 http://roy/~madoka/2012/r2/05/r2_05_07_theme_05_factorial.html 「シュミレーションで考えること」 http://roy/~madoka/2012/r2/05/r2_05_05_theme_03_param.html