Рисование елок с помощью вложенных циклов - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь нарисовать в консоли рождественские елки, которые будут выглядеть примерно так, в зависимости от высоты, в которую входит пользователь. Вот правила.Верхняя часть: в прямоугольнике / треугольнике столько строк, сколько и числа, введенного пользователем.Ширина прямоугольника / треугольника на единицу меньше, чем удвоенная высота дерева (например, дерево высотой 5 имеет ширину 9).В случае треугольника основание верхней части направлено вправо к левому краю, и каждая строка над ним имеет отступ на один пробел дальше и на два символа короче.В результате получается равнобедренный треугольник, похожий на верхушку ели или ели.Нижняя часть: Прямоугольник ниже центрируется под прямоугольником (для Плоского дерева) или треугольником (для Рождественского дерева).Его высота составляет более одной пятой высоты верхней части.Например, прямоугольник дерева выше имеет две строки, так как 9 ÷ 5 + 1 равно 2. Ширина прямоугольника составляет одну треть от ширины дерева - но добавьте один, если эта ширина получается четной.Например, треугольник высотой 5 имеет ширину 9, поэтому ширина прямоугольника равна 3 (это 9 ÷ 3).Дерево высоты 4, однако, имеет основание ширины 7. Его прямоугольник будет иметь ширину 3 (т. Е. 7 ÷ 3 равно 2, что является четным, поэтому измените его на 3).

How tall should the top of the tree be? 7
Flat Tree:
*************
*************
*************
*************
*************
*************
*************
    *****
    *****
Xmas Tree:
      *
     ***
    *****
   *******
  *********
 ***********
*************
    *****
    *****

На данный момент это мой код, TreeStructures.java

import java.util.Scanner;

public class TreeStructures {

public static void main(String[] args) {
    Scanner scnr = new Scanner(System.in);
    int height;
    System.out.print("How tall should the top of the tree be? ");
    height = scnr.nextInt();
    int topWidth = (height * 2) - 1;
    int bottomWidth = topWidth/3;
    System.out.println();
    if (height >= 5 && height <= 20) {
        if(bottomWidth % 2 == 0) {
            bottomWidth = (topWidth/3) + 1;
        }
        // FLAT TREE -----------------------------------------
        System.out.println("Flat tree:");
        // first for loop to print number of rows
        for (int i = 1; i <= height; i++) {
            // second for loop to print stars to create rectangle
            for (int stars = 1; stars <= topWidth; stars++) {
                System.out.print("*");
            }
            // println to print rows in.
            System.out.println();
        }
        // first for loop to print out rows for the bottom part of tree
        for (int i = 0; i <= (height / 5) + 1; i++) {
            // for loop to print the bottom part of the tree
            for (int j = 0; j <= bottomWidth - 1; j++) {
                System.out.print(" ");
            }
            for (int j = 0; j <= bottomWidth - 1; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

        // XMAS TREE --------------------------------------------
        System.out.println("Xmas tree:");
        // NESTED LOOPS
        // first for loop to print amount of rows
        for (int i = 0; i < height; i++) {
            // second for loop for print out spaces to match the tree level
            for (int j = 1; j < height - i; j++) {
                System.out.print(" ");
            }
            // third for loop to print out stars
            for (int k = 0; k < (2 * i + 1); k++) {
                System.out.print("*");
            }
            System.out.println();
        }
        // first for loop to determine amount of rows for bottom
        for (int i = 0; i <= (height / 5); i++) {
            // for loop to print the bottom part of the tree
            for (int j = 0; j <= bottomWidth - 1; j++) {
                System.out.print(" ");
            }
            for (int j = 0; j <= bottomWidth - 1; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    } else {
        System.out.println("Sorry, i can only take heights between 5 and 20"
                + "\nQuitting now...");
    }


}

}

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

мой вывод сейчас выглядит следующим образом.

How tall should the top of the tree be? 8
Flat tree:
***************
***************
***************
***************
***************
***************
***************
***************
     *****
     *****
     *****
Xmas tree:
       *
      ***
     *****
    *******
   *********
  ***********
 *************
***************
     *****
     *****

но когда я ввожу любое другое число, например, 6, 5, 8 ... дно не центрируется

1 Ответ

0 голосов
/ 22 февраля 2019

Поскольку у вас есть 1/3 для стебля, пространства с обеих сторон также составляют 1/3 всей ширины.Общая формула будет (width-stemWidth) / 2, что в данном случае даст 1/3 ширины.

Я удалил модуль и заменил его на «(высота -1) / 5 +1» - этоокругляет до следующего большегоТаким образом, если высота равна 1,2,3,4 или 5, это дает 1 (что включает в себя 0: 2 строки), а если высота находится в 6,7,8,9 или 10, это дает 2 (то есть 0: 3ряды) и тд.Я не уверен, но подумал, что это то, чего вы хотели достичь с помощью модуля.

import java.util.Scanner;

public class TreeStructures {

    static Scanner scnr = new Scanner(System.in);
    static int height;

    public static void main(String[] args) {

        System.out.print("How tall should the top of the tree be? ");
        height = scnr.nextInt();
        System.out.println();
        if (height >= 5 && height <= 20) {
            System.out.println("Flat tree:");
            flatTree();
            System.out.println("Xmas tree:");
            xmasTree();
        } else {
            System.out.println("That's not a valid size. I can only do trees from 5 to 20");
            System.out.println("Quitting now.");
        }

    }

    public static void flatTree() {
        int width = (height * 2) - 1;
        // first for loop to print number of rows
        for (int i = 1; i <= height; i++) {
            // second for loop to print stars to create rectangle
            for (int stars = 1; stars <= width; stars++) {
                System.out.print("*");
            }
            // println to print rows in.
            System.out.println();
        }
        //first for loop to print out rows for the bottom part of tree
        for (int i = 0; i <= height / 5; i++) {
            if (height % 2 == 0) {
                for (int j = 0; j <= ((width) / 3) + 1; j++) {
                    System.out.print("*");

                }
            } else {

                //second for loop to print out width for the bottom part of the tree
                for (int j = 0; j <= (width) / 3; j++) {
                    System.out.print("*");

                }
            }
            System.out.println();
        }

    }

    public static void xmasTree() {
        int width = height * 2 - 1;
        // NESTED LOOPS
        // first for loop to print amount of rows
        for (int i = 0; i < height; i++) {
            // second for loop for print out spaces to match the tree level
            for (int j = 0; j < height - i; j++) {
                System.out.print(" ");
            }
            // third for loop to print out stars
            for (int k = 0; k < (2 * i + 1); k++) {
                System.out.print("*");
            }
            System.out.println();
        }
        // first for loop to determine amount of rows for bottom
        for (int i = 0; i <= (height-1) / 5 +1 ; i++) {
                // for loop to print the bottom part of the tree
                for (int j = 0; j <= width/3; j++) {
                    System.out.print(" ");
                }
                for (int j = 0; j <= (width) / 3; j++) {
                    System.out.print("*");
                }
                System.out.println();
        }

    }

}

output:

How tall should the top of the tree be? 10

Flat tree:
*******************
*******************
*******************
*******************
*******************
*******************
*******************
*******************
*******************
*******************
********
********
********
Xmas tree:
          *
         ***
        *****
       *******
      *********
     ***********
    *************
   ***************
  *****************
 *******************
       *******
       *******
       *******

Если вы хотите, чтобы в любом случае он был хорошо отцентрирован, вам нужно обманутьнемного и изменить ширину стебля.

Для этого: Мы знаем, что дерево должно выглядеть так:

witdh = пробел * ширина ствола + пробел

Из этого мы можемлегко вычесть, разрыв составляет

разрыв = (с шириной ствола) / 2

Теперь вставьте, что ширина снова равна:

ширина = (с шириной ствола) / 2+ stemwidth + (with-stemwidth) / 2

Из этого мы можем вычесть:

stemwidth = witdh - 2 * ((with-stemwidth) / 2).

Ну, можно оценить правильность и показать, что это уравнение является правильным

В дискретной математике мы должны принять во внимание раундинг и остатки.

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

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

public static void xmasTree() {
    int width = height * 2 - 1;
    int stem = width - 2*width/3; 
    // NESTED LOOPS
    // first for loop to print amount of rows
    for (int i = 0; i < height; i++) {
        // second for loop for print out spaces to match the tree level
        for (int j = 0; j < height - i; j++) {
            System.out.print(" ");
        }
        // third for loop to print out stars
        for (int k = 0; k < (2 * i + 1); k++) {
            System.out.print("*");
        }
        System.out.println();
    }
    // first for loop to determine amount of rows for bottom
    for (int i = 0; i <= (height - 1) / 5 + 1; i++) {
        // for loop to print the bottom part of the tree
        for (int j = 0; j <= width / 3; j++) {
            System.out.print(" ");
        }
        //here we put the formula to use, instead of using width/3, the equivalent is used, that takes rounding into account.
        for (int j = 0; j < width - 2*(width/3); j++) {
            System.out.print("*");
        }
        System.out.println();

    }
...