需要帮助Java作业

时间:2010-09-14 13:12:40

标签: java

我的家庭作业需要一些帮助。我的任务是创建一个程序,创建一个Till对象,接受付款,发出确切的变化,告诉我需要使用哪些硬币,然后告诉我在之后有多少钱。以下是我编写的代码。 USmoney类已完成且正在运行。老师提供了一份备忘单。然而,它是主要的班级(CoinCalc),让收银台付款并从支付的金额中扣除付款,以便给我改变我遇到的问题。任何帮助都将非常感激。

public class USmoney {
  int dollars = 0;
  int cents = 0;

  public USmoney(int newcents) {
    dollars = newcents /100;
    cents = newcents %100;
  }
  public USmoney(int dollars, int cents) {
    this.dollars = dollars;
    this.cents = cents;
  }

  public int getDollars() {
    return dollars;
  }

  public int getCents(){
    return cents;
  }
}

public class CoinCalc {
  public static void main(String[] args) {
    USmoney Till1 = new USmoney(100,0);
    USmoney billTotal = new USmoney(49);
    USmoney amountPaid = new USmoney(100);

    double penny = 1;
    double nickel = 5;
    double dime = 10;
    double quarter = 25;

    double[] Coin = new double []{penny,nickel,dime,quarter};

  }

  private void changeFor(USmoney billTotal, USmoney amountPaid) {
  }
}

4 个答案:

答案 0 :(得分:2)

这是knapsack problem的变量,您需要执行几个步骤

  1. 计算总变化
  2. 使用最少数量的硬币来满足变化
  3. 我首先在USMoney类中使用第一个签名实现一个方法,然后阅读背包问题以实现第二个方法。

    public USMoney subtract(final USMoney value);
    
    public double[] getCoins(final USMoney value);
    

答案 1 :(得分:2)

这里有两个问题,您可以单独考虑。

  1. 您是否能够通过算法描述如何确定问题的答案?
  2. 鉴于此描述,您可以将其转换为Java代码吗?
  3. 我将从解决第一项开始:您必须准确理解输入是什么以及所需输出是什么,并且您能够提供有关如何解决问题的精确伪代码描述。如果您不知道伪代码是什么,请在维基百科上查找。然后,您可以开始考虑如何使用Java编写代码。 从算法的角度来看,您的问题非常简单。

    假设客户支付金额X和费用金额为C的物品。 首先,您必须检查X> = C.否则客户将无法获得足够的报酬,您可以在那里停下来。

    假设X> = C,并且您能够给出确切的更改,则在交易完成后,结算中的金额将增加C,因为这正是客户最终支付的费用。

    现在,您必须提供的更改量应该等于X-C。叫这个Y.

    测试你可用的最大硬币分多少次Y: 假设最大的硬币有价值V,那么你应该给这个价值的客户Y / V硬币。 之后,您需要向客户偿还余额Y'= Y-(Y / V)* V.确保您知道Java中的除法如何工作(请参阅本文末尾的链接)。 重复这个程序,用第二大硬币支付Y',依此类推。

    2。 我不会用Java写出整个内容,但是你应该考虑一些事情。

    Till是否包含“钱”而没有明确指出它包含哪些账单/硬币,或者您是否应该将这些钱代表一些账单和硬币?

    你将进行整数除法,因此你的硬币值不应该是双倍的,而应该是整数。

    您需要从计算更改的函数内部访问硬币值(一角硬币价值等),因此不同硬币的值应该可以声明为CoinCalc类的静态成员变量,而不是一个功能。

    您需要确保了解if-else语句和while循环的基本工作方式以及如何分配变量。然后你应该能够编写解决方案。

    您还需要确定解决方案的确切含义。它可以是硬币名称列表,每次需要时重复一个名称,例如: [硬币,便士,便士],或者可能是四个数字的数组,说明需要多少个四分之一,硬币,镍币和便士。如果需要列表,可以通过阅读Java文档中的条目LinkedList来了解列表数据结构如何在Java中工作。

    祝你好运!

    注意:因为我是新用户,所以我无法发布任意数量的链接。您可以通过Google搜索java部门并选择指向mindprod.com的链接,在Java中找到对部门划分的良好描述。

答案 2 :(得分:0)

要调用changeFor()方法,您需要引用CoinCalc类。您可以采用不同的方式,一种方法是在main()方法中声明CoinCalc类的变量,如下所示:

CoinCalc cc = new CoinCalc();

cc.changeFor(billTotal, amountPaid);

但是仍然存在问题,方法changeFor()目前什么也没做,以及你在changeFor()方法中声明它们无法访问的直接对象和硬币数组的方式。

所以稍微研究一下这个问题然后再回到我们身边......

修改

以下是我如何构建它,billTotalfloat amountPaidUSMoney对象,它内部跟踪每种货币面额(1美元,四分之一,一角钱,镍和一分钱)。当有人付钱时,他们会给你不同数额的这些钱。 USMoney需要和方法,它将返回它拥有的各种货币的价值(美元,季度等的总和)。

tillUSMoney的另一个实例,其初始值为不同面额的货币。

USMoney有一个名为changeFor(float bill, USMoney paid)的方法,它返回USMoney的另一个实例。然后你会这样称呼它:

USMoney change = till.changeFor(bill, amountPaid);

然后,changeFor()方法必须根据till中的内容以及billamountPaid的值之间的差异来确定如何进行更改。注意如果你没有足够的宿舍,你的计算应该足够聪明,如果它足够的话,可以使用角钱和镍币。如果你想真的,如果你无法做出改变,就会聪明地抛出异常。

答案 3 :(得分:0)

看起来您需要有关changeFor算法的帮助,所以这是一个大纲:

首先从amountPaid中减去billTotal。这将使你获得多少改变。

然后制作一些变量来保存你所回馈的变化。对于季度,角钱,镍,便士中的每一个,如果更改,则保留为>硬币的价值,加一个硬币并减去价值。按顺序为每个硬币执行此操作,直到该硬币的值未通过测试,然后转到下一个硬币。