【问题标题】:I don'.t get the correct output in PocketTester我没有在 PocketTester 中得到正确的输出
【发布时间】:2020-10-27 23:55:30
【问题描述】:

所以我开始的这个项目有三个课程,每个课程都做特定的事情。 Coin 类可以用所选的 (String)、Dollar、Quarter、Nickel、Dime 和 Penny 实例化。每个硬币显然都有不同的美分价值,并将价值返回给调用者。我的 Pocket 类实例化多个硬币对象并将其用作自定义对象/类型作为实例字段。然后我的最后一个名为 PocketTester 的类创建了一个名为 myPocket 的对象,并将输入 5 个硬币、3 个硬币、2 个镍币和 7 美分,并打印出总值。

输出:172 美分

这是我的课程,但由于某种原因,当我运行 main() 时,它给了我 132 美分而不是 172 美分,我不知道为什么。我很确定我正确地调用了变量。有人可以帮忙解决这个问题吗?

顺便说一句,你可能会问我为什么不在一个班级这样做,而是导入 Scanner 并使用它,我只是想这样做。

当我第一次发布此内容时,有人决定将其标记为重复或重新发布,而这从来都不是重复或报告,所以不要这样做。

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" && i == 0){
        
       System.out.println(" Input an actual Coin ");
       
    }
    if(s == "Quarter" && i == 5){
        
       
       quarter = 125;
    }
    if(s == "Dimes" && i == 3){
        
       
       dime = 30;
    }
    if(s == "Nickels" && i == 2){
        
       
       nickel = 10;
    }
    if(s == "Penny" && 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();
    }
}




【问题讨论】:

  • 不要使用 == 运算符 (s == "Dollar") 进行字符串比较是否相等。这是错误的。请改用 String#equals() 方法或 String#equalsIgnoreCase() 方法(在这种情况下后者更好)。 s.equalsIgnoreCase("dollar")
  • 由于您在cents 工作,美元应该等于100(不是1)。 addCoin() 方法应该像这样计算每个货币面额:if (s.equalsIgnoreCase("quarter")) { quarter = 25 * i; }。最好为此使用switch/case,而不是一堆if/else if 语句。
  • 为此:if (s == "Dollar" || s == "Quarter" || s == "Dime" || s == "Nickel" || s == "Penny" && 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")) && i == 0) { System.out.println("Input an actual number of coins for: " + s); return; }。请注意所有|| 条件是如何包含在一组括号中的?

标签: java object if-statement instantiation custom-object


【解决方案1】:

如果您的目标是编写仅在您正在使用的确切、特定测试用例中正常工作的代码,那么您所拥有的应该可以正常工作。

您得到 132 而不是 172 的原因是因为您只计算了 5 个季度 (125) 和 7 个便士 (7)。 125 + 7 = 132。

为什么?因为在您的 addCoin() 方法中,您正在检查字符串匹配。如果字符串与“Nickels”匹配,则添加镍,但您的测试代码在“Nickel”中传递,没有 s,所以它没有被添加。与便士相同。

说了这么多,我强烈建议您多研究一下如何使用变量,因为您正在使用几个完全不必要的变量。您还通过检查您传递给addCoin() 的整数是否与您的预设值匹配,将您的代码限制在您正在使用的确切测试用例中;如果您简单地使用i 并乘以添加的任何硬币的价值(25 季度等),无论您添加多少硬币,您都可以使用此代码。

我还建议在检查字符串匹配时使用equals() 而不是==,您在Coin 类中而不是在Pocket 类中这样做;您在这里只看到任何成功,因为您所有的字符串都是文字。

【讨论】:

  • 感谢您的回复,我刚刚修复了我的代码并且它可以工作,但是我将如何做到这一点,以便它适用于任何测试用例,所以我不必在 5 个季度内手动编写代码, 3 个硬币、2 个镍币和 7 个便士
  • @hobmnum 您可以删除if 语句中的所有&& i == ? 条件,而不是使用单独的变量来表示季度、角钱等。然后,例如,不要设置quarter = ?,而是说currentValue += i * 25,这会将四分之一数乘以25 添加到当前值。然后你也可以去掉最后的加法语句。
猜你喜欢
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2021-05-03
相关资源
最近更新 更多