特定于以下问题的类创建问题

如何解决特定于以下问题的类创建问题

我在Java编码问题中遇到了问题,我可以使用一点帮助来理解问题中提到的条件的思考过程(如下所述)。

这个问题的目的是设计一个收银机程序。您的寄存器中当前包含以下纸币/硬币:

一便士:.01 两便士:.02 五便士:.05 十便士:.10 二十便士:.20 五十便士:.50 一磅:1 两磅:2 五磅:5 十磅:10 二十磅:20 五十磅:50

该程序的目的是计算必须退回给客户的硬币/纸币数量最少的找零。请注意,期望有一个面向对象的解决方案-考虑创建类以提高可重用性

现在在此平台上对此问题有一个类似的帖子,但是我想知道如何在此问题中使用类而不是对面额进行硬编码?如果有人能对此有所启发,我将不胜感激!我已经为此编写了以下代码,根据上述条件更改此代码的任何帮助将不胜感激:

    import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.io.*;

public class Main {
  /**
   * Iterate through each line of input.
   */
  public static void main(String[] args) throws IOException {
    InputStreamReader reader = new InputStreamReader(System.in);
    BufferedReader in = new BufferedReader(reader);

    try {
        double purchasePrice = Double.parseDouble(in.readLine());
        double cash = Double.parseDouble(in.readLine());
        Main.calculateChange(purchasePrice,cash);
    } catch (Exception e) {
        System.out.println(e);
    }
  }

  public static void calculateChange(double purchasePrice,double cash) {
    
    float cashBack = (float) (cash - purchasePrice);
    
    if (cashBack < 0) {
      System.out.println("ERROR");
      return ;
    }
    else if (cashBack == 0){
      System.out.println(0);
    }
    StringBuilder change = new StringBuilder();

        while (cashBack > 0.01) {
            if (cashBack >= 50.0) {
                change.append("Fifty Pounds");
                cashBack -= 50.0;
            } else if (cashBack >= 20.0) {
                change.append("Twenty Pounds");
                cashBack -= 20.0; 
            } else if (cashBack >= 10.0) {
                change.append("Ten Pounds");
                cashBack -= 10.0;
            } else if (cashBack >= 5.0) {
                change.append("Five Pounds");
                cashBack -= 5.0;
            } else if (cashBack >= 2.0) {
                change.append("Two Pounds");
                cashBack -= 2.0;
            } else if (cashBack >= 1.0) {
                change.append("One Pound");
                cashBack -= 1.0;
            } else if (cashBack >= 0.5) {
                change.append("Fifty Pence");
                cashBack -= 0.5;
            } else if (cashBack >= 0.20) {
                change.append("Twenty Pence");
                cashBack -= 0.20;
            } else if (cashBack >= 0.1) {
                change.append("Ten Pence");
                cashBack -= 0.1;
            } else if (cashBack >= 0.05) {
                change.append("Five Pence");
                cashBack -= 0.05;
            } else if (cashBack >= 0.02) {
                change.append("Two Pence");
                cashBack -= 0.02;
            } else {
                change.append("One Pence");
                cashBack -= 0.01;
            }
            change.append(",");
        }
        change.setLength(change.length() - 2);

        System.out.println(change.toString());
    // Access your code here. Feel free to create other classes as required
  }

}

解决方法

完整的解决方案在这里:

硬币类:保存硬币值及其名称。

public class Coin {

    double value;
    String name;

    public Coin(double value,String name) {
        this.value = value;
        this.name = name;
    }

    public double getValue() {
        return value;
    }

    public String getName() {
        return name;
    }
}

收银机类:它按降序保存不同类型的硬币。

public class CashRegister {

    LinkedHashSet<Coin> coins = new LinkedHashSet<>();

    public String calculateChange(double purchasePrice,double cash) {

        double cashBack = cash - purchasePrice;

        if (cashBack < 0) {
            System.out.println("ERROR");
            return "";
        }

        StringBuilder change = new StringBuilder();

        while (cashBack > 0) {
            Iterator<Coin> iterator = coins.iterator();
            while (iterator.hasNext()) {
                Coin coin = iterator.next();
                int count = 0;
                while (cashBack >= coin.getValue()) {
                    count++;
                    cashBack -= coin.getValue();
                }
                if (count > 0) {
                    change.append(count).append(" " + coin.getName());
                    change.append("\n");
                }
            }
        }
        return change.toString();
    }

    public LinkedHashSet<Coin> init() {
        coins.add(new Coin(50,"Fifty Pound"));
        coins.add(new Coin(20,"Twenty Pound"));
        coins.add(new Coin(10,"Ten Pound"));
        coins.add(new Coin(5,"Five Pound"));
        coins.add(new Coin(2,"Two Pound"));
        coins.add(new Coin(1,"One Pound"));
        coins.add(new Coin(0.5,"Fifty Pence"));
        coins.add(new Coin(0.2,"Twenty Pence"));
        coins.add(new Coin(0.1,"Ten Pence"));
        coins.add(new Coin(0.05,"Five Pence"));
        coins.add(new Coin(0.02,"Two Pence"));
        coins.add(new Coin(0.01,"One Pence"));
        return coins;
    }
}

实例化和调用收银机以获取找零:

public static void main(String[] args) throws IOException {
        InputStreamReader reader = new InputStreamReader(System.in);
        BufferedReader in = new BufferedReader(reader);
        try {
            // Initialise cash register.
            CashRegister cashRegister = new CashRegister();
            cashRegister.init();

            double purchasePrice = Double.parseDouble(in.readLine());
            double cash = Double.parseDouble(in.readLine());

            // Calculate change.
            String result = cashRegister.calculateChange(purchasePrice,cash);
            System.out.println(result);

        } catch (Exception e) {
            System.out.println(e);
        }
    }

可以通过 init()方法将任何面额的硬币添加到收银机中。您还可以在收银机中添加很多其他功能,例如

  • 保持平衡。
  • 支持动态添加新面额。
  • 支持动态删除面额。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?