2015-12-17 3 views
0

Так что у меня проблема с моим кодом. Единственное, что осталось, это распечатка степени моих полиномов. Может ли кто-нибудь сказать мне, что мне следует изменить, чтобы исправить это? (Примечание * код должен использовать эти функции, и я не могу использовать указатели сделали это работать)Добавление и умножение двух многочленов в C

#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 $ 

Fixed он это является рабочим кодом, если кому-либо это необходимо:

#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]); 
} 
+0

Предоставить журнал вашей программы. Не понятно, как это работает. – QuestionC

+0

Выход программы, как это 1.Polynom Введите самый высокий показатель: 5 (например) х (0) = 5 // Х с 0 показатель х (1) = 4 х (2) = 3 х (3) = 2 х (4) = 1 х (5) = 1 Затем этот процесс повторяется для 2. полином После того, что он выводит добавление этих двух многочленов (с показателями), и после этого он должен отображать умножение этих полиномов, программа отображает правильные коэффициенты, но показатели не являются хорошими. –

+0

Подозреваемый '*' запутан. Я ожидал бы что-то вроде 'przvd.n = pol1.n + pol2.n-1; (инициализировать przvd для всех 0.0) для (i = 0; i <= przvd.n; i ++) для (j = 0; j <= przvd.n; j ++) przvd.koef [i + j] + = pol1.koef [i] * pol2.koef [j]; ' – chux

ответ

1

С этим кодом связано несколько проблем.

  • przvd коэффициенты не инициализируется, поэтому += добавляет первоначальный мусор.

  • Оба полинома зациклированы до степени высшего полинома, что означает, что доступ к несуществующим коэффициентам нижнего полинома.

Похоже, вы ожидаете, что коэффициенты магически инициализированы на 0. Это не так. В C автоматические переменные не инициализируются; вы должны сделать это вручную.

Кроме того, обе ветви pomnozi должны использовать ту же формулу (свертку). Как закодировано, первая ветвь математически ошибочна.

+0

Я исправил свой код, но спасибо, что заметил это :) –

Смежные вопросы