gpt4 book ai didi

c++ - 作业 - 运算符重载货币类 - 卡住/丢失

转载 作者:行者123 更新时间:2023-11-30 02:09:00 24 4
gpt4 key购买 nike

请帮助我创建运算符重载函数。我试过 2 但我卡住了。(感谢大家上次的帮助!我能够完全完成:])。

问题 1:operator+(const Currency &rhs) 将添加 2 美元的金额,但不会添加 2 美分的金额,尽管它保留了其中一个的美分。因此,40.20 + 40.20 = 80.20(40 美元和 20 美分分别输入为“int”,出于可读性显示的目的,将其写成上面的样子……抱歉造成混淆!)//去掉了减法(如果删除重载运算符,程序可以正确地加/减)。

问题 2:在我有 int Dollars 和 int Cents 之前,现在我只有“金额”。我猜我需要传入这两个,并将它们加在一起作为一项成本 [货币/金额],然后将它们作为“金额”返回并使用它?*我不太确定,这是我被困住的另一个原因: (.

如果需要,我可以发布以前分配的原始公共(public)成员。我暂时保留了之前作业的公共(public)成员的所有旧功能。


class Currency
{
private:<p></p>

<pre><code>int Dollars;
int Cents;
//string Amount;
</code></pre>

<p>public:
// Constructor
Currency(int Dollars = 0, int Cents = 0);
friend Currency operator+(Currency, Currency const &);
// Addition</p>

<pre><code>// Get
int GetDollars();// Need to be removed
int GetCents();// Need to be removed
</code></pre>

<p>}; </p>

<p>Currency::Currency(int Dollars, int Cents)
{
this->Dollars = Dollars;
this->Cents = Cents;</p>

<pre><code>if(this->Cents >= 100)
{
this->Dollars += 1;
this->Cents -= 100;
}
</code></pre>

<p>}</p>

<p>Currency operator+(Currency left, Currency const &right)
{
left.Dollars += right.Dollars;
left.Cents += right.Cents;
while (left.Cents >= 100)
{
left.Cents -= 100;
left.Dollars += 1;
}
return left;
}</p>

<p>int Currency::GetDollars()
{
return Dollars;
}</p>

<p>int Currency::GetCents()
{
return Cents;
}</p>

<p>int main()
{</p>

<pre><code>int currDollars;
int currCents;
//char answer;

cout << "Please enter a dollar amount" << endl;
cin >> currDollars;

cout << "Please enter a cents amount:" << endl;
cin >> currCents;

// Creating and initalizing objects instances of Currency class
Currency payroll(currDollars, currCents);
Currency payroll2(currDollars, currCents);
Currency payroll3;

// Testing overloaded opertator+
payroll3 = payroll + payroll2;


// Displaying test results

cout << "Payroll3 Amount:$ " << payroll3.GetDollars() << "."
<< payroll3.GetCents() << endl << endl;

return 0;
</code></pre>

<p>}</p>

</pre></code>

最佳答案

好的,现在我们的代码已经很少了,可以真正查看了,下面是一些建议。首先,我认为我只有一个加法运算符:

Currency operator+(Currency const &c);

将右侧的美元和美分相加,并返回结果。如果允许的话,使用全局运算符重载可能会更好(大概这是家庭作业,所以你可能不会......):

Currency operator+(Currency left, Current const &right) {
left.Dollars += right.Dollars;
left.Cents += right.Cents;
while (left.Cents >= 100) {
left.Cents -= 100;
left.Dollars += 1;
}
return left;
}

请注意,这使用了一个小“技巧”​​——它通过值传递左操作数,因此我们收到的“左”是作为左操作数传递的值的拷贝。然后我们修改并返回该对象。

我也只有一个构造函数,使用默认参数作为数量:

Currency(int dollars = 0, int cents = 0);

这样,如果您没有指定金额,您将获得 0.00 美元,但您可以指定美元,或美元和美分,而无需三份重复代码来处理这三种可能性。

通过结合这两个,你仍然可以做一些事情,比如添加 1 , 但它的处理方式略有不同——而不是直接使用 operator+它接受一个 int,它接受 int 并将其转换为 Currency使用构造函数的对象,然后添加 Currency反对对方。您的代码变得更短,并且(特别是)重复更少。无需尝试测试/验证三个不同的加法运算符,您只需在一个地方处理一段代码。

我要添加到真实版本中的一件事在此处的精简版本中并不明显。我会把 while 分开将上面的循环变成一个名为 normalize 的单独(私有(private))函数或类似的东西,然后将同时用于 operator+operator- (如果您添加 operator* 和/或 operator/ ,也可能添加它们)。

我还会消除 GetCentsGetDollars成员,而不是添加一个重载的 operator<<直接处理 Currency 对象:

std::ostream &operator<<(std::ostream &os, Currency const &c) { 
return os << c.Dollars << "."
<< std::setfill('0') << std::setw(2) << std::setprecision(2)
<< c.Cents;
}

有了这个,你可以替换这个代码块:

     cout << "Current Amount is:$ " 
<< payroll.GetDollars()
<< ".";
if(payroll.GetCents() < 10)
{cout << "0";}
else
cout
<< payroll.GetCents()
<< endl;
cout << endl;

用更短和更易读的东西:

    cout << "Current amount is: $" << payroll << endl;

编辑:鉴于它仅用于货币,您可以让 Currency 对象打印出 $本身。如果您想更详细地说明,可以让它从语言环境中检索正确的货币指示符和小数点分隔符。

关于c++ - 作业 - 运算符重载货币类 - 卡住/丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5853476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com