Устранение неполадок при выводе текста - PullRequest
0 голосов
/ 03 октября 2019

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

Вот код на данный момент:

public class TreeStructures {

    public static void main(String[] args) {
        Scanner scnr = new Scanner(System.in);

        int height = 0;
        int weidth = 0;
        int weidth2 = 0;

        //Introduction
        System.out.println("Tree Structures");
        System.out.println("---------------\n");
        System.out.println("This program prints two tree like structures! ");
        System.out.println("A \"Flat\" tree and a \"Christmas\" tree.");
        System.out.println("You choose how big the trees will be.\n");
        System.out.println("By Daniel Sousa (A00433806)\n");

        //User input
        System.out.print("How tall should the top of the tree be? ");
        height = scnr.nextInt();
        System.out.println();

        //Input check
        if (height > 4 && height < 21) {            
            System.out.println("Flat Tree:");

            //Top Square
            for (int i = 1; i <= height; i++) {
                System.out.println(" ");
                for (int j = 0; j <= (height*2) - 2; j++) {
                    System.out.print("*");
                    weidth = j;
                }
            }
            //Bottom Square
            for (int i = 1; i <= (height/5) + 1; i++) {
                System.out.println(" ");
                for (int k = 1; k <= (weidth - weidth2)/2; k++) {
                System.out.print(" ");
                }
                for (int j = 0; j <= weidth/3; j++) {
                    System.out.print("<");
                    weidth2 = j;
                }

            }
        }

        //Invalid Input
        else {
            System.out.println("That's not a valid size.  "
                    + "I can only do trees from 5 to 20.\n");
            System.out.println("Quitting now.\n");
            System.out.print("Press enter...");
            scnr.nextLine();
            scnr.nextLine();
        }
    }
}
\\\

Это конкретный блок кода, который должен создать и центрировать второй прямоугольник:

for (int i = 1; i <= (height/5) + 1; i++) {
            System.out.println(" ");
            for (int k = 1; k <= (weidth - weidth2)/2; k++) {
            System.out.print(" ");
            }
            for (int j = 0; j <= weidth/3; j++) {
                System.out.print("<");
                weidth2 = j;
            }

        }

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

Пример вывода (замените «X» пробелами):

\\\
Tree Structures
---------------

This program prints two tree like structures! 
A "Flat" tree and a "Christmas" tree.
You choose how big the trees will be.

By Daniel Sousa (A00433806)

How tall should the top of the tree be? 19

Flat Tree:

************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
************************************* 
XXXXXXXXXXXXXXXXXX<<<<<<<<<<<<< //!-!-!-! <-problematic line
XXXXXXXXXXXX<<<<<<<<<<<<< 
XXXXXXXXXXXX<<<<<<<<<<<<< 
XXXXXXXXXXXX<<<<<<<<<<<<

Мой вопрос таков: как я могу сделать первую строку второго отступа прямоугольника ("X") столько же, сколько остальные. Или, что еще лучше, как сделать так, чтобы второй прямоугольник выровнялся с серединой первого прямоугольника?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Проблема в вашей первой итерации weidth2 = 0.

for (int k = 1; k <= (weidth - weidth2)/2; k++) {
    System.out.print(" ");
}

for (int j = 0; j <= weidth/3; j++) {
    System.out.print("<");
    weidth2 = j; //happens after first printing of spaces
}

Итак, вам нужно сначала установить width2. (Я изменил weidth2 на width2)

Это:

//Bottom Square
for (int i = 1; i <= (height/5) + 1; i++) {
    System.out.println(" ");
    width2 = width/3;

    for (int k = 1; k <= (width - width2)/2; k++)
        System.out.print(" ");

    for (int j = 0; j <= width/3; j++)
        System.out.print("<");
}

Производит это:

How tall should the top of the tree be? 10

Flat Tree:

******************* 
******************* 
******************* 
******************* 
******************* 
******************* 
******************* 
******************* 
******************* 
******************* 
      <<<<<<< 
      <<<<<<< 
      <<<<<<<

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

0 голосов
/ 03 октября 2019

Вы, кажется, слишком усложняете это с помощью циклов for, не будет ли проще использовать 2 цикла (по 1 на каждую ось, по которой вы двигаетесь) и просто решить, нужно ли печатать что-то или нет? Как это:

for (int i = 1; i <= (height/5) + 1; i++) {
    System.out.println(" ");
    for (int k = 1; k <= 2*weidth/3; k++) {
        if (k < weidth/3){
            System.out.print(" ");
        } else {
            System.out.print("<");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...