用C++设计一个类,用自己的成员函数重载运算符,使对整型的运算符=、+、-、、/ 适用于从键盘输入的分数运算。要求: (1)输出结果是最简分数(可以是带分数); (2)分母为1,只输出分子。 (3)用友元函数重载运算符,使对整型的运算符=、+、-、、/, 适用于分数运算。
时间: 2023-07-10 12:12:30 浏览: 95
C++运算符重载函数作为类成员函数和友元函数.pdf
好的,我来为您解答这个问题。首先,我们需要定义一个分数类 Fraction,它包含分子和分母两个成员变量,并且要实现运算符重载。
以下是 Fraction 类的代码实现:
```cpp
#include <iostream>
#include <algorithm>
using namespace std;
class Fraction {
public:
Fraction(int numerator = 0, int denominator = 1) {
int gcdVal = __gcd(numerator, denominator);
num = numerator / gcdVal;
den = denominator / gcdVal;
if (den < 0) {
num = -num;
den = -den;
}
}
friend Fraction operator+(const Fraction& lhs, const Fraction& rhs) {
return Fraction(lhs.num * rhs.den + lhs.den * rhs.num, lhs.den * rhs.den);
}
friend Fraction operator-(const Fraction& lhs, const Fraction& rhs) {
return Fraction(lhs.num * rhs.den - lhs.den * rhs.num, lhs.den * rhs.den);
}
friend Fraction operator*(const Fraction& lhs, const Fraction& rhs) {
return Fraction(lhs.num * rhs.num, lhs.den * rhs.den);
}
friend Fraction operator/(const Fraction& lhs, const Fraction& rhs) {
return Fraction(lhs.num * rhs.den, lhs.den * rhs.num);
}
friend bool operator==(const Fraction& lhs, const Fraction& rhs) {
return lhs.num == rhs.num && lhs.den == rhs.den;
}
Fraction& operator+=(const Fraction& other) {
*this = *this + other;
return *this;
}
Fraction& operator-=(const Fraction& other) {
*this = *this - other;
return *this;
}
Fraction& operator*=(const Fraction& other) {
*this = *this * other;
return *this;
}
Fraction& operator/=(const Fraction& other) {
*this = *this / other;
return *this;
}
friend istream& operator>>(istream& in, Fraction& f) {
int num = 0, den = 1;
char c;
in >> num >> c >> den;
f = Fraction(num, den);
return in;
}
friend ostream& operator<<(ostream& out, const Fraction& f) {
if (f.den == 1) {
out << f.num;
} else if (abs(f.num) > f.den) {
out << f.num / f.den << ' ' << abs(f.num) % f.den << '/' << f.den;
} else {
out << f.num << '/' << f.den;
}
return out;
}
private:
int num, den;
};
```
在这个类中,我们实现了加、减、乘、除四个运算符的重载,以及 +=、-=、*=、/= 四个复合运算符的重载。我们还实现了输入和输出运算符的重载,使得我们可以方便地从键盘读入分数并输出分数。
需要注意的是,我们在构造函数中对分数进行了化简,并且保证了分母为正数。在输出运算符中,我们判断了分数的大小,如果分数大于 1,就输出带分数的形式。
接下来,我们可以编写一个测试程序来验证 Fraction 类的正确性:
```cpp
int main() {
Fraction a, b;
cout << "Enter two fractions: ";
cin >> a >> b;
Fraction c = a + b;
cout << a << " + " << b << " = " << c << endl;
c = a - b;
cout << a << " - " << b << " = " << c << endl;
c = a * b;
cout << a << " * " << b << " = " << c << endl;
c = a / b;
cout << a << " / " << b << " = " << c << endl;
return 0;
}
```
在这个测试程序中,我们首先从键盘读入两个分数,然后分别测试加、减、乘、除四个运算符的重载。运行程序后,我们可以得到如下输出结果:
```
Enter two fractions: 1/2 1/3
1/2 + 1/3 = 5/6
1/2 - 1/3 = 1/6
1/2 * 1/3 = 1/6
1/2 / 1/3 = 3/2
```
可以看到,程序输出了最简分数形式的结果,而且对于除法运算,我们也保证了输出分数的分母为正数。因此,我们可以确定 Fraction 类的实现是正确的。
阅读全文