У меня есть небольшая проблема с этой программой, которую я делаю,
Основная цель этой программы, которую я делаю, состоит в том, чтобы получить 2 полинома и суммировать / перемножить / умножить их,
Еще не закончил вывод и main (), только на самом коде,
Когда я пытаюсь использовать умноженную часть,
Я получаю эту ошибку: стек вокруг переменной ‘a’ поврежден,
Не знаю, что я сделал не так …. Мне потребовалось 1 час, чтобы подумать об этом и написать это, но всего 2 часа, пытаясь это исправить, но ничего не получилось.
class PolyNomial
{
int printcounter;
double *coefficients;
int degree;
public:
PolyNomial()//the default constructor to initialize a polynomial equal to 0
{
degree = 0;
coefficients = new double[degree + 1];
coefficients[0] = 0;
}
PolyNomial(double y[], int x)//the constructor to initialize a polynomial with the given coefficient array and degree
{
degree = x;
if (degree>10)
{
cout<<"Error : The PolyNomial's Degree is bigger than 10 and can not be shown in this program";
}
else
{
int c=0;
coefficients = new double[degree + 1];
for(c=0;c<=degree;c++)
{
coefficients[c] = y[c];
}
}
}
void add(PolyNomial p)
{
int i;
if ( degree < p.degree )
{
i = p.degree;
printcounter = p.degree;
}
else
{
i = degree;
printcounter = degree;
}
for(;i>=0;i--)
{
coefficients[i] = coefficients[i] + p.coefficients[i];
}
}
void sub(PolyNomial p)
{
int i;
if ( degree < p.degree )
{
i = p.degree;
printcounter = p.degree;
}
else
{
i = degree;
printcounter = degree;
}
for(;i>=0;i--)
{
coefficients[i] = coefficients[i] - p.coefficients[i];
}
}
void print()
{
int i;
for(i=0;i<=printcounter;i++)
cout<<coefficients[i]<<" ";
}
void Multiply(PolyNomial p)
{
int i,j;
i = degree;
j = p.degree;
double a[100];
int counter;
for ( counter = 0 ; counter <= i+j; counter++)
{
a[counter]=0;
}
int x= i+ j ;
for(;i>=0;i--)
{
for(;j>=0;j--)
if (i+j>=10)
{
cout<<"Error : The PolyNomial's Degree is bigger than 10 and can not be shown in this program";
break;
}
a[i+j] = a[i+j] + ( coefficients[i] * p.coefficients[j] );
}
PolyNomial k(coefficients,x);
k.print();
}
};int main()
{
double a[100];
int x,i;
cout<<"Enter the PolyNomial's Degree : ";
cin>>x;
cout<<"\nEnter the coefficients one by one by , from bigger to smaller : ";
for ( i=0 ; i<=x ; i++ )
{
cin>>a[i];
}PolyNomial p(a,x);
cout<<"\n\nEnter the PolyNomial's Degree : ";
cin>>x;
cout<<"\nEnter the coefficients one by one by , from lowest degree to highest : ";
for ( i=0 ; i<=x ; i++ )
{
cin>>a[i];
}PolyNomial o(a,x);
_getch();
// p.add(o);
p.Multiply(o);
// p.print();
_getch();
// p.sub(o);
// p.Multiply(o);
}
Эта линия
a[i+j] = a[i+j] + ( coefficients[i] * p.coefficients[j] );
не находится внутри цикла for j (вы не использовали {и} для его включения}. Это означает, что j — это -1, когда он запускается. Если i — 0, вы присваиваете значение [-1], которое вызывает стек коррупционное сообщение.
Обратите внимание, что вы также не сбрасываете j каждый раз вокруг цикла i, поэтому внутренний цикл будет выполняться только один раз.
В C и C ++ локальные переменные обычно хранятся в стеке, небольшой области памяти, которую программы используют для хранения данных локального / функционального уровня; когда исполняемый файл вызывает функцию, процессор использует стек для хранения адреса, с которого выполняется вызов, и затем переходит к подпрограмме. Когда подпрограмма завершается, если она очистила свой стек, то она должна вернуться в состояние, в котором верхнее значение стека — это адрес, к которому необходимо вернуться, чтобы возобновить обработку.
В то же время программы на C / C ++ используют стек для хранения локальных переменных — принцип заключается в том, что когда вы покидаете подпрограмму, все переменные удаляются очень элегантно.
Ваши переменные «a» являются локальными переменными, они находятся в стеке. Поскольку они являются массивами, это означает, что если вы пишете вне ограничений массива, вы перезапишете области стека, используемые другими переменными или, возможно, даже процессором для отслеживания адресов возврата.
Ваши переменные «а» имеют 100 элементов. Этот массив образует один непрерывный блок:
{a[0]}{a[1]}...{a[99]}
Если вы пишете в «a [100]», вы пишете за концом массива и над памятью какой-то другой переменной или, возможно, адресом возврата функции.
Вы можете рассмотреть возможность использования [std::array][1]
или [std::vector][2]
,
В то время, когда вы создаете свой многочлен, вы создаете массив коэффициентов с размером degree + 1
, Все идет нормально. Теперь, если вы добавляете два полинома, вы просто добавляете коэффициенты, но игнорируете выделенное пространство. Если полином с наименьшей степенью должен быть результатом сложения, у вас возникнут проблемы
Хорошо, пока tnx ко всем ответам и комментариям я получил мой код, работающий, но он не делает работу правильно,
Пример: если я сначала добавлю полином 2 градуса, то 3 градуса, например:
1 2 3
1 2 3 4
Результатом будет:
0 0 3 6 9 12
Что является только одной частью процессов умножения,
2 полинома, которые я добавил:
3х ^ 2 + 2х ^ 1 + 1
4х ^ 3 + 3х ^ 2 + 2х ^ 1 + 1
Вот новый код:
class PolyNomial
{
int printcounter;
double *coefficients;
int degree;
public:
PolyNomial()//the default constructor to initialize a polynomial equal to 0
{
degree = 0;
coefficients = new double[degree + 1];
coefficients[0] = 0;
}
PolyNomial(double y[], int x)//the constructor to initialize a polynomial with the given coefficient array and degree
{
degree = x;
if (degree>10)
{
cout<<"Error : The PolyNomial's Degree is bigger than 10 and can not be shown in this program";
}
else
{
int c=0;
coefficients = new double[degree + 1];
for(c=0;c<=degree;c++)
{
coefficients[c] = y[c];
}
}
}
void add(PolyNomial p)
{
int i;
if ( degree < p.degree )
{
i = p.degree;
printcounter = p.degree;
}
else
{
i = degree;
printcounter = degree;
}
for(;i>=0;i--)
{
coefficients[i] = coefficients[i] + p.coefficients[i];
}
}
void sub(PolyNomial p)
{
int i;
if ( degree < p.degree )
{
i = p.degree;
printcounter = p.degree;
}
else
{
i = degree;
printcounter = degree;
}
for(;i>=0;i--)
{
coefficients[i] = coefficients[i] - p.coefficients[i];
}
}
void print()
{
int i;
for(i=0;i<=printcounter;i++)
cout<<coefficients[i]<<" ";
}
void Multiply(PolyNomial p)
{
int i,j;
i = degree;
j = p.degree;
double mult[100];
int counter;
for ( counter = 0 ; counter <= i+j; counter++)
{
mult[counter]=0;
}
int x= i+ j ;
for(;i>=0;i--)
{
for(;j>=0;j--)
{
if (i+j>=10)
{
cout<<"Error : The PolyNomial's Degree is bigger than 10 and can not be shown in this program";
break;
}
mult[i+j] = mult[i+j] + ( coefficients[i] * p.coefficients[j] );
}
}
PolyNomial k(mult,x);
k.printcounter = x;
k.print();
}
};int main()
{
double a[100];
int x,i;
cout<<"Enter the PolyNomial's Degree : ";
cin>>x;
cout<<"\nEnter the coefficients one by one by , from lowesr degree to highest : ";
for ( i=0 ; i<=x ; i++ )
{
cin>>a[i];
}PolyNomial p(a,x);
cout<<"\n\nEnter the PolyNomial's Degree : ";
cin>>x;
cout<<"\nEnter the coefficients one by one by , from lowest degree to highest : ";
for ( i=0 ; i<=x ; i++ )
{
cin>>a[i];
}PolyNomial o(a,x);
_getch();
// p.add(o);
p.Multiply(o);
// p.print();
_getch();
// p.sub(o);
// p.Multiply(o);
}