Re: класс полином
Добавлено: 23 ноя 2009, 15:21
посмотрите пжл. операторы =,+=, когда правый операнд число.
и у меня вопрос по оператору += для 2ух полиномов. сомневаюсь я серавно в правильности его работы.)
еще вопрос как правильней реализовать диффиринцал полинома, когда полином задан конструктором с одним аргументом.
и у меня вопрос по оператору += для 2ух полиномов. сомневаюсь я серавно в правильности его работы.)
еще вопрос как правильней реализовать диффиринцал полинома, когда полином задан конструктором с одним аргументом.
Код: Выделить всё
Polynom::Polynom(const size_t Dim): m_Dim(Dim)
{
{
m_Dim=Dim+1;
if(!m_Dim)
{
cout<<szbuf.toOem("Ошибка")<<endl;
exit (-3);
}
if(!(m_Pol= new double[m_Dim]))
{
cout<<szbuf.toOem("Ошибка")<<endl;
exit (-1);
}
size_t i;
for(i=0; i < m_Dim ; ++i)
{
m_Pol[i]=i;
}
}
}
Код: Выделить всё
////////////////////////////////
/////////Перегрузки 1///////////
////////////////////////////////
Polynom: :o perator double*() const
{
return m_Pol;
}
////перегрузка унарного оператора "-"
Polynom Polynom: :o perator-()
{
size_t i;
for (i=0; i < m_Dim; ++i)
m_Pol[i] = -m_Pol[i];
return *this;
}
////////////////////////////////
/////////Перегрузки 2///////////
////////////////////////////////
// Оператор присваивания
Polynom & Polynom: :o perator=(const Polynom &ob)
{
if (this != &ob)
{
delete[] m_Pol;
if (!(m_Pol=new double[m_Dim=ob.m_Dim]))
{
cout<<szbuf.toOem("Ошибка! Недостаточно памяти!")<<endl;;
exit(-1);
}
size_t i;
for (i=0; i < m_Dim; ++i)
m_Pol[i]=ob.m_Pol[i];
}
return *this;
}
// Оператор присваивания, когда правая часть число
Polynom & Polynom: :o perator=(double op)
{
Polynom tmp(*this);
size_t i;
for (i=0; i < m_Dim; ++i)
{
tmp.m_Pol[0]=op;
m_Pol[i]+=tmp.m_Pol[0];
}
return *this;
}
// Оператор присваивания cо сложением
Polynom & Polynom: :o perator+=(const Polynom &ob)
{
if (&ob != this)
{
size_t i,k,j;
if (m_Dim > ob.m_Dim)
{
i = m_Dim;
k=ob.m_Dim;
}
else
{
i = ob.m_Dim;
k = m_Dim;
}
double* new_Pol = new double[i];
for(j=0; j<k; ++j)
new_Pol[j] = m_Pol[j]+ob.m_Pol[j];
for(j=k; j<i; ++j)
if (m_Dim > ob.m_Dim)
new_Pol[j] = m_Pol[j];
else
new_Pol[j] = ob.m_Pol[j];
m_Pol = new_Pol;
m_Dim = i;
}
return *this;
}
// Оператор присваивания cо сложением, когда правая часть число.
Polynom & Polynom: :o perator+=(double po)
{
Polynom tmp(*this);
size_t i;
for (i=0; i < m_Dim; ++i)
tmp.m_Pol[0]+=po;
return tmp;
}
// Оператор присваивания c вычитанием
Polynom & Polynom: :o perator-=(const Polynom &ob)
{
if (&ob != this)
{
size_t i,k,j;
if (m_Dim > ob.m_Dim)
{
i = m_Dim;
k=ob.m_Dim;
}
else
{
i = ob.m_Dim;
k = m_Dim;
}
double* new_Pol = new double[i];
for(j=0; j<k; ++j)
new_Pol[j] = m_Pol[j]-ob.m_Pol[j];
for(j=k; j<i; ++j)
if (m_Dim > ob.m_Dim)
new_Pol[j] = -m_Pol[j];
else
new_Pol[j] = -ob.m_Pol[j];
m_Pol = new_Pol;
m_Dim = i;
}
return *this;
}
// Оператор присваивания c вычитанием, когда правая часть число.
Polynom & Polynom: :o perator-=(double po)
{
Polynom tmp(*this);
size_t i;
for (i=0; i <= m_Dim; ++i)
tmp.m_Pol[0]-=po;
return tmp;
}
//оператор присваивания с умножением
Polynom & Polynom: :o perator*=(const Polynom &poly)
{
Polynom tmp(m_Dim-1,m_Pol);
m_Dim=tmp.m_Dim+poly.m_Dim-1;
delete [] m_Pol;
if(!(m_Pol= new double[m_Dim]))
{
cout << szbuf.toOemA("Ошибка! Недостаточно памяти!") << endl;
exit(-1);
}
size_t i,j;
for(i=0;i<m_Dim;++i)
{
m_Pol[i]=0;
}
for(i=0; i < tmp.m_Dim; i++)
{
for(j=0; j < poly.m_Dim; j++)
{
m_Pol[i+j] += tmp.m_Pol[i]*poly.m_Pol[j];
}
}
return *this;
}
//для случая,когда правый операнд число
Polynom & Polynom: :o perator*=(double op)
{
size_t i;
for(i=0; i<=m_Dim; ++i)
m_Pol[i] *= op;
return *this;
}
//оператор возвидения в степень для случая,когда правый операнд число/
Polynom & Polynom: :o perator^=(int op)
{
if (op > 0)
{
size_t i;
Polynom temp = *this;
for (i=0;i <= op;++i)
{
*this *= temp;
}
}
return *this;
}
//Бинарный оператор присваивания с делением
//для случая,когда правый операнд число
Polynom & Polynom: :o perator/=(double op)
{
if (op!=0)
{
size_t i;
for(i=0; i<=m_Dim; ++i)
m_Pol[i] /= op;
return *this;
}
else cout<<szbuf.toOem("На ноль делить нельзя")<<endl;
}