楼梯不工作,我的代码中有bug

时间:2017-09-27 06:32:08

标签: java

我在java中做了阶梯案例问题。我写了但它没有用。所以我发布它,以便任何人可以检查我的错误。感谢。

    public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int f=n;
        for(int i=0;i<n;i++)
        {
            for(int j=0;i<f;j++)
            {
                System.out.print(" ");
            }
            for(int k=0;k<=i;k++)
            {
                System.out.print("#");
            }
            f=f-1;
            System.out.println(" ");
        }
    }

输入为6

,输出模式应为

     #
    ##
   ###
  ####
 #####
######

但是我没有生产任何东西 代码是固定的,代码应该是

public static void main(String [] args){

        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int f=n;
        for(int i=0;i<n;i++)
        {
            for(int j=1;j<f;j++)
            {
                System.out.print(" ");
            }
            for(int k=0;k<=i;k++)
            {
                System.out.print("#");
            }
            f=f-1;
            System.out.println(" ");
        }
    }

感谢所有帮助人员...有幸拥有这样的社区...... :)

5 个答案:

答案 0 :(得分:2)

此行错误

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

应该是

       for(int j=0;j<f;j++)
        {
            System.out.print(" ");
        }

你切换了i和j,所以你永远不会退出for loop

答案 1 :(得分:2)

让我们分解你的代码的每个部分正在做什么,看看答案是否变得明显:

    int n=sc.nextInt();
    int f=n;

因此,我们读了一个数字(在本例中为6)并将nf都设为此值。

    for(int i=0;i<n;i++)
    {

在这里,我们将重复以下块6次,i等于0,然后是1,然后是2,3,4和5.我们将在i时停止不再小于n,在这种情况下为6。

所以,我们开始循环,i为0. nf都是6,因为我们没有更改它们。

        for(int j=0;i<f;j++)
        {

另一个循环,这次我们从0 j开始,一直持续到i不再小于f。什么是ifi为0(我们第一次通过该外循环)并且f仍然是6. 0小于6,所以我们开始这个循环。

            System.out.print(" ");
        }

我们打印一个空格,找到循环的结尾,所以我们回到for(int j=0...循环,递增j(因为我们在此开头说j++循环)。

所以,现在我们拥有的值是:j = 1i = 0f = 6。我们检查循环条件 - i<f - 并且0仍小于6,因此我们再次重复循环,并打印另一个空格,并再次重复上述步骤。

该循环中的任何内容都不会更改if的值,因此循环(i<f)的条件始终为真,我们最终会无限循环,永远印刷空间。 j在每次迭代时递增,因此它会升至1,2,3等,但由于您再也没有引用它,这是无关紧要的。

所以,问题是您需要更改循环条件,以便退出循环,然后转到程序的其他部分。

鉴于你的循环正在迭代j,而你正在逐渐递增,我的猜测是你想用它来确定是否结束循环 - 所以,你可能想要使其成为条件j<f而不是i<f,即:

        for(int j=0;j<f;j++)
        {
            System.out.print(" ");
        }

我不确定这是否会使你的程序变得完美,或者你是否会遇到另一个类似的问题,但希望通过这样打破你可以看到你需要经历的那种思维过程才能解决你遇到的下一个问题。基本上,您需要伪装成计算机并单独处理每一行,记下每个变量每次变化时的值。这并不难,但是耗时且烦人 - 欢迎编程!

答案 2 :(得分:0)

我认为这很简单,可以用几行来完成。您只需要两个计数器(一个用于行,另一个用于分割empty部分和#部分)。

int rows = 6;
for (int i = rows; i > 0; i--) {
    for (int j = rows; j > 0; j--)
        System.out.print((rows - j + 1) < i ? ' ' : '#');
    System.out.println();
}

答案 3 :(得分:0)

使用Java 8流String.format,您可以更简洁的方式解决问题:

int limit = 6;
IntStream.rangeClosed(1, limit)
    .forEach(i -> System.out.printf("%" + limit + "s%n", String.join("", Collections.nCopies(i, "#"))));

这是&#34;#&#34;重复:

String.join("", Collections.nCopies(i, "#")

使用System.out.printf"%" + digit + "s"右对齐字符串。

答案 4 :(得分:0)

对于StairCase模式,您也可以这样做。

for(int i=0;i<n;i++){
for(int j=n;j>=0;j--){
if(j<=i)
System.out.print("#");
else
System.out.print(" ");
}
System.out.println();
}
}

对于输入6,输出为

      #
     ##
    ###
   ####
  #####
 ######