Поскольку у вас есть 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();
}