第5回 何度も呼び出そう レポート課題 氏名:伊藤桜子 学籍番号:c1100265 語学クラス:英語6 コース:政策マネジメント 1、筆記問題 A、 16進数 i 0x69 t 0x74 o 0x6f u 0x75 s 0x73 a 0x61 k 0x6b u 0x75 r 0x72 a 0x61 k 0x6b o 0x6f 10進数にすると i 0x69 = 6*16 + 9*1 = 105 = 0d105 t 0x74 = 7*16 + 4*1 = 116 = 0d116 o 0x6f = 6*16 + 15*1 = 111 = 0d111 u 0x75 = 7*16 + 5*1 = 111 0d117 s 0x73 = 7*16 + 3*1 = 115 = 0d115 a 0x61 = 6*16 + 1*1 = 97 = 0d97 k 0x6b = 6*16 + 15*1 = 107 = 0d107 u 0x75 = 7*16 + 5*1 = 111 0d117 r 0x72 = 7*16 +2*1 = 114 = 0d114 a 0x61 = 6*16 + 1*1 = 97 = 0d97 k 0x6b = 6*16 + 15*1 = 107 = 0d107 o 0x6f = 6*16 + 15*1 = 111 = 0d111 となる。10進数にしたものをすべて足していくと pan{c110026}% bc -l [~/Ruby] 105+116+111+117+115+97+107+117+114+97+107+111 1314 quit よって0d1314となった。 0d1314を16進数に変換すると 16 ) 1314 2 -------- 16 ) 82 2 -------- 16 ) 5 5 -------- 0 よって0x522となる。 より、自分の名前の文字コードを全て足し合わせると 0d1314 = 0x522 となる。 B、 ◯車を運転するときの操作をプログラム風に書き直す。 def kuruma(enjin, sidebure-ki, akuseru) unten = enjinをかけ、sidebure-kiをかえてakuseruを踏む end kuruma(かぎをさす, ドライブモードに入れる, 右足で踏む) # 操作するときに必要なものを呼び出す print("今から車を運転します。\n") 2、プログラム問題 A、 ◯考えた設定 ミーティングに集まる人の数といすの個数を入力してもらい、 いすに座る組み合わせを表示するプログラム ◯プログラム #!/usr/koeki/bin/ruby $KCODE = 'e' def factorial(m) if m == 1 1 else m * factorial(m-1) end end def suwaru(people,chair) #仮引数をpeopleとchairとする。 factorial(people)/(factorial(chair) * factorial(people-chair)) # nCr = n! / r!(n-r)!の計算式 end print("ミーティングをします!!\n") STDERR.print("集まる人は何人ですか?: ") hito = gets.to_i print("いすは何個ありますか: ") isu = gets.to_i if hito < isu print("すみません。今いすが足りないんです…。\n") elsif hito == isu printf("%d 人がいすに座る組み合わせは1通りです。\n",hito) elsif printf(" %d 人がいすに座る組み合わせは %d 通りです。\n", hito, suwaru(hito,isu)) end ◯もとにしたプログラムからの変更点 def_factorial.rbをもとにした。 集まる人がいすに座る組み合わせの公式は nCr = n! / r!(n-r)! なので def suwaru(x,y) factorial(x)/(factorial(y) * factorial(x-y)) end というdefメソッドをつくった。 ◯実行結果 ●集まる人の方が多い場合 pan{c110026}% ./def_combination.rb [~/Ruby] ミーティングをします!! 集まる人は何人ですか?: 6 いすは何個ありますか: 3 6 人がいすに座る場所の組み合わせは 20 通りです。 ●いすの方が多い場合 pan{c110026}% ./def_combination.rb [~/Ruby] ミーティングをします!! 集まる人は何人ですか?: 6 いすは何個ありますか: 7 すみません。今いすが足りないんです…。 ●集まる人といすの個数が同じ数の場合 pan{c110026}% ./def_combination.rb [~/Ruby] ミーティングをします!! 集まる人は何人ですか?: 4 いすは何個ありますか: 4 4 人がいすに座る組み合わせは1通りです。 ◯考察 人数を6人、いすの個数を3個として、公式に当てはめてbc -lで計算したところ pan{c110026}% bc -l [~/Ruby] 6*5*4*3*2*1/(3*2*1*3*2*1) 20.00000000000000000000 quit となり、実行結果と答えが同じだったのでこのプログラムは 正しいといえる。 また、いすよりも集まる人数が多い場合と集まる人数よりもいすの個数 が多い場合と、集まる人数といすの数が同じ場合の3つの場合を考えて プログラムを作成した。 人数よりもいすの個数が多い場合は計算ができないので「今いすが足りない」 という設定にした。 人数といすの個数が同じ場合は組み合わせは1通りなので「1通り」と表示 できるようにした。 それぞれの場合で実行したところ、きちんと表示できたのでこのプログラム は正しいといえる。 B、 ◯考えた設定 パンと牛乳を何個買うのかを入力してもらい、パンを3個以上買うと 4割引きになるように計算するプログラム ◯プログラム #!/usr/koeki/bin/ruby $KCODE = 'e' def gyu(g) 150 * g #牛乳を買ったときの計算式 end def pa(p) if p >= 3 130 * p * 0.6 #パンを3個以上買ったときの計算式 else 130 * p #パンを3個未満買ったときの計算式 end end print("パンと牛乳を買う個数を入力してください。パンは1個130円、牛乳は1本 150円です。\n") print("\n") print("パンは3個以上買うと4割引きになります。\n") STDERR.print("買うパンの個数 = ") pan = gets.to_i STDERR.print("買う牛乳の個数 = ") milk = gets.to_i total = gyu(milk) + pa(pan) printf("パンを%d個、牛乳を%d個買うと合計は%d円になります。\n",pan, milk, total) ◯もとにしたプログラムからの変更点 前回のレポート課題のdef_twoparam.rbを参考にした。 パンを3個以上買うと4割引きになるようにしたかったので、牛乳の金額を 求めるものと、パンの金額を求めるものとに分けた。 パンの合計を求めるdef文ではif文で3個以上買った場合と3個未満買った場合を 表した。 合計金額をtotalとしてdef文の計算式に入力してもらったパンの個数(pan)と牛乳の個数 (milk)を代入して計算させ、printfで表示できるようにした。 ◯実行結果 ●パンを3個以上買う場合 pan{c110026}% ./two_method.rb [~/Ruby] パンと牛乳を買う個数を入力してください。パンは1個130円、牛乳は1本 150円です。 パンは3個以上買うと4割引きになります。 買うパンの個数 = 5 買う牛乳の個数 = 6 パンを5個、牛乳を6個買うと合計は1290円になります。 ●パンを3個未満買う場合 pan{c110026}% ./two_method.rb [~/Ruby] パンと牛乳を買う個数を入力してください。パンは1個130円、牛乳は1本 150円です。 パンは3個以上買うと4割引きになります。 買うパンの個数 = 2 買う牛乳の個数 = 4 パンを2個、牛乳を4個買うと合計は860円になります。 ●パンを10個、牛乳を0本買う場合 pan{c110026}% ./two_method.rb [~/Ruby] パンと牛乳を買う個数を入力してください。パンは1個130円、牛乳は1本 150円です。 パンは3個以上買うと4割引きになります。 買うパンの個数 = 10 買う牛乳の個数 = 0 パンを10個、牛乳を0個買うと合計は780円になります。 ◯考察 パンを5個、牛乳を6本買ったときの合計をbc -lで確かめてみると pan{c110026}% bc -l [~/Ruby] 130*5*0.6+150*6 1290.0 quit となった。このことからパンが4割引きになっている実行結果と bc -lの答えが一致していることがわかる。 また、パンを2個、牛乳を4本買ったときの合計をbc -lで確かめてみると pan{c110026}% bc -l [~/Ruby] 130*2+150*4 860 quit となった。このことから実行結果とbc -lの答えが一致していることがわかる。 パンを10個牛乳を0本買ったときの合計をbc -lで確かめてみると pan{c110026}% bc -l [~/Ruby] 10*130*0.6 780.0 quit となった。このことからパン10個分が4割引きになっていることがわかる。 以上のことから、このプログラムは正しいといえる。 3、感想 機械的な操作を繰り返すものとして私が考えたのは ネジをまわすとシンバルをたたく猿のおもちゃ、オルゴール、自動販売機などで ある。 今回の課題では筆記問題に時間がかかった。16進数同士で足していく方法がわか らなかったため、10進数同士で足していき、その答えを16進数に直して計算した。 16進数同士の加算方法も教わりたかったと思った。 プログラムの問題はA問題は組合せを求める問題で、組合せの公式は複雑なので、 プログラムに取り入れて実行できたときは嬉しかった。 B問題は前回のプログラムをもとに作った。割引価格も表示できるプログラムを 作ることができたので便利だと思った。 今後も日常生活に役立つようなプログラムを作っていきたいと思った。 4、参考文献 ◯神田先生の前期の第9回授業ページ(ASCIIコード) http://roy/~naoya/ruby/9.html ◯組み合わせの公式 http://next1.cc.it-hiroshima.ac.jp/MULTIMEDIA/prob/node3.html ◯共同学習者 畠山貴衣 齊藤陽香 東北公益文科大学 公益学部 公益学科 2年 伊藤桜子 c110026@f.koeki-u.ac.jp