第5回 何度も呼び出そう レポート課題 氏名:土屋哲平 学籍番号:c1111085 語学クラス:中国語3 コース:政策マネジメント A. 私の名前をASCIIコードで表すと以下の様に表される。 Ox74,Ox73,Ox75,Ox63,Ox68,Ox69,Ox79,Ox61 Ox74,Ox65,Ox70,Ox70,Ox65,Ox69 16進数同士の足し算では16ごとに次の桁にくりあがるので、1の位から順に足し て計算していく。 また、分かりやすいように始めに2つの16進数を足し、その答えに次の16進数を 足すというのを繰り返して計算していく。 ・Ox74とOx73を足す 1の位 4+3=7 10の位 7+7=14(e) Ox74+Ox73=Oxe7 ・Oxe7とOx75を足す 1の位 7+5=12(c) 10の位 14+7=21 21/16=1...5 100の位 1 Oxe7+Ox75=Ox15c ・Ox15cとOx63を足す 1の位 12+3=15(f) 10の位 5+6=11(b) 100の位 1 Ox15c+Ox63=Ox1bf ・Ox1bfとOx68を足す 1の位 15+8=23 23/16=1...7 10の位 11+6+1=18 18/16=1...2 100の位 1+1=2 Ox1bf+Ox68=Ox227 ・Ox227とOx69を足す 1の位 7+9=16 16/16=1...0 10の位 2+6+1=9 100の位 2 Ox227+Ox68=Ox290 ・0x290とOx79を足す 1の位 0+9=9 10の位 9+7=16 16/16=1...0 100の位 2+1=3 Ox290+Ox79=Ox309 ・Ox309とOx61を足す 1の位 9+1=10(a) 10の位 0+6=6 100の位 3 Ox309+Ox61=Ox36a ・Ox36aとOx74を足す 1の位 10+4=14(e) 10の位 6+7=13(d) 100の位 3 Ox36a+Ox74=Ox3de ・Ox3deとOx65を足す 1の位 14+5=19 19/16=1...3 10の位 13+6+1=20 21/16=1...4 100の位 3+1=4 Ox3de+Ox65=Ox443 ・Ox443とOx70を足す 1の位 3+0=3 10の位 4+7=11(b) 100の位 4 Ox453+Ox70=Ox4b3 ・Ox4b3とOx70を計算する 1の位 3+0=3 10の位 11+7=18 18/16=1...2 100の位 4+1=5 Ox4b3+Ox70=Ox523 ・Ox523とOx65を足す 1の位 3+5=8 10の位 2+6=8 100の位 5 Ox523+Ox65=588 ・Ox588とOx69を足す 1の位 8+9=17 17/16=1...1 10の位 8+6+1=15(f) 100の位 5+1 Ox584+Ox69=Ox5f1 16進数を全て足すとOx5f1という計算結果になった。 次に10進数に直してから計算をおこなう。 16進数を10進数に直した値は、16進数の1の位に16の0乗、10の位に16の1乗...と かけていき、最後に全ての数字を足すことで求められる。 私の名前は10個の16進数を使って表すことが出来るのでまず10個の16進数を 10進数に変換する。 Ox74=7*16の1乗+4*16の0乗 =112+4 =116 0x73=7*16の1乗+3*16の0乗 =112+3 =115 Ox75=7*16の1乗+5*16の0乗 =112+5 =117 Ox63=6*16の1乗+3*16の0乗 =96+3 =99 Ox68=6*16の1乗+8*16の0乗 =96+8 104 Ox69=6*16の1乗*9*16の0乗 =96+9 =105 Ox79=7*16の1乗+9*16の0乗 =112+9 =121 Ox61=6*16の1乗+1*16の0乗 =96+1 =97 Ox65=6*16の1乗+5*16の0乗 =96+5 =101 Ox70=7*16の1乗+0*16の0乗 =112+0 =112 計算ができたのでこれを全て足していく。 pan{c111108}% bc -l 116+115+117+99+104+105+121+97+116+101+112+112+101+105 1521 答えはOd1521と表すことができる。 次に上記の10進数を16進数に変換する。 1521/16=95...1 95/16=5...15(f) 5/16=0...5 余りを下から読むとOx5f1となり、16進数の足し算と同じ計算結果になった。 よってこの計算は正しいといえる。 Ox5f1を10進数に変換するとOd1521になるか確かめる。 5*16**2=1280 15*16**1=240 1*16**0=1 1280+240+1=1521 bc -lで計算が正しいか確かめる。 pan{TSUCHIYA Teppei}% bc -l [~] 5*256 1280 15*16 240 1*1 1 1280+240+1 1521 計算結果は合っていた、かつ16進数を10進数に変換した答えが、10進数を足していっ たものとおなじだったのでこの計算結果は正しいといえる。 <参考文献> webサイト http://www.geocities.co.jp/SiliconValley-SanJose/7769/hard/keisan.html 2進数と16進数の計算 B <考えた設定> ラーメン屋でバイトをしているのでラーメンの作る行程を プログラム風に書き直した。 def ramen(men,soop,toppingu) #関数名はラーメン、仮引数は麺、スープ、トッピング men をゆでる soop を準備する donburi = men と soop を盛りつける donburi = donburi に toppingu を盛りつける end ramen(200g,350ml,3枚) #ラーメンを作るので呼び出す print("ラーメンできあがり\n") 2.プログラム問題 A a.考えた設定 基数と指数を入力させ、計算を行うプログラムを作成した。 b.作成したプログラム #!/usr/koeki/bin/ruby #coding:euc-jp def power(a,b) a ** b end STDERR.print("基数を入力してください :") base = gets.to_i STDERR.print("指数を入力してください :") index = gets.to_i printf("%d の %d 乗は %d です\n",base,index,power(base,index)) c.もとにしたプログラムからの変更点 授業中に作成したdef_fact.rbを参考にプログラムを作成した。 このプログラムは指数計算を行うので、関数の定義の部分を**を使い 指数の計算を行うように変更した。 d.実行画面 (1) pan{c111108}% ./def_power.rb [~/Ruby] 基数を入力してください :1 指数を入力してください :3 1 の 3 乗は 1 です (2) pan{c111108}% ./def_power.rb [~/Ruby] 基数を入力してください :4 指数を入力してください :2 4 の 2 乗は 16 です (3) pan{c111108}% ./def_power.rb [~/Ruby] 基数を入力してください :10 指数を入力してください :10 10 の 10 乗は 10000000000 です e.考察 (1)の計算では、1の3乗を計算した結果答えが1になった。 この計算結果が正しいかbc -lで計算してたしかめる。 1の3乗は1を3回かけると計算できる。 pan{c111108}% bc -l 1*1*1 1 答えが1になったのでこの計算結果は正しいといえる。 (2)は4の2乗の計算である。 bc -lで計算してみると pan{c111108}% bc -l 4*4 16 となり答えが同じであった。 なのでこの計算結果は正しいといえる。 (3)は10の10乗で大きい数字になっている。 これも計算できるかたしかめる。 pan{c111108}% bc -l [~/Ruby] 10*10*10*10*10*10*10*10*10*10 10000000000 実行結果とbc -lで計算した結果が同じになったので この計算は正しいといえる。 3パターンの計算を行ったが、すべての計算が合っていた。 なのでこのプログラムは正しいといえる。 f.参考文献 webサイト http://roy/~madoka/2012/r2/05/r2_05_07_theme_05_factorial.html 西村まどか 2012年度基礎プログラミングII 講義ノート 第5回 何度も呼び出そう 「階乗計算」 B a.考えた設定 最近のレンタルビデオ店では新作を何枚か一緒に借りると安くなるという キャンペーンを行っている。そこで、新作を3本借りると通常の価格より安く 借りれるというプログラムtwo_methods.rbを作成した。 b.作成したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp def sinsaku(a) #新作を借りる場合の関数 仮引数はa if a == 3 #もし引数がaなら600円になる 600 elsif a >=3 #aが3よりも大きいなら 600 + (a-3) * 250 #600円に借りる本数から3引いて250円かけた値になる else a *280 #それ以外の場合は 本数×280円 end end def junsin(b) #準新作は150円×本数 b * 150 end def kyusaku(c) #旧作は80円×本数 c * 90 end print("☆ただいま新作3本で600円☆\n") print("新作280円\t準新作150円\t旧作90円\n") print("\n\n") STDERR.print("新作は何本借りますか? :") #新作のレンタル本数を聞く new = gets.to_i STDERR.print("準新作は何本借りますか? :") #準新作のレンタル本数を聞く jun = gets.to_i STDERR.print("旧作は何本借りますか? :") #旧作のレンタル本数を聞く old = gets.to_i total = sinsaku(new) + junsin(jun) + kyusaku(old) #金額はそれぞれの関数の計算結果を足した値 printf("新作を %d 本、準新作を %d 本、旧作を %d 本でお会計 %d円です。\n", new,jun,old,total) print("\n") print("ありがとうございました!!\n") c.もとにしたプログラムからの変更点 授業中に作成したdef_meta.rbを参考にプログラムを作成した。 methodを3つに増やし、値を入力することで計算結果が変化するように変更した。 新作の部分の計算では、新作1本の値段を280円に設定し、if文を使い新作を3本 借りると3本で600円、それ以降は1本250円でレンタルできるようにした。 d.実行画面 <パターン1> pan{c111108}% ./two_methods.rb [~/Ruby] ☆ただいま新作3本で600円☆ 新作280円 準新作150円 旧作90円 新作は何本借りますか? :1 準新作は何本借りますか? :1 旧作は何本借りますか? :1 新作を 1 本、準新作を 1 本、旧作を 1 本でお会計 520円です。 ありがとうございました!! <パターン2> pan{c111108}% ./two_methods.rb [~/Ruby] ☆ただいま新作3本で600円☆ 新作280円 準新作150円 旧作90円 新作は何本借りますか? :3 準新作は何本借りますか? :1 旧作は何本借りますか? :1 新作を 3 本、準新作を 1 本、旧作を 1 本でお会計 840円です。 ありがとうございました!! <パターン3> pan{c111108}% ./two_methods.rb [~/Ruby] ☆ただいま新作3本で600円☆ 新作280円 準新作150円 旧作90円 新作は何本借りますか? :5 準新作は何本借りますか? :1 旧作は何本借りますか? :1 新作を 5 本、準新作を 1 本、旧作を 1 本でお会計 1340円です。 ありがとうございました!! e.考察 このプログラムでは新作280円、準新作150円、旧作90円の料金設定で、新作を3 枚借りると600円になり、それ以降は1枚250円でレンタル出来るという設定にし てある。 そこで、3枚以下の場合、3枚の場合、3枚以上の場合の3パターンを実行し、 正しく計算できているか確かめる。 パターン1は新作が3枚以下の場合である。なので新作は1枚280円で計算されてい なければならない。新、準、旧作それぞれ1本ずつ借りると、実行結果では 520円と表示された。bc -lでこの結果が正しいか計算してみる。 pan{c111108}% bc -l [~/Ruby] 280+150+90 520 計算結果と実行結果が同じ値になったので、パターン1は正しい計算結果 であるといえる。 次にパターン2。これは新作を3本借りた場合である。 この場合は新作は600円で借りることが出来る。 実行結果では新作3本、準新作1本、旧作1本借りて会計が840円になっているので この結果が正しいか計算して確かめてみる。 pan{c111108}% bc -l 600+150*1+90*1 840 計算した結果、実行結果と同じになった。なのでパターン2は 正しい計算結果であるといえる。 パターン3は3本以上借りた場合である。この場合は新作は3本借りた料金600円 にプラスして1本250円で借りることができる。実行結果では新作5本、準新作1本 旧作1本借りた場合であり、料金は1340円である。 この実行結果が正しいか計算して確かめる。 pan{c111108}% bc -l [~/Ruby] 600+250*2+150*1+90*1 1340 実行結果と同じ計算結果になったのでパターン3は正しいといえる。 3パターンの実行結果を確かめたが、全て正しい計算結果になった。 なのでこのプログラムは正しいといえる。 f.参考文献 webサイト http://roy/=madoka/2012/r2/05/r2_05_02_theme_02_deccelate.html 西村まどか 2012年度 基礎プログラミングII 講義ノート 第5回 何度も呼び出そう 「体力があがったら」 3.感想 ボタンを押すと予め設定されている音声を発するおもちゃは機械的な行動 であると思われる。 今回のレポートでは、進数の計算が難しく、計算結果が合わなかったりして 時間がかかってしまった。進数計算のやり方はノートなどを見なくても 出来るレベルまで理解しておく必要があると感じた。 プログラム問題では、Aの問題に少しとまどってしまったが、良く考えて見ると 案外簡単な構造であることに気付き、柔軟な頭でプログラム作成にとりかかりた いと思った。