c++对Polynomial多项式的编写

只利用c++对polynomial多项式进行编写,要求可以在VS上完美运行,具体的功能放在下面的图片上了,希望哪位能够解答我的疑问(希望解答具有原创性)

img

运行结果:

img

代码如下:
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;
}