首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的循环不会停止;似乎不考虑布尔表达式

为什么我的循环不会停止;似乎不考虑布尔表达式
EN

Stack Overflow用户
提问于 2012-10-15 09:34:03
回答 4查看 303关注 0票数 0

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

重复7次。

第三个for语句(这就是我假设的问题所在)向下移动一行并重复前两行。

它一直在无限期地重复!

代码语言:javascript
复制
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加1。

代码语言:javascript
复制
for (int k=1 ; (j>=7)&&**(k<=4)** ; j=j-7 , k++)

请帮帮忙!:)

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

添加j=j-7修复了这个问题,但启动了这个新问题。我以为这会因为k<=4不是真的而被修复。有什么理由让它看起来“忽略”这个布尔值?

EDIT2: Fixed:将最后的for语句更改为以下IF语句:

代码语言:javascript
复制
 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;

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-15 09:39:26

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

为什么这个循环会被无限次地运行?

看起来你在最里面和最外面的循环中的终结器是不一致的。由于在最里面的循环中,每次j增加到超过7时,都会从j中减去7,并且只要j小于或等于7,最外面的循环就会运行,所以决不允许j变得足够大,以便最外面的循环终止。这意味着最里面的循环一遍又一遍地运行(因为最外面的循环是无限的),1-4,1-4,1-4……

票数 0
EN

Stack Overflow用户

发布于 2012-10-15 09:37:29

有没有可能您引用的行中的j= j -7没有在j上的第一个for循环中破坏您的意图?

票数 0
EN

Stack Overflow用户

发布于 2012-10-15 09:37:54

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

我会进行重构,这样除了在外部for语句中修改j之外,不会修改其他内容。

我还建议您使用调试器来查看是怎么回事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12888231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档