Изучение вложенного цикла while в Java - PullRequest
3 голосов
/ 12 февраля 2011

В этой программе внутренний цикл генерирует случайные числа из 100 и затем перестает генерировать их, когда случайное число равно 7. Внешний цикл повторяет внутренний цикл 100 раз.
почему мой внешний цикл не продолжает переделывать внутренний цикл?
Кажется, он сделал это только один раз.

package test;


public class Loops {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int i = 0;
        int sum = 0;
        int counter = 0;
        String randomNumberList = " ";
        int c = 0;
        while (c != 100){

            while (i != 7) {
            i = (int) (101 * Math.random());
            sum += i;
            ++counter;
            randomNumberList += " " + i;
            }
        System.out.print("\n loop repeated" + counter+ " times and generated these numbers: " + randomNumberList);
            ++c;
        }

    }

}

Ответы [ 3 ]

7 голосов
/ 12 февраля 2011

Внутренний цикл работает до тех пор, пока i = 7. После его завершения я по-прежнему равен 7, поэтому он не запустится снова, пока вы не измените i на какое-либо другое значение.- цикл while должен прояснить проблему.

4 голосов
/ 12 февраля 2011

Просто потому, что вы не сбрасываете i до запуска внутреннего цикла (или после его завершения).

Следовательно, во второй и последующих итерациях внешнего цикла вы попадаете во внутренний оператор while, но условие i != 7 по-прежнему false и вы не выполняете тело внутреннего цикла. 1007 *

Простым решением было бы добавить i = 0 непосредственно перед внутренним while.

Более элегантным решением было бы заменить внутренний while на do ... while.

0 голосов
/ 12 февраля 2011

Лучшее решение - использовать для циклов вместо циклов while и сократить область видимости переменных. Это приводит к более чистому и более идиоматическому стилю кодирования:

import java.util.Random;

...

public static void main(String[] args) {
    Random rand = new Random();

    for (int c = 0; c < 100; ++c) {
        String randomNumberList = " ";
        int sum = 0;
        int counter = 0;
        for (int i = 0; i != 7; ++counter) {
            i = rand.nextInt(101);
            sum += i;
            randomNumberList += " " + i;
        }
        System.out.println("loop repeated " + counter+ " times and generated these numbers: " + randomNumberList);
    }
}

Некоторые примечания по вышеуказанным изменениям:

  1. Вы обнаружите, что усеченный цикл скрывал ошибку, вызванную тем, что ваши переменные были инициализированы только один раз перед входом во внешний цикл. Исправлена ​​ограниченная область действия randomNumberList, sum и counter.
  2. Как правило, лучше печатать \n в конце строки, а не в начале, особенно в Unix, где командная строка помещается в конце последней строки вывода, если только вы не завершаете последнюю строку с помощью новая линия. А еще лучше, чтобы избежать проблемы, используя println, как показано выше.
  3. Если вы хотите генерировать случайные числа от нуля до 100, Random.nextInt() достигает того же результата без математических вычислений и преобразований с плавающей запятой.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...