C ++ перегрузка * для полиномиального умножения - PullRequest
1 голос
/ 01 декабря 2009

Итак, я разработал полиномиальный класс, в котором вводимые пользователем данные: 1x ^ 0 + 2x ^ 1 + 3x ^ 2 ... и 1,2,3 (коэффициенты) хранятся в массиве int

Мои перегруженные функции + и - работают, однако * не работают. Независимо от ввода, он всегда показывает -842150450
когда должно быть (5x ^ 0 + x ^ 1) * (-3x ^ 0 + x ^ 1) = -15x ^ 0 + 2x ^ 1 + 1x ^ 2
или (х + 5) (х-3) = х ^ 2 + 2х - 15

Я использую перегруженную * функцию, например: Polynomial multiply = one * two;
Я предполагаю, что проблема в strtol (p, & endptr, 10), так как он использует длинное целое, однако сложение и вычитание работает отлично

Мой конструктор

Polynomial::Polynomial(char *s)
{
    char *string;
    string = new char [strlen(s) + 1];
    int length = strlen(string);
    strcpy(string, s);

    char *copy;
    copy = new char [length];
    strcpy(copy, string);

    char *p = strtok(string, "  +-");
    counter = 0;
    while (p) 
    {
        p = strtok(NULL, "  +-");
        counter++;
    }

    coefficient = new int[counter];

    p = strtok(copy, "  +");
    int a = 0;
    while (p)
    {
        long int coeff;
        char *endptr;
        coeff = strtol(p, &endptr, 10); //stops at first non number
        if (*p == 'x')
           coeff = 1;

        coefficient[a] = coeff;
        p = strtok(NULL, "  +");
        a++;
    }
}

и перегруженная * функция

Polynomial Polynomial::operator * (const Polynomial &right)
{
    Polynomial temp;

    //make coefficient array
    int count = (counter + right.counter) - 1;
    temp.counter = count;
    temp.coefficient = new int [count];
    for (int i = 0; i < counter; i++)
    {
        for (int j = 0; j < right.counter; j++)
            temp.coefficient[i+j] += coefficient[i] * right.coefficient[j];
    }
    return temp;
}

И вот весь мой код: http://pastie.org/721143

Ответы [ 4 ]

7 голосов
/ 01 декабря 2009

Вы не можете инициализировать temp.coefficient[i+j] в ноль в вашем operator * ().

temp.coefficient = new int [count];
std::memset (temp.coefficient, 0, count * sizeof(int));
5 голосов
/ 01 декабря 2009

Конвертируйте -842150450 в шестнадцатеричное значение, чтобы найти одно из магических значений , используемых в CRT в отладочной сборке. Это помогает найти ошибку в вашем коде:

    temp.coefficient = new int [count];
    // Must initialize the memory
    for (int ix = 0; ix < count; ++ix) temp.coefficient[ix] = 0;

Есть много других ошибок, кстати, удачи в их исправлении.

1 голос
/ 03 февраля 2011

Заменить

temp.coefficient = new int [count];

от

temp.coefficient = new int [count]();

для инициализации значений массива нулями.

1 голос
/ 01 декабря 2009

ли

temp.coefficient = new int [count];

дать вам массив нулей?

В противном случае в цикле for вы добавляете вещи в мусор.

...