分别用成员函数和友元函数重载运算符,使对整型的运算符=、+、、*、/适用于分数运 要求: (1)输出结果是最简分数(可以是带分数); 2)分母为1,只输出分子。
时间: 2024-02-27 19:56:46 浏览: 65
C++运算符重载 成员函数与友元函数详解
5星 · 资源好评率100%
好的,下面是一个简单的 C++ 程序,其中定义了一个 Fraction 类,重载了运算符 =、+、-、*、/ 等,并且满足上述要求:
```c++
#include <iostream>
using namespace std;
class Fraction {
public:
Fraction(int num = 0, int den = 1) : m_num(num), m_den(den) {}
Fraction(const Fraction& other) : m_num(other.m_num), m_den(other.m_den) {}
Fraction& operator=(const Fraction& other);
friend Fraction operator+(const Fraction& a, const Fraction& b);
friend Fraction operator-(const Fraction& a, const Fraction& b);
friend Fraction operator*(const Fraction& a, const Fraction& b);
friend Fraction operator/(const Fraction& a, const Fraction& b);
void simplify(); // 约分
void print() const; // 输出分数
private:
int m_num; // 分子
int m_den; // 分母
};
Fraction& Fraction::operator=(const Fraction& other) {
if (this != &other) {
m_num = other.m_num;
m_den = other.m_den;
}
return *this;
}
Fraction operator+(const Fraction& a, const Fraction& b) {
Fraction res(a.m_num * b.m_den + b.m_num * a.m_den, a.m_den * b.m_den);
res.simplify();
return res;
}
Fraction operator-(const Fraction& a, const Fraction& b) {
Fraction res(a.m_num * b.m_den - b.m_num * a.m_den, a.m_den * b.m_den);
res.simplify();
return res;
}
Fraction operator*(const Fraction& a, const Fraction& b) {
Fraction res(a.m_num * b.m_num, a.m_den * b.m_den);
res.simplify();
return res;
}
Fraction operator/(const Fraction& a, const Fraction& b) {
Fraction res(a.m_num * b.m_den, a.m_den * b.m_num);
res.simplify();
return res;
}
void Fraction::simplify() {
if (m_den == 0) {
cerr << "Error: denominator is zero" << endl;
return;
}
if (m_num == 0) {
m_den = 1;
return;
}
int gcd = 1;
int a = abs(m_num);
int b = abs(m_den);
for (int i = min(a, b); i > 0; --i) {
if (a % i == 0 && b % i == 0) {
gcd = i;
break;
}
}
m_num /= gcd;
m_den /= gcd;
}
void Fraction::print() const {
if (m_den == 1) {
cout << m_num << endl;
} else {
int integer = m_num / m_den;
int numerator = m_num % m_den;
if (integer != 0) {
cout << integer << " ";
}
cout << numerator << "/" << m_den << endl;
}
}
```
这个程序中,我们定义了一个 Fraction 类,包含了两个私有成员变量 m_num 和 m_den,分别表示分子和分母。我们重载了运算符 =、+、-、*、/,并且使用了友元函数实现。
在运算符重载函数中,我们按照分数的加减乘除法规则进行计算,得到结果后调用 simplify() 函数对结果进行约分,最后返回结果。simplify() 函数实现了分数的约分,即求出分子和分母的最大公约数,并将分子和分母都除以这个最大公约数,从而得到最简分数形式。
在 print() 函数中,我们实现了分数的输出,如果分数的分母为 1,则直接输出分子;否则,输出最简分数形式,如果有整数部分,则输出整数部分和分数部分。
您可以在 main() 函数中定义 Fraction 类型的变量,然后进行各种运算,例如:
```c++
int main() {
Fraction a(1, 2);
Fraction b(2, 3);
Fraction c = a + b;
c.print(); // 输出 7/6
Fraction d = a - b;
d.print(); // 输出 -1/6
Fraction e = a * b;
e.print(); // 输出 1/3
Fraction f = a / b;
f.print(); // 输出 3/4
return 0;
}
```
在这个例子中,我们定义了两个分数 a 和 b,然后进行加减乘除法运算,并将结果赋值给变量 c、d、e、f,最后调用 print() 函数输出结果。
阅读全文