Ошибка в цикле for, который работает без остановки

1

По сути, мой код настроен на то, чтобы выбросить дротики (10 000) по умолчанию на мишень, которая будет вычислять Pi. Если аргументы не введены, будет выдано по умолчанию 10 000 дротиков. Если пользователь вводит аргумент, то этим аргументом будет количество бросаемых дротиков.

Прямо сейчас программа будет запускать цикл for навсегда, без остановки. Я понимаю, что, поскольку моя программа не останавливается, цикл for не заканчивается. Это ошибка с тем, как я записываю второе условие в цикле for и как я инициализирую переменную numberOfDarts выше, но я не уверен, что делать.

public class PiEstimator {

  public static void main(String[] args) {

  int numberOfThrows = 0;

  if (args.length == 0) {

  numberOfThrows = 10000;      

}

if (args.length > 0) {

  numberOfThrows = Integer.parseInt(args[0]);

}

if (Integer.parseInt(args[0]) < 0) {
  System.out.println("Cannot throw a negative amount of darts");

}

int numberOfHits = 0;

System.out.println("start");

И цикл for написан так: (Сам цикл работает отлично, я считаю, что ошибка находится в пределах условий.)

for (int i = 0; i < numberOfThrows; i++) {

  double x = Math.random();
  double y = Math.random();

  numberOfThrows++;

  if (x*x + y*y <= 1) {
    numberOfHits++;
      System.out.println(x + " " + y + " in");
    }

  if (x*x + y*y > 1) {
      System.out.println(x + " " + y + " out");
    }

}

System.out.println("end");
System.out.println("Darts : " + numberOfThrows + " " + "Hits : " + numberOfHits + " " + "Pi Estimation : " + (4*((double)numberOfHits/(double)numberOfThrows)));

}

}

  • 5
    Нет ничего плохого в этих условиях. Ошибка должна быть в коде, который вы не показывали (тело цикла)
  • 0
    Я думаю, ваше значение numberofThrows отрицательно. Вы печатаете сообщение в этом случае, но все еще позволяете войти в цикл
Показать ещё 4 комментария
Теги:
for-loop
loops

3 ответа

3

Удали это

numberOfThrows++;

В противном случае цикл не будет завершен, так как условие остановки i < numberOfThrows, поэтому, если numberOfThrows продолжает расти, i никогда не пройду его (по крайней мере, до numberOfThrows пор, пока numberOfThrows переполнится и не станет отрицательным).

Кроме того, измените условия:

int numberOfThrows = 0;
if (args.length == 0) {
  numberOfThrows = 10000;      
}
if (args.length > 0) {
  numberOfThrows = Integer.parseInt(args[0]);
  if (Integer.parseInt(args[0]) < 0) {
    System.out.println("Cannot throw a negative amount of darts"); 
  }
}

Вы только хотите проверить отрицательный ввод, когда знаете, что есть вход.

  • 0
    Это прекрасно работает с добавленным аргументом! Однако, когда аргумент отсутствует (если я хочу установить значение по умолчанию 10 000), ошибка все равно появляется.
  • 0
    @etree хорошо работает для меня.
Показать ещё 6 комментариев
2

Проблема в том, что вы увеличиваете numberOfThrows на каждой итерации цикла, что заставляет цикл быть бесконечным. Предположим, что если

numberOfThrows=1
for (int i = 0; i <numberOfThrows ; i++) {
  numberOfThrows++
  numberOfThrows++  // if the if condition is also true

//next iteration loop would be
for (int i = 0; i < 3; i++) {  // and increases for other iteration causing it infinite
1

Вы увеличиваете количество бросков здесь:

numberOfThrows++;

Цикл никогда не заканчивается, потому что он идет от 0 до numberOfThrows, который продолжает расти. Удалите эту строку, и она будет работать нормально.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню