C++ 分数类 Fraction 实现:构造函数、简化、运算符重载及示例
#include<iostream>
#include<cmath>
using namespace std;
class Fraction {
private:
int numerator;
int denominator;
public:
Fraction(int n = 0, int d = 1) {
numerator = n;
denominator = d;
}
int gcd(int a, int b) {
if (b == 0) {
return a;
} else {
return gcd(b, a % b);
}
}
void simplify() {
int common = gcd(abs(numerator), abs(denominator));
numerator /= common;
denominator /= common;
if (denominator < 0) {
numerator *= -1;
denominator *= -1;
}
}
operator double() {
return (double)numerator / denominator;
}
friend ostream& operator <<(ostream& out, const Fraction& f);
friend istream& operator >>(istream& in, Fraction& f);
friend Fraction operator +(const Fraction& f1, const Fraction& f2);
friend Fraction operator -(const Fraction& f1, const Fraction& f2);
friend Fraction operator *(const Fraction& f1, const Fraction& f2);
friend Fraction operator /(const Fraction& f1, const Fraction& f2);
friend Fraction operator +(const Fraction& f1, const int& i);
friend Fraction operator -(const Fraction& f1, const int& i);
friend Fraction operator *(const Fraction& f1, const int& i);
friend Fraction operator /(const Fraction& f1, const int& i);
friend Fraction operator +(const int& i, const Fraction& f2);
friend Fraction operator -(const int& i, const Fraction& f2);
friend Fraction operator *(const int& i, const Fraction& f2);
friend Fraction operator /(const int& i, const Fraction& f2);
};
ostream& operator <<(ostream& out, const Fraction& f) {
out << f.numerator << '/' << f.denominator;
return out;
}
istream& operator >>(istream& in, Fraction& f) {
char slash;
in >> f.numerator >> slash >> f.denominator;
f.simplify();
return in;
}
Fraction operator +(const Fraction& f1, const Fraction& f2) {
int num = f1.numerator * f2.denominator + f2.numerator * f1.denominator;
int den = f1.denominator * f2.denominator;
Fraction result(num, den);
result.simplify();
return result;
}
Fraction operator -(const Fraction& f1, const Fraction& f2) {
int num = f1.numerator * f2.denominator - f2.numerator * f1.denominator;
int den = f1.denominator * f2.denominator;
Fraction result(num, den);
result.simplify();
return result;
}
Fraction operator *(const Fraction& f1, const Fraction& f2) {
int num = f1.numerator * f2.numerator;
int den = f1.denominator * f2.denominator;
Fraction result(num, den);
result.simplify();
return result;
}
Fraction operator /(const Fraction& f1, const Fraction& f2) {
int num = f1.numerator * f2.denominator;
int den = f1.denominator * f2.numerator;
Fraction result(num, den);
result.simplify();
return result;
}
Fraction operator +(const Fraction& f1, const int& i) {
Fraction f2(i);
return f1 + f2;
}
Fraction operator -(const Fraction& f1, const int& i) {
Fraction f2(i);
return f1 - f2;
}
Fraction operator *(const Fraction& f1, const int& i) {
Fraction f2(i);
return f1 * f2;
}
Fraction operator /(const Fraction& f1, const int& i) {
Fraction f2(i);
return f1 / f2;
}
Fraction operator +(const int& i, const Fraction& f2) {
Fraction f1(i);
return f1 + f2;
}
Fraction operator -(const int& i, const Fraction& f2) {
Fraction f1(i);
return f1 - f2;
}
Fraction operator *(const int& i, const Fraction& f2) {
Fraction f1(i);
return f1 * f2;
}
Fraction operator /(const int& i, const Fraction& f2) {
Fraction f1(i);
return f1 / f2;
}
int main() {
Fraction f1(3, 4);
Fraction f2(1, 2);
Fraction f3 = f1 + f2;
cout << f3 << endl; // 输出 5/4
Fraction f4 = f1 - f2;
cout << f4 << endl; // 输出 1/4
Fraction f5 = f1 * f2;
cout << f5 << endl; // 输出 3/8
Fraction f6 = f1 / f2;
cout << f6 << endl; // 输出 3/2
Fraction f7 = f1 + 2;
cout << f7 << endl; // 输出 11/4
Fraction f8 = f1 - 2;
cout << f8 << endl; // 输出 -5/4
Fraction f9 = f1 * 2;
cout << f9 << endl; // 输出 3/2
Fraction f10 = f1 / 2;
cout << f10 << endl; // 输出 3/8
Fraction f11 = 2 + f1;
cout << f11 << endl; // 输出 11/4
Fraction f12 = 2 - f1;
cout << f12 << endl; // 输出 5/4
Fraction f13 = 2 * f1;
cout << f13 << endl; // 输出 3/2
Fraction f14 = 2 / f1;
cout << f14 << endl; // 输出 8/3
double d = f1;
cout << d << endl; // 输出 0.75
Fraction f15;
cin >> f15; // 输入 2/3
cout << f15 << endl; // 输出 2/3
return 0;
}
原文地址: https://www.cveoy.top/t/topic/kWxv 著作权归作者所有。请勿转载和采集!