以下のようなプログラムを作成しましたが、表示が思うようにいきません。。
本当なら複数の問題をランダムで5問ずつ表示したいのですが、すべて表示することができず、1問のみだったり、3問のみしか表示されなかったりとバラバラです。
記述方法が悪いのでしょうか?どなたか分かる方いらっしゃいましたらご教授お願いします。
-------------------------
<%
accessdb="cityquiz"
cn="DRIVER={Microsoft Access Driver (*.mdb)};"
cn=cn & "DBQ=" & server.mappath(accessdb)
set rs = Server.CreateObject("ADODB.Recordset")
sql = "select * from quiz"
rs.Open sql, cn, 1, 3
total_records=rs.recordcount
randomize
random_number=int(rnd*total_records)+1
rs.MoveFirst
do while not rs.eof and counter <> random_number
counter = counter + 1
if counter= random_number then
response.write rs("問題") & "<br>"
response.write "<input type='radio' name='Q1' vakue='" & rs("ID") & "1'>" & rs("1択") & "<br>"
response.write "<input type='radio' name='Q1' vakue='" & rs("ID") & "2'>" & rs("2択") & "<br>"
response.write "<input type='radio' name='Q1' vakue='" & rs("ID") & "3'>" & rs("3択") & "<br>"
response.write "<input type='radio' name='Q1' vakue='" & rs("ID") & "4'>" & rs("4択") & "<br>"
response.write "<br>"
end if
counter2 = counter + 2
if counter2= random_number then
response.write rs("問題") & "<br>"
response.write "<input type='radio' name='Q2' vakue='" & rs("ID") & "1'>" & rs("1択") & "<br>"
response.write "<input type='radio' name='Q2' vakue='" & rs("ID") & "2'>" & rs("2択") & "<br>"
response.write "<input type='radio' name='Q2' vakue='" & rs("ID") & "3'>" & rs("3択") & "<br>"
response.write "<input type='radio' name='Q2' vakue='" & rs("ID") & "4'>" & rs("4択") & "<br>"
response.write "<br>"
end if
counter3 = counter + 3
if counter3= random_number then
response.write rs("問題") & "(3)<br>" & counter3
response.write "<input type='radio' name='Q3' vakue='" & rs("ID") & "1'>" & rs("1択") & "<br>"
response.write "<input type='radio' name='Q3' vakue='" & rs("ID") & "2'>" & rs("2択") & "<br>"
response.write "<input type='radio' name='Q3' vakue='" & rs("ID") & "3'>" & rs("3択") & "<br>"
response.write "<input type='radio' name='Q3' vakue='" & rs("ID") & "4'>" & rs("4択") & "<br>"
response.write "<br>"
end if
~略~
rs.movenext
loop
%>
No.1ベストアンサー
- 回答日時:
これだと、連続した問題しか表示されないし、random_numberによっては5問表示されないです。
counter?の値を追ってみましょう
1回目のループでは
counter=0+1=1
counter2=counter+2=3
counter3=counter+3=4
counter4=counter+4=5
counter5=counter+5=6
になります。
2回目のループでは
counter=1+1=2
counter2=counter+2=4
counter3=counter+3=5
counter4=counter+4=6
counter5=counter+5=7
になります。以下同様に増えていきます。
ここで、random_number=6だったとすると
1回目→counter5=6で 第1レコードの問題を表示(radio name="Q5")
2回目→counter4=6で 第2レコードの問題を表示(radio name="Q4")
3回目→counter3=6で 第3レコードの問題を表示(radio name="Q3")
4回目→counter2=6で 第4レコードの問題を表示(radio name="Q2")
5回目→該当無し
6回目→counter=6で 第6レコードの問題を表示(radio name="Q1")
→counter=random_numberでループ終了
となり、5問表示されます。
ただし、必ず連続した問題が表示されます。また、ラジオボタンはQ5からの逆順です。
では、random_number=2だったらどうでしょうか?
1回目→該当無し
2回目→counter=2で 第2レコードの問題を表示(radio name="Q1")
→counter=random_numberでループ終了
と1問しか表示されません。
現在の構造をそのまま使いたいなら、
random_number=int(rnd*(total_records-5))+1+5
として、random_numberを6~total_recordsの範囲になるようにします。
よりランダムにする常套手段として
・1~total_recordsの乱数を5つ、同じ値にならないように用意する。
・それぞれの乱数に該当するレコードを表示
とします。
あと、変数counterに初期値が無いまま、いきなりcounter=coutnter+1と使用しています。
一応、暗黙の初期値として0が入るので、今回は動作していますが、思わぬバグを引き起す原因となります。
whileループの前に count=0 と明示的に初期値を入れるような癖を身に付けましょう。
分かりやすく丁寧な解説ありがとうございました。
おかげさまで解決することが出来ました。
初期値を入れることも大事なんですね。バグを引き起こす原因になるのも初めて知りました。
これからはつけるように心がけていきたいと思います。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
write downとfill outの違いを...
-
arduinoのスケッチについて教え...
-
HTMLの値の渡し方について質問...
-
フォームのtextareaにnl2brを使...
-
select case文について
-
遷移先のURLにパラメータを表示...
-
aspxでIFみたいなことがしたい
-
改行コードが取り切れない
-
SELECTボックスの内容を動的に...
-
javascriptで結果表示テキスト...
-
末尾の改行をカットして保存す...
-
ACCESSのレポートの表示...
-
機種依存文字
-
NotifyIconで二列の文字列を表...
-
ASP.NETでTimerコントロールを...
-
[ASP]URL付加情報を転用した...
-
あいまい検索画面を作成したい
-
csv内の改行を削除
-
遺伝子アルゴリズムの2点交叉に...
-
テキストボックス内を・・・
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
奇数・偶数の区別をプログラミング
-
write downとfill outの違いを...
-
最大値と最小値の間を循環する変数
-
シリアル通信プログラミングで...
-
micropython コードについて
-
数字の右側にゼロを付加する
-
fortranのwrite文コメント有無...
-
Fortaranの質問
-
Fortran 出力形式
-
OpenSSLのSSL_write()をタイム...
-
C言語について。
-
複数のランダムクイズの表示が...
-
最大値、最小値の求め方
-
私は、もっと早くお祝いメッセ...
-
HTMLの値の渡し方について質問...
-
ACCESSのレポートの表示...
-
フォームのtextareaにnl2brを使...
-
SELECTボックスの内容を動的に...
-
遷移先のURLにパラメータを表示...
-
aspxでIFみたいなことがしたい
おすすめ情報