変数について指摘があったのでその点を変更したので再提出します。 第 5 回 何度も呼び出そう レポート課題 氏名: 池田 紘平 学籍番号: c1110097 語学クラス: 英語 3 コース: 社会福祉コース 1.A 第 3 回レポート課題より、自分の名前のASCIIコードは I K E D A K o h e i ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 0x49 0x4b 0x45 0x44 0x41 0x4b 0x6f 0x68 0x65 0x69 よって自分の名前をアルファベットで示したもののASCIIコードは 0x49 0x4b 0x45 0x44 0x41 0x4b 0x6f 0x68 0x65 0x69 となる。 これを足していく。16進数の足し算では、合計が16になったらひとつ繰り上げれ ば良いので、次のように筆算で計算する。 0x49 0x4b 0x45 0x44 0x41 0x4b 0x6f 0x68 0x65 +) 0x69 -------- 0x32e となる。 次に。最初の16進数を直して10進数で計算する。 16進 2進 10進 0x49 → 1001001 → 73 0x4b → 1001011 → 75 0x45 → 1000101 → 69 0x44 → 1000100 → 68 0x41 → 1000001 → 65 0x4b → 1001011 → 75 0x6f → 1101111 → 111 0x68 → 1101000 → 104 0x65 → 1000101 → 69 0x69 → 1101001 → 105 となるので、10進数の部分を計算すると 73 + 75 + 69 + 68 + 65 + 75 + 111 + 104 + 69 + 105 = 814 bc -l での計算結果 73+75+69+68+65+75+111+104+69+105 814 となる。これを16進数に直すには、10進数の合計を2進数に直し、足して781にな る部分に1を入れてできた2進数を右から4桁ずつ区切っていく。 512 256 128 64 32 16 8 4 2 1 ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 1 1 0 0 1 0 1 1 1 0 bc -l での計算結果 pan{c111009}% bc -l [~/Ruby2] 512+256+32+8+4+2 814 これを右から4桁ずつ区切るって16進数に直すと、 11 | 0010 | 1110 3 2 e となったので一致している。 1.B 起きてから家を出るまでの流れをプログラム風にした。 def breakfast(rice,miso_soup,obon) rice を盛る miso_soup えお盛る obon = rice と miso_soup をのせる end # obon を返す def wash(sengan,face,taoru) sengan をとる face を洗う taoru でふく taoru = face -sengan で綺麗にする end # taoru を返す def cloth(namaki,fuku,zubon,syuryou) nemaki を脱ぐ fuku を着る zubon をはく syuryou = - nemaki + fuku + zubon コーディネート終了 end # syuryou を返す breakfast(1杯,1杯,日本食) # おぼんにのっているものを呼び出す wash(1.5cm,ていねい,やんわり) # タオルでふくまでの状況を呼び出す cloth(スウェット,パーカー,ジーンズ,コーディネート) # 服のコーディネートを呼び出す print("行ってきます!\n") 2.A < 設定 > 最初の def -- end の中に計算式をあらかじめ仕込んでおき、前回のプログラム よりも簡略化した。 < プログラム def_power.rb > #!/usr/koeki/bin/ruby # coding: euc-jp def power(kisuu,shisuu) # power という method の中に仮引数 kisuu,shisuu を準備する k_kisuu = kisuu # a に kisuu を代入 s_shisuu = shisuu # b に shisuu を代入 ans = k_kisuu ** s_shisuu # ans に a の b 乗をいれる end # def の end STDERR.print("基数を入力: ") # 基数を入力する base = gets.to_i # bese に整数で代入 STDERR.print("指数を入力: ") # 指数を代入 index = gets.to_i # index に整数で代入 printf("%d の %d 乗は %d です\n",base,index,power(base,index)) # base の index 乗の結果 power(base,index) を表示 < 実行結果 > pan{c111009}% ./def_power.rb [~/Ruby2] 基数を入力: 2 指数を入力: 3 2 の 3 乗は 8 です pan{c111009}% ./def_power.rb [~/Ruby2] 基数を入力: 3 指数を入力: 3 3 の 3 乗は 27 です pan{c111009}% ./def_power.rb [~/Ruby2] 基数を入力: 4 指数を入力: 7 4 の 7 乗は 16384 です pan{c111009}% ./def_power.rb [~/Ruby2] 基数を入力: 5 指数を入力: 5 5 の 5 乗は 3125 です ここで、bc -l での確かめ算をする。 pan{c111009}% bc -l [~/Ruby2] 2*2*2 8 3*3*3 27 4*4*4*4*4*4*4 16384 5*5*5*5*5 3125 このようになるので、このプログラムは正しいと言える。 < 説明 > 計算式をすべて def -- end の中にいれておくことで、のちの計算式を書かずに 簡略化できる。 2.B < 設定 > 前回のプログラム(def_budget.rb)を使って、30個以上購入したら2割引になるよ うにした。 < プログラム two_methods.rb > #!/usr/koeki/bin/ruby # coding: euc-jp def wata(kosuu) # 割り引きしない(30個未満の)時の変数 wata 200 * kosuu # 200 * 個数 end # def の end def waribiki(kosuu) # 割り引きする(30個以上の)時の変数 waribiki 200 * kosuu * 0.8 # 200 * 個数 *2割引き end # def の end def zandaka(kosuu) # 割り引きしない(30個未満の)時の変数 zandaka 10000 - 200 * kosuu # 10000 - 200 * a end # def の end def waribikizandaka(kosuu) # 割り引きする(30個以上の)時の変数 waribikizandaka 10000 - 200 * kosuu * 0.8 # 10000 - 200 * 個数 * 2割引き end # def の end def ringo(kosuu) # 割り引きしない(30個未満の)時の変数 ringo (10000 - 200 * kosuu) / 400 # 10000 - 200 * 個数 / 400 end # def の end def waribikiringo(kosuu) # 割り引きする(30個以上の)時の変数 waribikiringo (10000 - 200 * kosuu * 0.8) / 400 # 10000 - 200 * 個数 / 400 end # def の end print("\n予算は 10000 円です\n\n") # 予算の表示 print("\nわたあめは30個以上買うと合計が 2 割引になります\n") # 30個以上買うと合計が2割引きになると表示 STDERR.print("わたあめ(1つ200円)をいくつ購入しますか\n") STDERR.print("個数 : ") # 個数の入力 wataame = gets.to_i # 変数 wataame に整数で代入 if wataame > 29 # 個数が29個以上で if wataame >= 63 # 個数が63個以上だったら print"\n個数が多すぎます!!\nお金がなくて恥ずかしい思いをしますよ・・・\n" # 予算オーバーを表示 end # if の end if wataame < 63 # 個数が63個未満で if wataame > 60 # 個数が60個以上だったら printf("\nわたあめを %d 個購入すると %d 円です\n残りの予算は %d 円なのでりんごあめは買えません…\n",wataame,waribiki(wataame),waribikizandaka(wataame)) # 残りの予算でりんごあめを買えないことを表示 end # if の end if wataame <= 60 printf("\nわたあめを %d 個購入すると %d 円です\n残りの予算は %d 円なのでりんごあめは %d 個買えます\n",wataame,waribiki(wataame),waribikizandaka(wataame),waribikiringo(wataame)) # 個数、割引き合計、割引き合計を引いた残高、その残高で買える個数を代入 end # if の end end # if の end end # if の end if wataame <= 29 # 個数が29個以下だったら printf("\nわたあめを %d 個購入すると %d 円です\n残りの予算は %d 円なのでりんごあめは %d 個買えます\n",wataame,wata(wataame),zandaka(wataame),ringo(wataame)) # 個数、割り引きしない合計金額・残高・買える個数を表示 end # if の end < 実行結果 > pan{c111009}% ./two_methods.rb [~/Ruby2] 予算は 10000 円です わたあめは30個以上買うと合計が 2 割引になります わたあめ(1つ200円)をいくつ購入しますか 個数 : 25 わたあめを 25 個購入すると 5000 円です 残りの予算は 5000 円なのでりんごあめは 12 個買えます pan{c111009}% ./two_methods.rb [~/Ruby2] 予算は 10000 円です わたあめは30個以上買うと合計が 2 割引になります わたあめ(1つ200円)をいくつ購入しますか 個数 : 29 わたあめを 29 個購入すると 5800 円です 残りの予算は 4200 円なのでりんごあめは 10 個買えます pan{c111009}% ./two_methods.rb [~/Ruby2] 予算は 10000 円です わたあめは30個以上買うと合計が 2 割引になります わたあめ(1つ200円)をいくつ購入しますか 個数 : 30 わたあめを 30 個購入すると 4800 円です 残りの予算は 5200 円なのでりんごあめは 13 個買えます pan{c111009}% ./two_methods.rb [~/Ruby2] 予算は 10000 円です わたあめは30個以上買うと合計が 2 割引になります わたあめ(1つ200円)をいくつ購入しますか 個数 : 35 わたあめを 35 個購入すると 5600 円です 残りの予算は 4400 円なのでりんごあめは 11 個買えます pan{c111009}% ./two_methods.rb [~/Ruby2] 予算は 10000 円です わたあめは30個以上買うと合計が 2 割引になります わたあめ(1つ200円)をいくつ購入しますか 個数 : 59 わたあめを 59 個購入すると 9440 円です 残りの予算は 560 円なのでりんごあめは 1 個買えます pan{c111009}% ./two_methods.rb [~/Ruby2] 予算は 10000 円です わたあめは30個以上買うと合計が 2 割引になります わたあめ(1つ200円)をいくつ購入しますか 個数 : 60 わたあめを 60 個購入すると 9600 円です 残りの予算は 400 円なのでりんごあめは 1 個買えます pan{c111009}% ./two_methods.rb [~/Ruby2] 予算は 10000 円です わたあめは30個以上買うと合計が 2 割引になります わたあめ(1つ200円)をいくつ購入しますか 個数 : 61 わたあめを 61 個購入すると 9760 円です 残りの予算は 240 円なのでりんごあめは買えません… pan{c111009}% ./two_methods.rb [~/Ruby2] 予算は 10000 円です わたあめは30個以上買うと合計が 2 割引になります わたあめ(1つ200円)をいくつ購入しますか 個数 : 63 個数が多すぎます!! お金がなくて恥ずかしい思いをしますよ・・・ bc -l で確かめ算 pan{c111009}% bc -l [~/Ruby2] (10000-200*25)/400 12.50000000000000000000 (10000-200*29)/400 10.50000000000000000000 (10000-200*30*0.8)/400 13.00000000000000000000 (10000-200*35*0.8)/400 11.00000000000000000000 (10000-200*59*0.8)/400 1.40000000000000000000 (10000-200*60*0.8)/400 1.00000000000000000000 (10000-200*61*0.8)/400 .60000000000000000000 (10000-200*63*0.8)/400 -.20000000000000000000 となり、買える個数がプログラムの結果と一致したのでこのプログラムは正しい といえる。 < 前回のプログラム(def_budget.rb)からの改良点 > 前のプログラムでは行が異常に多く感じたので、個数で判断させることにより行 数を少なくした。30個以上購入すると2割引くことにしたため、買える個数が変 わってしまうことに気がついたので、その点を探しだしその個数で判断させるよ うにした。 < 考察 > 上記のプログラム(two_methods.rb)では前回のプログラム(def_budget.rb)と異 なり、一定個数以上買ったら割引くようにしたので、前回とは違う個数で予算オー バーになってしまうことになった。それをふせぐために、2.B の実行結果で示し たように、オーバーするぎりぎりの個数を見つけ出すことで、解決することがで きた。また、if 文の閉じ忘れで、全く違う数値が出てくることがあり、計算等 に苦労したが、if 文のすぐあとに if 文をつけて実行することで上手く結果が 表示された。後期だけでなく、前期の知識も総動員してプログラム問題にとり組 む必要性があるとわかった。 < 感想 > 機械的な操作を繰り返すものには、野球の投げて・打って・走ってという動作が 機械的ではないかと考えた。 最近はじめた def -- end によって、プログラムが簡略化できるようになったの で嬉しく感じる。 < 共同学習者 > 稲村洋樹 < 参考文献 > ・基礎プログラミング II 第 5 回 (何度も呼び出そう) 「体力があがったら」 西村まどか http://roy/~madoka/2012/r2/05/r2_05_02_theme_02_deccelate.html ・基礎プログラミング II 第 5 回 (何度も呼び出そう) 「自作の method 」 西村まどか http://roy/~madoka/2012/r2/05/r2_05_03_review_01_selfmademethod.html 追伸: プログラム(def_power.rb two_methods.rb)を添付します