西农大 C plus

news/2024/10/25 17:22:59/

问题 K: oop实习-11.运算符重载

题目描述

定义有理数类(分母不为0的分数,分子分母均为整数)Rational,实现相应操作符的重载。

(1)定义私有数据成员:分子int iUp; 分母 int iDown。

(2)定义私有成员函数:void Reduce() 和 int Gcd(int l, int r),分别用于有理数的约简和求两个整数的最大公约数。其中,在约简时需要求取分子与分母的最大公约数。

(3)定义构造函数,在构造函数体内可调用Reduce对有理数进行约简。

(4)将负号-和赋值运算符=重载为公有成员函数,分别用于求有理数的负数和赋值。

(5)将前置++、前置--、后置++、后置--重载为公有成员函数,实现有理数自增1或自减1。

(6)将+、-、*、/重载为友员函数,实现有理数的加减乘除。

(7)将<、<=、>、>=重载为友员函数,实现有理数的大小关系比较。

(8)重载流插入符<<和流提取符>>,分别用于有理数的输出和输入。其中,输出格式为“分子/分母”,若为整数,则直接输出整数。

 

在main函数中,根据输入的分子和分母定义两个有理数对象a和b。再定义几个有理数对象分别用于表示a和b的加、减、乘、除、前置自增a、前置自减a、后置自增a、后置自减a,并依次各个对象的结果。最后依次用<、<=、>、>=比较a和b的大小关系,并依次输出比较结果(true或false)。

输入

两个有理数a和b的的分子和分母

输出

有理数a和b的加、减、乘、除以及前置自增a、前置自减a、后置自增a、后置自减a

有理数a和b的<、<=、>、>=的结果

提示

#include <iostream>
using namespace std;class Rational{friend Rational operator+(Rational& p1, Rational& p2);friend Rational operator-(Rational& p1, Rational& p2);friend Rational operator*(Rational& p1, Rational& p2);friend Rational operator/(Rational& p1, Rational& p2);friend bool operator<(Rational& p1, Rational& p2);friend bool operator<=(Rational& p1, Rational& p2);friend bool operator>(Rational& p1, Rational& p2);friend bool operator>=(Rational& p1, Rational& p2);friend ostream& operator <<(ostream& cout, Rational& p);friend istream& operator >>(istream& cin, Rational& p);
private:int iUp;int iDown;//有理数约简void Reduce() {int t = abs(Gcd(iUp, iDown));iUp = iUp / t;iDown = iDown / t;if (iDown < 0){iDown = -iDown; iUp = -iUp; }}int Gcd(int l, int r) {int temp = l % r;while (temp != 0) {l = r;r = temp;temp = l % r;}return r;}public:Rational() {iUp = 1;iDown = 1;}Rational(int a,int b) {iUp = a;iDown = b;Reduce();}//相反数Rational operator-()  { Rational temp;temp.iUp = -iUp;temp.iDown = iDown;return temp;}//赋值    Rational& operator=(const Rational& p) {iUp = p.iUp;iDown = p.iDown;Reduce();return *this;}//前置++Rational& operator++() {iUp += iDown;Reduce();return *this;}//前置--Rational& operator--() {iUp -= iDown;return *this;}//后置++Rational operator++(int) {Rational temp = *this;iUp += iDown;return temp;}//后置--Rational operator--(int) {Rational temp = *this;iUp -= iDown;return temp;}  };
//加法+
Rational operator+(Rational& p1, Rational& p2) {Rational temp;temp.iDown = p1.iDown * p2.iDown;temp.iUp = p1.iUp * p2.iDown + p2.iUp * p1.iDown;temp.Reduce();return temp;
}
//减法-
Rational operator-(Rational& p1, Rational& p2) {Rational temp;temp.iDown = p1.iDown * p2.iDown;temp.iUp = p1.iUp * p2.iDown - p2.iUp * p1.iDown;temp.Reduce();return temp;
}
//乘法*
Rational operator*(Rational& p1, Rational& p2) {Rational temp;temp.iUp = p1.iUp * p2.iUp;temp.iDown = p1.iDown * p2.iDown;temp.Reduce();return temp;
}
//除法/
Rational operator/(Rational& p1, Rational& p2) {Rational temp;temp.iUp = p1.iUp * p2.iDown;temp.iDown = p1.iDown * p2.iUp;temp.Reduce();return temp;
}
//<号
bool operator<(Rational& p1, Rational& p2) {int temp;temp = p1.iDown * p2.iDown;p1.iDown = temp;p1.iUp += p2.iDown;p2.iDown = temp;p2.iUp += p1.iDown;p1.Reduce();p2.Reduce();if (p1.iUp < p2.iUp) {return true;}return false;
}
bool operator<=(Rational& p1, Rational& p2) {int temp;temp = p1.iDown * p2.iDown;p1.iDown = temp;p1.iUp += p2.iDown;p2.iDown = temp;p2.iUp += p1.iDown;p1.Reduce();p2.Reduce();if (p1.iUp <= p2.iUp) {return true;}return false;
}
bool operator>(Rational& p1, Rational& p2) {int temp;temp = p1.iDown * p2.iDown;p1.iDown = temp;p1.iUp += p2.iDown;p2.iDown = temp;p2.iUp += p1.iDown;p1.Reduce();p2.Reduce();if (p1.iUp > p2.iUp) {return true;}return false;
}
bool operator>=(Rational& p1, Rational& p2) {int temp;temp = p1.iDown * p2.iDown;p1.iDown = temp;p1.iUp += p2.iDown;p2.iDown = temp;p2.iUp += p1.iDown;p1.Reduce();p2.Reduce();if (p1.iUp >= p2.iUp) {return true;}return false;
}
ostream& operator <<(ostream& cout, Rational& p) {int temp;if (p.iUp % p.iDown == 0) {cout << p.iUp / p.iDown <<endl;}else {cout << p.iUp << "/" << p.iDown << endl;}return cout;
}
istream& operator >>(istream& cin, Rational& p) {cin >> p.iUp >> p.iDown;//cout << p.iUp << "/" << p.iDown << endl;return cin;
}int main()
{Rational a;Rational b;cin >> a;cin >> b;Rational c;				c = a + b;cout << "a+b: " << c ;c = a - b;cout << "a-b: " << c;c = a * b;cout << "a*b: " << c;c = a / b;cout << "a/b: " << c;c = -a;cout << "-a: " << c ;cout << "++a: " << ++a ;cout << "--a: " << --a ;c = a++;cout << "a++: " << c ;c = a--;cout << "a--: " << c ;bool d;d = (a < b);cout << "a<b: " << boolalpha << d << endl;d = (a <= b);cout << "a<=b: " << boolalpha << d<< endl;d = (a > b);cout << "a>b: " << boolalpha << d << endl;d = (a >= b);cout << "a>=b: " << boolalpha << d << endl;}


http://www.ppmy.cn/news/315255.html

相关文章

程序员面试题精选100题(51)-顺时针打印矩阵

// 程序员面试题精选100题(51)-顺时针打印矩阵.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include <iostream> using namespace std; #define M 9 #define N 4 int _tmain(int argc, _TCHAR* argv[]) {int arr[M][N];int all0;int i,j,iup0,…

运算符重载例题

用的是vs2019编译器 这是一个有关运算符重载的例题&#xff0c;希望大家作以参考 定义有理数类&#xff08;分母不为0的分数&#xff0c;分子分母均为整数&#xff09;Rational&#xff0c;实现相应操作符的重载。 &#xff08;1&#xff09;定义私有数据成员&#xff1a;分子…

FPGA实现深度学习系列之卷积神经网络算法描述

这里全部内容都是由这个网址转载过来的。 https://tech.youmi.net/2016/07/163347168.html 解说&#xff1a; 关于算法的完成。需要看很多的文章和视频才能有更好的理解和领悟。这里就随便点一下。 1&#xff0c;FPGA作为部署终端&#xff0c;只执行前向传导任务。并不执行…

十字链表c语言实验报告,矩阵加法(基于十字链表)及C语言代码实现

矩阵之间能够进行加法运算的前提条件是:各矩阵的行数和列数必须相等。 在行数和列数都相等的情况下,矩阵相加的结果就是矩阵中对应位置的值相加所组成的矩阵,例如: 采用链式存储结构存储稀疏矩阵三元组的方法,称为“十字。 十字链表法表示矩阵 例如,用十字链表法表示矩阵…

万字博文讲解如何用shell来实现一个俄罗斯方块小游戏

文章目录 1.游戏效果运行图&#xff1a;2. 前置知识与游戏进程设计&#xff1a;2.1: 有关 $0,$1,$2,...$9, 和 $!2.2 进程设计 3.进程间信号传递3.1 RunAsKeyReceiver接收到用户的键盘输入后是如何把信号传递给RunAsDisplayer 进程的 4. 使用echo进行字符打印4.1 打印带颜色背景…

计算机开发日语词汇笔记二

プルダウンリスト&#xff1a;下拉列表&#xff0c;“pull-down list”。 取得できない場合、○○のプルダウンリストに値は設定されない。 不给○○下拉列表赋值。 プルダウンリストに全ての項目を表示する。 下拉列表中显示所有的列表。 エビデンス&#xff1a;成果&…

飞腾(ARM V8)平台实现FFT

最近在做飞腾上的FFT优化&#xff0c;记录一下以后用。 目前实现了基2FFT&#xff0c;使用arm提供的neon接口做了并行计算。算法原理网上很多&#xff0c;这里就不讲了&#xff0c;记录复数正向优化方法。 优化思路&#xff1a; 第一层蝶形计算&#xff1a; 第一层的蝶形因子都…

iDownsV1.8.4资源素材教程下载类WordPress

介绍&#xff1a; 本主题全部干净整洁&#xff0c;代码开源&#xff0c;可以自行随意修改。 完美适合WordPress虚拟资源分享下载站&#xff0c;或者其他的素材资源站点。 感谢支持作者&#xff0c;如果您不是在本站下载的主题&#xff0c;关于安全等任何问题本人概不负责&…