我的家庭作业需要一些帮助。我的任务是创建一个程序,创建一个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) {
}
}
答案 0 :(得分:2)
这是knapsack problem的变量,您需要执行几个步骤
我首先在USMoney类中使用第一个签名实现一个方法,然后阅读背包问题以实现第二个方法。
public USMoney subtract(final USMoney value);
public double[] getCoins(final USMoney value);
答案 1 :(得分:2)
这里有两个问题,您可以单独考虑。
我将从解决第一项开始:您必须准确理解输入是什么以及所需输出是什么,并且您能够提供有关如何解决问题的精确伪代码描述。如果您不知道伪代码是什么,请在维基百科上查找。然后,您可以开始考虑如何使用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()方法中声明它们无法访问的直接对象和硬币数组的方式。
所以稍微研究一下这个问题然后再回到我们身边......
修改
以下是我如何构建它,billTotal
是float amountPaid
是USMoney
对象,它内部跟踪每种货币面额(1美元,四分之一,一角钱,镍和一分钱)。当有人付钱时,他们会给你不同数额的这些钱。 USMoney
需要和方法,它将返回它拥有的各种货币的价值(美元,季度等的总和)。
till
是USMoney
的另一个实例,其初始值为不同面额的货币。
USMoney
有一个名为changeFor(float bill, USMoney paid)
的方法,它返回USMoney
的另一个实例。然后你会这样称呼它:
USMoney change = till.changeFor(bill, amountPaid);
然后,changeFor()
方法必须根据till
中的内容以及bill
与amountPaid
的值之间的差异来确定如何进行更改。注意如果你没有足够的宿舍,你的计算应该足够聪明,如果它足够的话,可以使用角钱和镍币。如果你想真的,如果你无法做出改变,就会聪明地抛出异常。
答案 3 :(得分:0)
看起来您需要有关changeFor算法的帮助,所以这是一个大纲:
首先从amountPaid中减去billTotal。这将使你获得多少改变。
然后制作一些变量来保存你所回馈的变化。对于季度,角钱,镍,便士中的每一个,如果更改,则保留为>硬币的价值,加一个硬币并减去价值。按顺序为每个硬币执行此操作,直到该硬币的值未通过测试,然后转到下一个硬币。