Помогите с Java

public class CarsAssemble {
    public double productionRatePerHour(int speed) {
        double a = (speed * 221);
        double b = a * 10 / 100;
        if(speed >= 1 && speed <= 4) {
            return a;
        } else if(speed >= 5 && speed <= 8) {
            return a - b;
        } else if(speed >= 9) {
            b = a * 20 / 100;
            return a - b;
        } else if(speed == 10) {
            b = (a * 23 / 100);
            return a - b;
        }
        return a - b;
    }
}

В этом упражнении вам предстоит написать код для анализа работы сборочной линии на автомобильном заводе. Скорость конвейера может варьироваться от 0 (выключен) до 10 (максимальная).

При минимальной скорости (1) каждый час производится 221 автомобиль. Производительность линейно увеличивается с ростом скорости. Таким образом, при скорости 4 конвейер должен производить 4 * 221 = 884 автомобиля в час. Однако более высокая скорость увеличивает вероятность выпуска бракованных автомобилей, которые затем приходится отбраковывать. В следующей таблице показано, как скорость влияет на коэффициент успеха:

  • От 1 до 4: 100 % успеха.
  • От 5 до 8: 90 % успеха.
  • 9: 80 % успеха.
  • 10: 77 % успеха.

Intellij говорит что когда я указываю 10 выходит не верный ответ.


Ответы (1 шт):

Автор решения: Nowhere Man

Проблему в представленном коде с некорректным условием else if (speed >= 9) описали в комментариях. К сожалению, компилятор не отлавливает подобные ошибки, так как не "может" вычислить, что ветвь else if (speed == 10) становится недостижимой.

Однако, можно было бы сразу получить более простой и наглядный код при помощи switch-выражения, указав "проценты успеха" в зависимости от скорости конвейера как в исходном задании:

private static final int BASIC_RATE = 221; // базовая производительность

public static double productionRatePerHour(int speed) {
    var outputPercent = switch(speed) { 
        case  1, 2, 3, 4 -> 1.00;
        case  5, 6, 7, 8 -> 0.90;
        case  9          -> 0.80;
        case 10          -> 0.77;
        default -> throw new IllegalArgumentException("Invalid speed = " + speed + ", must be in range [1..10]");
    };
    
    return BASIC_RATE * speed * outputPercent;
}

или определив массив с процентами отдельно (при некорректном значении speed будет выброшено ArrayIndexOutOfBoundsException):

private static final int BASIC_RATE = 221;
private static final double[] SUCCESS_PERCENT = {
    1.0, 1.0, 1.0, 1.0,
    0.9, 0.9, 0.9, 0.9,
    0.8,
    0.77
};

public static double productionRatePerHour(int speed) {
    return BASIC_RATE * speed * SUCCESS_PERCENT[speed - 1];
}
→ Ссылка