氏名 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
を使おうと思ったのですが、今回のプログラムには上手く組み込むことが出来な
かったので、次回以降利用したいと思います。段々とリズムを掴めて来たので、
もう少し複雑なプログラムにも挑戦していきたいです。