第7回 基礎プログラミング I レポート課題 氏名: XXXXXXXXX 学籍番号: c109XXX 語学クラス:英語3 コース(系):地域共創 1.筆記問題 A.0b11110110 = 0x?? 0bは2進数、0xは16進数を表す。 2進数を16進数に変換する場合、11110110を右から4桁ごとに区切っていく。 そして、それぞれを2進数に変換していく。 2進数 1111 0110 ↓ ↓ 16進数 f 6 よって、答えは 0xf6 となる。 B.0d256 = 0x?? 0dは10進数、0xは16進数を表す。 10進数を16進数に変換する場合は、 ・直接16進数に変換する ・2進数に変換してから、16進数に変換する の二通りがある。今回は直接16進数に変換していく。 10進数を16進数に直接変換する場合、256 を 答えが0になるまで 16 で割っ ていく。 256 / 16 = 16…0 16 / 16 = 1…0 1 / 16 = 0…1 ここで出た余りを下から並べていく。 よって、答えは 0x100 となる。 2.プログラミング問題 A.参考にしたプログラム … write_ticket.rb 上のプログラムで駅の番号を選ぶまでのプログラムを参考にして 作成した。 ○参考にしたプログラムからの変更点 ・if文をさらに追加した ・合計と求める goukei += x 、平均を求める tanka = goukei / 9 を追加 ================================================================================ ○作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' #文字化けしないようにする denti = Array.new #電池の種類の候補を選ぶ kazu = Array.new #個数の候補を選ぶ suzi = 0 #初期値を0にして始める goukei = 0 #goukeiの初期値を0にする open("battery.dat", "r") do |bat| #ファイルをあらかじめ読み込む while buy = bat.gets #chomp. if /(\S+)\s+(\d+)/ =~ buy #この条件に合った時、下のように作動する denti[suzi] = $1 kazu[suzi] = $2.to_f #文字列を小数にする # p kazu if denti[suzi] == "A" #もし電池Aなら、 x = 400 * kazu[suzi] #400円 * 個数 = x円 elsif denti[suzi] == "B" #もし電池Bなら、 x = 300 * kazu[suzi] #300円 * 個数 = x円 else #他の場合は、 x = 50 * kazu[suzi] #50円 * 個数 = x円 end goukei += x # x を全て足して、合計を出す suzi += 1 end end end k = 0 print("電池の種類 売れた数\n") while k < denti.length #個数を調べる printf("%-10s\t%d\n", denti[k], kazu[k]) k += 1 end tanka = goukei / 9 printf("この日の総売り上げは %d円です。\n", goukei) printf("客単価は %2.1f円です。 \n", tanka) -------------------------------------------------------------------------------- ○実行結果 pan{c109014}% ./open_battery.rb [~/Ruby] 電池の種類 売れた数 A 1 B 2 C 3 B 6 C 5 A 4 C 2 B 1 A 3 この日の総売り上げは 6400円です。 客単価は 711.1円です。 ○考察 初めプログラムを実行したときは、 pan{c109014}% ./open_battery.rb [~/Ruby] 電池の種類 売れた数 0 1 0 2 0 3 0 6 0 5 0 4 0 2 0 1 0 3 この日の総売り上げは 1350円です。 客単価は 150.0円です。 となり、電池の種類の表示がおかしかった。考えた結果、.to_iと入力したこと によって、文字を数字表記に変えたと思われる。 そこで、 denti[suzi] = $1.to_i → denti[suzi] = $1 に戻して、また実行してみた。 pan{c109014}% ./open_battery.rb [~/Ruby] 電池の種類 売れた数 A 1 B 2 C 3 B 6 C 5 A 4 C 2 B 1 A 3 この日の総売り上げは 6400円です。 客単価は 711.1円です。 結果、電池の種類が正しく表示された。 ・Ktermで計算してみる pan{c109014}% bc -l [~/Ruby] 400 * 1 400 300 * 2 + 400 1000 50 * 3 + 1000 1150 300 * 6 + 1150 2950 50 * 5 + 2950 3200 400 * 4 + 3200 4800 50 * 2 + 4800 4900 300 * 1 + 4900 5200 400 * 3 + 5200 6400 6400 / 9 711.11111111111111111111 小数第二位を四捨五入し、小数第一位まで表示すると711.1になり、 合計と平均はプログラムの結果と一致したので、正しいと言える。 B. 参考プログラム … write_ticket.rb open_battery.rb(今回自分で作ったもの) ○参考にしたプログラムからの変更点 ・電池Bの値段を300円から280円に変更 ・パックを2個以上買った場合に-60円されるようにした ・denti → type kazu → kosu suzi → i goukei → total --------------------------------------------------------------------------------○作成したプログラム #!/usr/koeki/bin/ruby $KCODE = 'e' #文字化けしないようにする type = Array.new #電池の種類の候補を選ぶ kosu = Array.new #個数の候補を選ぶ i = 0 #初期値を0にして始める total = 0 #totalの初期値を0にする open("battery.dat", "r") do |bat| #ファイルをあらかじめ読み込む while buy = bat.gets #chomp. if /(\S+)\s+(\d+)/ =~ buy #この条件に合った時、下のように作動する type[i] = $1 kosu[i] = $2.to_f #文字列を小数にする # p kazu if type[i] == "A" #もし電池Aなら、 x = 400 * kosu[i] #400円 * 個数 = x円 elsif type[i] == "B" #もし電池Bなら、 x = (300 - 20) * kosu[i] #(300-20)円 * 個数 = x円 else #他の場合は、 x = 50 * kosu[i] #50円 * 個数 = x円 if kosu[i] >= 2 x - 60 end total += x # x を全て足して、合計を出す i += 1 end end end k = 0 print("電池の種類 売れた数\n") while k < type.length #個数を調べる printf("%-10s\t%d\n", type[k], kosu[k]) k += 1 end tanka = total / 9 printf("売り上げは %d円です。\n", total) printf("客単価は %2.1f円です。 \n", tanka) end ------------------------------------------------------------------------------- ○実行結果 pan{c109014}% ./open_six.rb [~/Ruby] 電池の種類 売れた数 C 3 C 5 C 2 A 3 売り上げは 500円です。 客単価は 55.6円です。 ○考察 if kosu[i] >= 2 x - 60 「もし個数が2以上ならば-60円する」ようにやってみたが、上の実行結果 のように、売れた数が2以上のものしか表示されなくなってしまった。Bの 結果も表示されていない。 いろいろ変更して試したが実行結果が変わらず、おそらく上のif文の入力 の仕方がおかしいと思われる。 3.感想 今回は、to_iやto_f、lengthなど自分がよく覚えていないものをひとつずつ 調べながらプログラミングを行いました。この文はどんな意味があるのかを 調べるために、講義ノートや先輩のレポートのページを何回も行き来して大 変でした。 また、今回は頑張ってB問題にもチャレンジしてみた。 でも、忘れていた内容を復習していくと、前よりはプログラミングがスムー ズに行えた気がします。復習することの重要さが身にしみて分かりました。 あるものを有効活用して、次回もやっていきたいと思います。 4.共同学習者 ・藤井 駿 6月1日(火)〜3日(木) ・布川 大地 6月3日(木) ・花木 剛志 6月3日(木) 参考文献 ・Rubyプログラミング基礎講座 著:広瀬雄二