Создание треугольника с петлями

Кажется, я не могу найти ответ на этот вопрос.

Мне нужно нарисовать простой треугольник, использующий для циклов.

     *  
    ***
   *****
  *******
 *********

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

 *
 **
 ***
 ****
 *****



  for (int i=0; i<6; i++)
  {
  for (int j=0; j<i; j++)
  {
  System.out.print("*");
  }
  System.out.println("");
  }

Спасибо -

Ответ 1

Прежде всего, вам нужно убедиться, что вы производите правильное количество символов *. Нам нужно произвести 1, 3, 5 и т.д. Вместо 1, 2, 3. Это можно устранить, изменив переменные счетчика:

for (int i=1; i<10; i += 2)
{
    for (int j=0; j<i; j++)
    {
        System.out.print("*");
    }
    System.out.println("");
}

Как вы можете видеть, это приводит к тому, что i начинается с 1 и увеличивается на 2 на каждом шаге, если оно меньше, чем 10 (т.е. 1, 3, 5, 7, 9). Это дает нам правильное количество символов *. Затем нам нужно исправить уровень отступа на строку. Это можно сделать следующим образом:

for (int i=1; i<10; i += 2)
{
    for (int k=0; k < (4 - i / 2); k++)
    {
        System.out.print(" ");
    }
    for (int j=0; j<i; j++)
    {
        System.out.print("*");
    }
    System.out.println("");
}

Прежде чем печатать символы *, мы печатаем некоторые пробелы, а количество пробелов меняется в зависимости от линии, в которой мы находимся. Это то, что для цикла for с переменной k. Мы можем видеть, что k выполняет итерации по значениям 4, 3, 2, 1 и 0, когда ì 1, 3, 5, 7 и 9. Это то, чего мы хотим, потому что чем выше в треугольнике мы, тем больше места нам нужно разместить. Чем дальше мы спускаемся по треугольнику, тем меньше нам пространства и последней линии треугольника вообще не нужны пробелы.

Ответ 2

Веселое, простое решение:

for (int i = 0; i < 5; i++) 
  System.out.println("    *********".substring(i, 5 + 2*i));

Ответ 3

Я ценю, что OP является новым для Java, поэтому методы могут считаться "продвинутыми", однако я думаю, что стоит использовать эту проблему, чтобы показать, как вы можете атаковать проблему, разбивая ее на части.

Подумайте о том, как написать метод для печати одной строки, указав метод, номер строки которого:

public void printTriangleLine(int rowNumber) {
    // we have to work out what to put here
}

Нам нужно напечатать некоторое количество пробелов, затем некоторое количество звезд.

Посмотрев на пример, я вижу, что (если первая строка равна 0) это (5-rowNumber) пробелы и (2 * rowNumber + 1) звезды.

Придумайте метод, который печатает строки символов для нас и использует его:

public void printTriangleLine(int rowNumber) {
    printSequence(" ", 5 - rowNumber);
    printSequence("*", 2 * rowNumber + 1);
    System.out.println(); 
}

Это не будет компилироваться, пока мы на самом деле не напишем printSequence(), поэтому сделаем следующее:

public void printSequence(String s, int repeats) {
    for(int i=0; i<repeats; i++) {
        System.out.print(s);
    }
}

Теперь вы можете самостоятельно протестировать printSequence, и вы можете самостоятельно протестировать printTriangleLine. Пока вы можете просто попробовать, вызвав эти методы непосредственно в main()

public static void main(String [] args) {
    printSequence("a",3);
    System.out.println();
    printTriangleLine(2);
}

... запустите его и проверьте (своими глазами), что он выводит:

aaa
   *****

Когда вы переходите к программированию, вы захотите использовать инфраструктуру модульного тестирования, такую ​​как jUnit. Вместо того, чтобы печатать, вы, скорее всего, пишете такие вещи, как printTriangleLine, чтобы вернуть String (который вы напечатали выше в вашей программе), и вы автоматизировали бы тестирование с помощью команд, таких как:

assertEquals("   *****", TriangleDrawer.triangleLine(2));
assertEquals("     *", TriangleDrawer.triangleLine(0))

Теперь у нас есть части, которые нам нужно нарисовать треугольник.

public void drawTriangle() {
    for(int i=0; i<5; i++) {
        printTriangleLine(i);
    }
}

Код, который мы написали, немного длиннее ответов других людей. Но мы смогли протестировать каждый шаг, и у нас есть методы, которые мы можем использовать снова в других проблемах. В реальной жизни мы должны найти правильный баланс между разбиением проблемы на слишком много методов или слишком мало. Я предпочитаю много действительно коротких методов.

Для дополнительного кредита:

  • адаптируйте это, чтобы вместо того, чтобы печатать на System.out, методы возвращают String - поэтому в вашем main() вы можете использовать System.out.print(drawTriangle())
  • адаптируйте это, чтобы вы могли запросить drawTriangle() для разных размеров, то есть вы можете вызвать drawTriangle(3) или drawTriangle(5)
  • сделать работу более крупными треугольниками. Подсказка: вам нужно добавить новый параметр width для printTriangleLine().

Ответ 4

Сначала подумайте о решении без кода. Идея состоит в том, чтобы напечатать нечетное число *, увеличивающееся по строке. Затем центрируйте * с помощью пробелов. Знание максимального числа * в последней строке даст вам начальное число пробелов, чтобы центрировать первый *. Теперь напишите его в коде.

Ответ 5

Домашний вопрос? Ну, вы можете изменить свой оригинальный код "правильного треугольника", чтобы создать перевернутый "правый треугольник" с пробелами Так что это будет как

for(i=0; i<6; i++)
{
for(j=6; j>=(6-i); j--)
{
   print(" ");
}
for(x=0; x<=((2*i)+1); x++)
{
   print("*");
}
print("\n");
}

Ответ 6

Попробуйте это в Java

for (int i = 6, k = 0; i > 0 && k < 6; i--, k++) {
    for (int j = 0; j < i; j++) {
        System.out.print(" ");
    }
    for (int j = 0; j < k; j++) {
        System.out.print("*");
    }
    for (int j = 1; j < k; j++) {
        System.out.print("*");
    }
    System.out.println();
}

Ответ 7

  for (int i=0; i<6; i++)
  {
     for (int k=0; k<6-i; k++)
     {
        System.out.print(" ");
     }
     for (int j=0; j<i*2+1; j++)
     {
        System.out.print("*");
     }
     System.out.println("");
  }

Ответ 8

Это ответит на ваш вопрос. раскомментируйте прокомментированный код для отображения только внешней строки:)

public class TrianglePattern {

    public static void main(String[] args) {
        // This logic will generate the triangle for given dimension
        int dim = 10;
        for (int i = 0; i < dim; i++) {
            for (int k = i; k < dim; k++) {
                System.out.print(" ");
            }
            for (int j = 0; j <= i; j++) {
                //if (i != dim - 1)
                //  if (j == 0 || j == i)
                //      System.out.print("*");
                //  else
                //      System.out.print(" ");
                //else
                    System.out.print("*");
                System.out.print(" ");
            }
            System.out.println("");
        }
    }
}

Ответ 9

private static void printStar(int x) {
    int i, j;
    for (int y = 0; y < x; y++) { // number of row of '*'

        for (i = y; i < x - 1; i++)
            // number of space each row
            System.out.print(' ');

        for (j = 0; j < y * 2 + 1; j++)
            // number of '*' each row
            System.out.print('*');

        System.out.println();
    }
}

Ответ 10

Это позволяет вам немного контролировать и облегчать его создание:

public static int biggestoddnum = 31;

public static void main(String[] args) {
    for (int i=1; i<biggestoddnum; i += 2)
    {
        for (int k=0; k < ((biggestoddnum / 2) - i / 2); k++)
        {
            System.out.print(" ");
        }
        for (int j=0; j<i; j++)
        {
            System.out.print("*");
        }
        System.out.println("");
    }
}

Просто измените значение public static int biggestoddnum на любое нечетное число, которое вы хотите, и for(int k...) был протестирован для работы.