Метод switch не работает, как исправить?
программа, которая будет считывает с консоли комбинацию из 0 и 1 в любом порядке и выводит его цифры в виде звёздочек (см. рисунок). Пример: Ввод 1001 Вывод должен выглядеть примерно как рисунки индекса с конверта.
[![Пример вывода в картинке по ссылке][1]][1] [1]: https://i.stack.imgur.com/4f6Sv.jpg
Scanner scanner = new Scanner(System.in);
System.out.println("Input number");
int number = scanner.nextInt();
scanner.close();
String s = Integer.toString(number);
int[] intArray = new int[s.length()];
for (int i = 0; i < s.length(); i++) {
int n = 5; //ширина цифры
int mid = n / 2 + 1;
switch (intArray[i] ) {
case 0:
for (i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if ((j == 1 || j == n) || (i == 1 || i == n)) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
continue;
}
case 1:
for (i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (j == mid || i == n || (i + j == mid && j <= mid)) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
continue;
}
}
}
}
Мой код рисует только 01, вне зависимости от порядка и количества цифр в числе. Хотя по логике предполагала что если первая 1, код обратится к 1, если стоит 0, то к нулю. Как исправить? через if else вообще только 0 выводил и все.
Ответы (2 шт):
c 14 джавы можно через лямбду делать
int num = 2;
switch (num) {
case 1 -> System.out.println("one"); // один блок
case 2, 3 -> {
System.out.println("two and three"); // проваливание
System.out.println("можно несколько блоков");// + несколько блоков
}
default -> System.out.println("another");
}
Не проблема, но замечание (на работу кода не влияет): вы через Scanner считываете целое число, потом преобразовываете это число в строку, потом эту строку как бы преобразовываете в массив из цифр (на самом деле нет, см. далее) и по этому массиву собираетесь пройтись. Тут нет особого смысла изначально считывать целое число, чтобы потом опять преобразовать его в строку, можно сразу считать строку:
String s = scanner.nextLine();
Единственная разница - код не упадет с ошибкой, если ввести не число. Хотя и ваш код тоже никак не проверяет, что введены только цифры 1 или 0, другие цифры игнорируются.
Проблема 1: Строка int[] intArray = new int[s.length()]; только создает массив такого же размера, как введенная строка, но ничем не заполняет его. Получается просто массив из нулей.
То что массив пустой легко увидеть, если запустить код под отладчиком - вообще, если что-то не работает рекомендую использовать отладчик, так быстрее можно увидеть, в какой момент что-то пошло не так:

Исправление - избавляемся от дополнительного массива, просто итерируемся по строке, в switch проверяем символы строки, а не цифры:
String s = scanner.nextLine();
for (int i = 0; i < s.length(); i++) {
int n = 5; //ширина цифры
int mid = n / 2 + 1;
switch (s.charAt(i)) {
case '0':
// ...
case '1':
// ...
}
}
Проблема 2: во внешнем цикле переменная-счетчик i, и во внутренних циклах (которые внутри switch) используется эта переменная. Из-за этого внешний цикл завершится после первой же итерации, если длина введенной строки меньше высоты выводимых цифр, ну или завершится сильно раньше, чем должен был.
Исправление - в циклах внутри switch меняем переменные i на другое имя, например на k:
switch (s.charAt(i)) {
case '0':
for (int k = 1; k <= n; k++) {
for (int j = 1; j <= n; j++) {
if ((j == 1 || j == n) || (k == 1 || k == n)) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
continue;
}
case '1':
for (int k = 1; k <= n; k++) {
for (int j = 1; j <= n; j++) {
if (j == mid || k == n || (k + j == mid && j <= mid)) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
continue;
}
}
Проблема 3: из-за того, что в case '0' нет break;, на цифре 0 будет рисоваться и 0, и 1.
Добавляем break, заодно удаляем бесполезные continue в циклах:
switch (s.charAt(i)) {
case '0':
for (int k = 1; k <= n; k++) {
for (int j = 1; j <= n; j++) {
if ((j == 1 || j == n) || (k == 1 || k == n)) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
}
break;
case '1':
for (int k = 1; k <= n; k++) {
for (int j = 1; j <= n; j++) {
if (j == mid || k == n || (k + j == mid && j <= mid)) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println();
}
}
Проблема 4: цифры рисуются в столбик, а не в строчку:
Input number
1001
**
* *
*
*
*****
*****
* *
* *
* *
*****
*****
* *
* *
* *
*****
**
* *
*
*
*****
Это происходит потому, что на каждой итерации внешнего цикла сначала полностью отрисовывается одна цифра, потом вторая, потом третья. Нужно переделать так, чтобы сначала отрисовывались первые строки всех цифр, потом вторые строки всех цифр, и т.д. По сути нужно цикл по k (по строкам цифр) сделать внешним циклом:
int n = 5; //ширина цифры
int mid = n / 2 + 1;
for (int k = 1; k <= n; k++) {
for (int i = 0; i < s.length(); i++) {
switch (s.charAt(i)) {
case '0':
for (int j = 1; j <= n; j++) {
if ((j == 1 || j == n) || (k == 1 || k == n)) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
break;
case '1':
for (int j = 1; j <= n; j++) {
if (j == mid || k == n || (k + j == mid && j <= mid)) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
}
System.out.print(" "); // Пробел между цифрами
}
System.out.println(); // Перенос строки после отрисовки каждого ряда
}
Итог:
Input number
111001
** ** ** ***** ***** **
* * * * * * * * * * * *
* * * * * * * *
* * * * * * * *
***** ***** ***** ***** ***** *****
P.S. можно еще немного упростить код, если вынести цикл по j из switch, а в самом switch просто записывать в переменную, нужно ли рисовать звездочку или пробел:
for (int k = 1; k <= n; k++) {
for (int i = 0; i < s.length(); i++) {
for (int j = 1; j <= n; j++) {
boolean draw;
switch (s.charAt(i)) {
case '0':
draw = (j == 1 || j == n) || (k == 1 || k == n);
break;
case '1':
draw = j == mid || k == n || (k + j == mid && j <= mid);
break;
default:
continue; // Пропускать символы, не являющиеся '0' или '1'
}
System.out.print(draw ? "*" : " ");
}
System.out.print(" "); // Пробел между цифрами
}
System.out.println(); // Перенос строки после отрисовки каждого ряда
}