2017-09-27 52 views
1

我在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

和输出模式应该是

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

,但该矿没有产生任何 代码是固定的代码应该已经

公共静态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(" "); 
     } 
    } 

感谢所有帮助家伙......幸运,有这样一个社区.. :)

+0

是否没有输出或输出很多空间? – dave

+0

欢迎来到堆栈溢出!它看起来像你需要学习使用调试器。请帮助一些[互补调试技术](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。如果您之后仍然遇到问题,请随时回答一个更具体的问题。 –

回答

2

此行是错误的

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

应该

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

你切换i和j让你永远不会退出那个循环

+0

你的代码没有通过这个测试用例。 输入(stdin)你的输出(stdout) # ## ### #### ##### ###### 期望输出 # ## # ## #### ##### ###### 编译器消息 错误代码 – Fiore

+0

你能找到更好的格式吗?它很难区分。一个问题可能是您使用System.out.println(“”)添加了额外的空间。最后。也许改为System.out.println(“”) – Legman

+0

让我知道如果最后一点有帮助 – Legman

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++) 
     { 

另一个循环,这时候我们已经开始与j为0,并一直持续到i没有比f再少。又是什么ifi是0(我们第一次通过外部循环),f仍然是6. 0小于6,所以我们开始这个循环。

  System.out.print(" "); 
     } 

我们打印空间,并找到循环的结束,所以我们回去绕到for(int j=0...循环,增加j(因为我们说在这个循环的开始j++)。

所以,现在我们的价值是:j = 1,i = 0f = 6。我们检查循环条件 - i<f - 并且0仍然小于6,因此我们再次重复该循环,并打印另一个空间,并再次重复上述操作。这个循环中

没有什么是不断变化的if值,所以对于循环(i<f)的条件始终是真实的,我们刚刚结束了一个无限循环,打印空间永远。 j每次迭代都会增加,因此它会上升到1,2,3等,但是因为您再也不会参考它,所以这是无关紧要的。

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

鉴于你的循环遍历了j,并且你正在增加它,所以我想你是想用它来决定是否结束循环 - 所以,你可能想要的i<f它的条件,而不是j<f,那就是:

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

我不知道这是否会令你的程序完善,或者如果你会被它分解这样你打另一个类似的问题,但希望可以看到你需要经历的那种思维过程,以解决你遇到的下一个问题。基本上,你需要假装成为计算机,并通过每条线单独工作,记下每次变化时每个变量的值。这并不困难,但是这非常耗时和烦人 - 欢迎编程!

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(); 
} 
+0

如果你可以发布一些解释来帮助别人学习你建议的内容,而不仅仅是工作代码,那么答案会更好。另外,OP已经明确表示他正在学习语言,因此将代码缩减为复杂的单行语句不太可能帮助他们学习。如果他们有任何计划成为一名专业软件开发人员,这也是一个可怕的例子 - 如果我在真实代码中遇到这样的事情,我会立即重写它,以使其意图清晰,而不是“聪明”,但完全朦胧。 – DaveyDaveDave

+0

@DaveyDaveDave我在帖子中添加了评论 –

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, "#")))); 

这是怎样的 “#” 被重复:

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

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