2010-09-14 135 views
3

我需要一些帮助,我的作业分配。我的任务是创建一个程序,创建一个对象,接受付款,发出确切的变化,告诉我需要使用哪些硬币,然后告诉我在到期后有多少钱。以下是我写的代码。 USmoney类已完成并正在运行。老师提供了一张备忘单。然而,它是主要类(CoinCalc),获得付款的付款并从支付的金额中扣除付款,以使我可以更改我遇到的问题。非常感激任何的帮助。需要帮助Java作业

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) { 
    } 
} 
+12

说“我遇到问题”并不是特别有用。怎么了?会发生什么*不是*? – BalusC 2010-09-14 13:20:20

+0

是的,请更具体地说明您遇到问题的哪个方面。 – wheaties 2010-09-14 13:28:09

+2

我的歉意,主要方法(coinCalc)不完整。我卡住了,不知道该从哪里出发。它需要返回它需要给出的变化,以得出billTotal(49)和amountPaid(100)之间的差异,然后将该数额转换为特定的硬币,即两个季度和一个paenny。 – Jon 2010-09-14 13:30:13

回答

2

这是knapsack problem的变体光盘,你有几个步骤来实现

  1. 计算总的变化
  2. 使用硬币的数量最少
  3. 手托变化

我d首先在USMoney类中实现一个带有第一个签名的方法,然后阅读背包问题以实现第二种方法。

public USMoney subtract(final USMoney value); 

public double[] getCoins(final USMoney value); 
+2

背包问题?问题可能是相关的,但这个问题要容易得多。对于这个作业问题来说,动态编程是过度的。 – Ishtar 2010-09-14 15:13:39

+0

我只是想给出一个答案,不提供解决方案,它的1维打包问题取决于作业的重点是学习Java还是考虑算法。 – 2010-09-14 15:29:28

0

为了调用changeFor()方法,您需要对CoinCalc类的引用。你可以这样做不同的方式,一种方式是声明CoinCalc类的变量在main()方法,像这样:

CoinCalc cc = new CoinCalc(); 

cc.changeFor(billTotal, amountPaid); 

但仍存在问题,该方法changeFor()目前并没有与你已经声明了until对象和硬币数组,它们在changeFor()方法中是不可访问的。

因此,对这个问题进行了一下,然后回来给我们工作...

编辑

这是我会怎么构建它,billTotalfloat amountPaidUSMoney对象internaly保持跟踪每种面值的钱(1美元钞票,四分之一,一角钱,镍和一分钱)。当有人付钱时,他们会给你不同数量的这些钱。 USMoney需求和方法将返回它拥有的货币种类(美元,季度等)的价值。

tillUSMoney的另一个实例,它具有不同面值的货币的初始值。

USMoney有一个名为changeFor(float bill, USMoney paid)的方法,该方法返回另一个USMoney实例。您需要调用它像这样:然后

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

changeFor()方法来确定如何基于什么是在tillbillamountPaid值之间的差异做出改变。注意如果你没有足够的宿舍,你的计算应该足够聪明,如果它足够的话可以使用硬币和镍币。如果你想真的得到巧妙抛出一个例外,如果你不能做出改变。

+0

这就是问题的一部分。我可以在脑海中看到每种方法大部分都需要做什么。但我似乎不能在代码中得到它。基本上,changefor方法需要采用与billTotal和amountPaid对象的区别。如果这个逻辑是正确的,你如何减去这些对象的属性。还是我完全脱离基地? – Jon 2010-09-14 13:41:19

0

它看起来像你想与你的changeFor算法的帮助,所以这里是一个轮廓:

首先从amountPaid减去BILLTOTAL。那会让你做出多少改变。

然后制作一些变量来保存您要给出的变化量。对于季度,角钱,镍,便士中的每一种,如果changeRemaining>硬币的价值,则添加硬币并减去该值。为每个硬币做这件事,直到该硬币的价值未通过测试,然后转向下一枚硬币。

+0

那正是我需要的。但是,我如何减去这两个对象? – Jon 2010-09-14 13:44:23

+0

想一想你如何在纸上做到这一点,例如2.20美元--1.3美元= 0.90美元 - 你有美元和美分作为单独的价值,所以你需要先处理美分,然后美元 – 2010-09-14 13:57:00

+0

对不起,我的意思是如何我要么将对象billTotal和amountPaid设置为int值,以便我可以对它们进行数学运算 – Jon 2010-09-14 14:12:15

2

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

  1. 您是否可以用算法描述如何确定问题的答案?
  2. 鉴于此描述,你可以把它变成Java代码吗?

我会解决的第一个项目开始:这是必须要了解到底是什么输入和输出要求的是什么,你能给出如何解决精确的伪代码描述问题。如果您不知道什么是伪代码,请在维基百科上查看它。然后你可以开始考虑如何用Java编写代码。从算法角度来看,您的问题非常简单。

假设客户支付的金额为X,对于成本为C的项目。 首先,您必须检查X> = C,否则客户的付款不够,您可以在此停止。

假设X> = C,并且您可以给出确切的更改,那么交易完成后,价格上涨的金额将增加C,因为这正是客户最终支付的金额。

现在,您必须给予的更改量应该等于X-C。打电话给Y.

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

2. 我不会写出Java中的所有东西,但有些事情你应该考虑。

是否包含“钱”而没有明确指定它包含的钞票/硬币,还是应该将钱作为一些钞票和硬币代表?

你会做整数除法,所以你的硬币值不应该是双倍,但是整数。

您需要从计算变化的函数内部访问硬币值(硬币值多少等),因此不同硬币的值应该可以声明为类CoinCalc的静态成员变量,而不是在一个函数里面。

您需要确保您知道if-else语句和while循环的工作原理以及如何分配给变量。那么你应该能够编写解决方案。

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

祝你好运!

注意:因为我是新用户,所以无法发布尽可能多的链接。您可以通过使用googling java部门并选择mindprod.com的链接,在Java中找到对部门的很好的描述。

+0

优秀!这是很大的帮助。我的问题如何将我的billTotal和amountPaid对象变成整数,所以我可以做他们的基本数学函数 – Jon 2010-09-14 14:13:45

+0

int billCents = 100 * billTotal.getDollars()+ billTotal.getCents() – okintheory 2010-09-14 14:27:46