【SUFE】围绕多项式的创建、计算、打印、释放空间等功能编写如下函数,在主程序中调用

这是一道关于多项式的计算题

(题目有点问题)

        因为题目已经给出了要写哪些函数,我们一个一个地实现就OK了。

#include <iostream>
#include<stdlib.h>
#include<time.h>
#include<assert.h>
using namespace std;

int *getPolynomial(int num){//创建空间
    int *p=new int[num+2];//new一个数组  少开辟了一个空间,所以一直报错!
    *p={0};//初始化
    *(p+num+1)=-1;//用于后续函数判断数组是否到结尾
    return p;
}

void setPolyCoef(int *pt,int maxval){// 函数对多项式系数(pt 所指向的动态数组的元素)赋值,每个元素的值为在 0~ maxval-1 之间的随机数。
    //srand((unsigned)time(NULL));//以秒作为种子,有点小问题

    srand(clock());//精确到毫秒(题目限制了头文件,所以我只能想到这个办法)
    int i=0;
    while(*(pt+i)!=-1){//逐一赋值
        *(pt+i)=(rand()%maxval);
        i++;
    }
    //*(pt+i-1)=0;//用来debug的
}

void releaseMem(int *pt){//函数用于释放由 getPolynomial 所申请的内存空间。
    delete []pt;
}

void printPolynomial(int *pt){// 函数按照多项式的格式,从左到右依次打印高次项,…, 常数项。 例如打印四次多项式: 5x^4 + 23x^3 + 105x + 2
    int j=0;
    while(true){//算出数组长度,最开始new的时候可以看到
        if(*(pt+j)==-1)
            break;
        else
            j++;
        //cout<<"try"<<j<<endl;//用来debug
    }
    int co=j-1;//因为数组下标从0开始,所以减一。co是标识次数
    bool pr=false;//这里是因为当最高次项的系数为0时,前面会多一个加号,所以这个用来判断前面是否输出过项,也就是说,前面是不是都为0。
    while(true){
        if(co==-1)
            break;
        if(*(pt+co)==0){//系数为0就跳过,看下一个
            co--;
            //cout<<"此处为0";//用来debug
            continue;
        }
        else{
            //cout<<"此处不为0";//用来debug
            if(pr)//前面存在项的话就输出"+"。
                cout<<" + ";
            if(co>1)
                cout<<*(pt+co)<<"x^"<<co;
            else if(co==1)
                cout<<*(pt+co)<<"x";
            else
                cout<<*(pt+co);
            co--;
            pr=true;//已经输出过一项,于是可以有"+"了
        }
        //cout<<"CO="<<co<<"  \n";//用来debug
    }
    cout<<endl;

}

double polynomialVal(int *pt,double x){// 当自变量 x 的值已知时,求多项式的函数值
    int j=0,i=0;
    double xn=1,sum=0;
    //pt[0]是常数项
    while(pt[j]!=-1){//逐个计算每一项的值,再相加
        i=j;
        xn=1;
        while(true){//计算x^n的值
            if(i==0) break;
            xn*=x;
            i--;
        }
        sum+=(xn*pt[j]);
        j++;
    }
    return sum;
}

int *polynomialAdd(int *pt1,int* pt2){//求两个多项式 pt1, pt2 的和,返回指向(求和)结果的指针。
    int j1=0,j2=0;
    while(true){//计算长度
        if(*(pt1+j1)==-1)
            break;
        else
            j1++;
    }
    while(true){//计算长度
        if(*(pt2+j2)==-1)
            break;
        else
            j2++;
    }
    j1--; j2--;
    //cout<<"j1="<<j1<<"j2="<<j2<<endl; //用来debug
    int j3=(j1>j2)?j1:j2;
    for(int i=0;i<=j3;i++){//哪个次数更高就用哪个
        if(i>j1){
            *(pt1+i)=0;
        }
        if(i>j2){//他还有常数项!
            *(pt2+i)=0;
        }
        if(j3>=j1)//以次数高的为基础再相加
            *(pt1+i)+=*(pt2+i);
        else
            *(pt2+i)+=*(pt1+i);
    }
    if(j3>j2)
        return pt1;
    else
        return pt2;
}

int main()
{
    int *p1,*p2,*p3,num1=7,num2=5;
    int maxval=50;

    p1=getPolynomial(num1);
    setPolyCoef(p1,maxval);
    printPolynomial(p1);

    double x=1.2;
    cout<<"the polynomial p1's value when x="<<x<<" is:"<<polynomialVal(p1,x)<<endl;
 
    p2=getPolynomial(num2);
    setPolyCoef(p2,maxval);
    printPolynomial(p2);

    p3=polynomialAdd(p1,p2);
    printPolynomial(p3);

    cout<<"the polynomial p3's value when x="<<x<<" is:"<<polynomialVal(p3,x)<<endl;

    releaseMem(p1);
    releaseMem(p2);

    return 0;
}

思路什么的我都写在注释里了,结合代码看效果更好(虽然我觉得我写得让人看不懂)。

(就先这样了,偷偷懒)先去准备期末了

希望有大佬能指出修改意见,欢迎大家交流各自的想法!

欢迎大家来我的小站看看

progress everyday!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值