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