10.10( RationalNumber 类)

创建类RationalNumber ( 分数) , 使其具备下列能力:
a ) 创建一个构造函数, 它可以防止分数的分母为0 。如果分数不是化简形式, 它可以进行化简。而且, 它还可以避免分母为负数
b) 针对该类, 重载加法、减法、乘法和除法运算符。
c) 针对该类, 重载关系和相等运算符。

实现代码

RationalNumber.h

#pragma once
#include <iostream>
using namespace std;
int small(int m, int n) {
   
	if (m >= n) return n;
	return m;
}
int factor(int m, int n) {
   
	for (int i = small(m, n); i >= 2; i--) {
   
		if (m % i == 0 && n % i == 0) return i;
	}
	return 1;
}
int multiple(int m, int n) {
   
	return m * n / factor(m, n);
}

class RationalNumber
{
   
public:
	int Denominator;
	int Numerator;
	double num;
	int x;
	RationalNumber() {
   };
	RationalNumber(int Numerator ,int Denominator) {
   
		//防止分母为0
		if(Denominator<=0){
   
			cout << "分母不能为非正数!" << endl;
			return;
		}
		//使其具备自动约分的功能
		else {
   
			x = factor(Denominator, Numerator);

			this->Denominator = Denominator / x;
			this->Numerator = Numerator / x;
			this->num = (double)Numerator / Denominator;
		}
	}
	//分数加法
	RationalNumber operator+(RationalNumber rn1) {
   
		RationalNumber temp;
		//分母相等时
		if (this->Denominator == rn1.Denominator) {
   
			temp.Numerator = this->Numerator + rn1.Numerator;
			temp.Denominator = this->Denominator;
			//分母与分子最大公因子为1
			if(factor(temp.Denominator,temp.Numerator)==1)
				return temp;
			//非最简模式时
			int commonfactor = factor(temp.Denominator, temp.Numerator);
			temp.Denominator = temp.Denominator / commonfactor;
			temp.Numerator = temp.Numerator / commonfactor;
			return temp;
		}
		//分母不相等时
		else {
   
			temp.Denominator = this->Denominator * rn1.Denominator;
			temp.Numerator = this->Numerator * rn1.Denominator + this->Denominator * rn1.Numerator;
			if (factor(temp.Denominator, temp.Numerator) == 1)
				return temp;
			//非最简模式时
			int commonfactor = factor(temp.Denominator, temp.Numerator);
			temp.Denominator = temp.Denominator / commonfactor;
			temp.Numerator = temp.Numerator / commonfactor;
			return temp;
		}
	}
	//分数减法
	RationalNumber operator-(RationalNumber rn1) {
   
		RationalNumber temp;
		//分母相等时
		if (this->Denominator == rn1.Denominator) {
   
			temp.Numerator = this->Numerator - rn1.Numerator;
			temp.Denominator = this->Denominator;
			//分母与分子最大公因子为1
			if (factor(this->Denominator, temp.Numerator) == 1)
				return temp;
			//非最简模式时
			int commonfactor = factor(temp.Denominator, temp.Numerator);
			temp.Denominator = temp.Denominator / commonfactor;
			temp.Numerator = temp.Numerator / commonfactor;
			return temp;
		}
		//分母不相等时
		else {
   
			temp.Denominator = this->Denominator * rn1.Denominator;
			temp.Numerator = this->Numerator * rn1.Denominator - this->Denominator * rn1.Numerator;
			if (factor(temp.Denominator, temp.Numerator) == 1)
				return temp;
			//非最简模式时
			int commonfactor = factor(temp.Denominator, temp.Numerator);
			temp.Denominator = temp.Denominator / commonfactor;
			temp.Numerator = temp.Numerator / commonfactor;
			return temp;
		}
	}
	//乘法
	RationalNumber operator*(RationalNumber rn1) {
   
		RationalNumber temp;
		temp.Denominator = this->Denominator * rn1.Denominator;
		temp.Numerator = this->Numerator * rn1.Numerator;
		if (factor(temp.Denominator, temp.Numerator) == 1)
			return temp;

		int commonfactor = factor(temp.Denominator, temp.Numerator);
		temp.Denominator = temp.Denominator / commonfactor;
		temp.Numerator = temp.Numerator / commonfactor;
		return temp;
	}
	//除法
	RationalNumber operator/(RationalNumber rn1) {
   
		RationalNumber temp;
		temp.Denominator = this->Denominator * rn1.Numerator;
		temp.Numerator = this->Numerator * rn1.Denominator;
		if (factor(temp.Denominator, temp.Numerator) == 1)
			return temp;

		int commonfactor = factor(temp.Denominator, temp.Numerator);
		temp.Denominator = temp.Denominator / commonfactor;
		temp.Numerator = temp.Numerator / commonfactor;
		return temp;
	}
	//关系运算符
	bool operator>(RationalNumber rn1) {
   
		
		return num > rn1.num;
	}
	bool operator<(RationalNumber rn1) {
   
		return num < rn1.num;
	}
	//相等运算符
	bool operator==(RationalNumber rn1) {
   
		return num == rn1.num;
	}
};

RationalNumber.cpp

#include<iostream>
#include "RationalNumber.h"
using namespace std;
int main() {
   
	cout << "当分母为0时" << endl;
	RationalNumber a1 = RationalNumber(1, 0);
	cout << endl;

	RationalNumber a2 = RationalNumber(49, 25);
	RationalNumber a3 = RationalNumber(36, 7);
	RationalNumber r1 = a2 + a3;
	cout << "分数 49/25 ,分数 36/7 相加结果为:";
	cout << r1.Numerator << "/" << r1.Denominator << endl;

	RationalNumber a4 = RationalNumber(17, 25);
	RationalNumber a5 = RationalNumber(7, 25);
	RationalNumber r2 = a4 - a5;
	cout << "分数 17/25 ,分数 7/25 相减结果为:";
	cout << r2.Numerator << "/" << r2.Denominator << endl;

	RationalNumber a6 = RationalNumber(49, 25);
	RationalNumber a7 = RationalNumber(36, 7);
	RationalNumber r3 = a6 * a7;
	cout << "分数 49/25 ,分数 36/7 相乘结果为:";
	cout << r3.Numerator << "/" << r3.Denominator  << endl;

	RationalNumber a8 = RationalNumber(5, 9);
	RationalNumber a9 = RationalNumber(5, 9);
	RationalNumber r4 = a8 / a9;
	cout << "分数 5/9 ,分数 5/9 相乘结果为:";
	cout << r4.Numerator << "/" << r4.Denominator  << endl;


	cout << endl;
	cout << " 5/9 ";
	if (a8 == a9)
		cout << "==";
	cout << " 5/9 " << endl;

	cout << "49/25 ";
	if (a2 < a3)
		cout << "<";
	cout << " 36/7 " << endl;

	cout << "17/25 ";
	if (a3 > a4)
		cout << ">";
	cout<<" 7/25" << endl;
	
}

10.11( Polynomial 类)

开发类Polynonual( 多项式) 。在类内部, 多项式由它的各个项组成的数组表示,
每一项包含一个系数和一个指数例如, 项2x^4的系数为2 , 指数为4 。开发一个完整的类, 包含适当的构造函数、析构函数及设置和设置获取函数。此外, Polynommal 类还应提供下列重载运算符的能力:
a ) 重载加法运算符( + ) , 对两个Polynomial 做加法。
b ) 重载减法运算符( - ) , 对两个Polynormal 做减法
c ) 重载赋值运算符, 把一个Polynomial 赋给另一个。
d ) 重载乘法运算符0 ) , 对两个Polynomial 做乘法。
e ) 重载加法赋值运算符( + = ) 、减法赋值运算符( - = ) 和乘法赋值运算符( * = ) 。

实现代码

Polynomial.h

#pragma once
#define maxsize 100
#include<iostream>
#include<vector>
using namespace std;
struct  polynode
{
   
	int a;
	int e;
};
class Polynomial
{
   
public:
	int count=0;
	vector<polynode>posture;
	Polynomial();
	Polynomial(int a,int e) {
   
		posture.push_back({
   a,e});
	};
	~Polynomial();
	//重载加法
	Polynomial operator+(Polynomial p1) {
   
		Polynomial temp;
		for (int i = 0; i <= this->posture.size(); i++)
			temp.posture.push_back({
    this->posture[i].a, this->posture[i].e});
		for (int j = 0; j <= p1.posture.size(); j++) 
			temp.posture.push_back({
    p1.posture[j].a ,p1.posture[j].e });
		for (int i = 0; i <= temp.posture.size(); i++)
			for (int j = 0; j <= temp.posture.size(); j++) {
   
				if (i != j && temp.posture[i].e == temp.posture[j].e) {
   
					vector<polynode>::iterator it = temp.posture.begin() + j;
					temp.posture[i] = {
    temp.posture[i].a + temp.posture[j].a,temp.posture[i].e };
					temp.posture.erase(it);
				}
			}
		return temp;
    }
	//重载减法
	Polynomial operator-(Polynomial p1) {
   
		Polynomial temp;
		for (int i = 0; i <= this->posture.size(); i++)
			temp.posture.push_back({
    this->posture[i].a, this->posture[i].e });
		for (int j = 0; j <= p1.posture.size(); j++)
			temp.posture.push_back({
   (-1)* p1.posture[j].a ,p1.posture[j].e });
		for (int i = 0; i <= temp.posture.size(); i++)
			for (int j = 0; j <= temp.posture.size(); j++) {
   
				if (i != j && temp.posture[i].e == temp.posture[j].e) {
   
					vector<polynode>::iterator it = temp.posture.begin() + j;
					temp.posture[i] = {
    temp.posture[i].a + temp.posture[j].a,temp.posture[i].e };
					temp.posture.erase(it);
				}
			}
		return temp;
	}
	 //重载赋值
	void operator=(Polynomial p1) {
   
		p1.posture.clear();
		for (int i = 0; i < this->posture.size(); i++)
			p1.posture.push_back(this->posture[i]);
	}
	//重载乘法
	Polynomial operator*(Polynomial p) {
   
		Polynomial temp;
		for(int i=0;i<this->posture.size();i++)
			for (int j = 0; j < p.posture.size(); j++) {
   
				temp.posture.push_back({
    this->posture[i].a * p.posture[j].a,this->posture[i].e * p.posture[j].e });
			}
		return temp;
	}
	//重载+=
	Polynomial operator+=(Polynomial p1) {
   
		return this->operator+(p1);
	}
	Polynomial operator-=(Polynomial p1) {
   
		return this->operator-(p1);
	}
	Polynomial operator-=(Polynomial p1) {
   
		return this->operator*(p1);
	}
};