Страница 2 из 3
Re: класс полином
Добавлено: 05 ноя 2009, 18:49
inlaf
не пойму чото)
опять переписал.не работает.
Код: Выделить всё
Polynom & Polynom: :o perator*=(Polynom & no)
{
if (&no != this)
{
size_t i,k,j,m_B,m_M;
if (m_Dim > no.m_Dim)
{
m_B = m_Dim;
m_M=no.m_Dim;
}
else
{
m_B = no.m_Dim;
m_M = m_Dim;
}
Polynom tmp(m_B+m_M-1),
sum(0);
for(i=0;i<m_M;++i)
{
for(k=0;k<m_B+m_M-1;++k)
tmp[k]=0;
k=i;
for(j=0;j<m_B;++j)
{
tmp[k] =
no.m_Pol[i]*m_Pol[j];
k++;
}
sum+=tmp;
}
}
return *this;
Re: класс полином
Добавлено: 08 ноя 2009, 02:15
Romeo
Дебагером пользовался когда-нибудь?

Очень советую - полезная вещь

Re: класс полином
Добавлено: 09 ноя 2009, 16:37
inlaf
да).
что-то у меня с ним вообще никак.
можешь подсобить?
Re: класс полином
Добавлено: 11 ноя 2009, 07:51
atavin-ta
А что там сложного? Сложнее включить комп. Ещё сложнее понять, для чего он нужен. А дебагер - самое элементарное. Ты просто его толком не пробовал, а на самом деле знаешь его в совершенстве, так как не знать его не возможно.
Re: класс полином
Добавлено: 11 ноя 2009, 12:06
inlaf
да без идей что-то совсем, как исправить ...
вроде умножает и возвращает.
но не правильно как-то))
поправьте кто-нибудь, приелась уже задачка не соображу никак.
Код: Выделить всё
Polynom & Polynom: :o perator*=(Polynom & no)
{
if (&no != this)
{
size_t i,k,j,m_B,m_M;
if (m_Dim > no.m_Dim)
{
m_B = m_Dim;
m_M = no.m_Dim;
}
else
{
m_B = no.m_Dim;
m_M = m_Dim;
}
Polynom new_Pol(m_B+m_M-1),
sum(new_Pol);
for(i=0;i<m_M;++i)
{
for(k=0;k <= m_B+m_M-1;++k)
new_Pol[k]=0;
*this = new_Pol;
k=i;
for(j=0;j<m_B;++j)
{
new_Pol[k] =
no.m_Pol[i]*m_Pol[j];
k++;
}
sum+=new_Pol;
}
*this = sum;
}
return *this;
}
Re: класс полином
Добавлено: 16 ноя 2009, 14:32
Ктулху
Код: Выделить всё
#include <iostream>
#include <stdexcept>
#include <string>
#include "math.h"
using namespace std;
class polynomial {
public:
polynomial();
polynomial(unsigned int);
polynomial(const double *, unsigned int);
polynomial(const polynomial &);
~polynomial();
polynomial &operator+=(const polynomial &);
polynomial &operator*=(const polynomial &);
double operator()(const double) const;
double &operator[](const unsigned int) const;
friend ostream &operator<<(ostream &, const polynomial &);
private:
double *coeffs;
unsigned int dimension;
void reset() { delete[] coeffs; }
};
polynomial: :p olynomial()
{
coeffs = new double[1];
coeffs[0] = 0;
dimension = 0;
}
polynomial: :p olynomial(unsigned int dim)
{
coeffs = new double[dim+1];
for(unsigned int i = 0; i <= dim; ++i)
coeffs[i] = 0;
dimension = dim;
}
polynomial: :p olynomial(const double *_coeffs, unsigned int dim)
{
coeffs = new double[dim+1];
/* the first element in array <_coeffs> is the coefficient of the highest power */
for(unsigned int i = 0; i <= dim; ++i)
coeffs[i] = _coeffs[dim-i];
dimension = dim;
}
polynomial: :p olynomial(const polynomial &poly)
{
dimension = poly.dimension;
coeffs = new double[dimension+1];
for(unsigned int i = 0; i <= dimension; ++i)
coeffs[i] = poly.coeffs[i];
}
polynomial::~polynomial()
{
reset();
}
double polynomial: :o perator ()(const double x) const
{
double value = coeffs[0];
for(unsigned int i = 1; i <= dimension; ++i)
value += coeffs[i] * pow(x, (int)i);
return value;
}
polynomial &polynomial: :o perator+=(const polynomial &poly)
{
if(this == &poly)
return *this;
const double min_dimension = (dimension >= poly.dimension)?poly.dimension:dimension;
for(unsigned int i = 0; i <= min_dimension; ++i)
coeffs[i] += poly.coeffs[i];
/* if <*this> has higher dimension, then no need to increase <coeffs> */
if(min_dimension == poly.dimension)
return *this;
double *new_coeffs = new double[poly.dimension+1];
/* assign coeffs, already added together */
for(unsigned int i = 0; i <= dimension; ++i)
new_coeffs[i] = coeffs[i];
/* assign coeffs of powers of x, missing from <*this> */
for(unsigned int i = dimension + 1; i <= poly.dimension; ++i)
new_coeffs[i] = poly.coeffs[i];
reset();
dimension = poly.dimension;
coeffs = new_coeffs;
return *this;
}
polynomial &polynomial: :o perator*=(const polynomial &poly)
{
const unsigned int new_dimension = dimension + poly.dimension;
double *new_coeffs = new double[new_dimension+1];
/* zero new coeffs for <*this> */
for(unsigned int i = 0; i <= new_dimension; ++i)
new_coeffs[i] = 0;
/* calc new coeffs */
for(unsigned int i = 0; i <= dimension; ++i)
for(unsigned int j = 0; j <= poly.dimension; ++j)
new_coeffs[i+j] += coeffs[i] * poly.coeffs[j];
reset();
dimension = new_dimension;
coeffs = new_coeffs;
return *this;
}
/* return a reference of a coeff by power <index> of x */
double &polynomial: :o perator[](const unsigned int index) const
{
if(index <= dimension)
return coeffs[index];
else
throw logic_error("out of bounds");
}
ostream &operator<<(ostream &os, const polynomial &poly)
{
for(unsigned int i = poly.dimension; i > 0; --i)
os << poly.coeffs[i] << "*x^" << i << " + ";
os << poly.coeffs[0] << endl;
return os;
}
int main()
{
double coeffs[] = { 4, -7, 2, 1 };
/* create a polynomial using references */
polynomial poly(2);
/* create a polynomial using double array */
polynomial _poly(coeffs, 3);
poly[0] = 3;
poly[1] = -2;
poly[2] = 1;
cout << poly << endl;
cout << _poly << endl;
//cout << endl << (poly += _poly) << endl;
cout << endl << (_poly *= poly) << endl;
cout << _poly(0.3) << endl;
getchar();
return 0;
}
Re: класс полином
Добавлено: 20 ноя 2009, 23:47
inlaf
спасибо. разобрался.
надо добавить открытые функции-члены для вычисления производной от полинома. derivative();
Код: Выделить всё
class Polynom
{
private:
size_t m_Dim; //размер
double * m_Pol;
public:
Polynom derivative() const;
};
..//
Polynom Polynom::derivative() const
{
if (m_Dim > 1)
{
Polynom tmp(*this);
for (int i = 0; i < m_Dim; ++i)
tmp.m_Pol[i-1] = m_Pol[i]*i;
return tmp;
}
else
{
Polynom tmp(1);
tmp.m_Pol[0] = 0.0;
return tmp;
}
}
//...
void main()
{
double v[]={1,2,3};
Polynom p1(2,v);
p1.derivative();
p1.Show();
}
подскажите, где собака зарыта)
Re: класс полином
Добавлено: 21 ноя 2009, 01:31
Romeo
У тебя же метод derivative не меняет самого объекта, а возвращает новый объект. Неужели по коду не видно?
Ещё у тебя ошибка в самом методе. Производная должна быть на одну степень меньше, чем исходный полином, а ты используешь конструктор копирования, значит степень будет та же самая.
Re: класс полином
Добавлено: 21 ноя 2009, 12:10
Ктулху
Код: Выделить всё
for (int i = 0; i < m_Dim; ++i)
tmp.m_Pol[i-1] = m_Pol[i]*i;
индексация i должна начинатся с 1
я сделал несколько иначе:
Код: Выделить всё
class polynomial {
explicit polynomial(const double);
[...]
polynomial: :p olynomial(const double value)
{
coeffs = new double[1];
dimension = 0;
coeffs[0] = value;
}
[...]
polynomial polynomial::derivative() const
{
if(dimension) {
double *new_coeffs = new double[dimension];
/* coeffs to the constructor must be passed in inverted order */
for(unsigned int i = 1; i <= dimension; ++i)
new_coeffs[dimension-i] = i * coeffs[i];
polynomial poly(new_coeffs, dimension - 1);
delete new_coeffs;
return poly;
} else
return polynomial(0.0);
}
Re: класс полином
Добавлено: 23 ноя 2009, 14:55
inlaf
Код: Выделить всё
class Polynom
{
private:
size_t m_Dim; //размер
double * m_Pol;
public:
Polynom(); // к-ор по умолчанию
Polynom(const size_t); // к-ор с 1 аргументом
Polynom(const size_t,const double* ); //конструктор с 2 аргументами
Polynom(const Polynom&); // Конструктор копирования
~Polynom(); // Деструктор
size_t GetDim() const {return m_Dim;} // Получение степени
double GetKof(const size_t i); //Получение i-ого коэффициента.
void SetKof(const size_t i,const double x ); // Изменение i-ого коэффициента.
void Show() const;
friend Vector Vec2Poly(const Polynom &);
friend Polynom Poly2Vec(const Vector &);
Polynom operator+() {return *this;} //перегрузка унарного оператора "+"
Polynom operator-(); //перегрузка унарного оператора "-"
operator double* () const;
double &operator[](const size_t i) const;
Polynom & operator=(const Polynom &ob);
Polynom & operator=(double op);
Polynom & operator+=(const Polynom &ob);
Polynom & operator+=(double op);
Polynom & operator-=(const Polynom &ob);
Polynom & operator-=(double op);
Polynom & operator*=(const Polynom &poly);
Polynom & operator*=(double op);
Polynom & operator/=(double op);
Polynom & operator^=(int op);
friend Polynom operator+(const Polynom &ob1, const Polynom &ob2);
friend Polynom operator+(const Polynom &ob1, double op2);
friend Polynom operator+(double op1,const Polynom &ob2);
friend Polynom operator-(const Polynom &ob1, const Polynom &ob2);
friend Polynom operator-(const Polynom &ob1, double op2);
friend Polynom operator-(double op1, const Polynom &ob2);
friend Polynom operator*(const Polynom &ob1,const Polynom &ob2);
friend Polynom operator*(const Polynom &ob1, double op2);
friend Polynom operator*(double op1, const Polynom &ob2);
friend Polynom operator/(const Polynom &ob1, double op2);
friend Polynom operator^(const Polynom &ob1, double op2);
friend bool operator==(const Polynom &ob1, const Polynom &ob2);
friend bool operator==(const Polynom &ob1, double op1);
friend bool operator!=(const Polynom &ob1,const Polynom &ob2);
friend bool operator!=(const Polynom &ob1, double op1);
friend ostream& operator<<(ostream&, const Polynom &);
friend istream& operator>>(istream&, Polynom &);
Polynom derivative() const; //dx
double evaluate(double x) const; // sum
};