第5回 何度も呼び出そう レポート課題 氏名: 村上茉奈美 学籍番号: C1111352 語学クラス: 英語3 コース: 社会福祉 1. A. 自分の名前を ASCIIコードに照らし合わせると、 m = 0x6d u = 0x75 r = 0x72 a = 0x61 k = 0x6b a = 0x61 m = 0x6d i = 0x69 m = 0x6d a = 0x61 n = 0x6e a = 0x61 m = 0x6d i = 0x69 となる。 1. 16進数の足し算 10進数のようにただ数を足すのではなく、16進数の場合は 10の位と1の位に分けて考える。 そのとき 16 で繰り上がるようにするため、16 よりも大きい値になっ たら、その数字から 16 を引き、1 繰り上げる。 名前を上から2つずつ区切って計算し、最後にそれぞれの値を合計する。 m(0x6d) + u(0x75) 6 d (d は10進数で 13 を表す) + 7 5 ------ 14 2 1 の位: 13 + 5 = 18 - 16 = 2 (10の位に 1 繰り上がる) 10の位: 6 + 7 + 1 (1の位からの繰り上げ) = 14 (14 は16進数で e を表す) よって、m(0x6d) + u(0x75) = 0xe2 r(0x72) + a(0x61) 7 2 + 6 1 ------ 13 3 1 の位: 2 + 1 = 3 10の位: 7 + 6 = 13 (13 は16進数で d を表す) よって、r(0x72) + a(0x61) = 0xd3 k(0x6b) + a(0x61) 6 b (b は10進数で 11 を表す) + 6 1 ------ 12 12 1 の位: 11 + 1 = 12 (12 は16進数で c を表す) 10の位: 6 + 6 = 12 ( 〃 ) よって、k(0x6b) + a(0x61) = 0xcc m(0x6d) + i(0x69) 6 d (d は10進数で 13 を表す) + 6 9 ------ 13 6 1 の位: 13 + 9 = 22 - 16 = 6 (10の位に 1 繰り上がる) 10の位: 6 + 6 + 1 (1の位からの繰り上げ) = 13 (13 は16進数で d を表す) よって、m(0x6d) + i(0x69) = 0xd6 m(0x6d) + a(0x61) 6 d (d は10進数で 13 を表す) + 6 1 ------ 12 14 1 の位: 13 + 1 = 14 (14 は16進数で e を表す) 10の位: 6 + 6 = 12 (12 は16進数で c を表す) よって、m(0x6d) + a(0x61) = 0xce n(0x6e) + a(0x61) 6 e (e は10進数で 14 を表す) + 6 1 ------ 12 15 1 の位: 14 + 1 = 15 (15 は16進数で f を表す) 10の位: 6 + 6 = 12 (12 は16進数で c を表す) よって、n(0x6e) + a(0x61) = 0xcf m(0x6d) + i(0x69) 6 d (d は10進数で 13 を表す) + 6 9 ------ 13 6 1 の位: 13 + 9 = 22 - 16 = 6 (10の位に 1 繰り上がる) 10の位: 6 + 6 + 1 (1の位からの繰り上げ) = 13 (13 は16進数で d を表す) よって、m(0x6d) + i(0x69) = 0xd6 次に、上で求めた値を足していく。 0xe2 + 0xd3 ( m + u の答えと r + a の答えを足す) e 2 (e は10進数で 14 を表す) + d 3 (d は10進数で 13 を表す) ------ 1 11 5 1 の位: 2 + 3 = 5 10 の位: 14 + 13 = 27 - 16 = 11 (100の位に 1 繰り上がる、11 は16進数で b を表す) 100の位: 1 (10の位からの繰り上げ) よって、0xe2 + 0xd3 = 0x1b5 0xcc + 0xd6 ( k + a の答えと m + i の答えを足す) c c (c は10進数で 12 を表す) + d 6 (d は10進数で 13 を表す) ------- 1 10 2 1 の位: 12 + 6 = 18 - 16 = 2 (10の位に 1 繰り上がる) 10 の位: 12 + 13 + 1 (1の位からの繰り上げ) = 26 - 16 = 10 (100の位に 1 繰り上がる、10 は16進数で a を表す) 100の位: 1 (10の位からの繰り上げ) よって、0xcc + 0xd6 = 0x1a2 0xce + 0xcf ( m + a の答えと n + a の答えを足す) c e (c は10進数で 12 、e は10進数で 14 を表す) + c f (c は10進数で 12、 f は10進数で 15 を表す) ------- 1 9 13 1 の位: 14 + 15 = 29 - 16 = 13 (10の位に 1 繰り上がる、13 は16進数で d を表す) 10 の位: 12 + 12 + 1 (1の位からの繰り上げ) = 25 - 16 = 9 (100の位に 1 繰り上がる) 100の位: 1 (10の位からの繰り上げ) よって、0xce + 0xcf = 0x19d 0x19d + 0xd6 (0xce + 0xcf の答えと m + i の答えを足す) 1 9 d (d は10進数で 13 を表す) + d 6 ( 〃 ) --------- 2 7 3 1 の位: 13 + 6 = 19 - 16 = 3 (10の位に 1 繰り上がる) 10 の位: 9 + 13 + 1 (1の位からの繰り上げ) = 23 - 16 = 7 (100の位に 1 繰り上がる) 100の位: 1 + 1 (10の位からの繰り上げ) = 2 よって、0x19d + 0xd6 = 0x273 0x1b5 + 0x1a2 ( 0xe2 + 0xd3 の答えと 0xcc + 0xd6 の答えを足す) 1 b 5 (b は10進数で 11 を表す) + 1 a 2 (a は10進数で 10 を表す) --------- 3 5 7 1 の位: 5 + 2 = 7 10 の位: 11 + 10 = 21 - 16 = 5 (100の位に 1 繰り上がる) 100の位: 1 + 1 + 1 (10の位からの繰り上げ) = 3 よって、0x1b5 + 0x1a2 = 0x357 0x357 + 0x273 (0x1b5 + 0x1a2 の答えと 0x19d + 0xd6 の答えを足す) 3 5 7 + 2 7 3 --------- 5 12 10 1 の位: 7 + 3 = 10 (10 は16進数で a を表す) 10 の位: 5 + 7 = 12 (12 は16進数で c を表す) 100の位: 3 + 2 = 5 よって、0x357 + 0x273 = 0x5ca (16進数の足し算の答え) 2. ASCIIコードに照らし合わせることによって出た自分の名前の 16進数表記を10進数に直し、合計する。 10進数に変換するためには、各桁に 16 の倍数をかけたものを足す。 m … 0x6d (d は10進数で 13 を表す) = (6 * 16) + (13 * 1) = 109 u … 0x75 = (7 * 16) + (5 *1) = 117 r … 0x72 = (7 * 16) + (2 * 1) = 114 a … 0x61 = (6 * 16) + (1 * 1) = 97 k … 0x6b (b は10進数で 11 を表す) = (6 * 16) + (11 * 1) = 107 a … 0x61 = (6 * 16) + (1 * 1) = 97 m … 0x6d (d は10進数で 13 を表す) = (6 * 16) + (13 * 1) = 109 i … 0x69 = (6 * 16) + (9 * 1) = 105 m … 0x6d (d は10進数で 13 を表す) = (6 * 16) + (13 * 1) = 109 a … 0x61 = (6 * 16) + (1 * 1) = 97 n … 0x6e (e は10進数で 14 を表す) = (6 * 16) + (14 * 1) = 110 a … 0x61 = (6 * 16) + (1 * 1) = 97 m … 0x6d (d は10進数で 13 を表す) = (6 * 16) + (13 * 1) = 109 i … 0x69 = (6 * 16) + (9 * 1) = 105 計算が合っているか bc -l で確認する。 重複しているものもあるので、 m、u、r、a、k、i、n について確かめた。 pan{MURAKAMI Manami}% bc -l [~] (6*16)+(13*1) 109 (7*16)+(5*1) 117 (7*16)+(2*1) 114 (6*16)+(1*1) 97 (6*16)+(11*1) 107 (6*16)+(9*1) 105 (6*16)+(14*1) 110 quit 確認したところ、計算が一致していることが分かった。 次に、上で求めた10進数を合計する。 109 + 117 + 114 + 97 + 107 + 97 + 109 + 105 + 109 + 97 + 110 + 97 + 109 + 105 = 1482 bc -l で確認する。 pan{c111135}% bc -l [~] 109+117+114+97+107+97+109+105+109+97+110+97+109+105 1482 quit 確認したところ、計算が一致していることが分かった。 よって、10進数に変換後の合計は、0d1482 3. 10進数に変換後の合計を16進数に直す。 16進数に変換するためには、もとの10進数の数を商が 0 になるまで 16 で割り、余りを下から順に拾う。 1482 / 16 = 92 余り 10 (10 は16進数で a を表す) 92 / 16 = 5 余り 12 (12 は16進数で c を表す) 5 / 16 = 0 余り 5 計算が合っているか bc -l で確認する。 pan{c111135}% bc -l [~] 1482/16 92.62500000000000000000 1482-(16*92) 10 92/16 5.75000000000000000000 92-(16*5) 12 5/16 .31250000000000000000 5-(16*0) 5 quit まず最初に上の式と同じ計算をして商がいくつになるのかを 確かめた。その後、もとの数から(16 * 商)を引いて、余りの数が 正しいのかを確かめた。 その結果、計算が一致していることが分かった。 求めた余りを下から順に読むと 5ca となる。 よって、0d1482 = 0x5ca 16進数の足し算の答えも 0x5ca となっており、 10進数に変換後であっても同じ答えが得られた。 A の参考文献 ・ http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1322528463 YAHOO 知恵袋 作者: YAHOO! JAPAN ・ http://roy/~madoka/2012/r1/05/r1_05_01_theme_01_asciicode.html 2012年度 基礎プログラミングI 第5回 (配列の構造) 「ASCIIコード表」 作者: 西村まどか ・ 「Rubyプログラミング基礎講座」 広瀬雄二 著 第8講 計算機の内部表現 8-1 2進数と16進数 p101~106 B. 朝ご飯を作る過程をプログラム風に書いた。 def morning(pan,cheese,ketchap) pan をトースターで焼く pan の上に cheese をのせる cheese に ketchap をかける end def cocoa(powder,milk,suger) milk を温める powder をカップにいれる カップに milk を注ぐ suger を入れる end morning(1枚, 1枚, 5グラム) #朝ご飯を作るので呼び出す cocoa(スプーン2杯, 150cc, スプーン1杯) #飲み物を作るので呼び出す print("朝ご飯の準備ができたよ!\n") B の参考文献 ・ http://roy/~madoka/2012/r2/04/r2_04_03_theme_03_method.html 2012年度 基礎プログラミングII 第4回 (繰り返しは引っ張りだそう) 「どんな関数がきてもだいじょうぶ」 作者: 西村まどか 2. A. 1. 考えた設定 基数と指数を入力することで乗数を計算することができるプログラム (def_power.rb)を作成。 2. 作成したプログラム(def_power.rb) #!/usr/koeki/bin/ruby #coding: euc-jp def power(a,b) #power という関数を定義、a と b を仮引数とする a ** b #必要な式 end #def に対する end(終わり) STDERR.print("基数: ") #入力を促す base = gets.to_i #入力された文字列を base という変数に入れ、整数にする STDERR.print("指数: ") #入力を促す index = gets.to_i #入力された文字列を index という変数に入れ、整数にする printf("%d の %d 乗は %d です。\n", base, index, power(base,index)) 3. もとにしたプログラムからの変更点 def_func.rb をもとにした。 関数や仮引数、入力された文字列を入れる変数の名前を変更した。 また、乗数が計算できるように def に必要な式に a ** b を入れた。 4. 実行結果 pan{c111135}% ./def_power.rb [~/Ruby] 基数: 2 指数: 5 2 の 5 乗は 32 です。 pan{c111135}% ./def_power.rb [~/Ruby] 基数: 6 指数: 4 6 の 4 乗は 1296 です。 pan{c111135}% ./def_power.rb [~/Ruby] 基数: 7 指数: 3 7 の 3 乗は 343 です。 5. 考察 実行結果の答えが正しいか bc -l で確認する。 pan{c111135}% bc -l [~/Ruby] 2*2*2*2*2 32 6*6*6*6 1296 7*7*7 343 quit 乗数は、ある数を複数回かけることによって求められる。 その方法で計算してみたところ、計算が一致していることが分かった。 よって、このプログラムは正しいということができる。 また、printf文をWeb上に表示されているものと同様に入力したところ、 結果の文の末尾に % がついた。 原因を考えたところ、表示する文の末尾に、改行を表す \n が入力され ていないことに気付いた。その後、\n を入れるときれいに表示された。 6. 参考文献 ・ http://roy/~madoka/2012/r2/04/r2_04_03_theme_03_method.html 2012年度 基礎プログラミングII 第4回 (繰り返しは引っ張りだそう) 「どんな関数がきてもだいじょうぶ」 作者: 西村まどか B. 1. 考えた設定 前回のレポートで考えた設定を応用する。 シャープペンシルと消しゴムを買う。 シャープペンシルは1本 250 円である。 3本以上買う場合は1本あたり 200 円 に割引される。 消しゴムは1個 100 円である。 合計はいくらになるか。 以上の設定で プログラム(two_methods.rb)を作成。 2. 作成したプログラム(two_methods.rb) #!/usr/koeki/bin/ruby #coding: euc-jp def nesage(pen) #nesage という関数を定義、pen を仮引数とする if pen >= 3 #もし pen が 3 本以上ならば 200 * pen #200 * ペンの本数 else #そうでなければ 250 * pen #250 * ペンの本数 end #if に対するend(終わり) end #def に対するend(終わり) def bun(kesi) #bun という関数を定義、kesi を仮引数とする 100 * kesi #100 * 消しゴムの個数 end #def に対するend(終わり) print("シャープペンシルは1本 250 円、消しゴムは1個 100 円です。\n") print("\n") #改行 print("ただし、シャープペンシルは3本以上買うと、1本あたり 200 円です。\n") print("\n") STDERR.print("シャープペンシルは何本買いますか: ") #入力を促す sharp = gets.to_i #入力された文字列を sharp に取りこんで、整数にする print("\n") STDERR.print("消しゴムは何個買いますか: ") #入力を促す eraser = gets.to_i #入力された文字列を eraser に取りこんで、整数にする print("\n") goukei = nesage(sharp) + bun(eraser) #合計 = シャープペンシルの値段 + 消しゴムの値段 printf("合計は %d 円です。\n", goukei) 3. もとにしたプログラムからの変更点 前回のレポートで作成した def_twoparam.rb をもとにした。 関数や仮引数、入力された文字列を入れる変数の名前を変更した。 また、def文の中にif文を加えて、3本以上買った場合に値引きがされるように 式を入れた。 4. 実行結果 pan{MURAKAMI Manami}% ./two_methods.rb [~/Ruby] シャープペンシルは1本 250 円、消しゴムは1個 100 円です。 ただし、シャープペンシルは3本以上買うと、1本あたり 200 円です。 シャープペンシルは何本買いますか: 2 消しゴムは何個買いますか: 4 合計は 900 円です。 pan{c111135}% ./two_methods.rb [~/Ruby] シャープペンシルは1本 250 円、消しゴムは1個 100 円です。 ただし、シャープペンシルは3本以上買うと、1本あたり 200 円です。 シャープペンシルは何本買いますか: 5 消しゴムは何個買いますか: 3 合計は 1300 円です。 5. 考察 シャープペンシルの本数が3本以下だった場合と3本以上だった場合の 2通りについて実行した。 計算が合っているか bc -l で確認する。 pan{c111135}% bc -l [~/Ruby] (250*2)+(100*4) 900 (200*5)+(100*3) 1300 quit 実行結果と照らし合わせて、計算が一致していることが分かった。 よって、このプログラムは正しいということができる。 6. 参考文献 ・ http://roy/~madoka/2012/r2/05/r2_05_02_theme_02_deccelate.html 2012年度 基礎プログラミングII 第5回 (何度も呼び出そう) 「体力があがったら」 作者: 西村まどか 3. 私は、機械的な操作を繰り返すものとして、銀行のATMを挙げる。 ATMは、預金者がどのボタンを押すかによって、それに対応する画面表示(動 作も)決められているからである。また、作成したプログラムのように、預金 者に数字を押してもらうという動作が機械的なのではないかと考えた。 共同学習者: 浅沼佑香 ・ 伊藤詩野