Java Diamond Asterisk的高度

时间:2015-11-03 06:08:28

标签: java for-loop height width

如何让这段代码正确显示高度?因此,如果钻石星号的宽度为3,高度为5,则钻石将如下所示。

     *
    ***
    ***
    ***
     *

它只会在中间增加任何多余的高度。到目前为止,这是我的代码。它的宽度可以很好。

public static void main(String[] args) {
    int width, height, heightT;
    Scanner scan = new Scanner(System.in);

    while(true) {
        System.out.println("Enter width of diamond (odd number between 0-19): ");
        width = scan.nextInt();
        if (width % 2 != 0) {
            if (0 <= width && width <= 19) {
                break;
            }
        }
    }
    while(true) {
        System.out.println("Enter height of diamond (greater than or equal to width): ");
        height = scan.nextInt();
        if(height >= width) {
            heightT = height - width;
            break;
        }
    }

    for(int i = 1; i < width + 1; i += 2) {
        for(int j = 0; j < 9 - i / 2; j++)
            System.out.print(" ");

        for(int j = 0; j < i; j++)
            System.out.print("*");

        System.out.print("\n");
    }

    for(int i = width - 2; i > 0; i -= 2) {
        for(int j = 0; j < 9 - i / 2; j++)
            System.out.print(" ");

        for(int j = 0; j < i; j++)
            System.out.print("*");

        System.out.print("\n");
    }
}

2 个答案:

答案 0 :(得分:0)

在解决这种类型的逻辑时,你必须始终关注你知道从不改变的事情。在这种情况下, 3件事永远不会改变

<强> 1。第一行。始终等于一个星号。

<强> 2。中间线。始终等于星号中的宽度。

第3。最后一行。始终等于一个星号。

现在,将中间行中的钻石分成两个。请注意,总高度始终是顶部(或底部)的高度乘以2加1(中间行)。你会得到更像这样的东西:

    for(int i = 0; ((i*2)+1) <= height; i++){
        //Print top
    }

    // Print middle row outside of loops or inside if you must.

    for(int i = 0; ((i*2)+1) <= height; i++){
        //Print bottom.
    } 

编辑:只有高度大于或等于宽度的钻石才会出现这种情况。

编辑:此代码可以解决您的问题(给定高度大于或等于宽度)。但是,无法正确处理 width = 0width = 1。我相信这对你来说是微不足道的。

public static void main(String[] args) {
    int height = 9, width = 9;
    int spaces = (width - 1) / 2, asterisks = 1;



    for(int i = 0;((i*2)) < height; i++){
        for(int ii = 0;ii < spaces;ii++){
           System.out.print(" ");  
        }
        for(int ii = 0;ii < asterisks;ii++){
           System.out.print("*");
        }
    spaces--;
    if(asterisks < width)asterisks += 2;
    System.out.println();
    }

    spaces = 0;

    for(int i = 0; ((i*2)+1) < height; i++){
        if(width < height){
            for(int ii = 0;ii < spaces;ii++){
                System.out.print(" ");
            }
            for(int ii = 0;ii < asterisks;ii++){
               System.out.print("*");
            }
        }else{
            for(int ii = 0;ii < (spaces + 1);ii++){
                System.out.print(" ");
            }
            for(int ii = 0;ii < (asterisks - 2);ii++){
               System.out.print("*");
            }
        }
    spaces++;
    asterisks -= 2;
    System.out.println();
    }
}

答案 1 :(得分:0)

您可以计算高度和宽度之间的差异,并在while循环中重用逻辑。

for(int i = 1; i < width + 1; i += 2) {
    for(int j = 0; j < 9 - i / 2; j++)

        System.out.print(" ");

    for(int j = 0; j < i; j++)
        System.out.print("*");

    System.out.print("\n");
}
int dif = height-width;
 while(dif !=0){
 for(int i = width; i < width + 1; i += 2) {
    for(int j = 0; j < 9 - i / 2; j++)

        System.out.print(" ");

    for(int j = 0; j < i; j++)
        System.out.print("*");

    System.out.print("\n");
}
 dif--;
 }
for(int i = width - 2; i > 0; i -= 2) {
    for(int j = 0; j < 9 - i / 2; j++)
        System.out.print(" ");

    for(int j = 0; j < i; j++)
        System.out.print("*");

    System.out.print("\n");
}