1.定义一个分数类,其数据成员为分子和分母,用成员函数重载运算符 =、+ 和-, 以实现分数的赋值、相加和相减。用友元函数重载运算符 * 和/,以实现分数的相乘和相除,提取和插入运算符重载。要求进行各种运算后,得到的分数是最简的,并输出到result.txt文件。请编写一个完整的程序,测试各种运算符重载的正确性。假定分子和分母都是整数。 提示∶ 为了得到最简分数可在构造函数中对分子分母进行约简,进而需要另外编写一个求两个数的最大公约数的成员函数。
时间: 2024-02-01 09:17:08 浏览: 95
运算符重载题目合集(整型数组交集、矩阵加法、分数加法)
下面是一个实现上述要求的完整程序:
```
#include<iostream>
#include<fstream>
using namespace std;
class Fraction{
private:
int numerator; // 分子
int denominator; // 分母
int gcd(int a, int b); // 求最大公约数的函数
public:
Fraction(int n=0, int d=1); // 构造函数
void simplify(); // 约分函数
Fraction operator=(const Fraction& f); // 赋值运算符重载
Fraction operator+(const Fraction& f) const; // 加法运算符重载
Fraction operator-(const Fraction& f) const; // 减法运算符重载
friend Fraction operator*(const Fraction& f1, const Fraction& f2); // 乘法运算符重载
friend Fraction operator/(const Fraction& f1, const Fraction& f2); // 除法运算符重载
friend ostream& operator<<(ostream& out, const Fraction& f); // 输出运算符重载
friend istream& operator>>(istream& in, Fraction& f); // 输入运算符重载
};
Fraction::Fraction(int n, int d):numerator(n),denominator(d){
simplify();
}
int Fraction::gcd(int a, int b){
if(b==0) return a;
else return gcd(b,a%b);
}
void Fraction::simplify(){
int g=gcd(numerator,denominator);
numerator/=g;
denominator/=g;
if(denominator<0){
numerator=-numerator;
denominator=-denominator;
}
}
Fraction Fraction::operator=(const Fraction& f){
numerator=f.numerator;
denominator=f.denominator;
return *this;
}
Fraction Fraction::operator+(const Fraction& f) const{
int n=numerator*f.denominator+f.numerator*denominator;
int d=denominator*f.denominator;
Fraction result(n,d);
result.simplify();
return result;
}
Fraction Fraction::operator-(const Fraction& f) const{
int n=numerator*f.denominator-f.numerator*denominator;
int d=denominator*f.denominator;
Fraction result(n,d);
result.simplify();
return result;
}
Fraction operator*(const Fraction& f1, const Fraction& f2){
int n=f1.numerator*f2.numerator;
int d=f1.denominator*f2.denominator;
Fraction result(n,d);
result.simplify();
return result;
}
Fraction operator/(const Fraction& f1, const Fraction& f2){
int n=f1.numerator*f2.denominator;
int d=f1.denominator*f2.numerator;
Fraction result(n,d);
result.simplify();
return result;
}
ostream& operator<<(ostream& out, const Fraction& f){
if(f.denominator==1) out<<f.numerator;
else out<<f.numerator<<"/"<<f.denominator;
return out;
}
istream& operator>>(istream& in, Fraction& f){
in>>f.numerator>>f.denominator;
f.simplify();
return in;
}
int main(){
Fraction f1, f2, f3, f4, f5, f6; // 定义分数对象
ifstream fin("input.txt"); // 从文件中读入分数
fin>>f1>>f2;
fin.close();
f3=f1+f2; // 分数相加
f4=f1-f2; // 分数相减
f5=f1*f2; // 分数相乘
f6=f1/f2; // 分数相除
ofstream fout("result.txt"); // 将计算结果输出到文件中
fout<<f1<<" + "<<f2<<" = "<<f3<<endl;
fout<<f1<<" - "<<f2<<" = "<<f4<<endl;
fout<<f1<<" * "<<f2<<" = "<<f5<<endl;
fout<<f1<<" / "<<f2<<" = "<<f6<<endl;
fout.close();
return 0;
}
```
在上面的程序中,我们定义了一个分数类 `Fraction`,其中包含了分子和分母两个数据成员。在构造函数中,我们对分数进行了约简,以确保最终得到的分数是最简分数。此外,我们还定义了求两个数的最大公约数的成员函数 `gcd`,用于约简分数。
在 `Fraction` 类中,我们重载了赋值运算符 `=`、加法运算符 `+`、减法运算符 `-`、乘法运算符 `*`、除法运算符 `/`,并且还定义了输出运算符 `<<` 和输入运算符 `>>`。其中,加法和减法运算符的重载都很容易理解,而乘法和除法运算符的重载则需要使用友元函数。在重载运算符时,我们都需要用到分数的约分函数 `simplify` 来确保最终得到的分数是最简分数。
最后,在 `main` 函数中,我们从文件中读入两个分数,并且对它们进行加、减、乘、除运算,将结果输出到文件中。
阅读全文