условие в моем цикле while кажется неправильным? - PullRequest
0 голосов
/ 21 февраля 2019

пытается написать программу, которая бросает кубик 3 раза, и как только вы получаете 3 6 с подряд, она печатает, сколько попыток потребовалось.возникли проблемы в конце кода, разница между ||и &&, похоже, что все наоборот, посмотрите ...


package javaapplication12;
import java.util.*;

public class JavaApplication12 {
public static void main(String[] args) {
  Random rand = new Random();
  // this should try to cast a die 3 times and keep doing that until we get 3 6s in a row and counter 
  // how many tries it takes to get that.
  int array[] = new int[3]; // creating 3 places for castin our die 3 times in a row
  int counter1 = 0; // creating a counter to track each time we try to cast 3 die ( 3 cast = 1 try)
  do{

      counter1++; 
      System.out.println("try " + counter1); // prints out counter in the beginning of every try.

      for (int counter = 0; counter < array.length; counter++ ){
          array[counter]=(rand.nextInt(6)+1);  // a loop that fills the array with random numbers from 1-6
      }
      for(int x: array)
          {System.out.println(x);} // this is for our own to check if we have 3 6s in a row,
                                   // prints out all the numbers in out array
  }

  //so this is the I'veusing part, i've written 3 scenarios that can be written for the condtion in our
  // do- while loop...

  while (array[0]+array[1]+array[2] != 18); // this works just fine.

  while (array[0] !=6 || array[1] != 6 || array[2] != 6); // imo this should not work but surprisingly it does

  while (array[0] !=6 && array[1] != 6 && array[2] != 6); // this should work, but it doesnt.


  } 
}

Ответы [ 5 ]

0 голосов
/ 21 февраля 2019

Обычно:

do{
    something....
}while(some condition is true);

Если вы хотите выразить это с помощью оператора '&&'

do{
    something....
}
while (!(array[0] == 6 && array[1] == 6 && array[2] == 6));

, что означает

  do { 
     something...
  }while(the expression every element in the array is equal to 6 is false);
0 голосов
/ 21 февраля 2019

Я полагаю, что ваше замешательство проистекает из законов отрицания Де Моргана .По сути, когда у вас есть отрицание группы условий, вы должны изменить && на || и наоборот, когда отрицаете отдельные условия.

Или просто поставить:

!(A && B) == !A || !B
!(A || B) == !A && !B

В вашем случае вы хотите сделать это:

!(array[0] == 6 && array[1] == 6 && array[2] == 6)

aka.«хотя это неправда, что первое - это 6, а второе - это 6, а третье - это шесть»

Из-за вышеуказанного закона, чтобы ввести ! внутрь, вам нужно изменить &&для ||, в результате чего

!(array[0] == 6) || !(array[1] == 6) || !(array[2] == 6)

упрощается до

array[0] != 6 || array[1] != 6 || array[2] != 6
0 голосов
/ 21 февраля 2019

Вот как это должно было работать.Это:

do{
}while(array[0] !=6 && array[1] != 6 && array[2] != 6)

означает, что пока условие истинно, цикл будет продолжаться.Другими словами, если любая из частей оценивается как ложная, цикл останавливается.Так что если array[0]==6, то цикл оборвется.

0 голосов
/ 21 февраля 2019
 while (array[0] !=6 || array[1] != 6 || array[2] != 6);

Это работает нормально, потому что это означает: «хотя одна из трех попыток не равна 6»

, поэтому условие выхода: «все кубики 6»

while (array[0] !=6 && array[1] != 6 && array[2] != 6);

Это не работает, потому что это означает: «хотя ни одна из трех попыток не равна 6»

, поэтому условие выхода: «по крайней мере, один кубик равен 6»

 while (array[0]+array[1]+array[2] != 18);

Это работает нормально, потому что означает: «сумма результата кубика равна 18»

, поэтому условие выхода: «все кубики равны 6» (потому что это единственный способ суммировать 18)

0 голосов
/ 21 февраля 2019

Ваше первое условие: сумма не равна 18, поэтому она действительно должна работать правильно.

Второе условие: по крайней мере один кубик не равен 6, поэтому он также должен работать правильно.

Ваше последнее условие: ни один кубик не равен 6, поэтому он сломается, даже если один бросок бросит 6, поэтому имеет смысл, что он не работает.

ОБНОВЛЕНИЕ: И (&&) означает, что обастороны аргументов должны быть истинными, чтобы выходные данные были истинными, ИЛИ (||) означает, что одна сторона аргументов должна быть истинной, чтобы результат был истинным.

Вам необходимо вернуться к основномуоперации булева алгебра .

...