講評: 頑張りました。 for 文で、 printf 文の [yen] の前の部分を変更すると結果が違ってくると思います。 ---- 10 月 17 日 第 3 回レポート 「Value が配列のとき」 学籍番号 : c106XXXX 氏名 : XXXXXXXX 語学クラス : XXXX語 系 : XXXX系 ---------------------------------------------------- 【1】 [A] 好きなくだものの種類 5 つを hash 配列 fruit とした。 fruit の key は くだもの名 value は 英名、収穫量[t]、生産地 にとりました。 その 1 : key 「みかん」 対して value は 「Mikan, 125,300, "愛媛県"」 その 2 : key 「もも」 対して value は 「Peach, 22,000, "山梨県"」 その 3 : key 「すいか」 対して value は 「Watermelon, 85,800, "熊本県"」 その 4 : key 「かき」 対して value は 「Persimmon, 62,200, "和歌山県"」 その 5 : key 「さくらんぼ」 対して value は 「Cherry, 14,900, "山形県"」 これらを hash 配列で表記すると・・・ fruit["蜜柑"] = "Mikan", 125,300, "愛媛県" fruit["桃"] = "Peach", 22,000, "山梨県" fruit["西瓜"] = "Watermelon", 85,800, "熊本県" fruit["柿"] = "Persimmon", 62,200, "和歌山県" fruit["さくらんぼ"] = "Cherry", 14,900, "山形県" [B] ASCII コードより・・・ 大文字表記 小文字表記 SATOU YUKINA satou yukina S ----- 53 s ----- 73 A ----- 41 a ----- 61 T ----- 54 t ----- 74 O ----- 4F o ----- 6F U ----- 55 u ----- 75 Y ----- 59 y ----- 79 U ----- 55 u ----- 75 K ----- 4B k ----- 6B I ----- 49 i ----- 69 N ----- 4E n ----- 6E A ----- 41 a ----- 61 ◎参考文献◎ 基礎プログラミング I 「第 5 回 配列とデータ処理」 ASCII コード 参照。 URL : http://roy/~madoka/2007/r1/05/05-03-ascii.html 大文字表記 と 小文字表記 をそれぞれ 16 進数表示 にすると・・・ S ----- 0x53 s ----- 0x73 A ----- 0x41 a ----- 0x61 T ----- 0x54 t ----- 0x74 O ----- 0x4f o ----- 0x6f U ----- 0x55 u ----- 0x75 Y ----- 0x59 y ----- 0x79 U ----- 0x55 u ----- 0x75 K ----- 0x4b k ----- 0x6b I ----- 0x49 i ----- 0x69 N ----- 0x4e n ----- 0x6e A ----- 0x41 a ----- 0x61 大文字表記 と 小文字表記 をそれぞれ 10 進数表示 にすると・・・ [ a = 10, b = 11, c = 12, d = 13, e = 14, f = 15] S --- 0x53 = 16 ** 0 * 3 + 16 ** 1 * 5 = 83 よって、0d83 A --- 0x41 = 16 ** 0 * 1 + 16 ** 1 * 4 = 65 よって、0d65 T --- 0x54 = 16 ** 0 * 4 + 16 ** 1 * 5 = 84 よって、0d84 O --- 0x4f = 16 ** 0 * 15 + 16 ** 1 * 4 = 79 よって、0d79 U --- 0x55 = 16 ** 0 * 5 + 16 ** 1 * 5 = 85 よって、0d85 Y --- 0x59 = 16 ** 0 * 9 + 16 ** 1 * 5 = 89 よって、0d89 U --- 0x55 = 16 ** 0 * 5 + 16 ** 1 * 5 = 85 よって、0d85 K --- 0x4b = 16 ** 0 * 11 + 16 ** 1 * 4 = 75 よって、0d75 I --- 0x49 = 16 ** 0 * 9 + 16 ** 1 * 4 = 73 よって、0d73 N --- 0x4e = 16 ** 0 * 14 + 16 ** 1 * 4 =78 よって、0d78 A --- 0x41 = 16 ** 0 * 1 + 16 ** 1 * 4 = 65 よって、0d65 ---------------------------------------------------------- s --- 0x73 = 16 ** 0 * 3 + 16 ** 1 * 7 = 115 よって、0d115 a --- 0x61 = 16 ** 0 * 1 + 16 ** 1 * 6 = 97 よって、0d97 t --- 0x74 = 16 ** 0 * 4 + 16 ** 1 * 7 = 116 よって、0d116 o --- 0x6f = 16 ** 0 * 15 + 16 ** 1 * 6 = 111 よって、0d111 u --- 0x75 = 16 ** 0 * 5 + 16 ** 1 * 7 = 128 よって、0d128 y --- 0x79 = 16 ** 0 * 9 + 16 ** 1 * 7 = 121 よって、0d121 u --- 0x75 = 16 ** 0 * 5 + 16 ** 1 * 7 = 117 よって、0d117 k --- 0x6b = 16 ** 0 * 11 + 16 ** 1 * 6 = 107 よって、0d107 i --- 0x69 = 16 ** 0 * 9 + 16 ** 1 * 6 = 105 よって、0d105 n --- 0x6e = 16 ** 0 * 14 + 16 ** 1 * 6 = 110 よって、0d110 a --- 0x61 = 16 ** 0 * 1 + 16 ** 1 * 6 = 97 よって、0d97 【2】 ◎考えた設定◎ くだものの種類 5 つを hash 配列 fruit とした。 fruit の key は 「くだもの名」 value は 「果物の色, 1 個当たりの値段, 残りの個数, 人気順」 とした。 その 1 : key 「みかん」 対して value は 「"橙", 80, 8, 2」 その 2 : key 「もも」 対して value は 「"桃", 250, 15, 3」 その 3 : key 「めろん」 対して value は 「"緑", 2000, 23, 5」 その 4 : key 「なし」 対して value は 「"黄", 150, 5, 1」 その 5 : key 「すいか」 対して value は 「"赤", 1200, 18, 4」 これを元にデータを作り、データを切り取る為に正規表現を用いた プログラムを作成する。 ◎作成したデータ fruit.dat ◎ みかん 橙 80 100 2 もも 桃 250 20 1 めろん 緑 2000 15 5 なし 黄 150 40 3 すいか 赤 1200 25 4 ◎作成したプログラム hash-for_1.rb ◎ #!/usr/koeki/bin/ruby fruit = Hash.new # Hash 配列を fruit と定義する $KCODE = 'e' # 日本語コード EUC で出力可能 while kuda = gets # while --- end 文 # 繰り返し if /(\S+)\s+(\S+)\s+(\d+)\s+(\d+)\s+(\d+)/ =~ kuda # \S+ ----- 文字列 # \s+ ----- 空白文字列 # \d+ ----- 整数値 fruit[$1] = [$2,$3.to_i,$4.to_i,$5.to_i] end end for mono, kuda in fruit # for --- end 文 #p mono,kuda printf("%-10s は %s 色 1 個当たり %-5d 円が残り %-4d 個で %d 番目に人気です。\n",mono,kuda[0],kuda[1],kuda[2],kuda[3],kuda[4]) # mono ----- key # kuda ----- value end ◎プログラムの実行結果◎ irsv{c106110}% chmod +x hash-for_1.rb [~/Ruby] irsv{c106110}% ./hash-array-calc.rb fruit.dat [~/Ruby] なし は 黄 色 1 個当たり 150 円が残り 5 個で 1 番目に人気です。 すいか は 赤 色 1 個当たり 1200 円が残り 18 個で 4 番目に人気です。 もも は 桃 色 1 個当たり 250 円が残り 14 個で 3 番目に人気です。 みかん は 橙 色 1 個当たり 80 円が残り 10 個で 2 番目に人気です。 めろん は 緑 色 1 個当たり 2000 円が残り 23 個で 5 番目に人気です。 ◎工夫した点◎ hash-for.rb は前回のレポートで作成済みで、消してしまうのが もったいなかったので hash-for_1.rb に変更して作成した。 今回のプログラムでは、 value の数を 1 つ増やす事に挑戦。また、 実行結果が見やすいように列を揃えた。 ◎参考文献◎ 「第 3 回 得意先の情報を分析しよう」 の [Hash 配列にしまえるもの] で作成した、sesame.rb を参考にした。 URL : http://roy/~madoka/2007/r2/03/03-04-value-array.html ------------------------------------------------------------------------ ●考えた設定● 上で使ったデータ fruit.dat を使用し、データを並び変える プログラムを作成する。 ●作成したプログラム hash-for_2.rb ● #!/usr/koeki/bin/ruby fruit = Hash.new # Hash 配列を fruit と定義する $KCODE = 'e' # 日本語コード EUC で出力可能 while kuda = gets # while --- end 文 # 繰り返し if /(\S+)\s+(\S+)\s+(\d+)\s+(\d+)\s+(\d+)/ =~ kuda fruit[$1] = [$2,$3.to_i,$4.to_i,$5.to_i] # \S+ ----- 文字列 # \s+ ----- 空白文字列 # \d+ ----- 整数値 end end for mono, kuda in fruit # for --- end 文 #p mono,kuda printf("%-10s は %s 色 1 個当たり %-5d 円が残り %-4d 個で %d 番目に人気です。\n",mono,kuda[0],kuda[1],kuda[2],kuda[3],kuda[4]) # mono ----- key # kuda ----- value end print("人気順について\n") # print 文 fruit.keys.sort{ # hash 配列.keys.sort{ |first,lowest| # |並び替え前の key 変数, 並び替え後の key 変数| fruit[first][3] <=>fruit[lowest][3] # hash 配列[並び替え前の key 変数][要素番号] <=> hash 配列[並び替え後の key 変数][要素番号] }.each{ |mono| printf("%s\t%d\n", mono, fruit[mono][3]) } # } ●プログラムの実行結果● irsv{c106110}% chmod +x hash-for_2.rb [~/Ruby] irsv{c106110}% ./hash-for_2.rb fruit.dat [~/Ruby] なし は 黄 色 1 個当たり 150 円が残り 5 個で 1 番目に人気です。 すいか は 赤 色 1 個当たり 1200 円が残り 18 個で 4 番目に人気です。 もも は 桃 色 1 個当たり 250 円が残り 14 個で 3 番目に人気です。 みかん は 橙 色 1 個当たり 80 円が残り 10 個で 2 番目に人気です。 めろん は 緑 色 1 個当たり 2000 円が残り 23 個で 5 番目に人気です。 --------------------------------------------------------------------- 人気順について なし 1 みかん 2 もも 3 すいか 4 めろん 5 ●工夫した点● fruit.dat のデータ内に人気順を組み込んで、 実行結果に順番を表示させた。 ●参考文献● 「第 3 回 得意先の情報を分析しよう」 の 「value の一部を使って sort する例」 を参考にした。 URL : http://roy/~madoka/2007/r2/03/03-07-sort-hash-array-02.html ----------------------------------------------------------------------------- ○考えた設定○ for 文を使って、配列成分を計算するプログラムを作成する。 ○作成したデータ fruit_2.dat ○ みかん 80 15 2 もも 250 4 3 めろん 2000 2 5 なし 150 6 1 すいか 1200 1 4 ○作成したプログラム hash-array-calc.rb ○ #!/usr/koeki/bin/ruby fruit = Hash.new # Hash 配列を fruit と定義する $KCODE = 'e' # 日本語コード EUC で出力可能 while kuda = gets # while --- end 文 # 繰り返し if /(\S+)\s+(\d+)\s+(\d+)\s+(\d+)/ =~ kuda fruit[$1] = [$2,$3.to_i,$4.to_i] # \S+ ----- 文字列 # \s+ ----- 空白文字列 # \d+ ----- 整数値 end end for mono, kuda in fruit # for --- end 文 #p mono,kuda printf("%-10s は 1 個当たり %-5d 円 欲しい個数は %-4d 個 %d 番目に人気 です。\n",mono,kuda[0],kuda[1],kuda[2],kuda[3]) # mono ----- key # kuda ----- value end print("-------------------------------------------------------------------\n\n") print("お遣いに行きます!!\n\n") sleep 1 print("総合金額は?? \n\n") sleep 1 for otukai, kuda in fruit # for 文 total = kuda[0] * kuda[1] printf("%s\t%d[yen]\n", otukai, total) # printf 文 end ○プログラムの実行結果○ irsv{c106110}% chmod +x hash-array-calc.rb [~/Ruby] irsv{c106110}% ./hash-array-calc.rb fruit.dat [~/Ruby] 桃 は 1 個当たり 250 円 欲しい個数は 14 個 3 番目に人気です。 赤 は 1 個当たり 1200 円 欲しい個数は 18 個 4 番目に人気です。 緑 は 1 個当たり 2000 円 欲しい個数は 23 個 5 番目に人気です。 橙 は 1 個当たり 80 円 欲しい個数は 10 個 2 番目に人気です。 黄 は 1 個当たり 150 円 欲しい個数は 5 個 1 番目に人気です。 ------------------------------------------------------------------- お遣いに行きます!! 総合金額は?? 桃 250250250250250250250250250250250250250250[yen] 赤 120012001200120012001200120012001200120012001200120012001200120012001200[yen] 緑 20002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000[yen] 橙 80808080808080808080[yen] 黄 150150150150150[yen] ○失敗した原因○ 計算の for 文内に異常があると思われる。 ○参考文献○ 「第 3 回 得意先の情報を分析しよう」 の 「key を叩いて value の一部を 取り出すには」 を参考にした。 URL : http://roy/~madoka/2007/r2/03/03-05-for-hash-array.html ------------------------------------------------------------------------ 【3】 今回のレポートでは、データの切り取り方について忘れていたところが 多かったので、大変良い復習になった。特に、\S+ (文字列)、\s+(空白文字列)、 \d+(整数値)の部分は良く理解した。 今回のレポートは、最後のプログラムが途中でいきずまってしまった。 もう少しのところで理解できそうというところまできているからこそ、とても 悔しい気持ちでいっぱいになった。 しかし、それと同時に、自分が何処まで理解できているかということが分った 事にもなるので、ある意味成長を感じることが出来た。 次回はもう少し粘ってみようと思う。