定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。

本文介绍了如何在C++中重载<<和>>运算符,用于分数类的输入输出,以此改进程序的显示效果,使其更加直观易读。通过示例代码展示了运算符重载的运用,帮助加深对这一概念的理解。
摘要由CSDN通过智能技术生成

问题及代码:

/*
*Copyright (c) 2016,烟台大学计算机学院
*All rights reserved.
*文件名称:main.cpp
*作    者:李磊涛
*完成时间:2016年5月28日
*版 本 号:v1.0
*
*问题描述:定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
*输入描述:无。
*程序输出:分数的各种形式。
*/
#include<iostream>
using namespace std;
class CFraction
{
private:
	int nume;//fenzi
	int deno;//fenmu
public:
	CFraction(int a=0,int b=0);
	
	void show();
	friend istream &operator>>(istream &in,CFraction &x);
    friend ostream &operator<<(ostream &out,CFraction x);
	CFraction operator+(double c);
	CFraction operator-(double c);
	CFraction operator*(double c);
	CFraction o
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个实现上述要求的完整程序: ``` #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` 函数,我们从文件入两个分数,并且对它们进行加、减、乘、除运算,将结果输出到文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值