氏名 : sideMt. 学籍番号 : c1141494 クラス : 英語 3 基礎プロII C ・どの問題を選択したか 3 ・作成したプログラム本体 #!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- okitama = Hash.new open("okitama.txt","r") do |x| while line = x.gets if /(\S+)\s+(\d+)\s+(\d+)\s+(\d+)/ =~ line okitama[$1] = [$2.to_i, $3.to_i, $4.to_i] end end end if ARGV[0] == nil STDERR.print "データファイルを指定してください。 実行例 : % ./okitama.rb -a 面積順に出力 % ./okitama.rb -b 総人口順に出力 % ./okitama.rb -c 観光者数順に出力 % ./okitama.rb -d 人口密度順に出力" exit 1 end while /^-/ =~ ARGV[0] print "\n--市町名------+-面積------+-総人口------+-観光者数------+-人口密度--\n\n" if ARGV[0] == "-a" for chiku in okitama.keys.sort{|x,y| okitama[x][0] <=> okitama[y][0] }.reverse menseki = okitama[chiku][0] jinkou = okitama[chiku][1] kankou = okitama[chiku][2] printf("%-6s %10dkm2 %9d人 %10d人 %12d人/km2\n",chiku, menseki, jinkou, kankou, jinkou/menseki) end elsif ARGV[0] == "-b" for chiku in okitama.keys.sort{|x,y| okitama[x][1] <=> okitama[y][1] }.reverse menseki = okitama[chiku][0] jinkou = okitama[chiku][1] kankou = okitama[chiku][2] printf("%-6s %10dkm2 %9d人 %10d人 %12d人/km2\n",chiku, menseki, jinkou, kankou, jinkou/menseki) end elsif ARGV[0] == "-c" for chiku in okitama.keys.sort{|x,y| okitama[x][2] <=> okitama[y][2] }.reverse menseki = okitama[chiku][0] jinkou = okitama[chiku][1] kankou = okitama[chiku][2] printf("%-6s %10dkm2 %9d人 %10d人 %12d人/km2\n",chiku, menseki, jinkou, kankou, jinkou/menseki) end elsif ARGV[0] == "-d" for chiku in okitama.keys.sort{|x,y| okitama[x][1]/okitama[x][0] <=> okitama[y][1]/okitama[y][0] }.reverse menseki = okitama[chiku][0] jinkou = okitama[chiku][1] kankou = okitama[chiku][2] printf("%-6s %10dkm2 %9d人 %10d人 %12d人/km2\n",chiku, menseki, jinkou, kankou, jinkou/menseki) end else break end ARGV.shift print"--------------------------------------------------------------------\n" end ・プログラムの説明(データ処理の部分の詳説) while /^-/ =~ ARGV[0] ハイフンで始まる間は操作を繰り返すことを表している。 if ARGV[0] == "-a" for chiku in okitama.keys.sort{|x,y| okitama[x][0] <=> okitama[y][0] }.reverse もし、ARGV[0]が-aだった場合、openメソッドで読み込まれたデータをsortメソッ ドで並び換える。この時、keyの値(市町名)を並び換えても意味が無いので、 sortにブロックを指定する。変数xとyには比較の対象となる市町名が入り、第0 要素である面積の配列が並び換えられる。並び換えられたものを逆順にし、大き い値のものから表示させたいので、reverseを入れる。 menseki = okitama[chiku][0] keyの部分をmensekiと表し、valueの部分をokitamaと表した。mensekiはこの配 列の第0要素。 jinkou = okitama[chiku][1] keyの部分をjinkouと表し、valueの部分をokitamaと表した。jinkouはこの配 列の第1要素。 kankou = okitama[chiku][2] keyの部分をkankouと表し、valueの部分をokitamaと表した。kankouはこの配 列の第2要素。 printf("%-6s %10dkm2 %9d人 %10d人 %12d人/km2\n",chiku, menseki, jinkou, kankou, jinkou/menseki) 結果が出力される。%とsやdの間の数字は実行されたとき見栄えをよくするため に列をずらすためのもの。 elsif ARGV[0] == "-b" for chiku in okitama.keys.sort{|x,y| okitama[x][1] <=> okitama[y][1] }.reverse ARGV[0]が-bだった場合も同じ。しかし、第1要素である総人口が並び換えられる。 elsif ARGV[0] == "-c" for chiku in okitama.keys.sort{|x,y| okitama[x][2] <=> okitama[y][2] }.reverse ARGV[0]が-bだった場合も同じ。しかし、第2要素である観光者数が並び換えられる。 elsif ARGV[0] == "-d" for chiku in okitama.keys.sort{|x,y| okitama[x][1]/okitama[x][0] <=> okitama[y][1]/okitama[y][0] }.reverse ARGV[0]が-bだった場合も同じ。人口密度は人口/面積なので第1要素である人口 で第0要素の面積を割ったものが並び換えられる。 ・実行結果 <データファイルを指定しなかった場合> sime{YOKOYAMA Miruki}% ./okitama.rb [~/Ruby] データファイルを指定してください。 実行例 : % ./okitama.rb -a 面積順に出力 % ./okitama.rb -b 総人口順に出力 % ./okitama.rb -c 観光者数順に出力 % ./okitama.rb -d 人口密度順に出力 <成功した場合> sime{c114149}% ./okitama.rb -a [~/Ruby] --市町名------+-面積------+-総人口------+-観光者数------+-人口密度-- 小国町 737km2 8108人 37人 11人/km2 米沢市 548km2 86521人 194人 157人/km2 飯豊町 329km2 7425人 57人 22人/km2 長井市 214km2 28141人 49人 131人/km2 高畠町 180km2 23983人 130人 133人/km2 川西町 166km2 16144人 18人 97人/km2 南陽市 160km2 32385人 108人 202人/km2 白鷹町 157km2 14375人 76人 91人/km2 -------------------------------------------------------------------- sime{c114149}% ./okitama.rb -d [~/Ruby] --市町名------+-面積------+-総人口------+-観光者数------+-人口密度-- 南陽市 160km2 32385人 108人 202人/km2 米沢市 548km2 86521人 194人 157人/km2 高畠町 180km2 23983人 130人 133人/km2 長井市 214km2 28141人 49人 131人/km2 川西町 166km2 16144人 18人 97人/km2 白鷹町 157km2 14375人 76人 91人/km2 飯豊町 329km2 7425人 57人 22人/km2 小国町 737km2 8108人 37人 11人/km2 -------------------------------------------------------------------- ・参考文献 広瀬雄二 . "#05 配列とハッシュの応用".2015年度 基礎プログラミングII .http://roy/~yuuji/2015/pf2/05/index.html ,(参照2015-11-1). 山形県置賜総合支庁."置賜地域の主要指標".置賜地域の概況 ./www.pref.yamagata.jp/ou/sogoshicho/okitama/325003/27gaikyo.pdf ,(参照 2015-11-1). ・感想 今回の課題も難しく感じた。配列とハッシュの組み合わせたプログラムを作成し たが、やはり1回では起動しなかった。データのほうにコンマがあったことに気 づき無くしたら起動したのでよかった。1つの並び換えが出来てからは、順調に 作成することができた。次回もっp頑張りたい。