16進数と10進数の問題で、bとdを勘違いしていたようなのでもう一度送ります。 第5回 基礎プログラミング II レポート課題 氏名:吉田瑞恵 学籍番号:C1082030 語学クラス:英語(?) コース(系):社会 1. A. 第3回レポートより、名前を16進数で表すと Y=0x59 o=0x6f s=0x73 h=0x68 i=0x69 d=0x64 a=0x61 M=0x4d i=0x69 z=0x7a u=0x75 e=0x65 となる。 それぞれを足していくと 0x59+0x6f=5+6,9+f=11+1,8=c8 0xc8+0x73=c+7,8+3=1,3,11=13b 0x13b+0x68=1,3+6,b+8=1,9+1,3=1a3 0x1a3+0x69=1,a+6,3+9=1+1,0,12=20c 0x20c+0x64=2,0+6,c+4=2,6+1,0=270 0x270+0x61=2,7+6,0+1=2,13,1=2d1 0x2d1+0x4d=2,d+4,1+d=2+1,1,14=31e 0x31e+0x69=3,1+6,e+9=3,7+1,7=387 0x387+0x7a=3,8+7,7+a=3,15+1,1=3+1,0,1=401 0x401+0x75=4,0+7,1+5=476 0x476+0x65=4,7+6,6+5=4db で4dbとなった。 次に16進数を10進数に変換したものを全て足す。 0x59 = 16*5+9 = 0d89 0x6f = 16*6+15= 0d111 0x73 = 16*7+3 = 0d115 0x68 = 16*6+8 = 0d104 0x69 = 16*6+9 = 0d105 0x64 = 16*6+4 = 0d100 0x61 = 16*6+1 = 0d97 0x4d = 16*4+13= 0d77 0x69 = 16*6+9 = 0d105 0x7a = 16*7+10= 0d122 0x75 = 16*7+5 = 0d117 0x65 = 16*6+5 = 0d101 89+111+115+104+105+100+97+77+105+122+117+101=1243となった。 10進数を10で割る。 1243/10=124 あまり 3 124/10 =12 あまり 4 12/10 =1 あまり 2 1/10 =0 あまり 1 あまりを下から付けていくと 1243 1243/16=77 あまり 11 77/16 =4 あまり 13 4/16 =0 あまり 4 あまりを下から付けていくと 4 13 11 = 4db 4dbを10進数に直すと 16^2*4+16^1*13+16^0*11=256*4+16*13+1*11=1024+208+11=1243 これを16で割っていく。 1243/16=77あまり11 75/16=4あまり13 4/16=0あまり4 あまりを下から付けていくと 4dbとなった。 B. 米を研いで炊飯器で炊くまでの様子を表した。 def kometogi(rice,wash,water) rice を 取りだす riceをwashする suihanki = suihankiにriceとwaterを入れる end def suihan(switch,wait,steam) switchを押す 炊けるまでwaitする steamで蒸らす end kometogi("1合,7回,200cc") #米を研ぐため呼び出す suihan("2回,60分,15分") #米を炊くため呼び出す print("ご飯が炊けました\n") #メッセージ 2. A. a.設定 候補者の人数、選ばれる人数をそれぞれ入力してもらい、組み合わせを計算する プログラムdef_combination.rb b.作成プログラムdef_combination.rb #!/usr/koeki/bin/ruby def factional(n)#関数factionalを作る。引数はninzuuのn if n == 1 #nが1のとき、 1 #1を返す。 else #nが1以外のとき n * factional(n-1) #一つ少ない数字をかける end #if文終了 end #factionalの定義終了。 def combination(ninzuu,iin) #関数combinationの式を作る。 if ninzuu==iin #ninzuu,iinが同じ数の場合 1 #1を返す else #それ以外の場合 factional(ninzuu)/(factional(iin) * factional(ninzuu-iin)) #上で定義したfactionalに入れられた数を代入したものを # nCr = n!/r!(n-r)!の公式に従い計算させる。 #今回の場合、nはninzuu,rはiinとなる。 end #if文終了 end #factionalの定義終了。 STDERR.printf("候補は何人いますか?:") member = gets.to_i #入力されたものを整数に STDERR.printf("委員は何人選びますか?:") choose = gets.to_i #入力されたものを整数に if member < choose #メンバーより選ぶ役職が多い場合 print("計算できません。正しい数値を入力して下さい。\n") #エラーメッセージを表示。 else #メンバーの方が役職より多い場合 printf("%d人から%d人選ぶときの組み合わせは、%d通りです。\n",member,choose,combination(member,choose)) #結果を表示。 end #if文終了 c.変更点 授業内であつかわれたdef_function.rbをもとに作成。 ・変数を設定に合わせ変更 ・組み合わせを求める nCr=n!/r!(n-r)! を使うようにした。 ・計算できないときにエラーメッセージを表示するようにした。 d.実行結果 roy{c108203}% ./def_combination.rb [~/Ruby] 候補は何人いますか?:30 委員は何人選びますか?:3 30人から3人選ぶときの組み合わせは、4060通りです。 roy{c108203}% ./def_combination.rb [~/Ruby] 候補は何人いますか?:13 委員は何人選びますか?:15 計算できません。正しい数値を入力して下さい。 roy{c108203}% ./def_combination.rb [~/Ruby] 候補は何人いますか?:15 委員は何人選びますか?:15 15人から15人選ぶときの組み合わせは、1通りです。 e.考察 roy{c108203}% ./def_combination.rb [~/Ruby] 候補は何人いますか?:15 委員は何人選びますか?:3 15人から3人選ぶときの組み合わせは、455通りです。 15人のうち3人選ぶのは15C3 nCr=n*(n-1)*(n-2).../r! で分子の個数がr個になるようにし、分母をrの階乗にすればいい。 (これが高校のときに習った方法だが、これを計算させるのは難しく感じたので、 調べて出てきた公式 nCr=n!/r!(n-r)!を使った。) 15*14*13/3*2*1 = 5*7*13 = 455 bc -lで確かめ算をする。 roy{c108203}% bc -l [~/Ruby] 15*14*13/6 455.00000000000000000000 13人から13人選ぶ場合。 これは全員が選ばれる1通りしかない。 roy{c108203}% ./def_combination.rb [~/Ruby] 候補は何人いますか?:13 委員は何人選びますか?:13 13人から13人選ぶときの組み合わせは、1通りです。 これは 13*12*11*10*9*8*7*6*5*4*3*2*1/13*12*11*10*9*8*7*6*5*4*3*2*1 なので 1 となる。 14人いるうちから20人選ぶ。memberよりiinが多くなる。 今回は計算できなかったと表示するようにしている roy{c108203}% ./def_combination.rb [~/Ruby] 候補は何人いますか?:14 委員は何人選びますか?:20 計算できません。正しい数値を入力して下さい。 となったので 正しく計算できているといえる。 B. a.設定 スーパーに卵と牛乳を買いに行く。 卵は特売で98円だが、1人で3パック以上買うと3パック目からは178円になる。 また、牛乳は1本158円である。合計金額を求めるプログラムtwo_methods.rb b.作成プログラムtwo_methods.rb #!/usr/koeki/bin/ruby def egg(t) #tを引数とする関数eggを定義する。 if t < 3 #購入するのが2パックまでのとき t * 98 #パック数に98をかける。 else #3パック以上購入する場合 2 * 98 + (t-2) * 178 # はじめの2パックまでは98円で、それ以外のパックは178円となる。 end #if文終了 end #関数eggの定義終了 def milk(g)#gを引数とする関数milkを定義する g * 158 #牛乳は1本158円。購入本数に158をそのままかける。 end #関数milkの定義終了 STDERR.printf("卵は何パック買いますか?:") tamago = gets.to_i #入力されたものを変数tamagoに整数として取り込む。 STDERR.printf("牛乳は何本買いますか?:") gyuunyuu = gets.to_i #入力されたものを変数gyuunyuuに整数として取り込む goukei = egg(tamago)+ milk(gyuunyuu) #tamagoの数値で計算された関数eggと #milkの数値で計算された関数gyuunyuuを足したものをgoukeiとする。 printf("合計で%d円になります。\n",goukei) #結果表示 c.変更点 前回の課題レポートで作成したdef_twoparam.rbをもとに作成。 ・変数を設定に合わせ変更。 ・前回は数に応じて全員分安くしたが、 今回はeggが3パック以上のときに2パックまでのとそれ以上の計算法を変えた。 ・関数を2つ作り、それぞれの結果を足させるようにした。 d.実行結果 roy{c108203}% ./two_methods.rb [~/Ruby] 卵は何パック買いますか?:1 牛乳は何本買いますか?:3 合計で572円になります。 roy{c108203}% ./two_methods.rb [~/Ruby] 卵は何パック買いますか?:3 牛乳は何本買いますか?:2 合計で690円になります。 e.考察 卵2パック以下の場合 roy{c108203}% ./two_methods.rb [~/Ruby] 卵は何パック買いますか?:1 牛乳は何本買いますか?:2 合計で414円になります。 自分で計算 98*1+158*2=98+316=414 bc -l で確かめ算 roy{c108203}% bc -l [~/Ruby] 98*1+158*2 414 卵2パック以上の場合 roy{c108203}% ./two_methods.rb [~/Ruby] 卵は何パック買いますか?:4 牛乳は何本買いますか?:1 合計で710円になります。 自分で計算 98*2+178*2+158=710 bc -l で確かめ算 roy{c108203}% bc -l [~/Ruby] 98*2+98*2+178*2+158*1 710 卵だけ買う場合 roy{c108203}% ./two_methods.rb [~/Ruby] 卵は何パック買いますか?:2 牛乳は何本買いますか?:0 合計で196円になります。 自分で計算 98*2=196 roy{c108203}% bc -l [~/Ruby] 98*2 196 roy{c108203}% ./two_methods.rb [~/Ruby] 卵は何パック買いますか?:3 牛乳は何本買いますか?:0 合計で374円になります。 自分で計算 98*2+178*1=374 bc -l で確かめ算 roy{c108203}% bc -l [~/Ruby] 98*2+178*1 374 なので正しく動いていると言える。 3.感想 機械的に繰り返すものとして、私は大学の学生証で開く扉を思い浮かべた。 例えば101教室は7:00から23:00までの間、学生証をかざすと開く。 もしきちんと閉まっていなかったらピーとなる。 このような扉は、開錠可能時間内はこういった行動を繰り返しているのではないかと考えた。 ###################################### 前回のレポートで先走ってif文を使ってしまったので、今回のB問題は あまり悩まずにできた。 また、今回は高校時代の数学で習った組み合わせをプログラムにした。 組み合わせの公式などをすっかり忘れていたが、少し思い出すことができた。 SPIに出ることもあるので、いい復習になったと思う。 4.参考文献 基礎プログラミング II 第5回 何度も呼び出そう 「階乗計算」 (講義ノート) http://roy/~madoka/2010/r2/05/05_07_theme_05_factorial.html 「ひとつずつ確かめよう」 (講義ノート) http://roy/~madoka/2010/r2/05/05_08_theme_06_onebyone.html 作成者:西村まどか 数学Web教材 > 高校数学公式 数学A 第1章 場合の数と集合 http://www.nakamura-sanyo.ed.jp/sanyo/yanase/kousiki/new/002_MA/004/002_ma_004.htm 作成者:T.Yanase