C中两个多项式的加法和乘法

时间:2015-12-17 17:56:08

标签: c polynomials

所以我的代码出了问题。 唯一剩下的就是我的多项式的程度打印输出。 有人能告诉我应该修改什么来修复它吗? (注意*代码必须使用这些函数,我不能使用指针使其工作)

    #include <stdio.h>
// Dva polinoma,sabrati,izmnoziti i ispisati
typedef struct polinom
{
    int koef[100];
    int n;
}POLINOM;

POLINOM citaj();
POLINOM saberi(POLINOM, POLINOM);
POLINOM pomnozi(POLINOM, POLINOM);
void ispisi(POLINOM);

int main()
{
    POLINOM pol1, pol2, zbir, przvd;
    printf("1. Polinom:\n");
    pol1 = citaj();
    printf("\n2. Polinom:\n");
    pol2 = citaj();
    zbir = saberi(pol1, pol2);
    printf("\n Zbir:\n");
    ispisi(zbir);
    przvd = pomnozi(pol1, pol2);
    printf("\n Proizvod:\n");
    ispisi(przvd);
    getch();
}

POLINOM citaj()
{
    POLINOM pol;
    int i;
    do
    {
        printf("Najveci stepen polinoma: "), scanf("%d", &pol.n);
    } while (pol.n < 1 || pol.n>100);
    for (i = 0; i < 100; i++)
    {
        if (i <= pol.n)
        {
            printf("(X%d)=", i), scanf("%d", &pol.koef[i]);
        }
        else
            pol.koef[i] = 0;
    }
    return pol;
}

POLINOM saberi(POLINOM pol1, POLINOM pol2)

{
    POLINOM zbir;
    int i;
    if (pol1.n > pol2.n)
        zbir.n = pol1.n;
    else
        zbir.n = pol2.n;
    for (i = 0; i < 100; i++)
        zbir.koef[i] = pol1.koef[i] + pol2.koef[i];

    return zbir;
}

POLINOM pomnozi(POLINOM pol1, POLINOM pol2)

{
    POLINOM przvd;
    int i, j;
    if (pol1.n > pol2.n)
    {
        przvd.n = pol1.n;
        for (i = 0; i <= przvd.n; i++)
        for (j = 0; j <= przvd.n; j++)
            przvd.koef[i] = pol1.koef[i] * pol2.koef[j];
    }
    else
    {
        przvd.n = pol2.n;
        for (i = 0; i <= przvd.n; i++)
        for (j = 0; j <= przvd.n; j++)
                przvd.koef[i + j] += pol1.koef[i] * pol2.koef[j];
    }
    return przvd;
}

void ispisi(POLINOM a)
{
    int i;
    for (i = 0; i <= a.n; i++)
        printf("(X%d)= %d ", i, a.koef[i]);
}

以下是我的代码运行示例:

$ ./a.out
1. Polinom:
Najveci stepen polinoma: ^C
sundev19:/home/jgalloway12 $ ./a.out
1. Polinom:
Najveci stepen polinoma: 5
(X0)=4
(X1)=3
(X2)=2
(X3)=1
(X4)=5
(X5)=6

2. Polinom:
Najveci stepen polinoma: 5
(X0)=1
(X1)=2
(X2)=3
(X3)=4
(X4)=5
(X5)=6

 Zbir:
(X0)= 5 (X1)= 5 (X2)= 5 (X3)= 5 (X4)= 10 (X5)= 12
 Proizvod:
(X0)= -4199088 (X1)= 16 (X2)= 25 (X3)= 35 (X4)= 50 (X5)= 76 $

修正了如果有人需要它,这是工作代码:

#include <stdio.h>
// Dva polinoma,sabrati,izmnoziti i ispisati
typedef struct polinom
{
    int koef[100];
    int n;
}POLINOM;

POLINOM citaj();
POLINOM saberi(POLINOM, POLINOM);
POLINOM pomnozi(POLINOM, POLINOM);
void ispisi(POLINOM);

int main()
{
    POLINOM pol1, pol2, zbir, przvd;
    printf("1. Polinom:\n");
    pol1 = citaj();
    printf("\n2. Polinom:\n");
    pol2 = citaj();
    zbir = saberi(pol1, pol2);
    printf("\n Zbir:\n");
    ispisi(zbir);
    przvd = pomnozi(pol1, pol2);
    printf("\n Proizvod:\n");
    ispisi(przvd);
    getch();
}

POLINOM citaj()
{
    POLINOM pol;
    int i;
    do
    {
        printf("Najveci stepen polinoma: "), scanf("%d", &pol.n);
    } while (pol.n < 1 || pol.n>100);
    for (i = 0; i < 100; i++)
    {
        if (i <= pol.n)
        {
            printf("(X%d)=", i), scanf("%d", &pol.koef[i]);
        }
        else
            pol.koef[i] = 0;
    }
    return pol;
}

POLINOM saberi(POLINOM pol1, POLINOM pol2)

{
    POLINOM zbir;
    int i;
    if (pol1.n > pol2.n)
        zbir.n = pol1.n;
    else
        zbir.n = pol2.n;
    for (i = 0; i < 100; i++)
        zbir.koef[i] = pol1.koef[i] + pol2.koef[i];

    return zbir;
}

POLINOM pomnozi(POLINOM pol1, POLINOM pol2)

{
    POLINOM przvd;
    int i, j,k;
    przvd.n = pol1.n + pol2.n ;
    for (k = 0; k <= przvd.n; k++)
        przvd.koef[k] = 0;
        for (i = 0; i <= pol1.n; i++)
            for (j = 0; j <= pol2.n; j++)
            przvd.koef[i + j] += pol1.koef[i] * pol2.koef[j];
    return przvd;
}

void ispisi(POLINOM a)
{
    int i;
    for (i = 0; i <= a.n; i++)
        if(a.koef[i]!=0)
            printf("(X%d)= %d ", i, a.koef[i]);
}

1 个答案:

答案 0 :(得分:1)

此代码存在一些问题。

  • przvd系数未初始化,因此+=会添加初始垃圾。

  • 两个多项式都被循环到更高的多项式的次数,这意味着可以访问下多项式的不存在的系数。

看起来你期望系数被神奇地初始化为0.事实并非如此。在C中,自动变量未初始化;你必须手动完成。

此外,pomnozi的两个分支必须使用相同的(卷积)公式。如编码,第一个分支在数学上是错误的。