C++ 重载按位运算符异或

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();

当我完成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();
        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