Я не получаю правильный вывод в PocketTester

#java #object #if-statement #instantiation #custom-object

#java #объект #if-оператор #создание экземпляра #пользовательский объект

Вопрос:

Итак, в этом проекте, который я начал, есть три класса, и каждый из них выполняет определенную функцию. Класс монет, который может быть создан с помощью выбранной (строки), доллара, четверти, никеля, десятицентовика и пенни. Очевидно, что каждая монета имеет разное значение в центах и возвращает значение вызывающему. Мой класс Pocket создает экземпляры серверных объектов coin и использует его как пользовательский объект / тип в качестве полей экземпляра. Затем мой последний класс с именем PocketTester создает объект с именем MyPocket и будет иметь входные данные в 5 четвертаков, 3 десятицентовика, 2 никеля и 7 центов и выводит общее значение.

Вывод: 172 цента

Вот мои классы, но по какой-то причине, когда я запускаю main(), это дает мне 132 цента вместо 172 центов, и я не знаю почему. Я уверен, что правильно вызвал переменные. Может кто-нибудь помочь это исправить.

Кстати, вы можете спросить меня, почему я не сделал этого в одном классе, а импортировал сканер и использовал его, мне просто захотелось сделать это таким образом.

И в первый раз, когда я опубликовал это, кто-то решил просто пометить это как дубликат или репост, когда это никогда не было ДУБЛИКАТОМ ИЛИ ОТЧЕТОМ, ТАК ЧТО НЕ ДЕЛАЙТЕ ЭТОГО.

 public class Coin
{
    private int value;
    public int dollar;
    public int quarter;
    public int dime;
    public int nickel;
    public int penny;
    public Coin(String s){
        //Use if statement to identify incoming string and provide value in cents
        if(s.equals("Dollar")){
            dollar = 1;
        }
        else if (s.equals("Quarter")){
            quarter = 25;
        }
        else if (s.equals("Dime")){
            dime = 10;
        }
        else if (s.equals("Nickel")){
            nickel = 5;
        }
        else if(s.equals("Penny")){
            penny = 1;
        }
        else{
         
            System.out.println("Give me an actual coin");
        }
        
    }
  
    public int getValue()
    {
        return value;
    }
}



  
 public class Pocket
{
   private int currentValue;
   private int totalValue;
   public int dollar;
   public int quarter;
   public int dime;
   public int nickel;
   public int penny;
   //You need to add more custom type instance variables here
   public Pocket(){  //Set initial value to zero
    totalValue = 0;
    currentValue = 0;
    }
   public void addCoin(String s, int i){
    // s is type of coin, you are using s to instantiate a Coin and get value
    // i is number of coins, you are using i to keep adding value to the totalValue
    if(s == "Dollar" || s == "Quarter" || s == "Dime" || s == "Nickel" || s == "Penny" amp;amp; i == 0){
        
       System.out.println(" Input an actual Coin ");
       
    }
    if(s == "Quarter" amp;amp; i == 5){
        
       
       quarter = 125;
    }
    if(s == "Dimes" amp;amp; i == 3){
        
       
       dime = 30;
    }
    if(s == "Nickels" amp;amp; i == 2){
        
       
       nickel = 10;
    }
    if(s == "Penny" amp;amp; i == 7){
        
       
       penny = 7;
    }
   
    currentValue = quarter   dime   nickel   penny;
    
    }
   public int getValue(){
    return totalValue;
    }
   public void printTotal(){
        System.out.println(currentValue  " cents");
        System.out.println();
    }
}




  
 public class PocketTester
{
    public static void main(String args[])
    {
        Pocket myPocket = new Pocket();
        myPocket.addCoin("Quarter", 5);
        myPocket.addCoin("Dime", 3);
        myPocket.addCoin("Nickel", 2);
        myPocket.addCoin("Penny", 7);
        myPocket.printTotal();
    }
}




  

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

1. Не выполняйте сравнения строк для равенства с == operator ( s == "Dollar" ) . Это неправильно. Вместо этого используйте метод String#equals() или метод String#equalsIgnoreCase() (последний вариант в данном случае лучше). s.equalsIgnoreCase("dollar")

2. Поскольку вы работаете в cents долларах, он должен быть эквивалентен 100 (а не 1). addCoin() Метод должен вычислять каждый денежный номинал примерно так: if (s.equalsIgnoreCase("quarter")) { quarter = 25 * i; } . switch/case Для этого лучше использовать a вместо кучи if/else if операторов.

3. Для этого: if (s == "Dollar" || s == "Quarter" || s == "Dime" || s == "Nickel" || s == "Penny" amp;amp; i == 0) { System.out.println(" Input an actual Coin "); } чтобы быть действительно эффективным, это должно быть так: if ((s.equalsIgnoreCase("Dollar") || s.equalsIgnoreCase("Quarter") || s.equalsIgnoreCase("Dime") || s.equalsIgnoreCase("Nickel") || s.equalsIgnoreCase("Penny")) amp;amp; i == 0) { System.out.println("Input an actual number of coins for: " s); return; } . Обратите внимание, как все || условия заключены в круглые скобки?

Ответ №1:

Если ваша цель — написать код, который работает правильно только в точном, конкретном тестовом примере, который вы используете, то то, что у вас есть, должно работать нормально.

Причина, по которой вы получаете 132 вместо 172, заключается в том, что вы считаете только 5 кварталов (125) и 7 пенни (7). 125 7 = 132.

Почему? Потому что в вашем addCoin() методе вы проверяете совпадения строк. Вы добавляете nickels, если строка соответствует «Nickels», но ваш тестовый код передается в «Nickel» без s, поэтому он не добавляется. Тот же случай с копейками.

При всем этом я бы настоятельно рекомендовал вам изучить, как использовать переменные еще немного, поскольку вы используете несколько переменных, которые совершенно не нужны. Вы также ограничиваете свой код только точным тестовым примером, который вы используете, проверяя, что целое число, которое вы передаете addCoin() , соответствует вашим заданным значениям; если вы просто используете i и умножаете на значение любой добавленной монеты (25 за квартал и т. Д.), Вы можете заставить этот код работать независимо от того, что вы используете.какое количество монет вы добавляете.

Я бы также рекомендовал использовать equals() вместо == при проверке совпадений строк, что вы делаете в классе Coin, но не в классе Pocket; вы видите какой-либо успех только здесь, потому что все ваши строки являются литералами.

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

1. спасибо за ответ, я только что исправил свой код, и он работает, но как бы я мог это сделать, чтобы он работал с любым тестовым примером, поэтому мне не нужно вручную вводить код в 5 кварталов, 3 десятицентовика, 2 никеля и 7 пенни

2. @hobmnum Вместо того, чтобы использовать отдельные переменные для quarter , dime и т. Д., Вы можете удалить все amp;amp; i == ? условия в своих if операторах. Затем вместо настройки quarter = ? , например, просто скажите currentValue = i * 25 , что добавит количество кварталов, умноженное на 25, к вашему текущему значению. Тогда вы также можете удалить оператор сложения в конце.