第十章课后习题(10,11)

本文介绍了如何使用C++创建RationalNumber类来处理分数,包括构造函数、加减乘除运算符重载,以及关系和相等运算符的实现。同时,展示了Polynomial类的设计,用于表示多项式,实现了各项的数组表示,包括加减乘运算符重载、赋值运算符以及加减乘赋值运算符。示例代码展示了类的使用方法。
摘要由CSDN通过智能技术生成

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);
	}
};
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空LA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值