Создаем базу для моей рождественской елки

#java #loops

#java #циклы

Вопрос:

Я пытаюсь создать рождественскую елку с введенной пользователем треугольной вершиной и прямоугольным основанием, но в настоящее время я застрял при создании базы. Спецификации следующие: треугольник начинается с одного * и увеличивает количество * в каждой строке в общей сложности на 2 в строке, так что конечная строка равна 2 (n) -1, где n является введенной высотой треугольника. Высота прямоугольника (пня) под деревом равна 1 плюс (1/5) n, а ширина пня равна 1/3n. Однако, если результат 1/3n является четным целым числом, добавьте 1 к общей ширине пня. (т. е. Ширина пня всегда является нечетным числом.) Вот что у меня есть на данный момент, треугольная часть дерева в порядке, но прямоугольная — беспорядок.

 public class xmasTree {

    public static final int TREE_MAXIMUM = 20;
    public static final int TREE_MINIMUM = 3;

    public static void main(String[] args) {

        Scanner keyboard = new Scanner(System.in);

        //User introduction 
        System.out.println("This program prints a "Christmas" tree. You "
              "choose how big the tree will be (within reason);

        // prompt for and get user input
        System.out.println("How tall should the top of the tree be?");
        int treeHeight = keyboard.nextInt();
        while (treeHeight < TREE_MINIMUM || TREE_MAXIMUM < treeHeight) {
            System.out.println("That's not a valid size.  I can only do trees "
                  "from 3 to 20.");
            System.out.println("Qutting now.");
            System.exit(0);
        }

        //Print the top triangle section of the christmas tree
        for (int i = 0; i < treeHeight; i  ) {
            for (int j = 0; j < treeHeight - i; j  ) {
                System.out.print(" ");
            }
            for (int k = 0; k < (2 * i   1); k  ) {
                System.out.print("*");
            }
            System.out.println();
        }
        //Print the bottom rectangle section of the tree
        for (int c = 0; c <= (1   (treeHeight / 5)); c  ) {
            for (int d = 0; d <= (treeHeight / 3); d  ) {
                System.out.print("");
            }
            System.out.printf("*");
        }

    }
}
  

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

Комментарии:

1. Можете ли вы добавить выходные данные?

2. Чего вы ожидаете print("") от меня?

Ответ №1:

Во-первых, вам нужно визуализировать, каким должен быть ваш результат.

Например, n = 8 , таким образом, база должна быть 1 n/5 = 2 высокой и n / 3 = 2 скорректирована на 3 ширину.

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

В вашем коде есть следующие проблемы:

  • print("") это бессмысленное утверждение. Это ничего не дает.
  • Вы не печатаете никаких начальных пробелов для отступов.
  • Вы не печатаете * для количества, равного ширине базы.
  • Вы не вызываете println() поэтому базовая высота определенно не будет работать.

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

Ответ №2:

И если вы заставите свой цикл for начинаться с 0, то не используйте знак равенства, так как он будет работать на 1 раз больше, чем вы ожидаете

Ответ №3:

У вас почти получилось, всего пара комментариев к вашему коду:

  • В последнем for вам следовало использовать < вместо <=, как вы делали в начале
  • У вас были четкие правила, поэтому вам просто нужно было записать их в свой код, как я сделал в своем коде, попробуйте сделать это более понятным, найдите высоту и ширину пня, прежде чем записывать его
  • Во внутреннем for вы должны были распечатать *, а во внешнем for вам просто нужно было напечатать новую строку

    Клавиатура сканера = новый сканер (System.in );

         //User introduction 
        System.out.println("This program prints a "Christmas" tree. You "
              "choose how big the tree will be (within reason)");
    
        // prompt for and get user input
        System.out.println("How tall should the top of the tree be?");
        int treeHeight = keyboard.nextInt();
        while (treeHeight < TREE_MINIMUM || TREE_MAXIMUM < treeHeight) {
            System.out.println("That's not a valid size.  I can only do trees "
                  "from 3 to 20.");
            System.out.println("Qutting now.");
            System.exit(0);
        }
    
        //Print the top triangle section of the christmas tree
        for (int i = 0; i < treeHeight; i  ) {
            for (int j = 0; j < treeHeight - i; j  ) {
                System.out.print(" ");
            }
            for (int k = 0; k < (2 * i   1); k  ) {
                System.out.print("*");
            }
            System.out.println();
        }
        //Print the bottom rectangle section of the tree
        int stumpHeight = (1   (treeHeight / 5));
        int stumpWidth;
        if ((treeHeight / 3) % 2 == 0) {
            //it is even add 1
            stumpWidth = (treeHeight / 3)   1;
        } else {
            //it is odd keep it like that
            stumpWidth = (treeHeight / 3);
        }
        for (int c = 0; c < stumpHeight; c  ) {
            //sorry for adding the spaces but I don't like the incomplete answers
            //centering
            for (int d = 0; d < treeHeight - stumpWidth/2; d  ) {
                System.out.print(" ");
            }
            //adding stump
            for (int d = 0; d < stumpWidth; d  ) {
                System.out.print("*");
            }
            //going to the next line
            System.out.println();
        }