2015-01-06 2 views
0

Я добавил цикл в свою программу, чтобы убедиться, что программа не выводит математический вопрос, который будет слишком сложным; что мне нужно, чтобы первое значение (левое число) было больше, чем правое, или вопрос выдаст отрицательный ответ. Однако я, очевидно, сделал это ужасно неправильно, так как он сбой программы.Программа генератора петли генератора чисел

Randomize() 
    Dim values1 As Integer = CInt(Int((10 * Rnd()) + 1)) 
    First_Number.Text = values1 

    Sign_Box.Text = "-" 

    Randomize() 
    Dim values2 As Integer = CInt(Int((10 * Rnd()) + 1)) 
    Second_Number.Text = values2 
    AnswerTextBox.Tag = values1 - values2 
    AnswerTextBox.Text = AnswerTextBox.Tag 
    Do Until values1 > values2 
    Loop 

Там же код, я знаю, что цикл не так, но я действительно не имею ни малейшего представления о том, как работать с петлями на данный момент. Заранее благодарны за Вашу помощь.

Код 2:

Dim values1 As Integer = 0 
    Dim values2 As Integer() = {2, 4, 5, 10} 
    Dim randomizer As New Random 
    Dim value2 As Integer = values2(randomizer.Next(values2.Length)) 

    Do Until values1 > values2 
     Randomize() 
     values1 = CInt(Int((10 * Rnd()) + 1)) 

    Loop 

    First_Number.Text = values1 
    Second_Number.Text = value2 
    AnswerTextBox.Tag = values1/value2 
    AnswerTextBox.Text = AnswerTextBox.Tag 
    Sign_Box.Text = "/" 

С выше коде, я пытаюсь сделать то же самое, но я получаю ошибку:

Ошибка 1 Operator «>» не определено для типы «Integer» и «1-мерный массив Integer».

+1

В этом цикле ничего нет, он должен просто запереть компьютер, а не сбой. все, что вам нужно для пары случайных валов, это 'rand.Next (min, max + 1)', вы можете определить диапазон возвращаемого значения, используя класс Random. Нет цикла и гораздо меньше кода. – Plutonix

+1

Я не вижу никакого кода в цикле. Если 'values1' больше, чем' values2', он будет зацикливаться навсегда. Нет никакого кода, чтобы попытаться получить значения, которые вы хотите. – TyCobb

+1

У вас там опечатка. Удалите «s» так, чтобы «values2» становился «value2» в 'Do Untul values1> value2'. Ужасно названные переменные ... –

ответ

3

Вы можете устранить цикл полностью. Подумайте, каковы должны быть верхние/нижние границы ответа, и вызовы Rnd() генерируют только вторую часть вопроса и ответ . Затем вы можете точно определить первую часть вопроса. Это устраняет необходимость писать петлю вообще.

Кроме того, не рекомендуется звонить Randomize() более одного раза. В идеале вы можете использовать тот же метод Randomize() для всей программы или сегмента программы. Вот код:

Dim r As New Random() 
Dim value2 As Integer = r.Next(1,11) '1 inclusive, 11 is exclusive. allows values from 1 to 10 
Dim answer As Integer = r.Next(0,11-value2) '11-value2 keeps value1 from being higher than you want 

First_Number.Text = value2 + answer 
Sign_Box.Text = "-" 
Second_Number.Text = value2 
AnswerTextBox.Tag = answer 
AnswerTextBox.Text = AnswerTextBox.Tag 

Теперь для исходного кода. Ваш существующий код выходит из строя, потому что весь ваш цикл содержится в этом коде:

Do Until values1 > values2 
Loop 

Ничто из этого не имеет. Поскольку ни values1, ни values2 никогда не меняются в этом коде, если они начинают сбой при возникновении условия цикла, они будут всегда не работают, и ваш код застрял там.

Чтобы это исправить, вы можете изменить этот код:

Dim values2 As Integer = CInt(Int((10 * Rnd()) + 1)) 
Second_Number.Text = values2 
AnswerTextBox.Tag = values1 - values2 
AnswerTextBox.Text = AnswerTextBox.Tag 
Do Until values1 > values2 
Loop 

выглядеть следующим образом:

Dim values2 As Intege2 = CInt((10 * Rnd()) + 1) 
Do Until values1 > values2 
    values2 = CInt((10 * Rnd()) + 1) 
Loop 

Second_Number.Text = values2 
AnswerTextBox.Tag = values1 - values2 
AnswerTextBox.Text = AnswerTextBox.Tag 

Но опять же, это менее эффективно, чем избежать петли в первую очередь.

+0

У меня работает исходный код, вы можете взглянуть на второй код и помочь мне понять, почему это может не работать? – Jurdun

+0

Это мое редактирование –

+0

О, теперь я вижу редактирование на ваш вопрос. Чтобы исправить это, просто измените 'values1> values2' на' values1> value2' –

1

Это может быть не лучший способ сделать это, но используя то, что у вас есть, вы могли бы попробовать что-то вроде:

Dim values1 As Integer = 0 
Dim values2 As Integer = 0 

Do Until values1 > values2 
Randomize() 
values1 = CInt(Int((10 * Rnd()) + 1)) 

Randomize() 
values2 = CInt(Int((10 * Rnd()) + 1)) 

Loop 

First_Number.Text = values1 
Sign_Box.Text = "-" 
Second_Number.Text = values2 
AnswerTextBox.Tag = values1 - values2 
AnswerTextBox.Text = AnswerTextBox.Tag 
+0

@ j-melis Это сработало, извините, вы можете взглянуть на код 2, я не могу правильно его перестроить. – Jurdun

+1

@Jurdun - Я не уверен, что вы просите/ищете во втором блоке кода. –

+0

@ j-melis Мне нужно, чтобы он был точно таким же, как и вы. У меня большая часть из них отсортирована, но ошибки нет: Ошибка Оператор '>' не определен для типов Integer и 1-мерный массив Integer. - Я скопирую код, который я сделал до сих пор. – Jurdun

Смежные вопросы