Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Почему цикл останавливается на 9?

Артем Колегов Ученик (171), на голосовании 8 месяцев назад
Дошло дело до arraylist и т.д. Хочу сгенерить номера,но на регионах счет останавливается на 9.
код:
import java.util.Scanner;
import java.util.HashSet;
import java.util.TreeSet;
import java.util.ArrayList;

public class Main
{
public static void main(String[] args)
{
String[] letters = {"С" , "М" , "Т" , "В" , "А" , "Р" , "О" , "Н" , "Е" , "У"};
String firstNumber = "000";
int number = Integer.parseInt(firstNumber);
int regions = 197;
int region = 1;
ArrayList<String> first = new ArrayList<>();

numbersGeneration(first , letters);
}
private static void numbersGeneration (ArrayList<String> array , String[] letter)
{
long start = System.currentTimeMillis();
int number = 111;
int region = 1;
int regions = 197;
do {
while (number < 1000) {
for (int j = 0; j < letter.length; j++) {
String blatnoiNumber = letter[j] + number + letter[j] + letter[j] + " " + region;
System.out.println( "\n" + blatnoiNumber);
array.add(blatnoiNumber);
System.out.println("Добавлено!");
}
number += 111;
region++;
}
}while(region < 198);
long end = System.currentTimeMillis();
int time = (int)(end - start);
System.out.println("\nОперация заняла " + time + " мс");
}

}
При запуске region доходит до 9 и все,принт дальше ничего не показывает, хотя должен до 197.Последняя команда при этом не запускается, значит, что цикл продолжается, но вывода нет. Что такое?
Голосование за лучший ответ
Александр Рогачёв Знаток (478) 9 месяцев назад
Разбери подробнее свои циклы.
Какая-то каша с ними.
А так да, цикл идёт до тех пор пока number меньше 1000, при этом на каждой итерации ты прибавляешь к нему 111. Т.е. всего таких итераций может быть 9.
В тоже время в каждой из этих же итераций ты прибавляешь 1 к региону. Т.е. и регион может получить максимум 9.
Получается у тебя внешний цикл работает бесконечно. Бесконечно вызывая внутри себя цикл в котором регион получает значения от 1 до 9.
Jurijus Zaksas Искусственный Интеллект (445767) 9 месяцев назад
Очевидно потому, что 1000/111=9
Аккуратнее с циклами.
Татьяна Просветленный (36374) 9 месяцев назад
Ваш код имеет логическую ошибку во вложенных циклах. Вы увеличиваете переменную region внутри цикла while, который зависит от переменной number. Это означает, что когда number достигает 1000, цикл while прерывается, и region увеличивается на 1 в цикле do-while. Затем number сбрасывается на 111, и цикл while повторяется, но только для одного значения region. Поэтому вы видите только номера для регионов от 1 до 9.

Чтобы исправить это, вам нужно увеличивать region внутри цикла for, который зависит от массива letter. Таким образом, вы будете генерировать номера для всех регионов для каждого значения number.
Исправленный код и проверенный что цикл все работает до конца:
 import java.util.Scanner;  
import java.util.HashSet;
import java.util.TreeSet;
import java.util.ArrayList;

public class Main
{
public static void main(String[] args)
{
String[] letters = {"С" , "М" , "Т" , "В" , "А" , "Р" , "О" , "Н" , "Е" , "У"};
String firstNumber = "000";
int number = Integer.parseInt(firstNumber);
int regions = 197;
int region = 1;
ArrayList first = new ArrayList<>();

numbersGeneration(first , letters);
}
private static void numbersGeneration (ArrayList array , String[] letter)
{
long start = System.currentTimeMillis();
int number = 111;
int region = 1;
int regions = 197;
do {
while (number < 1000) {
for (int j = 0; j < letter.length; j++) {
String blatnoiNumber = letter[j] + number + letter[j] + letter[j] + " " + region;
System.out.println( "\n" + blatnoiNumber);
array.add(blatnoiNumber);
System.out.println("Добавлено!");
region++; // переместить сюда
}
number += 111;
// region++; // удалить отсюда
}
}while(region < 198);
long end = System.currentTimeMillis();
int time = (int)(end - start);
System.out.println("\nОперация заняла " + time + " мс");
}

}
Похожие вопросы