- ベストアンサー
4択問題のプログラムで「次の問題」に移行する処理で困っています
- 「次の問題」ボタンをクリックするとデータテーブルに格納された問題、選択肢が表示され順次解答をしていくのですが、現在の「次の問題」ボタンのプログラムではデータテーブルの「解答」と「正解」に1つずれが生じてしまいます。
- 下記は「次の問題」ボタンのプログラムです。
- 4日ぐらい四苦八苦しているのですが、このバグを解消する方法を知りたいです。お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
回答開始を「次の問題」ボタンで共用しているため、最初の問題が出た瞬間に正誤判定が行われてしまいます。しかも i がインクリメントされているために、第1問は強制的に「回答無し」となり、この歯車がずれたまま進んでいますね。 そもそも、変数 i の役割があやふやです。i は「現在の問題」なのか「次の問題」なのか。配列の添え字に使う変数を「i」にしていることが、コーディングの混乱を招いているように思えます。intCurrent等、変数の役割は明確にしたほうがよいでしょう。設計に慣れていないうちは特に。 また、「次の問題」ボタンは「回答開始」のクリックと「次に進む」クリックで、役割が異なるため処理を分けなければいけません。 ・回答開始の時は「問題の表示」をするだけで正誤判定してはいけません。 ・次の問題へ移る時は、先に「正誤判定」を行い、i を進めて「問題の表示」を行わなければなりません。 この異なる処理をひとつのメソッドで行おうとしているのだと思います。(この考え方自体は否定しません) この場合、クリックイベントの手続きとしては次のようになります。(分かりにくくてすみません) クリック処理の開始 ↓(1問目) ↓(2問目以降) ↓ 正誤判定 ↓ ↓ i を進める ↓(i < 10) ↓(i = 10) ↓ 正解数を表示して終了 ↓ 問題を表示 1問目の流れで「i の問題を表示」するときに、i = 0 とするために、i の初期値は -1 としておきます。これが1問目か2問目以降かの判断材料になります。 また、i の役割は「現在の出題数」です。これは、クリックするたびに必ずインクリメントしなければ無限ループします。 Public i As Integer = -1 ' 出題中の問題数を示す値 Private Sub NextQuestion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NextQuestion.Click ' i が -1 のとき(つまり、初回のクリック) If i = -1 Then 【コントロールの準備】 ' i が -1以外のとき(つまり、回答後のクリック) Else 【正誤判定】 【正解数の記憶】 End If i += 1 ' i をインクリメント(出題を次に進める) ' i が10になった = 回答が10問終わった If i = 10 Then 【結果の表示】 ここで i = -1 とすればまた最初からスタートします。 Else 【問題の表示】 End If End Sub 古典的ではありますが「流れ図」を書いてみると、やりたいことと実際の処理の流れの違いに気づけると思います。
その他の回答 (1)
- kyonn2008
- ベストアンサー率22% (4/18)
なんかシッチャカメッチャカ‥ 実際のプログラムはきっともっとちゃんと作られているのだろうとして 質問にだけ答えると Question.Text = DataSet1.DataTable1(i).Question Answer1.Text = DataSet1.DataTable1(i).Answer1 Answer2.Text = DataSet1.DataTable1(i).Answer2 Answer3.Text = DataSet1.DataTable1(i).Answer3 Answer4.Text = DataSet1.DataTable1(i).Answer4 ↑この部分が i = i + 1 より前にあるからダメなんじゃないの?
お礼
とてもわかりやすく大助かりでした。 本当にありがとうございました。