Subject: #04 データ処理 3番 From: c118167@f.koeki-u.ac.jp To: ruby-2-05@e.koeki-u.ac.jp Date: Sun, 10 Nov 2019 03:30:51 +0900 (JST) X-Mailer: Mew version 6.7 on Emacs 26 / Mule 6.0 (HANACHIRUSATO) 氏名: shining 学籍番号: c1181677 クラス: F ●●●どの問題を選択したか●●● 3番の問題を選択した。 また、2番も作成しているため2番に関してはファイルの添付と 実行結果の表示のみしておく。 hw-bmi.rb は Hash 、hw-bmi2.rb は Array を用いて作成している。 ●●●作成したプログラム本体●●● #!/usr/koeki/bin/ruby # coding: utf-8 require "./kprintf.rb" if ARGV[0] == nil STDERR.print "データファイルを指定して下さい。 実行例: % ./mcd.rb ファイル名 # 「商品名」順に出力 % ./mcd.rb -p ファイル名 # 「価格」が低い順に出力 % ./mcd.rb -k ファイル名 # 「kcal」が低い順に出力 % ./mcd.rb -w ファイル名 # 「1円あたりのkcal」が低い順に出力 " exit 1 end sortby = "name" # デフォルトは商品名でソート while /^-/ =~ ARGV[0] # ハイフンで始まる間繰り返す if ARGV[0] == "-p" sortby = "price" # 価格でソート elsif ARGV[0] == "-k" sortby = "kcal" # kcalでソート elsif ARGV[0] == "-w" sortby = "wariai" # 1円あたりのkcalでソート else break end ARGV.shift end menu = Array.new while line = gets if /(\S+)\s+(\d+)\s+(\d+)/ =~ line p = $2.to_f k = $3.to_f menu << {"name" => $1, "price" => p, "kcal" => k, "wariai" => k/p} end end puts"---------------------------●●●マック●●●---------------------------" puts"-"*72 puts"--商品名------------------------+-価格----+-kcal----+-1円あたりのkcal---" puts"-"*72 for i in menu.sort_by{|x| x[sortby]} name = i["name"] price = i["price"] kcal = i["kcal"] wariai = i["wariai"] printf("%-32s %d円 %7dkcal %10.2fkcal\n",name,price,kcal,wariai) end puts"-"*72 ●●●プログラムの説明(データ処理の部分の詳説)●●● if ARGV[0] == nil プログラムを実行するとき、プログラム自身にコマンドラインで何も与えなかっ た場合にプログラムの実行例を表示するようにしている。具体的に、./mcd.rb のみだと実行することができないため、どうすれば実行できるかの説明文が表示 されるということである。 sortby という変数を用いて、ソート基準を変更している。 なお、デフォルトは商品名にしている。 while /^-/ =~ ARGV[0] ARGVの第0要素が - から始まるときに処理を繰り返す。 if ARGV[0] == "-p" sortby = "price" elsif ARGV[0] == "-k" sortby = "kcal" elsif ARGV[0] == "-w" sortby = "wariai" else break end ARGV.shift end -pのときは変数 sortby を price(価格) -kのときは変数 sortby を kcal -wのときは変数 sortby を wariai(1円あたりのkcal) にしている。 ARGV.shift がなければ上手くファイルを読み込むことができない。 -p -k -w というファイルはないからである。 ファイルを読み込む上で、-p -k -w が邪魔になるため、 shiftを用いて取り出すことでARGV配列の要素を詰めている。 こうすることでファイルを上手く読み込めるようになるのである。 menu = Array.new while line = gets if /(\S+)\s+(\d+)\s+(\d+)/ =~ line p = $2.to_f k = $3.to_f menu << {"name" => $1, "price" => p, "kcal" => k, "wariai" => k/p} end end 配列変数 menu を用意し、name price kcal wariai を代入している。 ファイルにあう正規表現を入力している。 for i in menu.sort_by{|x| x[sortby]} name = i["name"] price = i["price"] kcal = i["kcal"] wariai = i["wariai"] printf("%-32s %d円 %7dkcal %10.2fkcal\n",name,price,kcal,wariai) end 比較すべき値を取り出す式として、x[sortby]とし、変数 sortby で並べ替える ようにしている。sortbyの値によって並び替えるものが変わる。 iには、商品名、価格、kcal、1円あたりの価格という配列が入っている。 ●●●実行結果●●● ●ファイルを指定しない場合● sime{c118167}% ./mcd.rb [~/Ruby] データファイルを指定して下さい。 実行例: % ./mcd.rb ファイル名 # 「商品名」順に出力 % ./mcd.rb -p ファイル名 # 「価格」が低い順に出力 % ./mcd.rb -k ファイル名 # 「kcal」が低い順に出力 % ./mcd.rb -w ファイル名 # 「1円あたりのkcal」が低い順に出力 ●「商品名」順に出力● sime{TSUCHIYA Koki}% ./mcd.rb mcd.txt [~/Ruby] ---------------------------●●●マック●●●--------------------------- ------------------------------------------------------------------------ --商品名------------------------+-価格----+-kcal----+-1円あたりのkcal--- ------------------------------------------------------------------------ えびフィレオ 390円 395kcal 1.01kcal てりやきチキンフィレオ 370円 498kcal 1.35kcal てりやきマックバーガー 340円 478kcal 1.41kcal エッグチーズバーガー(エグチ) 200円 387kcal 1.94kcal グランガーリックペッパー 390円 430kcal 1.10kcal グランクラブハウス 490円 527kcal 1.08kcal グランベーコンチーズ 390円 489kcal 1.25kcal ダブルチーズバーガー 340円 457kcal 1.34kcal チキンクリスプ 110円 345kcal 3.14kcal チキンチーズバーガー(チキチー) 200円 431kcal 2.16kcal チキンフィレオ 360円 465kcal 1.29kcal チーズバーガー 140円 307kcal 2.19kcal ハンバーガー 110円 256kcal 2.33kcal ビッグマック 390円 525kcal 1.35kcal フィレオフィッシュ 340円 341kcal 1.00kcal ベーコンマックポーク(マクポ) 200円 420kcal 2.10kcal ベーコンレタスバーガー 360円 374kcal 1.04kcal ------------------------------------------------------------------------ ●「価格」が低い順に出力● sime{c118167}% ./mcd.rb -p mcd.txt [~/Ruby] ---------------------------●●●マック●●●--------------------------- ------------------------------------------------------------------------ --商品名------------------------+-価格----+-kcal----+-1円あたりのkcal--- ------------------------------------------------------------------------ ハンバーガー 110円 256kcal 2.33kcal チキンクリスプ 110円 345kcal 3.14kcal チーズバーガー 140円 307kcal 2.19kcal ベーコンマックポーク(マクポ) 200円 420kcal 2.10kcal エッグチーズバーガー(エグチ) 200円 387kcal 1.94kcal チキンチーズバーガー(チキチー) 200円 431kcal 2.16kcal ダブルチーズバーガー 340円 457kcal 1.34kcal てりやきマックバーガー 340円 478kcal 1.41kcal フィレオフィッシュ 340円 341kcal 1.00kcal チキンフィレオ 360円 465kcal 1.29kcal ベーコンレタスバーガー 360円 374kcal 1.04kcal てりやきチキンフィレオ 370円 498kcal 1.35kcal グランガーリックペッパー 390円 430kcal 1.10kcal えびフィレオ 390円 395kcal 1.01kcal ビッグマック 390円 525kcal 1.35kcal グランベーコンチーズ 390円 489kcal 1.25kcal グランクラブハウス 490円 527kcal 1.08kcal ------------------------------------------------------------------------ ●「kcal」が低い順に出力● sime{c118167}% ./mcd.rb -k mcd.txt [~/Ruby] ---------------------------●●●マック●●●--------------------------- ------------------------------------------------------------------------ --商品名------------------------+-価格----+-kcal----+-1円あたりのkcal--- ------------------------------------------------------------------------ ハンバーガー 110円 256kcal 2.33kcal チーズバーガー 140円 307kcal 2.19kcal フィレオフィッシュ 340円 341kcal 1.00kcal チキンクリスプ 110円 345kcal 3.14kcal ベーコンレタスバーガー 360円 374kcal 1.04kcal エッグチーズバーガー(エグチ) 200円 387kcal 1.94kcal えびフィレオ 390円 395kcal 1.01kcal ベーコンマックポーク(マクポ) 200円 420kcal 2.10kcal グランガーリックペッパー 390円 430kcal 1.10kcal チキンチーズバーガー(チキチー) 200円 431kcal 2.16kcal ダブルチーズバーガー 340円 457kcal 1.34kcal チキンフィレオ 360円 465kcal 1.29kcal てりやきマックバーガー 340円 478kcal 1.41kcal グランベーコンチーズ 390円 489kcal 1.25kcal てりやきチキンフィレオ 370円 498kcal 1.35kcal ビッグマック 390円 525kcal 1.35kcal グランクラブハウス 490円 527kcal 1.08kcal ------------------------------------------------------------------------ ●「1円あたりのkcal」が低い順に出力● sime{c118167}% ./mcd.rb -w mcd.txt [~/Ruby] ---------------------------●●●マック●●●--------------------------- ------------------------------------------------------------------------ --商品名------------------------+-価格----+-kcal----+-1円あたりのkcal--- ------------------------------------------------------------------------ フィレオフィッシュ 340円 341kcal 1.00kcal えびフィレオ 390円 395kcal 1.01kcal ベーコンレタスバーガー 360円 374kcal 1.04kcal グランクラブハウス 490円 527kcal 1.08kcal グランガーリックペッパー 390円 430kcal 1.10kcal グランベーコンチーズ 390円 489kcal 1.25kcal チキンフィレオ 360円 465kcal 1.29kcal ダブルチーズバーガー 340円 457kcal 1.34kcal てりやきチキンフィレオ 370円 498kcal 1.35kcal ビッグマック 390円 525kcal 1.35kcal てりやきマックバーガー 340円 478kcal 1.41kcal エッグチーズバーガー(エグチ) 200円 387kcal 1.94kcal ベーコンマックポーク(マクポ) 200円 420kcal 2.10kcal チキンチーズバーガー(チキチー) 200円 431kcal 2.16kcal チーズバーガー 140円 307kcal 2.19kcal ハンバーガー 110円 256kcal 2.33kcal チキンクリスプ 110円 345kcal 3.14kcal ------------------------------------------------------------------------ ●2番の課題の実行結果● --氏名-----------+-身長--+--体重--+--BMI-- 三川一二三 163.3 77.0 28.87 山田太郎 169.4 80.2 27.95 鶴岡一人 180.2 75.5 23.25 中町太郎 169.1 60.9 21.30 飯森花子 158.5 52.1 20.74 酒田三吉 170.4 55.5 19.11 ------------------------------------------ ●●●参考文献●●● 広瀬雄二 ."第5回 配列とハッシュの応用". Programming Fundamentals II #05. http://roy/~yuuji/2019/pf2/04/index.html ,(参照 2019-11-10). ●●●課題作成の所要時間●●● 約8時間 ●●●感想●●● 3番の課題に手こずってしまいました。ヒントにある変数 sortby をどう活かせ ば良いのか気づくのに時間がかかってしまいました。2番の課題に関しては、 HashとArrayの両方で作成することができたのでよかったと思います。 ●●●Multipart形式で添付したRubyプログラムとデータファイル●●●