Методы управления затратами

#java

#java

Вопрос:

Это проблема для школы

Напишите метод drivingCost() с входными параметрами drivenMiles , milesPerGallon , и dollarsPerGallon , , который возвращает долларовую стоимость проезда в этих милях. Все элементы имеют тип double . Если метод вызывается с

 50 20.0 3.1599
 

метод возвращает 7.89975 .

Определите этот метод в программе, входными данными которой являются мили / галлон автомобиля и доллары на бензин / галлон (оба удваиваются). Выведите стоимость бензина для 10 миль, 50 миль и 400 миль, вызвав свой drivingCost() метод три раза.

Выводите каждое значение с плавающей запятой с двумя цифрами после запятой, что может быть достигнуто следующим образом:

 System.out.printf("%.2f", yourValue);
 

Вывод заканчивается новой строкой.

Пример: если входные данные:

 20.0 3.1599
 

результат:

 1.58 7.90 63.20
 

Ваша программа должна определить и вызвать метод:
public static double drivingCost(double drivenMiles, double milesPerGallon, double dollarsPerGallon)

Пока мой код, кажется, имеет смысл, но я продолжаю получать эту ошибку, и я не уверен, что это значит,

 Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Scanner.throwFor(Scanner.java:937)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
 

Вот мой код

 import java.util.Scanner;

public class LabProgram {
   
   public static double drivingCost(double drivenMiles, double milesPerGallon, double dollarsPerGallon) {
      double totalCost = (dollarsPerGallon * drivenMiles) / milesPerGallon;
      return totalCost;
   }
   
   public static void main(String[] args) {
      Scanner scnr = new Scanner(System.in);
      double milesPerGallon = scnr.nextDouble();
      double dollarsPerGallon = scnr.nextDouble();
      double drivenMiles = scnr.nextDouble();
      
      System.out.printf("%.2f ", drivingCost(drivenMiles, milesPerGallon, dollarsPerGallon) * 10);
      System.out.printf("%.2f ", drivingCost(drivenMiles, milesPerGallon, dollarsPerGallon) * 50);
      System.out.printf("%.2fn", drivingCost(drivenMiles, milesPerGallon, dollarsPerGallon) * 400);
   }
}
 

Комментарии:

1. В какой среде вы запускаете код? Некоторые требуют, чтобы вы указывали ввод в стандартный ввод перед запуском программы.

2. Невозможно воспроизвести

3. Привет, мой ответ вам помог?

Ответ №1:

drivenMiles это не один из входных данных, вы предоставляете его в вызовах drivingCost() .

   System.out.printf("%.2f ", drivingCost(10, milesPerGallon, dollarsPerGallon));
  System.out.printf("%.2f ", drivingCost(50, milesPerGallon, dollarsPerGallon));
  System.out.printf("%.2fn", drivingCost(400, milesPerGallon, dollarsPerGallon));
 

Причина, по которой вы получаете NoSuchElementException , заключается в том, что существует только два входных параметра, и вы пытаетесь прочитать три параметра.

Ответ №2:

Чтобы избежать такого рода ошибок, всегда проверяйте пользовательский ввод.

Это можно сделать с помощью hasNextDouble :

 Scanner scnr = new Scanner(System.in);
double milesPerGallon = (scnr.hasNextDouble() ? sc.nextDouble() : 0.0;
 

Также всегда будьте осторожны Divison by Zero .
Код выдаст исключение, если milesPerGallon равно нулю. Итак, решите это с помощью троичного операнда:

 double totalCost = (dollarsPerGallon * drivenMiles) / (milesPerGallon!=0?milesPerGallon:1);
 

Хотя приведенный выше код приводит к правильному результату.
Изменение приведенного ниже кода имеет немного больше смысла:

 return (drivenMiles / (milesPerGallon!=0?milesPerGallon:1)) * dollarsPerGallon;
 

Правильный код:

 import java.util.Locale;
import java.util.Scanner;

public class LabProgram {
   
   public static double drivingCost(double drivenMiles, double milesPerGallon, double dollarsPerGallon) {
      //Avoid Division by zero
      return (drivenMiles / (milesPerGallon!=0?milesPerGallon:1)) * dollarsPerGallon;
   }
   
   public static void main(String[] args) {
      //Fix user input to US number formats 
      Locale.setDefault(Locale.ENGLISH);
      
      Scanner scnr = new Scanner(System.in);
      
      double milesPerGallon = (scnr.hasNextDouble()) ? scnr.nextDouble() : 0.00; 
      double dollarsPerGallon = (scnr.hasNextDouble()) ? scnr.nextDouble() : 0.00;
      
      System.out.printf("10mi: $%.2f "  , drivingCost( 10, milesPerGallon, dollarsPerGallon));
      System.out.printf("50mi: $%.2f "  , drivingCost( 50, milesPerGallon, dollarsPerGallon));
      System.out.printf("400mi: $%.2fn", drivingCost(400, milesPerGallon, dollarsPerGallon));
   }
}
 

Скомпилируйте это с помощью: javac LabProgram.java
Запустите это с помощью: java LabProgram

Вывод:

 20.0 3.1599
10mi: $1.58 50mi: $7.90 400mi: $63.20`
 

Ответ №3:

Хотя я здесь слишком поздно, все еще публикую это для тех, кто борется с этим. Следующий код дал мне правильный вывод:

 import java.util.Scanner;

public class LabProgram {
   public static void main(String[] args) {

      Scanner scnr = new Scanner(System.in);

      Double milesPerGallon = 0.0;
      Double dollarsPerGallon = 0.0;
      Double gasCost = 0.0;
      Double gasCost20 = 0.0;
      Double gasCost75 = 0.0;
      Double gasCost500 = 0.0;

      milesPerGallon = scnr.nextDouble();
      dollarsPerGallon = scnr.nextDouble();
      gasCost = dollarsPerGallon / milesPerGallon;
      gasCost20 = gasCost * 20;

      System.out.printf("%.2f", gasCost20);
      System.out.print(" ");
         gasCost75 = gasCost * 75;
      System.out.printf("%.2f", gasCost75);
      System.out.print(" ");
         gasCost500 = gasCost * 500;
      System.out.printf("%.2f%n", gasCost500);
   }
}