#include <iostream>
#include <iomanip>
#include <cmath>
#include <conio.h>
#include <windows.h>
#include "ConvOem.h"
using namespace std;
CConvOem szbuf(100);
class Vector;
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;} // Получение степени
//void SetDim(int y){ m_Dim = y; } // Изменение Степени.
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* ();
Polynom & operator=(Polynom &no);
Polynom & operator=(double no);
Polynom & operator+=(Polynom &no);
Polynom & operator+=(double no);
Polynom & operator-=(Polynom &no);
Polynom & operator-=(double no);
Polynom & operator*=(Polynom &no);
Polynom & operator*=(double no);
Polynom & operator/=(double no);
Polynom & operator^=(double no);
};
class Vector
{
private:
size_t m_Dim; // Размер вектора.
double *m_pVec; //адрес массива с координатами вектора
public:
Vector(size_t,double*); //конструктор с 1-им параметром
Vector(size_t); //конструктор с 2-мя параметром
Vector();
Vector(const Vector&); //конструктор копирования
~Vector(); // Деструктор.
double GetKof(const size_t i); // Получение i-ой координаты.
void SetKof(const size_t i, const double x); // Изменение i-ой координаты.
size_t GetDim() const {return m_Dim;} // Получение размера вектора.
void Show() const; // Вывод вектора.
friend Vector Vec2Poly(const Polynom &);
friend Polynom Poly2Vec(const Vector &);
};
double Vector::GetKof(const size_t i)
{
if (i > m_Dim)
{
cout<<szbuf.toOem("Неправильное значение")<<endl;;
exit(-1);
}
return m_pVec[i-1];
}
void Vector::SetKof(const size_t i,const double x )
{
if (i > m_Dim)
{
cout<<szbuf.toOem("Неправильное значение ")<<endl;
exit(-1);
}
m_pVec[i-1]=x;
}
void Vector::Show() const
{
cout << '(';
size_t i;
for (i = 0; i < m_Dim; ++i)
{
cout << m_pVec[i];
if (i < m_Dim - 1) cout << ", ";
}
cout << ')' << endl;
}
Vector::Vector(const size_t Dim,double* pVec):m_Dim(Dim) // к-ор с 2мя арг
{
m_pVec=new double[Dim];
if (!m_pVec)
{
cout <<szbuf.toOemA( "Ошибка! Неверный размер вектора." )<< endl;
exit(-3);
}
for(int i=0;i<m_Dim;i++)
m_pVec[i]=pVec[i];
}
Vector::Vector(size_t Dim):m_Dim(Dim) // к-ор с 1им арг
{
m_pVec= new double[m_Dim];
if (!m_pVec)
{
cout <<szbuf.toOemA( "Ошибка! Неверный размер вектора." )<< endl;
exit(-1);
}
for(int i=0;i<m_Dim;i++)
m_pVec[i]=0.0;
}
Vector::Vector():m_Dim(1) // к-ор без арг
{
m_pVec=new double [m_Dim];
if(!m_pVec) {
cout<<"Error"<<endl;
exit (-1);
}
}
Vector::Vector(const Vector& cv):m_Dim(cv.m_Dim) //конструктор копирования
{
if (!(m_pVec=new double[m_Dim]))
{
cout<<szbuf.toOemA("Нет памяти") <<endl;
exit(-1);
}
//копирование координат
size_t i;
for(i=0;i<m_Dim;++i)
m_pVec[i]=cv.m_pVec[i];
cout<<szbuf.toOemA("копия создана Vec") <<endl;
}
Vector::~Vector()
{
cout << szbuf.toOemA("Вектор успешно удалён ...") << endl;
delete[] m_pVec;
}
Polynom Poly2Vec(const Vector& cv)
{
Polynom c(cv.m_Dim-1);
for(int i=0; i < cv.m_Dim; ++i)
c.m_Pol[i]=cv.m_pVec[i];
return c;
}
Vector Vec2Poly(const Polynom& cc)
{
//создадим объект класса вектор
Vector v(cc.m_Dim);
for(int i=0; i<cc.m_Dim; ++i)
v.m_pVec[i]=cc.m_Pol[i];
return v;
}
double Polynom::GetKof(const size_t i)
{
if (i > m_Dim)
{
cout<<szbuf.toOem("Неправильное значение")<<endl;;
exit(-1);
}
return m_Pol[i-1];
}
void Polynom::SetKof(const size_t i,const double x )
{
if (i > m_Dim)
{
cout<<szbuf.toOem("Неправильное значение ")<<endl;
exit(-1);
}
m_Pol[i]=x;
}
//Конструктор без аргументов
Polynom::Polynom(): m_Dim(0)
{
m_Dim=m_Dim+1;
m_Pol=new double[m_Dim]; // Выделение памяти для Polynoma
if(!m_Pol)
{
cout<<szbuf.toOem("Ошибка")<<endl;
exit (-1);
}
m_Pol[0]=0;
}
// Определение конструктора с 1 арг
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+1]))
{
cout<<szbuf.toOem("Ошибка")<<endl;
exit (-1);
}
size_t i;
for(i=0; i <= m_Dim ; ++i)
{
m_Pol[i]=i;
}
}
}
Polynom::Polynom(const size_t Dim,const double *mas):m_Dim(Dim)
{
m_Dim=Dim+1;
if(!m_Dim)
{
cout<<szbuf.toOem("Неверный размер")<<endl;
exit(-3);
}
if(!(m_Pol= new double[m_Dim+1]))
{
cout<<szbuf.toOem("Нет памяти")<<endl;
exit(-1);
}
size_t i;
if(mas)
{
for(i=0; i <= m_Dim ; ++i)
{
m_Pol[i]=mas[i];
}
}
}
//Конструктор копирования
Polynom::Polynom(const Polynom& Pol):m_Dim(Pol.m_Dim)
{
if (!(m_Pol=new double[m_Dim+1]))
{
cout<<szbuf.toOem("Нет памяти") <<endl;
exit(-1);
}
for (int i=0; i < m_Dim; i++)
m_Pol[i]=Pol.m_Pol[i];
cout<<szbuf.toOem("копия Pol создана") <<endl;
}
Polynom::~Polynom()
{
cout << szbuf.toOem("Полином успешно удалён ...") << endl;
delete[] m_Pol;
}
void Polynom::Show()const
{
size_t i;
for(i=0;i<m_Dim-1;++i)
{
cout << m_Pol[i] << "*x^" << m_Dim-i-1;
if(m_Pol[i+1]>=0)
cout << "+";
}
cout << m_Pol[m_Dim-1] << endl;
}
/*
void Polynom::Show()const
{
cout << m_Pol[0];
for (int i=1; i<m_Dim; ++i)
{
if(i!=0)
{
if (m_Pol[i] < 0)
cout << m_Pol[i]<<"*x^"<<i;
else cout << "+" << m_Pol[i] << "*x^" << i;
}
}
cout << endl;
}
*/
////////////////// OPERATORI /////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
//////////////// Перегрузки 1
////////////////
Polynom::operator double *()
{
return m_Pol;
}
////перегрузка унарного оператора "-"
Polynom Polynom::operator-()
{
size_t i;
for (i=0; i<m_Dim; ++i)
m_Pol[i] = -m_Pol[i];
return *this;
}
//////////////// Перегрузки 2
////////////////
// Оператор присваивания
Polynom & Polynom::operator=(Polynom & no)
{
if ( this != &no)
{
delete[] m_Pol;
if (!(m_Pol=new double[m_Dim=no.m_Dim]))
{
cout<<szbuf.toOem("Ошибка! Недостаточно памяти!")<<endl;;
exit(-1);
}
size_t i;
for (i=0; i < m_Dim; ++i)
m_Pol[i]=no.m_Pol[i];
}
return *this;
}
// Оператор присваивания, когда правая часть число
Polynom & Polynom::operator=(double no)
{
size_t i;
for (i=0; i <= m_Dim; ++i)
m_Pol[i]=no;
return *this;
}
// Оператор присваивания cо сложением
Polynom & Polynom::operator+=(Polynom & no)
{
if (&no != this)
{
size_t i,k,j;
if (m_Dim > no.m_Dim)
{
i = m_Dim;
k=no.m_Dim;
}
else
{
i = no.m_Dim;
k = m_Dim;
}
//Polynom new_Pol(i);
double* new_Pol = new double[i];
for(j=0; j<k; ++j)
new_Pol[j] = m_Pol[j]+no.m_Pol[j];
for(j=k; j<i; ++j)
if (m_Dim > no.m_Dim)
new_Pol[j] = m_Pol[j];
else
new_Pol[j] = no.m_Pol[j];
m_Pol = new_Pol;
m_Dim = i;
}
return *this;
}
// Оператор присваивания cо сложением, когда правая часть число.
Polynom & Polynom::operator+=(double no)
{
size_t i;
for (i=0; i < m_Dim; ++i)
m_Pol[i]+=no;
return *this;
}
// Оператор присваивания c вычитанием
Polynom & Polynom::operator-=(Polynom & no)
{
if (&no != this)
{
size_t i,k,j;
if (m_Dim > no.m_Dim)
{
i = m_Dim;
k=no.m_Dim;
}
else
{
i = no.m_Dim;
k = m_Dim;
}
double* new_Pol = new double[i];
for(j=0; j<k; ++j)
new_Pol[j] = m_Pol[j]-no.m_Pol[j];
for(j=k; j<i; ++j)
if (m_Dim > no.m_Dim)
new_Pol[j] = -m_Pol[j];
else
new_Pol[j] = -no.m_Pol[j];
m_Pol = new_Pol;
m_Dim = i;
}
return *this;
}
// Оператор присваивания c вычитанием, когда правая часть число.
Polynom & Polynom::operator-=(double no)
{
size_t i;
for (i=0; i < m_Dim; ++i)
m_Pol[i]-=no;
return *this;
}
//оператор присваивания с умножением
Polynom & Polynom::operator*=(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(k=0;k <= m_B+m_M-1; ++k)
new_Pol[k]=0;
*this = new_Pol;
for(i=0; i < m_M;++i)
{
k=i;
for(j=0;j < m_B;++j)
{
new_Pol[k] = m_Pol[j] * no.m_Pol[i];
k++;
}
sum+=new_Pol;
}
*this = sum;
}
return *this;
}
//для случая,когда правый операнд число
Polynom & Polynom::operator*=(double no)
{
size_t i;
for(i=0; i<m_Dim; ++i)
m_Pol[i] *= no;
return *this;
}
//оператор возвидения в степень для случая,когда правый операнд число/
Polynom & Polynom::operator^=(double no)
{
size_t i;
for(i=0; i<m_Dim; ++i)
m_Pol[i] = pow(m_Pol[i],no);
return *this;
}
//Бинарный оператор присваивания с делением
//для случая,когда правый операнд число
Polynom & Polynom::operator/=(double no)
{
size_t i;
for(i=0; i<m_Dim; ++i)
m_Pol[i] /= no;
return *this;
}
///////////////////////////////////
/////////Перегрузки 3///////////
void main()
{
Polynom p1;
Polynom p2(4);
double mass[4]={4,5,6,7};
Polynom p3(3,mass);
p1.Show();
p2.Show();
p3.Show();
Polynom p4(p3);
p4.Show();
p4.SetKof(3,20);
p4.Show();
double per;
per = p4.GetKof(3);
cout << per << endl;
double mass2[5]={-4,5,6,-0.77,0};
Vector va3(5,mass2);
va3.Show();
Polynom toVec = Poly2Vec(va3);
Vector toPol = Vec2Poly(toVec);
toVec.Show();
toPol.Show();
cout<<endl;
cout <<szbuf.toOem("Использование оператора +:");
+p1;
p1.Show();
cout <<szbuf.toOem("Использование оператора -:");
-p1;
p1.Show();
cout<<endl;
cout <<szbuf.toOem("Использование бинарного оператора =:");
p1=p4;
p1.Show();
cout << szbuf.toOem("Использование бинарного оператора = когда правый операнд число(2):");
double x=2;
p1=x;
p1.Show();
cout <<szbuf.toOem("Использование бинарного оператора +=:");
double mass3[]={1,1,1,0,2,10};
Polynom p6(5,mass3);
double mass4[]={4,3,100,100,30};
Polynom p7(4,mass4);
p6+=p7;
p6.Show();
cout << szbuf.toOem("Использование бинарного оператора += когда правый операнд число:");
double y=3;
p1+=y;
p1.Show();
cout <<szbuf.toOem("Использование бинарного оператора -=:");
double mass6[]={1,1,1,0,2,10};
Polynom p10(5,mass6);
double mass7[]={4,3,100,100,30};
Polynom p11(4,mass7);
p11-=p10;
p11.Show();
cout << szbuf.toOem("Использование бинарного оператора -= когда правый операнд число:");
double z=4;
p1-=z;
p1.Show();
///////////////////
cout <<szbuf.toOem("Использование бинарного оператора =*:");
double mass8[]={3,1,5}; // 3 + x + 5x^2
Polynom p12(2,mass8);
double mass9[]={1,3}; // 1 + 3x
Polynom p13(1,mass9);
p13*=p12;
p13.Show();
getch();
}