#java #automated-tests #bluej
Вопрос:
Я читаю вводный курс программирования на Java, и мы выполняем проект в Bluej, где нам нужно использовать автоматическое тестирование для запуска нашего кода. Код теста задан и не может быть изменен, и мы должны написать код и успешно выполнить тесты. У меня все идет гладко, за исключением этой последней части. Вот фрагмент из тестового кода:
public void test_spray() {
int currentRoaches = population.getRoaches();
population.spray(20); // reduce the population by 20%
assertEquals((int)(currentRoaches * 0.80), population.getRoaches() );
}
И вот метод, который я написал для этого. Он компилируется, но когда я запускаю его через тест, я получаю ошибку с ошибкой «ожидалось:<160>, но было:<160><180>» Я думал, что формула верна, но, думаю, нет.
/* simulates spraying with insecticide, which reduces the population
by the given percentage. */
public void spray(double givenPercentage) {
this.population = this.population - (int)givenPercentage;
}
Я не уверен, что я здесь делаю не так. Любое озарение было бы потрясающим. Заранее спасибо!
Комментарии:
1. Один из отличных способов отладки программы-присвоить ей номера и просмотреть ее на бумаге. Допустим, у вас есть 200 тараканов. Уменьшение на 20% = 0,8 * 200 = 160. Ваша формула вычитает процент, как если бы это было количество тараканов, так что 200 — 20 = 180. Однако, если бы вы могли написать утверждение assertEquals, я не уверен, почему вы считаете, что метод распыления должен быть написан по-другому. Пометка как опечатка
2. Я не могу написать утверждение assertEquals. Это часть тестового файла, которую я не могу изменить. Он был передан мне вместе с проектом.
3. Ах, это все объясняет. Я вижу, что у вас есть решение, но я все равно рекомендовал бы исследовать «проценты», поскольку это концепция, которая будет возникать снова и снова в программировании. Это также просто необходимый жизненный навык для расчета цен в магазине и тому подобного.
Ответ №1:
Вы вычитаете givenPercentage
как абсолютное число. То, что вы ищете, — это вычесть процент населения. 20% от 200 равно 40. 200-40=160. Правильный код:
public void spray(double givenPercentage) {
this.population = this.population - (int)((givenPercentage/100) * this.population);
}
Комментарии:
1. Спасибо за ваш вклад! Я ввел то, что вы предоставили, и тест по-прежнему не удался, сказав: «ожидалось:<160>, но было:<160><200>» 🙁
2. Этот ответ не работает. Вы приводите
givenPercentage
к целому числу. Затем вы делите на100
. Но это целочисленное деление , так что до тех пор , покаgivenPercentage
оно меньше100
, вы должны в конечном итоге получить0
. Так что тогда у вас естьthis.population - 0 * this.population
, что то же самое, что простоthis.population
. Что вы хотите сделать, так это найти коэффициент, используя математику с плавающей запятой, выполнить умножение с плавающей запятой и только затем привести конечный результат к целому числу.3. Мое предложение:
this.population = (int) ((1 - givenPercentage / 100) * this.population)
4. @Marcin Мое предложение эквивалентно тому, что у вас есть сейчас. У вас просто есть это в развернутом виде. Поскольку
this.population
это фактор обоих ваших терминов, вы можете его учесть, что приводит к моему выражению выше. Что касается 20 против 0,2, обратите внимание, что я делю их на 100. Порядок операций гласит, что деление предшествует вычитанию, поэтому оно делится на 100, прежде чем вычитаться из 1. В любом случае это допустимо, я просто сохранил несколько символов 🙂5. спасибо, спасибо, спасибо, ребята!! это сработало 🙂