第3回情報の構造を分析しよう レポート課題 再提出 氏名:小山田晃平 学籍番号:c1110393 語学クラス:英語5 コース:政策マネジメント プログラムAとBの配列の数値の部分を修正しました 1.筆記問題 A. KoheiOyamada K:0x4b =16*4+11 =75 o:0x6f =16*6+15 =111 h:0x68 =16*6+8 =104 e:0x65 =16*6+5 =101 i:0x69 =16*6+9 =105 O:0x4f =16*4+15 =79 y:0x79 =16*7+9 =121 a:0x61 =16*6+1 =97 m:0x6d =16*6+13 =109 a:0x61 =16*6+1 =97 d:0x64 =16*6+4 =100 a:0x61 =16*6+1 =97 B. "きょうはいしんする" きょう はいしん する(今日配信する) きょう はいしん する(今日背信する) きょう はいしん する(今日拝診する) きょう は いしん する(今日は維新する) C. 文房具の値段をhash配列stationaryとしました stationaryのkeyとvalueはそれぞれ文房具名とその値段[円]、原価[円]、在庫[個]にとりました その1:key 「消しゴム」に対してvalue 「100,30,20」 その2:key 「シャープペンシル」に対してvalue 「300,100,15」 その3:key 「ペン」に対してvalue 「120,40,50」 その4:key 「マーカー」に対してvalue 「150,35,25」 その5:key 「定規」にたいして value「200,60,10」 これに対するHashの表し方は stationary["消しゴム"] = "100","30","20" stationary["シャープペンシル"] = "300","100","15" stationary["ペン"] = "120","40","50" stationary["マーカー"] = "150","35","25" stationary["定規"] = "200","60","10" また、もう1つの表し方は {"消しゴム" => "100","30","20" "シャープペンシル" => 300,"100","15" "ペン" => "120","40","50" "マーカー"=> "150","35","25" "定規" => "200","60","10"} となる 2.プログラム問題 A. 考えた設定 Hashを使い、key,valueを表示させるようなプログラムにする valueが複数なので、Hashに[0],[1]を使う 作成したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp stationary = Hash.new stationary["消しゴム"] = 100,30,20 # keyとvalue stationary["シャープペンシル"] = 300,100,15 stationary["ペン"] = 120,40,50 stationary["マーカー"] = 150,35,25 stationary["定規"] = 200,60,10 for item,kakaku in stationary printf("%s1つ:%d[円],\t\t原価:%d[円],\t\t在庫%d[個]\n", item, kakaku[0], kakaku[1], kakaku[2]) # keyとvalueを表示する。\tで空白を入れた。kakaku[0]は商品の価格、kakaku[1]は原価、kakaku[2]は在庫を示す end もとにしたプログラムからの変更点 先週のhash_for.rbをもとにした 今回はvalueが複数あるので、[0],[1]などを使う点を変更した 結果画面 pan{OYAMADA Kohei}% ./hash_ary_print.rb [~/Ruby] 消しゴム1つ:100[円], 原価:30[円], 在庫20[個] シャープペンシル1つ:300[円], 原価:100[円], 在庫15[個] ペン1つ:120[円], 原価:40[円], 在庫50[個] マーカー1つ:150[円], 原価:35[円], 在庫25[個] 定規1つ:200[円], 原価:60[円], 在庫10[個] 考察 keyとvalueが指定したと通りに表示されている また、\tによる空白も反映されている よって、プログラムは正しいといえる B. 考えた設定 商品を価格の高い順に並び替えて表示させるようにする 作成したプログラム #!/usr/koeki/bin/ruby #coding: euc-jp stationary = Hash.new stationary["消しゴム"] = 100,30,20 # keyとvalue stationary["シャープペンシル"] = 300,100,15 stationary["ペン"] = 120,40,50 stationary["マーカー"] = 150,35,25 stationary["定規"] = 200,60,10 print("価格の高い順に表示します。\n") # 何を基準に並び替えるのかを表示させる stationary.keys.sort{ # ソートを行う |chp, exp| # chp,expという変数を使う stationary[chp] <=> stationary[exp] }.reverse.each{|item| printf("%s1つ:%d[円]\t原価:%d[円]\t在庫:%d[個]\n", item, stationary[item][0], stationary[item][1], stationary[item][2]) } 変更点 Aのプログラムをもとにした Aにソートをする部分を追加した 結果 pan{c111039}% ./hash_ary_sort.rb [~/Ruby] 価格の高い順に表示します。 シャープペンシル1つ:300[円] 原価:100[円] 在庫:15[個] 定規1つ:200[円] 原価:60[円] 在庫:10[個] マーカー1つ:150[円] 原価:35[円] 在庫:25[個] ペン1つ:120[円] 原価:40[円] 在庫:50[個] 消しゴム1つ:100[円] 原価:30[円] 在庫:20[個] 考察 商品が価格の高い順にソートされ表示されている 最初に何についてソートするのか表示されている よって、プログラムは正しいといえる C. 考えた設定 商品を検索させ、その数量もきき、合計金額を表示させるプログラムにした。 また、検索したときに登録されていないものであった場合には非取扱いであるこ とを表示させる。 プログラム #!/usr/koeki/bin/ruby #coding: euc-jp stationary = Hash.new("非取扱い商品") # 検索したときにkeyに無いものを入力したときに非取扱い商品であることをしらせる stationary["消しゴム"] = 100,30,20 # keyとvalue stationary["シャープペンシル"] = 300,100,15 stationary["ペン"] = 120,40,50 stationary["マーカー"] = 150,35,25 stationary["定規"] = 200,60,10 print("価格の高い順に表示します。\n") # 何を基準に並び替えるのかを表示させる stationary.keys.sort{ # ソートを行う |chp, exp| stationary[chp] <=> stationary[exp] }.reverse.each{|item| printf("%s1つ:%d[円]\t原価:%d[円]\t在庫:%d[個]\n", item, stationary[item][0], stationary[item][1], stationary[item][2]) } STDERR.print("商品名: ") # 商品名をきく req = gets.chomp # 入力されたものをreqにいれる if stationary.key?(req) == true # もし、keyに一致するものがあったら STDERR.print("数量[個]: ") # 数量をきく m = gets.to_i # 入力されたものをmにいれる printf("%sが%d[個]で%d[円]です。\n", req, m, stationary[req][0] * m) # 入力された商品と数量、及び合計金額を計算し表示する。stationary[req][0]は、stationaryのkeyに一致するもののvalueの最初の数値を意味する else printf("%sは%sです\n", req, stationary[req]) # 入力された商品がkeyに無かった場合に非取扱いであることを表示する文 end 変更点 Bのプログラムをもとにした Bに商品を検索させる部分、数量をきく部分、合計金額を計算し、これらすべて を表示する部分を追加した 結果 (a) pan{c111039}% ./hash_ary_calc.rb [~/Ruby] 価格の高い順に表示します。 シャープペンシル1つ:300[円] 原価:100[円] 在庫:15[個] 定規1つ:200[円] 原価:60[円] 在庫:10[個] マーカー1つ:150[円] 原価:35[円] 在庫:25[個] ペン1つ:120[円] 原価:40[円] 在庫:50[個] 消しゴム1つ:100[円] 原価:30[円] 在庫:20[個] 商品名: ペン 数量[個]: 3 ペンが3[個]で360[円]です。 (b) pan{c111039}% ./hash_ary_calc.rb [~/Ruby] 価格の高い順に表示します。 シャープペンシル1つ:300[円] 原価:100[円] 在庫:15[個] 定規1つ:200[円] 原価:60[円] 在庫:10[個] マーカー1つ:150[円] 原価:35[円] 在庫:25[個] ペン1つ:120[円] 原価:40[円] 在庫:50[個] 消しゴム1つ:100[円] 原価:30[円] 在庫:20[個] 商品名: 定規 数量[個]: 9 定規が9[個]で1800[円]です。 (c) pan{c111039}% ./hash_ary_calc.rb [~/Ruby] 価格の高い順に表示します。 シャープペンシル1つ:300[円] 原価:100[円] 在庫:15[個] 定規1つ:200[円] 原価:60[円] 在庫:10[個] マーカー1つ:150[円] 原価:35[円] 在庫:25[個] ペン1つ:120[円] 原価:40[円] 在庫:50[個] 消しゴム1つ:100[円] 原価:30[円] 在庫:20[個] 商品名: シャープペンシル 数量[個]: 11 シャープペンシルが11[個]で3300[円]です。 (d) pan{c111039}% ./hash_ary_calc.rb [~/Ruby] 価格の高い順に表示します。 シャープペンシル1つ:300[円] 原価:100[円] 在庫:15[個] 定規1つ:200[円] 原価:60[円] 在庫:10[個] マーカー1つ:150[円] 原価:35[円] 在庫:25[個] ペン1つ:120[円] 原価:40[円] 在庫:50[個] 消しゴム1つ:100[円] 原価:30[円] 在庫:20[個] 商品名: えんぴつ えんぴつは非取扱い商品です 考察 (a) 120*3 =360 (b) 200*9 =1800 (c) 300*11 =3300 (d) keyに無いものであるため非取扱いであると表示された 入力されたものの商品名、数量、合計金額が正しく表示されている また、非取扱いもしっかりと表示されている よって、正しいといえる D 考えた設定 データを読みこむようにする それをHashを使いプログラムする データ 消しゴム 100 30 20 シャープペンシル 300 100 15 ペン 120 40 50 マーカー 150 35 25 定規 200 60 10 プログラム #!/usr/koeki/bin/ruby #coding: euc-jp stationary = Hash.new("非取扱い商品") # 検索したときにkeyに無いものを入力したときに非取扱い商品であることをしらせる open("hash_ary_data.dat", "r") do |read| # データを読みこみreadという変数にいれる。rは読みこみを意味する while data = read.gets readをdataという変数にいれる if /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/ =~ data # データの列が4あるので、Sは4つ stationary[$1] = [$2.to_i,$3.to_i,$4.to_i] # データの2,3,4列目は数値で、すべて整数で表示したいので、.to_iをつける end end end print("価格の高い順に表示します。\n") # 何を基準に並び替えるのかを表示させる stationary.keys.sort{ # ソートを行う |chp, exp| stationary[chp] <=> stationary[exp] }.reverse.each{|item| printf("%s1つ:%d[円]\t原価:%d[円]\t在庫:%d[個]\n", item, stationary[item][0], stationary[item][1], stationary[item][2]) } STDERR.print("商品名: ") # 商品名をきく req = gets.chomp # 入力されたものをreqにいれる if stationary.key?(req) == true # もし、keyに一致するものがあったら STDERR.print("数量[個]: ") # 数量をきく m = gets.to_f l = stationary[req][0] * m # 入力されたものをmにいれる printf("%sが%d[個]で%d[円]です。\n", req, m, l) # 入力された商品と数量、及び合計金額を計算し表示する。stationary[req][0]は、stationaryのkeyに一致するもののvalueの最初の数値を意味する else printf("%sは%sです\n", req, stationary[req]) # 入力された商品がkeyに無かった場合に非取扱いであることを表示する文 end 変更点 Cをもとにした Cにデータを読みこむようにした それを配列にした 結果 (a) pan{OYAMADA Kohei}% ./hash_ary_read.rb [~/Ruby] 価格の高い順に表示します。 シャープペンシル1つ:300[円] 原価:100[円] 在庫:15[個] 定規1つ:200[円] 原価:60[円] 在庫:10[個] マーカー1つ:150[円] 原価:35[円] 在庫:25[個] ペン1つ:120[円] 原価:40[円] 在庫:50[個] 消しゴム1つ:100[円] 原価:30[円] 在庫:20[個] 商品名: ペン 数量[個]: 5 ペンが5[個]で600[円]です。 (b) pan{c111039}% ./hash_ary_read.rb [~/Ruby] 価格の高い順に表示します。 シャープペンシル1つ:300[円] 原価:100[円] 在庫:15[個] 定規1つ:200[円] 原価:60[円] 在庫:10[個] マーカー1つ:150[円] 原価:35[円] 在庫:25[個] ペン1つ:120[円] 原価:40[円] 在庫:50[個] 消しゴム1つ:100[円] 原価:30[円] 在庫:20[個] 商品名: マーカー 数量[個]: 13 マーカーが13[個]で1950[円]です。 (c) pan{c111039}% ./hash_ary_read.rb [~/Ruby] 価格の高い順に表示します。 シャープペンシル1つ:300[円] 原価:100[円] 在庫:15[個] 定規1つ:200[円] 原価:60[円] 在庫:10[個] マーカー1つ:150[円] 原価:35[円] 在庫:25[個] ペン1つ:120[円] 原価:40[円] 在庫:50[個] 消しゴム1つ:100[円] 原価:30[円] 在庫:20[個] 商品名: ふで ふでは非取扱い商品です 考察 (a) 120*5 =600 (b) 150*13 =1950 (c) keyに無いものなので非取扱いとなっている データから正しく読みこみ計算できている それぞれの数値も正しく表示できている よって、プログラムは正しい 3.感想 おすすめ商品は、特定のキーワードに当てはまったら表示されるようにできてい るのではないか。だから、内容は全然関係ないことがあるのではないか。 キーワードが何回当てはまったらおすすめにするもしくは、何種類かのキーワー ドに当てはまったらおすすめにするというようにすればより正確になるのではな いか。 4.参考文献 第5回基礎プログラミング1 (配列の構造)|ASCIIコード表| 西村まどか http://roy/~madoka/2012/r1/05/r1_05_01_theme_01_asciicode.html