C++ 重载按位运算符异或
当我完成Money类项目时,我只剩下一条指令,那就是使用位运算符^对两个Money对象进行四舍五入 在我的头文件中,我有:C++ 重载按位运算符异或,c++,operator-overloading,rounding,C++,Operator Overloading,Rounding,当我完成Money类项目时,我只剩下一条指令,那就是使用位运算符^对两个Money对象进行四舍五入 在我的头文件中,我有: #ifndef MONEY_H #define MONEY_H #include <iostream> using namespace std; class Money{ public: Money(int dollars, int cents); Money(int dollars); Money();
#ifndef MONEY_H
#define MONEY_H
#include <iostream>
using namespace std;
class Money{
public:
Money(int dollars, int cents);
Money(int dollars);
Money();
int getDollars() const {return dollars;};
int getCents() const {return cents;};
void setDollarsAndCents(int dollars, int cents);
double getAmount() const {return dollars + cents / 100.0 ;};
void setAmount(double amount);
//Define bit wise operator
friend Money operator^(const Money& firstAmount, const Money& secondAmount);
//Define the input and output operator
friend istream& operator>>(istream& inputStream, const Money& money);
friend ostream& operator<<(ostream& outStream, const Money& money);
private:
int dollars, cents;
double amount;
};
const Money LOONIE = Money(1 , 0);
const Money TOONIE = Money(2 , 0);
const Money QUARTER = Money(0 , 25);
const Money DIME = Money(0 , 10);
const Money NICKEL = Money(0 , 5);
#endif
编辑:太激动了,我忘了这个问题
如果有人能帮我说明什么是错误的,为什么我得到了错误的输出,那将不胜感激。谢谢大家! 我不认为
^
操作符正在做您期望的事情。让我们举你的第一个例子
Money m14(4 , 19); //round off to the nearest nickel : $4.19 = $4.20
cout << (m14 ^ NICKEL) << endl;
因此,您最终得到4.22
作为您的输出
您的问题的一个简单解决方案是使用带
%
的模块化算法。我们可以使用19%5
检查19/5
的其余部分。如果结果大于或等于5/2
,我们将向上取整(将5
和余数之间的差值相加),如果不大于或等于,我们将向下取整(减去余数)
19%5==4
和4>5/2
因此我们使用19+5-4
进行汇总,得到20
通常,给定x
美分和一些硬币值c
,我们可以按如下方式取整:
int r = x%c; // get remainder
if (r >= c/2) {
x += c - r; // round up
} else {
x -= r; // round down
}
在这种情况下,
x
将是firstAmount.cents
,c
将是secondAmount.cents
,我不知道你为什么这么想
unsigned int finalCents = (firstAmount.cents ^ secondAmount.cents);
我会给你最接近的便士
这对我很有用:
int closestPennies(int cents1, int cents2)
{
cents1 += cents2/2;
return (cents1/cents2)*cents2;
}
下面是一个示例程序和输出:
#include <stdio.h>
int closestPennies(int cents1, int cents2)
{
cents1 += cents2/2;
return (cents1/cents2)*cents2;
}
void printClosestPennies(int cents1, int cents2)
{
int closest = closestPennies(cents1, cents2);
printf("Cents 1: %d, Cents 2: %d, Closest Cents: %d\n",
cents1, cents2, closest);
}
int main()
{
printClosestPennies(21, 5);
printClosestPennies(26, 5);
printClosestPennies(29, 5);
printClosestPennies(21, 10);
printClosestPennies(26, 10);
printClosestPennies(29, 10);
return 0;
}
#包括
整数收盘点(整数中心1、整数中心2)
{
cents1+=cents2/2;
返回(cents1/cents2)*cents2;
}
无效打印关闭端口(内部中心1,内部中心2)
{
int最近=最接近点(cents1,cents2);
printf(“美分1:%d,美分2:%d,最近的美分:%d\n”,
中央1、中央2、最近);
}
int main()
{
打印关闭页面(21,5);
打印关闭页面(26,5);
打印关闭页面(29,5);
打印关闭按钮(21,10);
打印关闭页面(26,10);
打印关闭(29,10);
返回0;
}
输出:
Cents 1: 21, Cents 2: 5, Closest Cents: 20
Cents 1: 26, Cents 2: 5, Closest Cents: 25
Cents 1: 29, Cents 2: 5, Closest Cents: 30
Cents 1: 21, Cents 2: 10, Closest Cents: 20
Cents 1: 26, Cents 2: 10, Closest Cents: 30
Cents 1: 29, Cents 2: 10, Closest Cents: 30
美分1:21,美分2:5,最接近的美分20
美分1:26,美分2:5,最接近的美分25
美分1:29,美分2:5,最近的美分30
美分1:21,美分2:10,最接近的美分20
美分1:26,美分2:10,最接近的美分30
美分1:29,美分2:10,最接近的美分30
@约翰库格曼编辑:很抱歉@ArcRanges好吧,您仍然缺少一个@πάνταῥεῖ 很抱歉弄得一团糟。现在一切都应该准备好了。基本上是:
unsigned int finalCents=(firstAmount.cents^ secondAmount.cents)代码>对于舍入没有意义。你知道异或运算符是做什么的吗?@MichaelBurr你能给我点化一下吗?我现在明白了。你能告诉我如何解决这个问题,这样我就可以拿到4.20美元吗?@ArcRanges我添加了一个解决方案。我尝试实现了你的代码:不走运。我想我很难按照指示去做。为实现您的代码而编辑的帖子。@ArcRanges我得到了与R Sahu在测试用例中得到的相同的结果。你那边出了什么问题。您是否收到错误消息,或者只是错误的结果?我认为程序无法识别^的运算符重载。它只是继续使用按位函数,而不是正在实现的函数。尝试了您的方法:int finalDollars=firstAmount.dollars+secondAmount.dollars);firstAmount.cents+=secondAmount.cents/2;返还款项(最终美元,((firstAmount.美分/secondAmount.美分)*firstAmount.美分));不走运,上学期不对。它必须是secondAmount.cents
。我试过了,但仍然不起作用..:(@ArcRanges,不知道如何进一步帮助。祝你好运。
int closestPennies(int cents1, int cents2)
{
cents1 += cents2/2;
return (cents1/cents2)*cents2;
}
#include <stdio.h>
int closestPennies(int cents1, int cents2)
{
cents1 += cents2/2;
return (cents1/cents2)*cents2;
}
void printClosestPennies(int cents1, int cents2)
{
int closest = closestPennies(cents1, cents2);
printf("Cents 1: %d, Cents 2: %d, Closest Cents: %d\n",
cents1, cents2, closest);
}
int main()
{
printClosestPennies(21, 5);
printClosestPennies(26, 5);
printClosestPennies(29, 5);
printClosestPennies(21, 10);
printClosestPennies(26, 10);
printClosestPennies(29, 10);
return 0;
}
Cents 1: 21, Cents 2: 5, Closest Cents: 20
Cents 1: 26, Cents 2: 5, Closest Cents: 25
Cents 1: 29, Cents 2: 5, Closest Cents: 30
Cents 1: 21, Cents 2: 10, Closest Cents: 20
Cents 1: 26, Cents 2: 10, Closest Cents: 30
Cents 1: 29, Cents 2: 10, Closest Cents: 30