Вывод ромбовидной формы ASCII с использованием циклов

Я пытаюсь написать программу на Java, которая захватывает целое число от пользователя (предположим, что данные действительны), а затем выводит форму ромба в зависимости от размера целого числа, т.е. пользователь вводит 5, вывод будет:

--*--
-*-*-
*---*
-*-*-
--*--

Пока у меня есть:

if (sqr < 0) {
    // Negative
    System.out.print("#Sides of square must be positive");
}
if (sqr % 2 == 0) {
    // Even
    System.out.print("#Size (" + sqr + ") invalid must be odd");
} else {
    // Odd
    h = (sqr - 1) / 2; // Calculates the halfway point of the square
    // System.out.println();
    for (j = 0; j < sqr; j++) {
        for (i = 0; i < sqr; i++) {
            if (i != h) {
                System.out.print(x);
            } else {
                System.out.print(y);
            }
        }
        System.out.println();
    }
}

Который просто выводит:

--*--
--*--
--*--
--*--
--*--

Я думал об уменьшении значения h, но это дало бы только левую сторону ромба.


person Michael    schedule 25.10.2011    source источник


Ответы (3)


void Draw(int sqr) {
    int half = sqr / 2;
    for (int row = 0; row < sqr; row++) {
        for (int column = 0; column < sqr; column++) {
            if ((column == Math.abs(row - half))
                    || (column == (row + half))
                    || (column == (sqr - row + half - 1))) {
                System.out.print("*");
            } else {
                System.out.print("_");
            }
        }
        System.out.println();
    }
}

Хорошо, теперь это код, но, как я видел, С.Л. Комментарий Барта Я только что понял, что это домашнее задание. Поэтому я настоятельно рекомендую вам понять, что написано в этом коде, прежде чем использовать его как окончательный. Не стесняйтесь задавать любые вопросы!

person Calin Paul Alexandru    schedule 25.10.2011

Взгляните на свое состояние:

if (i != h)

Это касается только столбца с номером i и средней точки h. Вам нужно условие, которое смотрит на номер столбца и номер строки. Точнее, вам нужно условие, которое смотрит на номер столбца, номер строки и расстояние номера столбца от средней точки.
Поскольку это вопрос домашнего задания, я оставляю вам определение точной формулы, но я готов дать еще несколько советов, если они вам понадобятся. Удачи!

person S.L. Barth    schedule 25.10.2011

Вы можете использовать два вложенных цикла for от -h до h, где h — половина ромба. Грань алмаза получается, когда:

Math.abs(i) + Math.abs(j) == h

Если пользователь вводит n=5, затем h=2, ромб выглядит так:

n=5, h=2
--*--
-*-*-
*---*
-*-*-
--*--

Попробуй онлайн!

// user input
int n = 9;
// half a diamond
int h = n / 2;
// output a diamond shape
System.out.println("n=" + n + ", h=" + h);
for (int i = -h; i <= h; i++) {
    for (int j = -h; j <= h; j++) {
        if (Math.abs(i) + Math.abs(j) == h) {
            System.out.print("*");
        } else {
            System.out.print("-");
        }
    }
    System.out.println();
}

Выход:

n=9, h=4
----*----
---*-*---
--*---*--
-*-----*-
*-------*
-*-----*-
--*---*--
---*-*---
----*----
person Community    schedule 27.03.2021