"Перекошенный" треугольник со звездочками в Java

Я действительно не понимаю, почему все отрицательные голоса:

  • Я опубликовал свой предварительный прогноз.
  • Хорошо объяснили, что было нужно
  • Я тщательно исследовал эту тему, но обнаружил, что для такого начинающего, как я (я начал заниматься Java несколько недель назад), совсем другие вещи были совершенно другими.
  • Честно говоря, единственная проблема, которую я вижу здесь, это то, что люди отклоняют вопрос, потому что они не читали ветку или потому, что они считают кого-то ленивым, не зная, что происходит.

Я учу Java.

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

Я не могу понять, почему это не работает, как предполагалось. Мне просто нужна свежая пара глаз (и предложения о том, как научиться видеть эти вещи самостоятельно).

Выход для 3 на данный момент:

*
**
***
*
**

вместо

*
**
***
**
*

Ниже приведен мой код с объяснением того, что я пытался сделать:

/*

    Write a program that asks the user to enter the size of a triangle (an integer
    from 1 to 50). Display the triangle by writing lines of asterisks. The first
    line will have one asterisk, the next two, and so on, with each line having one
    more asterisk than the previous line, up to the number entered by the user.
    On the next line write one fewr asterisk and continue by decreasing the number
    of asterisk by 1 for each successive line until only one asterisk is displayed.
    Hint: use nested for loops; the outside loop controls the number of lines to
    write, and the inside loop controls the number of asterisks to display on a line)
    For example, if the user enters 3, the output would be:
    *
    **
    ***
    **
    *

*/

import java.util.Scanner;

public class Triangles
{
    public static void main (String[] args)
    {
        Scanner kb = new Scanner(System.in);
        System.out.println("Enter the number of your triangle (1 to 50):");
        int userInput = kb.nextInt();
        int minus = userInput -1;
        int lineNumber = userInput + minus;
        int half = (lineNumber / 2) + 1;

        for(int i = 1; i <= half; i++)
        {
            System.out.println("");
            for (int j = 1; j <= i; j++)
            {
                System.out.print("*");
            }
        }
        for (int i = minus; i >= 1; i--)
        {
            System.out.println("");
            for (int j = minus; j >= i; j--)
            {
                System.out.print("*");
            }
        }
    }
}

5 ответов

Решение

Просто измените внутренний цикл:

for (int i = minus; i >= 1; i--)
{
    System.out.println("");
    for (int j = 1; j <= i; j++)
    {
        System.out.print("*");
    }
}

В то время как внешний цикл уменьшается, внутренний цикл должен увеличиваться

Весь код будет:

Scanner kb = new Scanner(System.in);
System.out.println("Enter the number of your triangle (1 to 50):");
int userInput = kb.nextInt();//3
int minus = userInput -1;//2
int lineNumber = userInput + minus;//5
int half = (lineNumber / 2) + 1;//3

for(int i = 1; i <= half; i++){
    System.out.println("");
    for (int j = 1; j <= i; j++){
        System.out.print("*");
    }
}
for (int i = minus; i >= 1; i--){
    System.out.println("");
    for (int j = 1; j <= i; j++){
        System.out.print("*");
    }
}

Результат:

Результат

Это хороший короткий способ сделать это:

private static void test(int n) {
    char[] buf = new char[n];
    Arrays.fill(buf, '*');
    for (int row = 1 - n; row < n; row++)
        System.out.println(new String(buf, 0, n - Math.abs(row)));
}

Тестовое задание

public static void main(String[] args) {
    test(5);
}

Выход

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

Вы можете попробовать что-то вроде этого:

Scanner kb = new Scanner(System.in);
System.out.print("Enter the number of your triangle (1 to 50): ");
int input = kb.nextInt();
for (int i = 0; i < input; i++) {
  System.out.println();
  for (int j = 0; j <= i; j++) {
    System.out.print("*");
  }
}
for (int i = input - 1; i > 0; i--) {
  System.out.println();
  for (int j = 0; j < i; j++) {
    System.out.print("*");
  }
}

Пример вывода для 5:

Enter the number of your triangle (1 to 50): 5

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

Process finished with exit code 0

Измените внутренний цикл на это. Я проверил это, и он прекрасно работает:

        //for (int j = minus; j >= i; j--) // <--old line
        for (int j = 0; j<i; j++) //<--new line
        {
            System.out.print("*");
        }

Вы могли бы попробовать

  for (int i = minus; i >= 1; i--)
        {
            System.out.println("");
            for (int j = minus; j >= 0 /* it was i */; j--)
            {
                System.out.print("*");
            }
        }

или же

int add = 1;
int asterics = 1;
while(asterics >0){
   if(asterics == userInput)
   {
      add = -1; // switch to decrement
   }
   for(int i=0;i<asterics;i++){
      System.out.print("*");
   }
   asterics += add;
}
Другие вопросы по тегам