Перегрузка C++ * для умножения полинома
-
22-07-2019 - |
Вопрос
Итак, я разрабатываю полиномиальный класс, в котором пользователь вводит: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
или (x+5)(x-3) = x^2 +2x - 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
Решение
Похоже, вы не инициализируете temp.coefficient [i + j]
в ноль в своем операторе * ()
.
temp.coefficient = new int [count];
std::memset (temp.coefficient, 0, count * sizeof(int));
Другие советы
Преобразуйте -842150450 в шестнадцатеричный формат, чтобы найти обратно одно из магических значений используется в CRT в отладочной сборке. Это помогает найти ошибку в вашем коде:
temp.coefficient = new int [count];
// Must initialize the memory
for (int ix = 0; ix < count; ++ix) temp.coefficient[ix] = 0;
Между прочим, есть много других ошибок, удачи в их исправлении.
Делает
temp.coefficient = new int [count];
дать вам массив нулей?
В противном случае в цикле for вы добавляете что-то в мусор.
Заменять
temp.coefficient = new int [count];
к
temp.coefficient = new int [count]();
чтобы инициализировать значения массива нулями.