Я вложил цикл for внутрь while, чтобы отслеживать время. А цикл while отслеживает отскоки, если выполняется определенное условие. Пока выполняется это условие, цикл for будет продолжать подсчет. Но как только условие выполнено, цикл должен остановиться. Однако он продолжается независимо от условий внутри цикла while.

/*
     * @Author Lawton C Mizel
     * @Version 1.0, 07 October 2014
     * 
     * A program that simulates a ball bouncing by computing 
     * its height in feet and each "second" as time passes on 
     * a simulated clock.
     * 
*/
public class bouncyballs001 {
    public static void main(String[] args) {

        // create and connect scanner object
        Scanner keyboard = new Scanner(System.in);

        //introduce program
        System.out.println("Welcome to the bouncing ball program!");

        //prompts the user
        System.out.println("Please enter the initial velocity: ");

        double vel = keyboard.nextInt();

        //initial variables

        double height = 0;
        int bounce = 0;
        while (bounce < 5) {
            for (int time = 0; time <= 30; time++) //counter
            {
                if (time >= 0) {
                    height = height + vel;
                    vel = vel - 32.0;
                }

                if (height < 0) {
                    height = height * -0.5;
                    vel = vel * -0.5;
                    System.out.println("BOUNCE!");
                    bounce++;
                }
                System.out.println("time: " + time + " " + "height: " + height);
            }
        }
    }
}
1
Alcamech 7 Окт 2014 в 22:05

2 ответа

Лучший ответ

Вы не достигнете внешнего цикла while, пока время не увеличится в 30 раз. Вы можете добавить требование отскока к циклу for и удалить цикл while. Что происходит, вы можете отскочить 30 раз в цикле for до того, как отскок будет проверен во внешнем цикле while.

    for(int time=0; time <= 30 && bounce < 5; time++) //counter, bails out if bounce > 5
    {
        if(time >= 0)
        {
        height = height + vel;
        vel = vel - 32.0;
        }

        if(height < 0)
        {
            height = height * -0.5;
            vel = vel * -0.5;
            System.out.println("BOUNCE!");
            bounce++;
        }
        System.out.println("time: "+time+" "+"height: "+height);
    }

В качестве альтернативы вы можете использовать оператор if и break.

3
TylerH 10 Апр 2018 в 18:53

У вас есть bounce ++ в условном выражении, которое никогда не будет вызвано.

if (height < 0)

Никогда не будет истинным, потому что высота начинается с 0 и идет вверх (т.е. никогда не может быть отрицательной).

Это означает, что отскок никогда не будет отличным от нуля.

1
Matt Jones 7 Окт 2014 в 22:08
Но vel может быть отрицательным, так что высота тоже, не так ли?
 – 
ToYonos
7 Окт 2014 в 22:13
Скорость может быть отрицательной, однако я предполагаю, что высота не будет отрицательной, поскольку это будет означать, что она находится ниже земли, поэтому это утверждение if никогда не будет достигнуто.
 – 
Matt Jones
7 Окт 2014 в 22:14
Высота может быть отрицательной. Попробуйте использовать 16 в качестве скорости и выполнить 4 цикла.
 – 
Compass
7 Окт 2014 в 22:15
Я полагаю, что моим первоначальным предположением была начальная точка отсчета, с которой сравнивалась высота, была земля, на которой мяч отскакивал (что было бы высотой = 0).
 – 
Matt Jones
7 Окт 2014 в 22:19