第5回 基礎プログラミング II レポート課題 氏名:青木 千紗 学籍番号:C1090012 語学クラス:中国語1 コース(系):地域共創コース 1 筆記問題 A 名前 Aoki Chisa 下の表を用いて16進数に変換した。 a = 0x61 o = 0x6f k = 0x6b i = 0x69 c = 0x63 h = 0x68 i = 0x69 s = 0x73 a = 0x61 a = 10 b = 11 c = 12 d = 13 e = 14 f = 15 0x61 = 6*16^1 + 1*16^0 = 97 0x6f = 6*16^1 + 15*16^0 = 111 0x6b = 6*16^1 + 11*16^0 = 107 0x69 = 6*16^1 + 9*16^0 = 105 0x63 = 6*16^1 + 3*16^0 = 99 0x68 = 6*16^1 + 8*16^0 = 104 0x69 = 6*16^1 + 9*16^0 = 105 0x73 = 7*16^1 + 3*16^0 = 115 0x61 = 6*16^1 + 1*16^0 = 97 97 + 111 + 107 + 105 + 99 + 104 + 105 + 115 + 97 = 940 940を16進数にするため16で割る。 940 / 16 = 58 余り 12 58 / 16 = 3 余り 10 3 / 16 = 0 余り 3 10 = a 12 = c 0d940 = 0x3ac 16進数と10進数で計算した結果が同じなので計算があっていることが 確認できた。 B 夕ご飯を作ることをプログラム風に書き直します。 def curry(carrot, potato, onion, roux, meat) carrot を剥く potato を剥く onion を切る meat を切る pan = onion と meat を炒める pan = pan に 全て加える end # 返すものは pan def salad(lettuce, tomato, cucumber, corn, dressing) lettuce を畑からとってくる tomato をプランターから持って来る cucumber をプランターから持って来る corn の缶をあける dressing を作る dish = lettuce と tomato と cucumber を水でよく洗う dish = dish に全て盛りつける end # 返すものは dish ・ ・ ・ curry(2本, 5個, 1個, 200g, 200g) # カレーを作るので呼び出す salad(1玉, 3個, 2本, 1缶, 150cc) # サラダを作るので呼び出す print("夕ご飯できたよ\n") 2 プログラム問題 A プログラム(def_combination.rb) a 考えた設定 factorialを使用し、箱の中から番号の付いたボールを取りだすときの組み合 わせを求めるプログラムを考えた。 b 作成したプログラム #!/usr/koeki/bin/ruby def factorial(box) # メソットの設定 if box == 1 # もし box が 1だったら 1 else # 違っていたら box * factorial(box-1) # box に factorial(box)を呼びかける end # ifに対するend end # defに対するend def kumiawase(ball_a,ball_b) # メソットの設定 factorial(ball_a)/(factorial(ball_b)*factorial(ball_a-ball_b)) # factorial(s)を呼び出し # m! # mCr = -----------の計算をする # r!(r-m)! end # defに対するend STDERR.print("この箱の中から番号の付いたボール(5個)を取りだすときの組み合わせを求めます。\n") STDERR.print("何個ボールを取りだしますか?\n") piece = gets.to_i # 入力された文字を整数に変えて、変数 pieceの中に代入する ball = 5 # ボールの数は5個なので、5を代入 printf("%d 個選んだときの組み合わせは %d 通りです。\n", piece, kumiawase(ball,piece)) c もとにしたプログラム def_factorial.rb を参考にしてプログラムを作成した d 実行結果 pan{c109001}% ./def_combination.rb [~/Ruby] この箱の中から番号の付いたボール(5個)を取りだすときの組み合わせを求めます。 何個ボールを取りだしますか? 2 2 個選んだときの組み合わせは 10 通りです。 e 考察 計算を行なったが、正しく計算されているか分からない。 そこで、bc -lで確かめ算を行なった。 pan{c109001}% bc -l [~/Ruby] ( 5 * 4 * 3 * 2 * 1 ) / ( 2 * 1 * 3 * 2 * 1 ) 10.00000000000000000000 quit 実行結果と確かめ算により、きちんと表示され、計算も正しく行なわれているこ とがわかった。よって、このプログラムは正確に機能したといえる。 しかし、5個取りだす場合は、エラーになってしまう。これは、0は階乗できない ためだと思われる。 B プログラム(two_methods.rb) a 考えた設定 methodを2つ使用し、米沢牛を200g以上買うと4割り引きになるプログラムを考 えた。 b 作成したプログラム #!/usr/koeki/bin/ruby def australia(foreign) # メソットの設定 88 * (foreign / 100) end # defに対するend def yonezawabeef(domestic) # メソットの設定 if domestic >= 200 # もしdomesticが200より大きかったら 800 * (domestic / 100) * 0.6 else # それ以外だったら 800 * (domestic / 100) end # ifに対するend end # defに対するend STDERR.print("オーストラリア産と米沢牛を買った場合の値段を計算します。\n") STDERR.print("オーストラリア産の牛肉は100g:88円、米沢牛は100g:800円です。\n") STDERR.print("米沢牛を200g以上買うと、米沢牛は4割り引きになります。\n") STDERR.print("オーストラリア産の牛肉を何グラム買いますか?\n") gram_f = gets.to_i # 入力されたオーストラリア産の牛肉のグラム数を整数に直して代入する STDERR.print("米沢牛を何グラム買いますか?\n") gram_d = gets.to_i # 入力された米沢牛のグラム数を整数に直して代入する total = australia(gram_f) + yonezawabeef(gram_d) # 値段の合計をaustralia,yonezawabeefをメソット使い求める printf("合計は %d 円です。\n", total) c もとにしたプログラム def_firefly.rb を参考にプログラムを作成した d 実行結果 (計算が変化した場合) pan{c109001}% ./two_methods.rb [~/Ruby] オーストラリア産と米沢牛を買った場合の値段を計算します。 オーストラリア産の牛肉は100g:88円、米沢牛は100g:800円です。 米沢牛を200g以上買うと、米沢牛は4割り引きになります。 オーストラリア産の牛肉を何グラム買いますか? 100 米沢牛を何グラム買いますか? 300 合計は 1528 円です。 (計算が変化しない場合) pan{c109001}% ./two_methods.rb [~/Ruby] オーストラリア産と米沢牛を買った場合の値段を計算します。 オーストラリア産の牛肉は100g:88円、米沢牛は100g:800円です。 米沢牛を200g以上買うと、米沢牛は4割り引きになります。 オーストラリア産の牛肉を何グラム買いますか? 100 米沢牛を何グラム買いますか? 100 合計は 888 円です。 e 考察 計算を行なったが、正しく計算されているか分からない。 そこで、bc -lで確かめ算を行なった。 (計算が変化した場合) pan{c109001}% bc -l [~/Ruby] 88 * ( 100 / 100 ) 88.00000000000000000000 800 * ( 300 / 100 ) * 0.6 1440.00000000000000000000 88 + 1440 1528 quit (計算が変化しない場合) pan{c109001}% bc -l [~/Ruby] 88 * ( 100 / 100 ) 88.00000000000000000000 800 * ( 100 / 100 ) 800.00000000000000000000 88 + 800 888 quit 実行結果と確かめ算により、きちんと表示され、計算も正しく行なわれているこ とがわかった。よって、このプログラムは正確に機能したといえる。 しかし、このプログラムは200g以上買うと4割り引きされるプログラムである。よ って199gの場合は割り引きされず 800 * ( 199 / 100 ) = 800 になるはずであ る。また、200gの場合は割り引きされるため 800 * ( 200 / 100 ) * 0.6 = 960 になるはずなので、実際に実行してみる。200gの場合は、960になったが、800に ならなかった。これは、プログラムで100で割った際に、199は1.99となり、小数 なので 1 として計算したのではないかと思われる。よって、このプログラムは 小数になるような数を入力されると、計算が合わなくなることがわかった。 3 感想 機械的な操作を繰り返すものは、自動ドアである。 自動ドアは、人が来る度に開け閉めを繰り返すからである。 4 参考文献 基礎プログラミング II 第5回 http://roy/~madoka/2010/r2/05/05_01_theme_01_diet.html 「脱メタボリック計画」 http://roy/~madoka/2010/r2/05/05_07_theme_05_factorial.html 「階乗計算」 http://roy/~madoka/2010/r2/05/05_04_appendix_01_firefly.html 「ほたるの数と米の収穫量」 著者:西村まどか ---------------------------------------------------------------- 5 共同学習者 小松 由里 久保田 瑛一郎 横山 広樹 6 添付