Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java程序:生成圣诞树:格式化?_Java - Fatal编程技术网

Java程序:生成圣诞树:格式化?

Java程序:生成圣诞树:格式化?,java,Java,所以在我的CS课上,我们有一个小的硬件问题,大约一周左右都没有到期,除了一个小问题,它几乎可以正常工作。以下是作业: 编写一个名为ChrisTree的程序,生成圣诞树图像作为输出。它应该有一个具有两个参数的方法:一个用于树中的段数,另一个用于每个段的高度。例如,左侧显示的树有三段高度为4,右侧显示的树有两段高度为5 因此,我的代码除了在一些树上工作外,树的最后一行是,树干都有一个空格。如果不换一个新洞,我似乎无法堵住那个洞。有人看到这个问题可能的“根源”吗?PS树段和高度是通过改变类常量来改变

所以在我的CS课上,我们有一个小的硬件问题,大约一周左右都没有到期,除了一个小问题,它几乎可以正常工作。以下是作业:

编写一个名为ChrisTree的程序,生成圣诞树图像作为输出。它应该有一个具有两个参数的方法:一个用于树中的段数,另一个用于每个段的高度。例如,左侧显示的树有三段高度为4,右侧显示的树有两段高度为5

因此,我的代码除了在一些树上工作外,树的最后一行是,树干都有一个空格。如果不换一个新洞,我似乎无法堵住那个洞。有人看到这个问题可能的“根源”吗?PS树段和高度是通过改变类常量来改变的(我知道,改变它们是一种糟糕的方法,但这正是这个家伙想要的)(我知道它可能也是非常冗余的)

公共类ChrisTree{
公共静态最终整数段=4;
公共静态最终内部高度=4;
公共静态void main(字符串[]args){
makeTree();
}
//makeTree:打印树的代码;参数:树段数、树段高度
公共静态void makeTree(){
//maxStars:计算每条直线的长度,即任意直线的空间和星星的总和
int maxStars=2*高度+2*分段-3;
//maxStr:将为每行更改和打印的主变量字符串
字符串maxStr=“”;
//填充maxStr将包含空格;将与子字符串一起使用以生成所需的空格
对于(int len=0;len对于(inti=1;i我知道这已经非常晚了,但我只是写了这个,它成功了

public class ChrisTree {
    public static final int SEGMENTS = 4;
    public static final int HEIGHT = 4;

    public static void main(String[] args) {
        makeTree();
    }

    public static void makeTree() {
        int maxStars = 2 * HEIGHT + 2 * SEGMENTS - 3;
        String maxStr = "";
        for (int l = 0; l < maxStars; l++) {
            maxStr += " ";
        }
        for (int i = 1; i <= SEGMENTS; i++) {
            for (int line = 1; line <= HEIGHT; line++) {
                String starStr = "";
                for (int j = 1; j <= 2 * line + 2 * i - 3; j++) {
                    starStr += "*";
                }
                for (int space = 0; space <= maxStars - (HEIGHT + line + i); space++) {
                    starStr = " " + starStr;
                }
                System.out.println(starStr);
            }
        }

        for (int i = 0; i <= maxStars / 2; i++) {
            System.out.print(" ");
        }
        System.out.println(" " + "*" + " ");
        for (int i = 0; i <= maxStars / 2; i++) {
            System.out.print(" ");
        }
        System.out.println(" " + "*" + " ");
        for (int i = 0; i <= maxStars / 2 - 3; i++) {
            System.out.print(" ");
        }
        System.out.println(" " + "*******");
    }
}
公共类ChrisTree{
公共静态最终整数段=4;
公共静态最终内部高度=4;
公共静态void main(字符串[]args){
makeTree();
}
公共静态void makeTree(){
int maxStars=2*高度+2*分段-3;
字符串maxStr=“”;
对于(int l=0;l例如(inti=1;i为我做明显的家庭作业问题辩护,这里的解决方案太伤我的眼睛了。(我知道这些是标准的家庭作业问题,我在80年代用帕斯卡做的)

许多人已经简化为

 2*SEGMENTS + 2*HEIGHT - 3
我并没有简化它,因为它隐藏了意图,一旦丢失,很难在代码中恢复

然后,在遍历循环时,我决定让大小增量的贡献者增加两个。这使其余的数学变得更容易,因为我们不必将“神奇”公式和数学放在奇怪的地方。这意味着我们可以重用
以绘图为中心的(…)
带有参数
1+segmentContrib+sliceContrib
,其中另外两个变量是段和片的“星号”贡献


最后,我们画了一个由两个垂直星号和底部组成的主干。

你能解释一下它为什么工作吗?现在,它只是一堆代码,可以实现一些目标,但这对那些想找出原始代码的错误之处的人来说并没有多大帮助。我唯一的安慰是,这样做可以让人们看到解决方案是什么uld看起来像。在一个人编程能力的早期,他将遇到的大多数解决方案看起来都很粗糙(就像这里发布的其他解决方案一样)。
package com.edwinbuck.christmas;

/**
 * Draws a ChristmasTree.

 * @author Edwin Buck
 */
public class ChristmasTree {

    public static final int SEGMENTS = 4;
    public static final int HEIGHT = 4;

    public static void main(String[] args) {
        int maxSize = 1 + 2 * (SEGMENTS - 1) + 2 * (HEIGHT - 1);
        // for each segment beyond zero, we need 2 more asterisks.
        for (int segmentContrib = 0; segmentContrib < 2 * SEGMENTS; segmentContrib += 2) {
            // for each segment slice beyond zero, we need 2 more asterisks.
            for (int sliceContrib = 0; sliceContrib < 2 * HEIGHT; sliceContrib += 2) {
                drawCentered(maxSize, 1 + segmentContrib + sliceContrib);
            }
        }
        // draw the trunk
        drawCentered(maxSize, 1);
        drawCentered(maxSize, 1);
        // draw the base
        drawCentered(maxSize, 7);
    }

    /**
     * Draws a line of asterisks, centered within size spaces.
     *
     * @param size The size to center on.
     * @param asterisks The number of asterisks to draw.
     */
    private static void drawCentered(int size, int asterisks) {
        int before = (size - asterisks) / 2;
        int after = size - before - asterisks;
        print(before, " ");
        print(asterisks, "*");
        print(after, " ");
        System.out.println();
    }

    /**
     * Draws a character a number of times.
     *
     * @param count The number of time to draw the character.
     * @param character The character to draw.
     */
    private static void print(int count, final String character) {
        for (int i = 0; i < count; i++) {
            System.out.print(character);
        }
    }

}
 1 + 2*(SEGMENTS-1) + 2(HEIGHT-1)
 2*SEGMENTS + 2*HEIGHT - 3