Здравствуйте, Tigresska!
Вот вариант решения Вашей задачи. Для деления использована
схема сокращённого деления Горнера. Для поиска корней -
метод простых итераций.
Чтобы суммирование возвращало новый экземпляр, сделала его дружественной функцией (можно было, конечно, и в методе так сделать, но так красивее мне показалось).
Код в приложении, из комментариев должно быть всё ясно. Будут вопросы, обращайтесь.
Удачи!
Приложение:
#include <conio.h>
#include <iostream>
using namespace std;
class Poly{
private:
double *mas; // массив коэффициентов
int k; // степень полинома
public:
Poly(): k(-1), mas (NULL) {}; // пустой конструктор для инициализации экземпляров и массивов экземпляров класса по умолчанию
Poly(double c);
Poly(int s, double* koef);
Poly( const Poly & p ); // копирующий конструктор
~Poly();
void Delen(const double n, Poly &res, double &R); //деление многочлена на двучлен
void Init (const int k_, double * mas_ ); //инициализация
double Calc( const double x ) const; // вычисление полинома в заданной точке
bool Root (double &root, double x1, double x2); //вычисление корня
Poly operator () (); // получение полинома для производной от данного полинома
Poly & operator = ( const Poly & p ); //оператор присваивания
friend istream & operator >> ( istream & in, Poly & p ); // ввод экземпляров класса из входного потока
friend ostream & operator << ( ostream & out, const Poly & p ); // вывод в выходной поток
friend Poly operator + (const Poly &p1, const Poly &p2); //оператор суммы
private:
void Clear (); //очистка
};
// копирующий конструктор
Poly::Poly( const Poly & p )
{
mas = NULL; //помечаем как непроинициализированный
Init( p.k, p.mas ); //инициализируем данными входящего класса
}
Poly::Poly(double c): k(0) //инициализация одним числом
{
mas = new double [1];
mas[0] = c;
}
Poly::Poly(int s, double* koef)
{
mas = NULL;
Init (s, koef);
}
Poly::~Poly()
{
if (mas!=NULL) delete [] mas; //очищаем память
}
// функция инициализации
void Poly::Init(const int k_, double * mas_)
{
k = k_;
if (mas!=NULL) delete [] mas; //удаляем, если что-то уже есть
mas = new double [k+1]; //выделяем память
memcpy( mas, mas_, (k+1)*sizeof(double) ); //копируем данные
}
void Poly::Clear ()
{
k = -1;
if (mas!=NULL) delete [] mas;
}
bool Poly::Root (double &root, double x1, double x2) //возвращает ниличие корней, сам корень в root
{
Poly f1 = (*this)(); //ищем первую производную
Poly f2 = f1(); //ищем вторую производную как производную от первой
if (f1.Calc (x1)*f2.Calc(x1)<0) return false; //проверяем их на разнознаковость
double t = (x1+x2)/2.0; //берём середину
double left = x1, rgt = x2;
double z = Calc(t); //считаем значение
while (abs(z)>0.0001) { //пока не достигнем заданной точности
if (z*Calc(left)<0) //выставляем новые границы отрезка в зависимости от разнознаковости
rgt = t;
else left = t;
t = (left+rgt)/2.0; //новая середина
z = Calc(t); //новое значение
}
root = t; //возвращаем корень
return true;
}
// вычисление полинома в заданной точке
double Poly::Calc( const double x ) const
{
double temp = 1, f = 0.0;
for ( int i = 0; i < k+1; i++ ) {
f+= (temp*mas[i]); //домножаем на коэффициент и суммируем
temp*=x; //накапливаем степень х
}
return f;
}
// получение полинома для производной от данного полинома
Poly Poly::operator () ()
{
Poly res;
res.k = k-1; //понижаем степень
res.mas = new double [k]; //выделяем память
for (int i = 1; i<k+1; i++)
res.mas[i-1] = mas[i]*i; //получаем новые коэффициенты путём умножения на степень
return res;
}
// деление
void Poly::Delen(const double n, Poly &res, double &R)
{
res.Clear (); //очищаем входящий полином
res.k = k-1; //понижаем степень
res.mas = new double [k]; //выделяем память
double t = 0;
for (int i = k-1; i>=0; i--) {
res.mas[i] = mas[i+1] + n*t; //вычисляем по реккурентной формуле
t = res.mas[i];
}
R = mas[0]+n*res.mas[0]; //вычисляем остаток
}
// переопределение экземпляра класса
Poly & Poly::operator = ( const Poly & p )
{
Init( p.k, p.mas); //инициаизируем входящим
return * this;
}
Poly operator + (const Poly &p1, const Poly &p2)
{
const Poly &max = p1.k>p2.k ? p1 : p2; //выбираем полином большей степени
const Poly &min = p1.k>p2.k ? p2 : p1; //и меньшей
Poly res;
res.k = max.k; //новый будет соответсвовать большей
res.mas = new double [max.k+1];
for (int i = 0; i<max.k+1; i++) {
res.mas[i] = max.mas[i]; //пишем коэффициент более длинного
if (i<min.k+1) res.mas[i]+=min.mas[i]; //если более короткий не закончился, суммируем
}
return res;
}
istream & operator >> ( istream & in, Poly & p )
{
int k = -1;
cout << "please, enter the poly power: ";
while ( k < 0 )
in >> k;
cout << "please, enter the poly koefficients: " << endl;
double *mas = new double [k+1];
for ( int i = k; i >= 0; i-- )
{
cout << "x^" << i << ": ";
in >> mas[i];
}
p.Init (k, mas);
return in;
}
// вывод полинома в выходной поток
ostream & operator << ( ostream & out, const Poly & p )
{
if ( p.k<0 )
{
out << "Not exists";
return out;
}
out << "P(x) = " << p.mas[p.k] << "*x^" << p.k << " + ";
for ( int i = p.k-1; i >= 0; i-- ){
out << p.mas[i];
if (i!=0) out << "*x^" << i << " + ";
}
out << endl;
return out;
}
char Menu ()
{
system("cls");
cout << "1. Нахождение суммы полиномов.\n";
cout << "2. Нахождение значение полинома в точке.\n";
cout << "3. Нахождение производной полинома.\n";
cout << "4. Нахождение корня полинома на отрезке.\n";
cout << "5. Деление полинома.\n";
cout << "6. Выход.\n";
cout << "Выберите пункт: ";
char c;
cin >> c;
return c;
}
void p1 ()
{
system("cls");
Poly p1, p2;
cin >> p1;
cin >> p2;
cout << p1+p2;
cout << "\nНажмите любую клавишу";
getch();
}
void p2 ()
{
system("cls");
Poly p1;
cin >> p1;
double x;
cout << "x = ";
cin >> x;
cout << "\nP = " << p1.Calc (x);;
cout << "\nНажмите любую клавишу";
getch();
}
void p3 ()
{
system("cls");
Poly p1;
cin >> p1;
cout << "\nP' = " << p1();
cout << "\nНажмите любую клавишу";
getch();
}
void p4 ()
{
system("cls");
Poly p1;
cin >> p1;
double a, b, x;
cout << "\nВведите границы отрезка: ";
cin >> a >> b;
if (!p1.Root (x, a, b)) cout << "\nКорней нет";
else cout << "x = " << x;
cout << "\nНажмите любую клавишу";
getch();
}
void p5 ()
{
system("cls");
Poly p1, p2;
cin >> p1;
double a, r;
cout << "\na = ";
cin >> a;
p1.Delen (a, p2, r);
cout << "\nРезультат:";
cout << p2;
cout << "Остаток: " << r;
cout << "\nНажмите любую клавишу";
getch();
}
int main()
{
setlocale (LC_ALL, "russian");
bool exit = true;
while (exit) {
char c = Menu();
switch (c) {
case '1':
p1();
break;
case '2':
p2();
break;
case '3':
p3();
break;
case '4':
p4();
break;
case '5':
p5();
break;
case '6':
exit = false;
break;
default:
cout << "Ошибка ввода!";
getch();
}
}
return 0;
}