Проблема с автоматическим тестированием и неправильной формулой

#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. спасибо, спасибо, спасибо, ребята!! это сработало 🙂