Есть ли способ, чтобы один цикл for возвращал разные значения для разных пользовательских вводов? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь создать один цикл for, который использует переменную lapTime для хранения текущего lapTime для гипотетических лыжников.Лыжники должны пройти 5 кругов, и на каждом круге скорость составляет 10%.Метод, который я пишу, должен позволять пользователю вводить номер своего круга, а цикл for должен предсказывать время, когда лыжник закончит свой круг.

slowRate Формула:

nextLapTime = previous lap time + (previous lap time * slowrate);

Я пыталсяиспользуя операторы if-else в цикле for, чтобы заставить его возвращать различные значения, которые зависят от ввода lapNumber пользователя, но это только нарушает цикл for (ошибка мертвого кода).В настоящее время цикл for возвращает только одно значение для каждого повторения цикла - 11 секунд.Я пытался сделать: lapTime = lapTime + (lapTime * slowRate), но это возвращает 16. (числа) по любой странной причине.Несмотря на то, что lapTime должен быть установлен равным firstLapTime, который == 10. Код, который я предоставил ниже, возвращает значение 15 - idk Why ..

For-Loop:

public double getLapTime(double firstLapTime, double slowRate, int lapNumber) 

    double lapTime;
    lapTime = firstLapTime;
    for (lapNumber=1; lapNumber<=5; lapNumber ++) {
        lapTime = lapTime + (firstLapTime * slowRate);
    }
    return lapTime;
    }

Вот методы тестирования, которые я пытаюсь отладить -

1)

public void testShouldHaveSecondLapOf11Seconds() {

    // Act: call our method with proper parameter value for our test
    double actualResult = theCalculator.getLapTime(10, .1, 2);

    // Assert: assert that our expected value is equal to the actual result
    assertEquals(11.0, actualResult, 0.001);

2)

public void testShouldHaveThirdLapOf12Point1Seconds() {

    // Act: call our method with proper parameter value for our test
    double actualResult = theCalculator.getLapTime(10, .1, 3);

    // Assert: assert that our expected value is equal to the actual result
    assertEquals(12.1, actualResult, 0.001);
}

Я ожидаю получить значения какпоказанный в тестах JUnit, и почему-то логика в моем цикле for не возвращает lapTimes, как это должно быть.Он возвращает только одно число для каждой итерации цикла.

PS .. это одно из моих первых сообщений, поэтому заранее извиняюсь за любые вопросы форматирования.Я сделаю все возможное, чтобы улучшить это.Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Я считаю, что в вашем коде есть две ошибки.

Первый способ заключается в том, как вы создали цикл for.Я считаю, что вы хотите вычислять время следующего круга на каждой итерации.Одна итерация даст вам 2-й круг, 2 итерации - время 3-го круга и т. Д. Это не то, что вы делаете в настоящее время, поскольку вы всегда вычисляете время 5-го круга.

Затем, глядя на ожидаемый ответ для второго круга, я думаю, что замедление относится к последнему выполненному кругу , а не к первому.В противном случае вам не понадобится цикл for для вычисления времени n-го круга, вам просто нужно вычислить абсолютное замедление один раз, умножить его на количество кругов, которое вы хотите, и добавить его к времени первого круга.Странная причина, по которой он не работал раньше, заключается в том, что у вас есть проблема с итерацией цикла.

Я бы предложил это для цикла:

for (int id = 1; i < lapNumber; i++) {
    lapTime = lapTime + (lapTime * slowRate);
}
0 голосов
/ 15 февраля 2019

Я думаю, что ваша проблема в самом цикле for.потому что даже если вы вызываете метод getLapTime () и передаете 3 как lapNumber, вы все равно присваиваете ему значение 1 в цикле for.Таким образом, вместо того, чтобы ваш lapNumber был равен 3, он фактически равен 1.

for (lapNumber=1 /* your chaning the value of lapNumber here to 1 */; lapNumber<=5; lapNumber ++) {
    lapTime = lapTime + (firstLapTime * slowRate);
}

, вы можете попробовать

for (int i = lapNumber; i <= 5; i++) {
    lapTime = lapTime + (firstLapTime * slowRate);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...