氏名 WYK 学籍番号 C1131685 クラス 7 ・作成したプログラム #!/usr/koeki/bin/ruby # -*- coding: utf-8 -*- if ARGV[0] == nil STDERR.puts "あなたの血中アルコール濃度を調べます。\n" STDERR.puts "飲酒量(ml)、あなたが飲んだお酒の度数(%)、あなたの体重(kg)を入力して下さい。\n" STDERR.puts "例: ./sum.rb 250 24.5 65.85" exit(1) end def alcinbl(ml, percent, weight) if ml < 0 || percent < 0 || weight < 0 return nil end return (ml * percent) / (833 * weight) end x = ARGV[0].to_f y = ARGV[1].to_f z = ARGV[2].to_f if alcinbl(x, y, z) == nil print "入力した値がおかしいです。\n" else printf "あなたの血中アルコール濃度は %7.4f %%です。\n", alcinbl(x, y, z) if alcinbl(x, y, z) < 0.5000 print "爽快期です。適度な飲み方です。\n" elsif 0.5000 <= alcinbl(x, y, z) && alcinbl(x, y, z) < 1.0000 print "弱度酩酊です。ほろ酔い気分ですね。\n" elsif 1.0000 <= alcinbl(x, y, z) && alcinbl(x, y, z) < 1.5000 print "軽度酩酊です。少々飲みすぎです。\n" elsif 1.5000 <= alcinbl(x, y, z) && alcinbl(x, y, z) < 2.5000 print "中等度酩酊です。気をつけて下さい!\n" elsif 2.5000 <= alcinbl(x, y, z) && alcinbl(x, y, z) < 3.5000 print "強度酩酊です。これ以上飲んではいけません!\n" elsif 3.5000 <= alcinbl(x, y, z) && alcinbl(x, y, z) < 4.5000 print "泥酔期です。危険です!\n" elsif 4.5000 <= alcinbl(x, y, z) print "昏睡期です。だからいったのに…\n" end printf "\nあなたの体重の前後10kgの人が同じお酒を同量飲んだときの血中アルコール濃度は下のようになります。\n" print "-" * 30 print "\n" (z - 10.0000).step(z + 10.0000,1) do |w| printf "%5.2f kg %3.4f %%\n",w ,alcinbl(x, y, w) end print"-" * 30 print"\n" end ・プログラムの説明 ARGV[] Kterm上でプログラムを実行する際に、./プログラム名 引数 といったように、 プログラムに直接引数やデータを与えることがある。この引数をコマンドライン 引数と言う。この際、コマンドライン引数は自動的に配列変数ARGVに格納される。 プログラム内であらかじめARGVを利用するように組み込んでおけば、利用者が入 力した引数をプログラム内で利用することが出来る。 STDERR コマンドラインに引数を必要とするプログラムを実行する際、コマンドライ ンに引数を与えずに実行すると、端末にメッセージが表示されることなくプログ ラムが終了してしまう。そこで、利用者側にメッセージを出力するためにこれを 使う。 exit プログラムの実行を終了する。Rubyプログラムでは、プログラムが上手くいった かどうかを、0(上手くいった)、0以外(上手くいかなかった)というふうに終了ス テータスを利用して表現される。これとexit(1)とすることで、予定した処理を 行わずにプログラムを終了したことをシステム側に送信する。 開始値.step(終了値[, 増加値]) do |変数| 〜 end 開始値から終了値までの回数分、間の処理を繰り返す。stepというメソッドは増 加値を自ら設けることも出来る。uptoメソッドは開始値から終了値まで1ずつ増 加、downtoメソッドは開始値から終了値まで1ずつ減少、timesは最初に置いた数 だけ処理を繰り返す。 ・実行結果 sime{c113168}% ./repeat.rb [~/Ruby] あなたの血中アルコール濃度を調べます。 飲酒量(ml)、あなたが飲んだお酒の度数(%)、あなたの体重(kg)を入力して下さい。 例: ./sum.rb 250 24.5 65.85 sime{WATANABE Yuki}% ./repeat.rb 200 5.6 65.7 [~/Ruby] あなたの血中アルコール濃度は 0.0205 %です。 爽快期です。適度な飲み方です。 あなたの体重の前後10kgの人が同じお酒を同量飲んだときの血中アルコール濃度は下のようになります。 ------------------------------ 55.70 kg 0.0241 % 56.70 kg 0.0237 % 57.70 kg 0.0233 % 58.70 kg 0.0229 % 59.70 kg 0.0225 % 60.70 kg 0.0222 % 61.70 kg 0.0218 % 62.70 kg 0.0214 % 63.70 kg 0.0211 % 64.70 kg 0.0208 % 65.70 kg 0.0205 % 66.70 kg 0.0202 % 67.70 kg 0.0199 % 68.70 kg 0.0196 % 69.70 kg 0.0193 % 70.70 kg 0.0190 % 71.70 kg 0.0188 % 72.70 kg 0.0185 % 73.70 kg 0.0182 % 74.70 kg 0.0180 % 75.70 kg 0.0178 % ------------------------------ sime{c113168}% ./repeat.rb 1000 40 45.29 [~/Ruby] あなたの血中アルコール濃度は 1.0603 %です。 軽度酩酊です。少々飲みすぎです。 あなたの体重の前後10kgの人が同じお酒を同量飲んだときの血中アルコール濃度は下のようになります。 ------------------------------ 35.29 kg 1.3607 % 36.29 kg 1.3232 % 37.29 kg 1.2877 % 38.29 kg 1.2541 % 39.29 kg 1.2222 % 40.29 kg 1.1918 % 41.29 kg 1.1630 % 42.29 kg 1.1355 % 43.29 kg 1.1092 % 44.29 kg 1.0842 % 45.29 kg 1.0603 % 46.29 kg 1.0374 % 47.29 kg 1.0154 % 48.29 kg 0.9944 % 49.29 kg 0.9742 % 50.29 kg 0.9548 % 51.29 kg 0.9362 % 52.29 kg 0.9183 % 53.29 kg 0.9011 % 54.29 kg 0.8845 % 55.29 kg 0.8685 % ------------------------------ sime{c113168}% [~/Ruby] ・参考文献 "豆知識 - 42.pdf:".医薬品総合卸 株式会社ATOL. http://www.atol-com.co.jp/mp/di/pdf/04_07/mametisiki/42.pdf,(accessed 2014-10-10) 広瀬雄二. "#03 Iteration". "いろいろな繰り返し". http://roy/~yuuji/2014/pf2/03/iteration.html, (参照2014-10-10) 広瀬雄二. "#03 Argument Value". "コマンドラインとの情報のやりとり". http://roy/~yuuji/2014/pf2/03/argv.html, (参照2014-10-10) ・感想 今回は内容的にも復習が多かったのですんなりと入って来ました。for〜in〜end を使おうと思ったのですが、今回のプログラムには上手く組み込むことが出来な かったので、次回以降利用したいと思います。段々とリズムを掴めて来たので、 もう少し複雑なプログラムにも挑戦していきたいです。