C 多项式操作

C 多项式操作,c,codeblocks,C,Codeblocks,我想添加两个多项式并在多项式结果上设置结果。我对第三个函数有问题。请给出任何指示,我真的需要帮助 PS:动态声明!看来我不太懂指针,所以如果你能给我一些建议,也许能帮助我理解这一章,那将是很有帮助的 typedef struct { int degree; float* coeff_tab; } Polynome; Polynome lire_polynome() {

我想添加两个多项式并在多项式结果上设置结果。我对第三个函数有问题。请给出任何指示,我真的需要帮助 PS:动态声明!看来我不太懂指针,所以如果你能给我一些建议,也许能帮助我理解这一章,那将是很有帮助的

     typedef struct {
            int degree;
            float* coeff_tab;
        } Polynome;


        Polynome lire_polynome()
        {
            Polynome p;
            int i;

            printf("Degree du polynome? ");
            scanf("%d", &p.degree);
            p.coeff_tab = (float*)malloc((unsigned long)(p.degree+1)*sizeof (float));

            for(i=0; i<=p.degree; i++)
            {
                printf("coeff de degree %i: ", i);
                scanf("%f", &p.coeff_tab[i]);
            }
            //free(p.coeff_tab);

            return p;
        }


        void affiche_polynome(Polynome p)
        {
            int i;
            if(p.degree > 1){
                printf("%4.2fX^%i ", p.coeff_tab[p.degree], p.degree);
                for(i=p.degree-1; i>1; i--){
                    printf(" + %4.2fX^%i ", p.coeff_tab[i], i);
                }
                printf(" + %4.2fX + %4.2f\n", p.coeff_tab[1], p.coeff_tab[0]);
            } else {
                printf(" + %4.2f\n", p.coeff_tab[0]);
            }
        }
        void sommePoly(Polynome p1 , Polynome p2 , Polynome psom)
 {
     int degsom,deg1,deg2,i=0,j=0,k=0;
     float coeffsum,coeff1,coeff2;
     Polynome *P,*S ,*Psom;
     P=&p1; S=&p2;
     degsom=max(p1.degree,p2.degree);
     psom.coeff_tab=(float*)malloc((unsigned long)(degsom+1)*sizeof (float));
     Psom=&psom;
     if( p1.degree == p2.degree)

     {
        psom.coeff_tab[k]=p1.coeff_tab[i]+p2.coeff_tab[j];
        psom.degree=p1.degree;
        Psom ++;
     i++;j++;k++;
     }
     else if(p1.degree > p2.degree) {
        psom.degree=p1.degree;
        psom.coeff_tab[k]=p1.coeff_tab[i];
        i++;k++;
    }else {
        psom.coeff_tab[k]=p2.coeff_tab[j];
        psom.degree=p2.degree;
        j++;k++;

    }
          }
typedef结构{
智力度;
浮动*系数选项卡;
}多项式;
多项式lire_多项式()
{
多项式p;
int i;
printf(“多项式度?”);
scanf(“%d”和“p.degree”);
p、 coeff_tab=(float*)malloc((无符号长)(p.degree+1)*sizeof(float));
对于(i=0;i 1){
printf(“%4.2fX^%i”,p.coeff_选项卡[p.degree],p.degree);
对于(i=p.degree-1;i>1;i--){
printf(“+%4.2fX^%i”,p.coeff_tab[i],i);
}
printf(“++%4.2fX++%4.2f\n”,p.coeff_选项卡[1],p.coeff_选项卡[0]);
}否则{
printf(“+%4.2f\n”,p.coeff_选项卡[0]);
}
}
void sommePoly(多项式p1、多项式p2、多项式psom)
{
int degsom,deg1,deg2,i=0,j=0,k=0;
浮动系数和,系数1,系数2;
多项式*P,*S,*Psom;
P=&p1;S=&p2;
degsom=最大值(p1度,p2度);
psom.coeff_tab=(float*)malloc((无符号长)(degsom+1)*sizeof(float));
Psom=&Psom;
如果(p1度==p2度)
{
psom.coeff_tab[k]=p1.coeff_tab[i]+p2.coeff_tab[j];
psom.degree=p1.degree;
Psom++;
i++;j++;k++;
}
否则如果(p1度>p2度){
psom.degree=p1.degree;
psom.coeff_tab[k]=p1.coeff_tab[i];
i++;k++;
}否则{
psom.coeff_tab[k]=p2.coeff_tab[j];
psom.degree=p2.degree;
j++;k++;
}
}
void sommePoly(多项式p1、多项式p2、多项式psom)

在C语言中,参数是通过复制变量的值来传递的。因此,
p1
是您传递的变量的副本。为了修改指针后面的值,需要传递指针。或者返回值,就像您在使用
Polynome lire\u Polynome()
时所做的那样

通常我会期望功能:

int lire_polynome(Polynome *p);
int sommePoly(Polynome *p1 , Polynome *p2 , Polynome *psom);
使用一些返回值,例如int,可以在出现错误时返回负数或非零数(例如
malloc
error)

因此,您的函数可能如下所示:

int sommePoly(Polynome *p1 , Polynome *p2 , Polynome *psom)
{
     int degsom, deg1, deg2, i = 0, j = 0, k = 0;
     float coeffsum, coeff1, coeff2;
     degsom = max(p1->degree, p2->degree);
     psom->coeff_tab = malloc((degsom + 1) * sizeof(float));
     if (psom->coeff_tab == NULL) { return -1; }
     if (p1->degree == p2->degree){
        psom->coeff_tab[k] = p1->coeff_tab[i] + p2->coeff_tab[j];
        psom->degree = p1->degree;
     ... // and so on replace psom. to psom-> ie. replace dot with ->
    }
    return 0;
}
然后将其称为向结构传递指针:

Polynome p1;
if (lire_polynome(&p1) != 0) { /* error handling */ }
Polynome p2;
if (lire_polynome(&p2) != 0) { /* error ahdling */ }
Polynome p3;
if (sommePoly(&p1, &p2, &p3) != 0) { /* error handling */ }
  • 记住检查
    scanf
    错误
    if(scanf(“%f”,…)!=1){fprintf(stderr,“scanf中的错误”);退出(1);}
  • 记住检查malloc错误
  • (unsigned long)(p.degree+1)*sizeof(float)
    中转换为unsigned long很奇怪,而且很容易出错
    sizeof(…)
    的类型为size\u t,这是大小表示的正确类型,将其强制转换为
    无符号长
    是不必要的,并且在某些大数情况下可能会导致错误。只需
    malloc((p.degree+1)*sizeof(float))
    calloc(p->degree+1,sizeof(float))
  • 抓起一本关于你的好书
  • 有关传递指针和修改值的更简单示例,请参见

  • 我认为这个版本的sommePoly正是您想要的:

    void sommePoly(Polynome *p1 , Polynome *p2 , Polynome *psom)
    {
            int     i;
            Polynome        *big, *sml;
    
            if (p1->degree > p2->degree) {
                    big = p1;
                    sml = p2;
            }
            else {
                    big = p2;
                    sml = p1;
            }
    
            psom->degree = big->degree;
            psom->coeff_tab = calloc(psom->degree + 1, sizeof(float));
    
            for (i = 0; i < sml->degree + 1; i++)
            {
                    psom->coeff_tab[i] = big->coeff_tab[i] + sml->coeff_tab[i];
            }
            for (; i < big->degree + 1; i++)
            {
                    psom->coeff_tab[i] = big->coeff_tab[i];
            }
    }
    
    以及输出:

    $ cc -g -O0 -Wall  poly.c -o poly
    $ ./poly
    1.00X^5 + 3.00X^4 + -2.00X^2 + 8.00X^1 + 1.00
    7.00X^3 + 5.00X^2 + -3.00X^1 + 1.00
    1.00X^5 + 3.00X^4 + 7.00X^3 + 3.00X^2 + 5.00X^1 + 2.00
    

    你能创造一个新的世界吗?如何调用这些函数?你能举个例子吗?示例输出?期望期望的输出?是的,前两个函数可以工作,但最后一个函数是完全错误的…示例输入多项式p=lire_Polynome();affiche_多项式(p)<代码>扫描(“%f”和p.coeff_选项卡[i])你能为你的程序提供示例输入吗?你的程序给它什么输出?您希望您的程序打印什么?在主函数中有以下内容:Polynome p=lire_Polynome();/*读取多项式1/affiche_多项式(p);/然后读取poly 2*/多项式s=lire_Polynome();附加多项式;乘法是什么?乘法比求和函数稍微复杂一点。您需要迭代两个多项式的每一项并执行乘法:for()循环中的for()循环。
    $ cc -g -O0 -Wall  poly.c -o poly
    $ ./poly
    1.00X^5 + 3.00X^4 + -2.00X^2 + 8.00X^1 + 1.00
    7.00X^3 + 5.00X^2 + -3.00X^1 + 1.00
    1.00X^5 + 3.00X^4 + 7.00X^3 + 3.00X^2 + 5.00X^1 + 2.00