roy > naoya > 基礎プログラミングII・情報表現[月1] > (10)CGI[2]> 補足
あなたの日常生活を診断します。氏名と性別、年齢、血液型を入力後、下記の全ての項目に応えてください。
<p>あなたの日常生活を診断します。氏名と性別、年齢、血液型を入力後、下記の全ての項目に応えてください。</p>
<form method="POST" action="./uranai.rb">
<p>
氏名(ニックネームでも可):<input type="text" name="namae" max="20"><br>
性別:
<input type="radio" name="seibetsu" value="男性">男性
<input type="radio" name="seibetsu" value="女性">女性
<input type="radio" name="seibetsu" value="不明">不明<br>
年齢:<input type="text" name="age" size="5"><br>
血液型:<select name="blood">
<option>A</option>
<option>B</option>
<option>O</option>
<option>AB</option>
</select>
</p>
<p>質問1:以下の全ての項目について該当するものを選び、回答してください。</p>
<table border="1">
<tr>
<td>質問</td>
<td>よ<br>く<br>当<br>て<br>は<br>ま<br>る</td>
<td>や<br>や<br>当<br>て<br>は<br>ま<br>る</td>
<td>ど<br>ち<br>ら<br>で<br>も<br>な<br>い</td>
<td>あ<br>ま<br>り<br>当<br>て<br>は<br>ま<br>ら<br>な<br>い</td>
<td>全<br>く<br>当<br>て<br>は<br>ま<br>ら<br>な<br>い</td></tr>
<tr>
<td>トイレはいつも同じ場所を使う</td>
<td><input type="radio" name="q1" value="5"></td>
<td><input type="radio" name="q1" value="4"></td>
<td><input type="radio" name="q1" value="3" checked="checked"></td>
<td><input type="radio" name="q1" value="2"></td>
<td><input type="radio" name="q1" value="1"></td></tr>
<tr><td>授業を受ける時の席はいつも同じだ</td>
<td><input type="radio" name="q2" value="5"></td>
<td><input type="radio" name="q2" value="4"></td>
<td><input type="radio" name="q2" value="3" checked="checked"></td>
<td><input type="radio" name="q2" value="2"></td>
<td><input type="radio" name="q2" value="1"></td></tr>
<tr><td>昼食のメニューはいつも決まっている</td>
<td><input type="radio" name="q3" value="5"></td>
<td><input type="radio" name="q3" value="4"></td>
<td><input type="radio" name="q3" value="3" checked="checked"></td>
<td><input type="radio" name="q3" value="2"></td>
<td><input type="radio" name="q3" value="1"></td></tr>
<tr><td>いつも飲むジュースが売り切れていると気分が悪い</td>
<td><input type="radio" name="q4" value="5"></td>
<td><input type="radio" name="q4" value="4"></td>
<td><input type="radio" name="q4" value="3" checked="checked"></td>
<td><input type="radio" name="q4" value="2"></td>
<td><input type="radio" name="q4" value="1"></td></tr>
<tr><td>たまには違うことをしてみたいと思う</td>
<td><input type="radio" name="q5" value="1"></td>
<td><input type="radio" name="q5" value="2"></td>
<td><input type="radio" name="q5" value="3" checked="checked"></td>
<td><input type="radio" name="q5" value="4"></td>
<td><input type="radio" name="q5" value="5"></td></tr>
</table>
<p>質問2:以下の項目のうち、当てはまるもの全てにチェックを入れてください。</p>
<p>
<input type="checkbox" name="cbk1" value="1">天気が良いとうきうきする。<br>
<input type="checkbox" name="cbk2" value="1">毎日が楽しくて仕方がない。<br>
<input type="checkbox" name="cbk3" value="1">毎週楽しみにしているドラマがある。<br>
<input type="checkbox" name="cbk4" value="1">スポーツをするのが好きだ。<br>
</p>
<p class="item">
<input type="submit" name="ok" value="診断する">
<input type="reset" name="ng" value="やめておく">
</form>
質問1はラジオボタン、質問2はチェックボックスを用いている。質問1は5つの質問があるが、質問ごとにラジオボタンのname属性を変更している。例えば質問1のname属性はq1であり、5つのラジオボタンにはvalue属性として1〜5のいずれかが割り当てられている。選んだラジオボタンに応じた値がkeyであるq1に対するvalueとしてCGIスクリプトに送られる。
参考までに5番目の質問は逆転項目であり、各ラジオボタンのvalueの点数の与え方が他の質問とは反対になっている。時折、逆転項目を含まないと、全て一方の端を選ぶのが社会的に望ましいと判断され、内容を見ずに適当に回答するという行動が発生しやすくなる。
質問2はチェックボックスであり、該当する項目のみが選択される。このためvalueは全て1とし、name属性を変えている。こうすることで、選択した項目に対応するkeyのみvalueとして1が与えられ、選択していないkeyはvalueが与えられない(value=0となる)。
#!/usr/bin/env ruby
require 'cgi'
c = CGI.new("html4")
print "Content-type: text/html; charset=EUC-JP\n\n"
name = c["namae"]
seibetsu = c["seibetsu"]
age = c["age"]
bl = c["blood"]
q1 = c["q1"]
q2 = c["q2"]
q3 = c["q3"]
q4 = c["q4"]
q5 = c["q5"]
q6 = c["cbk1"]
q7 = c["cbk2"]
q8 = c["cbk3"]
q9 = c["cbk4"]
point = q1.to_i + q2.to_i + q3.to_i + q4.to_i + q5.to_i - q6.to_i - q7.to_i - q8.to_i - q9.to_i
adjust = age.to_i%5
point += adjust
print "<html>
<head><title>診断結果</title></head>
<body>\n"
print "<h1>#{name}さん(#{seibetsu}:#{bl}型)の診断結果</h1>\n"
print "<p>総合得点は#{point}点です。</p>\n"
print "<p>"
if point >= 20
print "平凡な毎日です。もっと刺激を求めましょう。\n"
elsif point >= 15
print "毎日が単調ですね。もっといろいろなことに挑戦しましょう。\n"
elsif point >= 10
print "人並みです。\n"
else
print "毎日が楽しくてよいですね。\n"
end
print "</p>\n"
print "<p>結果は適当なので、悩まないでくださいね。</p>\n"
print "</body>\n"
print "</html>\n"
入力フォームで選択されたデータは、ハッシュ変数cのkeyとvalueという形で取り出されている。そして、全てのvalueの和が求められpointに代入されている。いんちき占いなので、その後、年齢を5で割った余りがpointに加算され、その得点に応じてif文で条件判断が行われ、対応するメッセージが表示されている。