为什么我的循环不会停止;看似尽管布尔表达

时间:2012-10-15 01:34:03

标签: java drjava

所以我的程序运行并从右上角开始绘制一排钻石。然后它向下移动并重复。它应该停在4行(由于画布大小),但它不会!

首先为声明绘制钻石。声明的第二个移动到下一个钻石。重复7次。

第三个声明(这是我假设问题是......)向下移动并重复前两个。

所有这些都完美运行!直到它没有停止!

它不断无限重复!

import Media.*;
import static java.lang.Math.*;

public class DiamondTiles2 {

private TurtleDisplayer display;
private Turtle            steve;

public DiamondTiles2 (){

display = new TurtleDisplayer();
steve = new Turtle();
display.placeTurtle(steve);

steve.setSpeed(15);
steve.forward(140);             // Moves Steve to the furthest right he needs to be
steve.left(PI/2);
steve.forward((float)1.5*(40*sqrt(3.0)));  // Moves Steve to the top (up 1.5 times the height of a diamond)
steve.left(PI/6);
steve.penDown();

for (int j=1 ; j<=7 ; j++){  //Diamond Drawing
  steve.forward(40);
  steve.left(2*PI/3);        
  steve.forward(40);
  steve.left(PI/3);
  steve.forward(40);
  steve.left(2*PI/3);
  steve.forward(40);
  steve.left(PI/3);
  for (int i=1 ; i<=1 ; i++){ //Move to Next Diamond
    steve.penUp();
    steve.left(PI/3);
    steve.forward(40);
    steve.right(PI/3);
    steve.penDown();         
    for (int k=1 ; (j>=7)&&(k<=4) ; j=j-7 , k++){ //Move to next row
      steve.penUp();
      steve.right(7*PI/6);
      steve.forward((float)40*(sqrt(3.0)));
      steve.left(PI/2);
      steve.forward(280);
      steve.left(2*PI/3);
      steve.penDown();
    }
  }
}  
display.close();
};
public static void main ( String[] args ) { DiamondTiles2 d = new DiamondTiles2(); };
}

我看到它的方式:最后一个for循环应该以k == 1开始,然后每次增加k。因为

,它不应该重复过去4
for (int k=1 ; (j>=7)&&**(k<=4)** ; j=j-7 , k++)

请帮忙! :)

编辑:好的,所以j肯定是问题...解释为什么我要重置J: 当我没有在7处重置7时它将绘制第一行然后它将无限循环移动到新行的步骤。所以它会停止绘制,只是移动“向下,向右,向下,向右,向下,向右......等等。

添加j = j-7解决了这个问题但开始了这个新问题.. 由于k&lt; = 4不是真的,我认为哪个会被解决...任何理由它似乎“忽略”那个布尔值?

EDIT2: 修正:将最后一个for语句更改为此IF语句:

 if ((j>=7)&&(x<=3)){ //Move to next row
      steve.penUp();
      steve.right(7*PI/6);
      steve.forward((float)40*(sqrt(3.0)));
      steve.left(PI/2);
      steve.forward(280);
      steve.left(2*PI/3);
      steve.penDown();
      j=j-7;
      x=x+1;

感谢所有帮助过我的人!在这个网站上的惊人回应!

4 个答案:

答案 0 :(得分:0)

您引用的行中的j = j-7是否可能在j的第一个for循环中没有搞砸你的意图?

答案 1 :(得分:0)

在最外层循环中递增j,然后在最里面的循环中重置j。这似乎是在寻找麻烦。最内层循环保证j永远不会是7或更多,因此最外层循环永远不会终止。

我会重构,以便除了在外j语句中之外不修改for

我还建议逐步使用调试器来查看正在发生的事情。

答案 2 :(得分:0)

看起来问题是j=j-7 - 只有当j大于或等于7且k小于4时,你的循环才会停止。因为j在每次迭代时递减7,你的病情永远无法满足。

答案 3 :(得分:0)

它不会在该循环中重复过去4 ... 。问题是最里面的循环运行无限次,所以它从1-4循环,然后从1-4循环,然后从1-4循环,等等。

为什么循环运行无限次?

似乎你的终结者在最里面&amp;最外面的循环是不一致的。由于每次增加超过7时从最内层循环中的j减去7,并且只要j小于或等于7,最外面的循环就会运行,j永远不会变得足够大以使最外层循环终止。这意味着最里面的循环一遍又一遍地运行(因为无尽的最外层循环),1-4,1-4,1-4 ......