2012-10-15 5 views
0

Итак, моя программа запускается и рисует ряд алмазов, начиная с верхнего правого. Затем он перемещается вниз и повторяется. Он ДОЛЖЕН остановиться на 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(); }; 
} 

Как я вижу это: последний цикл должен начинаться при к == 1, а затем увеличить к на единицу каждый раз. и НЕ ДОЛЖНО повторять прошлое 4 из-за

for (int k=1 ; (j>=7)&&**(k<=4)** ; j=j-7 , k++) 

Пожалуйста, помогите! :)

EDIT: Хорошо, поэтому я определенно проблема ... объяснить ПОЧЕМУ Я сбрасываю J: Когда я не сбросил 7 в семь, он нарисовал бы первую строку, а затем она будет бесконечно петля шаг, который перемещается в новую строку. Так что это прекратило бы рисование и просто переместило бы «Вниз», «Вправо», «Вниз», «Вправо», «Вниз», «Вправо» ... и т. Д.)

Добавление j = j-7 исправил эту проблему, но начал эту новую .. Какой я THUUGHT быть фиксированным из к < = 4 НЕ быть правдой ... любая причина, кажется, «игнорирование», что булева

EDIT2: Исправлено: Изменен последний для заявления к этому, если заявление:

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; 

Спасибо всем, кто мне помог! Удивительный ответ на этом сайте!

+0

Это не игнорирование k - k сбрасывается 1 каждый раз, когда внешний контур возобновляет самый внутренний цикл. Затем он повторяется с 1-4, но когда внешний контур возвращается ... получает сброс до 1. – coderabbi

ответ

0

Это не повторяется 4 ... в этом цикле. Дело в том, что самый внутренний цикл запускается бесконечно много раз, поэтому он циклируется с 1-4, а затем с 1-4, а затем с 1-4 и т. Д.

Почему эта петля выполняется бесконечно много раз?

Похоже, что у ваших терминаторов в самой внутренней точке & наружные петли находятся в противоречии. Поскольку вы вычитаете 7 из j в самый внутренний цикл каждый раз, когда он увеличивается выше 7, а самый внешний цикл будет работать до тех пор, пока j меньше или равно 7, j никогда не становится достаточно большим, чтобы крайний край цикла заканчивался. Это означает, что самая внутренняя петля запускается снова и снова (потому что самая внешняя петля в бесконечном), 1-4, 1-4, 1-4 ...

+0

Понял; вы оба! Но не BOTH Boolean утверждения ИМЕЮТ быть истинным, чтобы он мог выполнить? А так как K НЕ меньше или равно 4 ... он должен остановиться? Нет? – OscarWilde

+0

Он останавливается ... это время. Но тогда завершается итерация самого внешнего цикла, и принимается решение о том, запускаться ли снова - поскольку j всегда будет> 7, самый внешний цикл никогда не будет завершен, и будет запущен другой набор самого внутреннего цикла (сужение снова на 4, из Конечно, поскольку вы объявляете k в самом внутреннем цикле, он всегда будет начинаться с 1 для каждой итерации самого внешнего цикла (даже если он был в 4 в конце предыдущей итерации самого внешнего цикла). – coderabbi

+0

Итак ... могу ли я добавьте boolean k <= 4 в самый внутренний цикл? Вместо внешнего? – OscarWilde

0

Возможно ли, что j = j-7 в строке, на которую вы ссылались, не забивает ваше намерение в первом цикле на j?

+0

Цените быстрый ответ! Не 100% уверены, что вы имеете в виду. Я использую j = j-7 для сброса j в 0 каждый раз, когда он запускает цикл, чтобы он повторялся на 7. Который работает. – OscarWilde

+0

Итак, я понимаю, что j все еще установлен в 0 в конце четвертого повтора, но разве он не должен «переопределяться» тем фактом, что k не меньше или равно четырем? isn – OscarWilde

+0

Приращение происходит, а затем оно снова проверяет состояние. Таким образом, значение сбрасывается, происходит проверка, самый внутренний цикл прерывается, но значение все еще сбрасывается в процессе. – Kirby

0

Вы увеличиваете j в своем внешнем цикле, и вы сбросили j в самой внутренней петле. Кажется, что он просил неприятностей. Самый внутренний цикл гарантирует, что j никогда не будет 7 или более, и поэтому самый дальний цикл никогда не завершится.

Я бы реорганизовал, чтобы вы не изменяли j, кроме как в внешнем описании for.

Я также хотел бы порекомендовать пройти через отладчик, чтобы узнать, что происходит.

0

Похоже, что проблема заключается в j=j-7. Ваша петля будет останавливаться только в том случае, если j больше или равно 7, а k меньше 4. Поскольку j уменьшается на 7 на каждой итерации, ваше состояние никогда не может быть выполнено.