Java中的钻石打印程序创建了一个无限循环

时间:2015-10-01 13:34:12

标签: java loops for-loop infinite-loop

我在印刷填充钻石时遇到一些问题。该程序错误地格式化钻石。

此代码:

      for (rows = 1; rows < height; rows += 2){

            for (spaces =0; spaces < height - 1 - rows / 2; spaces++){
                System.out.print(" ");
            }

            for (stars = 0; stars < rows; stars++){
                System.out.println("*");
            }
        }

打印出来:

Please enter a positive odd height for the diamond:
9
    *
   *
*
*
  *
*
*
*
*
 *
*
*
*
*
*
*

编辑:我已经完成了上半部分的钻石,但我似乎无法将下半部分缩小。它创造了一个无限循环。

for (rows = 1; rows < height  + 1 ; rows += 2){

            for (spaces =0; spaces < height - 1 - rows / 2; spaces++){
                System.out.print(" ");
            }

            for (stars = 0; stars < rows; stars++){
                System.out.print("*");
            }
            System.out.println("");
        }

        for (rows = 1; rows < height; rows -= 2){

            for (spaces =0; spaces < height; spaces++){
                System.out.print(" ");
            }

            for (stars = 0; stars < rows; stars++){
                System.out.print("*");
            }
            System.out.println("");
        }

编辑2:修正了无限循环,但现在星星未对齐:

for (rows = 1; rows < height  + 1 ; rows += 2){

            for (spaces =0; spaces < height - 1 - rows / 2; spaces++){
                System.out.print(" ");
            }

            for (stars = 0; stars < rows; stars++){
                System.out.print("*");
            }
            System.out.println("");
        }

        for (rows = height - 2; rows >= 1; rows -= 2){
                for (spaces =0; spaces < height; spaces++){
                    System.out.print(" ");
                }

                for (stars = 0; stars < rows; stars++){
                    System.out.print("*");
                }
                System.out.println("");
            }

输出:

    *
   ***
  *****
 *******
*********
     *******
     *****
     ***
     *

编辑3: 得到星星对齐,只需摆脱中间行。

代码:

for (rows = 1; rows < height  + 1 ; rows += 2){

            for (spaces =0; spaces < height - 1 - rows / 2; spaces++){
                System.out.print(" ");
            }

            for (stars = 0; stars < rows; stars++){
                System.out.print("*");
            }
            System.out.println("");
        }

        for ( rows = height; rows > 0; rows -= 2){

            for ( spaces =0; spaces < height - 1 - rows / 2; spaces++){
                System.out.print(" ");
            }

            for ( stars = 0; stars < rows; stars++){
                System.out.print("*");
            }

            System.out.println();
        }

输出:

    *
   ***
  *****
 *******
*********
*********
 *******
  *****
   ***
    *

4 个答案:

答案 0 :(得分:1)

对于你的更新问题,你得到一个无限循环,因为你的for循环

for (rows = height; rows >= 1; rows -= 2)

仅递减行(从1开始),并检查小于。

尝试类似:

X = [0, 2, 3, 4.0, 1, 0, 3, 0, 0, 0, 2, 1, 5, 2, 6, 0, 2.2, 1]

答案 1 :(得分:1)

您的原始代码存在一些问题。

首先,你正在使用它:

System.out.println("*")

而不是:

System.out.print("*")

在Java中,printlnprint是两回事。 println会自动在字符串末尾添加换行符,而print则不会。

但是,您不能只将println更改为print,因为这样所有输出都会在一行上。每次运行循环时,使用System.out.println()创建换行符。

您也没有定义rowsspacesstars(我假设它们没有在别处定义。)您可以在for循环中定义它们,就像这样:

for (int rows = 1; rows < height; rows += 2) {

至于钻石的下半部分,您可以简单地反转for循环并省略一条线(中间线,因为它是由第一个循环创建的。)这是第二个for循环的开始,内容与第一个内容相同:

for (int rows = height - 2; rows > 0; rows -= 2){

不是从0开始,添加2并继续直到我们到达height,我们从height - 2开始,减去2,然后继续直到我们达到0。 为什么height - 2而不是height?那是因为如果我们使用height,它将打印一个重复的行。 height - 2删除一行(副本)并打印下半部分的剩余部分。

以下是完整的固定代码:

    for (int rows = 1; rows < height; rows += 2){

        for (int spaces =0; spaces < height - 1 - rows / 2; spaces++){
            System.out.print(" ");
        }

        for (int stars = 0; stars < rows; stars++){
            System.out.print("*");
        }

        System.out.println();
    }

        for (int rows = height - 2; rows > 0; rows -= 2){

        for (int spaces = 0; spaces < height - rows / 2 - 1; spaces++) {
            System.out.print(" ");
        }

        for (int stars = 0; stars < rows; stars++){
            System.out.print("*");
        }

        System.out.println();
    }

如果有任何不准确或不清楚,请告诉我。

答案 2 :(得分:1)

import java.util.Scanner;


public class diamond {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        int i,n,j,k,l=0;
        System.out.println("enter number n");
        Scanner in=new Scanner(System.in);
        n=in.nextInt();

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

            }
            for(l=2;l<=i;l++)
            {
                System.out.print("*");

            }
            System.out.println();
        }
        for(i=n;i>=1;i--)
        {
            for(j=0;j<=n-i;j++)
            {
                System.out.print(" ");
            }
            for(k=1;k<=i;k++)
            {
                System.out.print("*");
            }
            for(k=2;k<=i;k++)
            {
                System.out.print("*");

            }
            System.out.println();
        }

    }
}

答案 3 :(得分:-2)

代码:

for (int i = 1; i < 10; 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 = 7; 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");
    }

输出:

     *
    ***
   *****
  *******
 *********
  *******
   *****
    ***
     *