只利用c++对polynomial多项式进行编写,要求可以在VS上完美运行,具体的功能放在下面的图片上了,希望哪位能够解答我的疑问(希望解答具有原创性)
运行结果:
代码如下:
Polynomial.h文件
#ifndef Polynomial_H
#define Polynomial_H
#include <string>
#include <stdlib.h>
#include <iostream>
using namespace std;
class Polynomial
{
private:
int* mXs; //存储系数
int* mJi; //存储幂次
int mNmb; //存储多项式的项数
int mSize; //数组的大小
public:
static int mCount; //存储多项式的个数
public:
Polynomial(); //无参构造函数
Polynomial(const Polynomial& a); //拷贝构造函数,这里采用浅拷贝
~Polynomial(); //析构函数
void add(int xs, int mj); //增加多项式
void show();
void Sort(); //按照幂次从小到大排序
int getXs(int mj, int& xs); //根据幂次获取系数
void setXs(int mj, int xs); //设置某个幂次的系数
double value(double x); //输入x计算表达式的值
void release(); //释放内存
//运算符重载
Polynomial operator +(const Polynomial& a);
friend Polynomial operator -(const Polynomial& a,const Polynomial& b); //友元函数
Polynomial operator =(Polynomial& a);
Polynomial operator *(Polynomial& a);
};
#endif // !Polynomial_H
Polynomial.cpp文件
#include "Polynomial.h"
#include <math.h>
Polynomial::Polynomial() //无参构造函数
{
mSize = 10;
mXs = (int*)malloc(sizeof(int) * mSize);
mJi = (int*)malloc(sizeof(int) * mSize);
mNmb = 0;
mCount++; //多项式个数+1
}
Polynomial::Polynomial(const Polynomial& a)
{
this->mNmb = a.mNmb;
mCount++;
delete[] this->mXs;
delete[] this->mJi;
this->mXs = a.mXs;
this->mJi = a.mJi;
this->mSize = a.mSize;
}
Polynomial::~Polynomial() //析构函数
{
mCount--; //多项式个数-1
//这里不释放内存,否则在运算符重载部分会出错,内存的释放需要手动释放
}
void Polynomial::release()
{
if (mXs) { delete[] mXs; mXs = 0; }
if (mJi) { delete[] mJi; mJi = 0; }
}
void Polynomial::add(int xs, int mj) //增加多项式
{
if (mNmb >= mSize)
{
mSize += 10; //扩容
mXs = (int*)realloc(mXs, sizeof(int) * mSize);
mJi = (int*)realloc(mJi, sizeof(int) * mSize);
}
mXs[mNmb] = xs;
mJi[mNmb] = mj;
mNmb++;
Sort();
}
void Polynomial::show()
{
for (int i = 0; i < mNmb; i++)
{
//输出系数
if (mXs[i] != 0)
{
if (i == 0 && mXs[i] > 0)
cout << mXs[i]; //第一项系数如果是正数,省略符号
else
{
if (mXs[i] > 0)
{
if(mXs[i] != 1)
cout << "+" << mXs[i]; //正系数补充符号位
else
{
if(mJi[i] == 0)
cout << "+" << mXs[i]; //正系数补充符号位
else
cout << "+"; //系数是1时省略
}
}
else
{
if (mXs[i] != -1)
cout << mXs[i]; //直接输出系数
else
{
if(mJi[i] == 0)
cout << mXs[i]; //直接输出系数
else
cout << "-"; //-1时只输出-即可
}
}
}
}
//输出幂次
if (mJi[i] != 0)
{
cout << "x";
if (mJi[i] != 1)
cout <<"^" << mJi[i]; //1次幂省略
}
}
cout << endl;
}
void Polynomial::Sort() //按照幂次从小到大排序
{
for (int i = 0; i < mNmb - 1; i++)
{
for (int j = 0; j < mNmb - 1 - i; j++)
{
if (mJi[j] > mJi[j + 1])
{
int t = mJi[j];
mJi[j] = mJi[j + 1];
mJi[j + 1] = t;
t = mXs[j];
mXs[j] = mXs[j + 1];
mXs[j + 1] = t;
}
}
}
}
int Polynomial::getXs(int mj,int &xs) //根据幂次获取系数
{
for (int i = 0; i < mNmb; i++)
{
if (mJi[i] == mj)
{
xs = mXs[i];
return 1;
}
}
return 0;
}
void Polynomial::setXs(int mj, int xs) //设置某个幂次的系数
{
for (int i = 0; i < mNmb; i++)
{
if (mJi[i] == mj)
{
mXs[i] = xs;
return;
}
}
}
Polynomial Polynomial::operator +(const Polynomial& a)
{
Polynomial res;
int i = 0, j = 0;
while (i < this->mNmb && j < a.mNmb)
{
if (this->mJi[i] < a.mJi[j])
{
res.add(this->mXs[i], this->mJi[i]);
i++;
}
else if (this->mJi[i] > a.mJi[j])
{
res.add(a.mXs[j], a.mJi[j]);
j++;
}
else
{
res.add(this->mXs[i] + a.mXs[j], a.mJi[j]);
i++;
j++;
}
}
while (i < this->mNmb)
{
res.add(this->mXs[i], this->mJi[i]);
i++;
}
while (j < a.mNmb)
{
res.add(a.mXs[j], a.mJi[j]);
j++;
}
return res;
}
Polynomial operator -(const Polynomial& a, const Polynomial& b)
{
Polynomial res;
int i = 0, j = 0;
while (i < a.mNmb && j < b.mNmb)
{
if (a.mJi[i] < b.mJi[j])
{
res.add(a.mXs[i], a.mJi[i]);
i++;
}
else if (a.mJi[i] > b.mJi[j])
{
res.add(b.mXs[j], b.mJi[j]);
j++;
}
else
{
res.add(a.mXs[i] - b.mXs[j], b.mJi[j]);
i++;
j++;
}
}
while (i < a.mNmb)
{
res.add(a.mXs[i], a.mJi[i]);
i++;
}
while (j < b.mNmb)
{
res.add(-b.mXs[j], b.mJi[j]);
j++;
}
return res;
}
Polynomial Polynomial::operator =(Polynomial& a)
{
Polynomial res;
res.mNmb = a.mNmb;
mCount++;
delete[] res.mXs;
delete[] res.mJi;
res.mXs = a.mXs;
res.mJi = a.mJi;
res.mSize = a.mSize;
return res;
}
Polynomial Polynomial::operator *(Polynomial& a)
{
Polynomial res;
for (int i = 0; i < this->mNmb; i++)
{
for (int j = 0; j < a.mNmb; j++)
{
int xs1=1, xs2=1;
this->getXs(this->mJi[i],xs1);
a.getXs(a.mJi[j], xs2);
int rt = xs1 * xs2; //系数相乘
int mc = this->mJi[i] + a.mJi[j]; //幂次相加
//cout << "mc=" << this->mJi[i] << "+" << a.mJi[j] << "=" << mc <<": ";
int xs3;
if (res.getXs(mc, xs3)) //如果已有该幂次,将两个结果相加
{
res.setXs(mc, xs3 + rt);
//cout << xs3 << " + " << rt << "=" << xs3 + rt << endl;
}
else
{
res.add(rt, mc);
//cout << rt << endl;
}
}
}
return res;
}
double Polynomial::value(double x)
{
double sum = 0;
for (int i = 0; i < mNmb; i++)
{
sum += mXs[i] * pow(x, mJi[i]);
}
return sum;
}
main.cpp
#include <iostream>
#include "Polynomial.h"
using namespace std;
int Polynomial::mCount = 0; //初始化个数
int main()
{
Polynomial s1;
s1.add(-10, 0);
s1.add(3, 1);
s1.add(-5, 3);
s1.add(8, 4);
s1.add(-1, 6);
cout << "s1表达式:";
s1.show();
Polynomial s2;
s2.add(9, 0);
s2.add(8, 1);
s2.add(3, 3);
s2.add(-6, 4);
s2.add(10, 5);
cout << "s2表达式:";
s2.show();
Polynomial s3(s2); //使用s2构建s3
cout << "调用拷贝构造函数构造s3:";
s3.show();
Polynomial s4 = s1 + s2;
cout << "s4 = s1 + s2 = ";
s4.show();
Polynomial s5 = s1 - s2;
cout << "s5 = s1 - s2 = ";
s5.show();
Polynomial s6 = s1 * s2;
cout << "s6 = s1 * s2 = ";
s6.show();
double x;
cout << "输入x的值,计算表达式s1的值:";
cin >> x;
cout << s1.value(x) << endl;
cout << "多项式的个数:" << Polynomial::mCount << endl;
return 0;
}