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);
}
};