Java简单的圣诞树

时间:2018-11-14 00:46:59

标签: java for-loop

我是Java的新手,我必须创建一个简单的java程序,以这种形式创建圣诞树:

10|       *       |15=7+1+7
 9|      ***      |15=6+3+6
 8|     *****     |15=5+5+5
 7|    *******    |15=4+7+4
 6|   *********   |15=3+9+3
 5|  ***********  |15=2+11+2
 4| ************* |15=1+13+1
 3|***************|15=0+15+0
 2|      ***      |15=6+3+6
 1|      ***      |15=6+3+6

高度(所有自然正数)和材料(在这种情况下,“ *”由用户输入指定)。 这是我已经拥有的,但是我不知道如何在每行的末尾获得“ | 15 = 7 + 1 + 7”,在树的底部获得树干。

这是我的实际代码及其创建的内容:

public class Christmas{
    public static void main(String[] args) {

        int height = Integer.parseInt(args[0]);
        String letters = (args[1]);
        char firstLetter = letters.charAt(0);

        //System.out.println(height+"   "+firstLetter);     

        for (int i = 0; i < height; i++) {
         // System.out.print((args.length)+"");
         int row_number = height-i;
         System.out.printf("%2d",row_number);
         System.out.print("|");

            for (int j = 1; j < height - i; j++){
            System.out.print(" ");  
            }   
                for (int k = 0; k < (2 * i + 1); k++){
                System.out.print(firstLetter+"");
                }

         System.out.println();

        }
    }
}

输出:

C:\Users\name\Desktop\JavaFolder>javac Christmas.java && java Christmas 10 *OMEGALUL
10|         *
 9|        ***
 8|       *****
 7|      *******
 6|     *********
 5|    ***********
 4|   *************
 3|  ***************
 2| *****************
 1|*******************

如何添加树树干,该树总是3个字母长,每棵大树的1/4 。(四舍五入),并且处| 15 = 7 + 1 + 7每行的末尾包含: 树的宽度为左侧空间的总和+相应行中的树的宽度+右侧的空间(左对齐)。

1 个答案:

答案 0 :(得分:3)

这是另一种方法,它计算一行上所需的spaces数和fill个字符数,然后使用printf打印线。

public static void printChristmasTree(int height, char ch) {
    if (height <= 4)
        throw new IllegalArgumentException("Height must be 5 or higher");
    for (int row = height; row > 0; row--) {
        int spaces = (row > 2 ? row - 3 : height - 4);
        int fill = (height - spaces) * 2 - 5;
        System.out.printf("%2d|%s%s%s|%d=%d+%d+%d%n", row,
                          repeat(spaces, ' '), repeat(fill, ch), repeat(spaces, ' '),
                          spaces * 2 + fill, spaces, fill, spaces);
    }
}
private static String repeat(int count, char ch) {
    char[] buf = new char[count];
    java.util.Arrays.fill(buf, ch);
    return new String(buf);
}

测试

printChristmasTree(10, '*');
printChristmasTree(6, '#');

输出

10|       *       |15=7+1+7
 9|      ***      |15=6+3+6
 8|     *****     |15=5+5+5
 7|    *******    |15=4+7+4
 6|   *********   |15=3+9+3
 5|  ***********  |15=2+11+2
 4| ************* |15=1+13+1
 3|***************|15=0+15+0
 2|      ***      |15=6+3+6
 1|      ***      |15=6+3+6
 6|   #   |7=3+1+3
 5|  ###  |7=2+3+2
 4| ##### |7=1+5+1
 3|#######|7=0+7+0
 2|  ###  |7=2+3+2
 1|  ###  |7=2+3+2

更新

这是height/4 (四舍五入)的躯干高度的逻辑,而不是上面的代码使用的2的固定高度。行李箱宽度仍固定为3。

public static void printChristmasTree(int height, char ch) {
    final int trunkHeight = (height + 2) / 4; // rounded
    final int treeWidth = (height - trunkHeight) * 2 - 1;
    final int width = (treeWidth > 3 || trunkHeight == 0 ? treeWidth : 3);
    for (int row = height; row > 0; row--) {
        int fill = (row > trunkHeight ? (height - row) * 2 + 1 : 3);
        int spaces = (width - fill) / 2;
        System.out.printf("%2d|%s%s%s|%d=%d+%d+%d%n", row,
                          repeat(spaces, ' '), repeat(fill, ch), repeat(spaces, ' '),
                          spaces * 2 + fill, spaces, fill, spaces);
    }
}

测试

printChristmasTree(5, '*');
printChristmasTree(4, '*');
printChristmasTree(3, '*');
printChristmasTree(2, '*');
printChristmasTree(1, '*');

输出

 5|   *   |7=3+1+3
 4|  ***  |7=2+3+2
 3| ***** |7=1+5+1
 2|*******|7=0+7+0
 1|  ***  |7=2+3+2
 4|  *  |5=2+1+2
 3| *** |5=1+3+1
 2|*****|5=0+5+0
 1| *** |5=1+3+1
 3| * |3=1+1+1
 2|***|3=0+3+0
 1|***|3=0+3+0
 2| * |3=1+1+1
 1|***|3=0+3+0
 1|*|1=0+1+0