C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: 4択問題の表示


(過去ログ 133 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■78483 / inTopicNo.1)  4択問題の表示
  
□投稿者/ ooki (1回)-(2016/01/18(Mon) 04:00:53)

分類:[VB.NET/VB2005 以降] 

If k1 = 1 Then
                Randomize()
1:              x1 = Int(Rnd() * n1)
                If sd1_1(x1).s3 = 2 Or sd1_1(x1).s1 = "" Then GoTo 1
                Label1.Text = sd1_1(x1).s1
2:              x2 = Int(Rnd() * n1)
                If x2 = x1 Or sd1_1(x2).s3 = 1 Or sd1_1(x2).s1 = "" Then GoTo 2
                Label2.Text = sd1_1(x2).s1
3:              x3 = Int(Rnd() * n1)
                If x3 = x1 Or sd1_1(x3).s3 = 1 Or sd1_1(x3).s1 = "" Then GoTo 3
                If x3 = x2 Or sd1_1(x3).s3 = 1 Or sd1_1(x3).s1 = "" Then GoTo 3
                Label3.Text = sd1_1(x3).s1
4:              x4 = Int(Rnd() * n1)
                If x4 = x1 Or sd1_1(x4).s3 = 1 Or sd1_1(x4).s1 = "" Then GoTo 4
                If x4 = x2 Or sd1_1(x4).s3 = 1 Or sd1_1(x4).s1 = "" Then GoTo 4
                If x4 = x3 Or sd1_1(x4).s3 = 1 Or sd1_1(x4).s1 = "" Then GoTo 4
                Label4.Text = sd1_1(x4).s1
                        End If

を 簡略化させようと思い、以下のように書き直したのですが、うまくラベル表示されません。
どこをどう直せばよいでしょうか。アドバイスお願いします。

If k1 = 1 Then
Static n(,) = {{2, 1, 1, 1}, {1, 2, 1, 1}, {1, 1, 2, 1}, {1, 1, 1, 2}, {1, 2, 2, 2}, {2, 1, 2, 2}, {2, 2, 1, 2}, {2, 2, 2, 1}}
 Dim al As New List(Of Integer)
 Dim x As Integer
 Randomize()
 For i = 1 To 4
 Do
 x = Int(Rnd() * n0)
 Loop While al.Contains(x) Or sd1_1(x).s4 = "済" Or sd1_1(x).s1 = "" Or sd1_1(x1).s3 = n(k1 - 1, 0) Or sd1_1(x2).s3 = n(k1 - 1, 1) Or _
                              sd1_1(x3).s3 = n(k1 - 1, 2) Or sd1_1(x4).s3 = n(k1 - 1, 3)
 al.Add(x)
 CType(Controls("Label" & i.ToString()), Label).Text = sd1_1(x).s1
 Next
 x1 = al(0)
 x2 = al(1)
 x3 = al(2)
 x4 = al(3)

end if

引用返信 編集キー/
■78496 / inTopicNo.2)  Re[1]: 4択問題の表示
□投稿者/ Jitta (170回)-(2016/01/19(Tue) 21:51:20)
No78483 (ooki さん) に返信
 え〜っと、「質問」というのは、
「答えてくれるかもしれない人に、聞きたいことを伝えること」
だということは、理解されているでしょうか。
その上で、この質問は、「プログラムを読んで、私がしたいことを理解してください」ということですか?
それは難しい。
まず、k1って、なんですか?
それが1の時って、何を意味しています?
x1 が、n1以下の整数が入ることはわかります。
しかし、その整数が意味するものがわかりません。
n1って、なんでしょう?
名前からは想像もできません。
等々。

 結局、こういうことですか?
「4択の選択肢を表示する時、選択肢の表示順番をランダムにしたい。」

 プログラムというのは、“私”(プログラマ)がして欲しいことを、
「この順番に実行してください」とコンピュータに対して依頼するための依頼書です。
「この順に、これこれを実行してください」というのが「プログラム」です。
ですから、どの様な順序で、何を、行うか、というところが整理できなければ、プログラムは書けません。
あなたのコードは、そのような、「何を、どの順序で行うか」を整理してから作りましたか?

 「トランプをシャッフルするには?」とかと同じです。
1〜4を重複なく乱数作成するなら、「何を作ったか」を覚えておかなければなりません。
しかし、「並んでいる1〜4を、適当に入れ替える」なら、どうでしょう?
既に選んだものを覚えておく必要がなくなる分、コードの見た目はスッキリします。
シャッフルの回数は、全量に対してこれくらいというのが統計的に出ていたと思う。
それは自分で調べてください。
私はC#erなので、VBコードは保証できません。

Dim 順序() = { 0, 1, 2, 3 }
Dim シャッフル回数 = 10
Loop While シャッフル回数 > 0
' 乱数で選んだ a 番目と b 番目を入れ替える
Dim a as Integer = Rnd() * 順序.Length
Dim b as Integer = Rnd() * 順序.Length
Dim 退避 = 順序(a)
順序(a) = 順序(b)
順序(b) = 退避
シャッフル回数 -= 1
Next
ラベルの表示はこんな感じ
CTypeで文字列から作らず、配列に入れて使う。
Dim ラベル() = { Label1, Label2, Label3, Label4 }
ラベル(n).Text = 選択肢(順序(n))

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -