Задача:
Составить описание класса многочленов от одной переменной, задаваемых степенью многочлена и массивом коэффициентов. Предусмотреть методы для вычисления значения многочлена для заданного аргумента, операции сложения, вычитания и умножения многочленов с получением нового объекта многочлена, печатать (вывод на экран) описания многочлена. Разработать программу демонстрирующую работу с объектами этого класса.
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
| #include "stdafx.h"
//main.cpp
#include <iostream>
using namespace std;
#include <conio.h>
#include "head.h"
int _tmain(int argc, _TCHAR* argv[])
{
int main()
{
usi n = 0; //степень многочлена
int menu;
do
{
cout<<"Vvedite stepen' pervogo mnogochlena (y1): ";
cin>>n;
}while(n<1);
Multinominal MN1 = Multinominal(n); //объявляем объект
do
{
cout<<"Vvedite stepen' vtorogo mnogochlena (y2): ";
cin>>n;
}while(n<1);
Multinominal MN2 = Multinominal(n); //объявляем объект
Multinominal MN3 = Multinominal(); //объявляем объект с параметрами по умолчанию
MN1.SetMN(); //задаем параметры первого многочлена
MN2.SetMN(); //задаем параметры второго многочлена
do
{
system("cls");
cout<<"1. Summa mnogochlenov"<<endl;
cout<<"2. Raznost' mnogoclenov"<<endl;
cout<<"3. Proizvedenie mnogochlenov"<<endl;
cout<<"4. Vicheslenie znachenija"<<endl;
cout<<"0. Exit"<<endl;
cout<<"Vvedite punkt menu: ";
cin>>menu;
switch (menu)
{
case 1:
/**********************сложение многочленов*********************/
system("cls");
cout<<"mn1: "; MN1.GetMN(); //выводим первый многочлен
cout<<endl<<" +"<<endl;
cout<<"mn2: "; MN2.GetMN(); //выводим второй многочлен
MN3 = MN1+MN2; //складываем первый многочлен со вторым (работает перегруженная операция присваивания),
//а также перегруженная операция сложения
cout<<endl<<" ="<<endl;
cout<<"mn3: "; MN3.GetMN();//выводим третий многочлен
getch();
break;
case 2:
/********************разность многочленов*********************/
system("cls");
cout<<"mn1: "; MN1.GetMN();
cout<<endl<<" -"<<endl;
cout<<"mn2: "; MN2.GetMN();
MN3 = MN1 - MN2; //вычитаем из первого многочлена второй (работает перегруженная операция присваивания),
//а также перегруженная операция вычитания
cout<<endl<<" ="<<endl;
cout<<"mn3: "; MN3.GetMN();
getch();
break;
case 3:
/*********************произведение многочленов*********************/
system("cls");
cout<<"mn1: "; MN1.GetMN();
cout<<endl<<" *"<<endl;
cout<<"mn2: "; MN2.GetMN();
MN3 = MN2 * MN1;//умножаем первый многочлен на второй (работает перегруженная операция присваивания),
//а также перегруженная операция умножения
cout<<endl<<" ="<<endl;
cout<<"mn3: "; MN3.GetMN();
getch();
break;
case 4:
double x,value1, value2;
system("cls");
cout<<"Vvedite argument: ";
cin>>x;
value1 = MN1.value(x); //вычисление значения первого многочлена при х
value2 = MN2.value(x); //вычисление значения второго многочлена при х
cout<<"MN1: "<<value1<<endl;
cout<<"MN2: "<<value2<<endl;
getch();
break;
case 0: return 0;
}
}while(menu!=0);
}
return 0;
} |
|
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
| //head.cpp
#include <iostream>
#include <conio.h>
#include "head.h" // здесь проблема
using namespace std;
Multinominal::Multinominal(usi _n, double* _dMN)
{
this->n = _n+1; // переделываем степень многочлена в кол-во элементов в нем
this->dMN = new double [n]; //динамически создаем массив
if (!_dMN)//если указатель на массив не указывает на массив:)
//то соответственно заполнить его нулями, чтобы не было лишних неудобств
for (int i = 0; i<n; i++)
dMN = 0;
else
//иначе заполнить его значениями переданного массива
//причем заполняем задом наперед, для удобства работы с многочленами
for (int i = n-1; i>=0; i--)
dMN = _dMN;
}
Multinominal::~Multinominal()
{
delete [] this->dMN; // удаляем из памяти наш созданный массив
}
void Multinominal:: SetMN (void)
{
cout<<"Vvedite znachenija mnogochlena: ";
//вводим значения многочлена задом наперед для удобства
for (int i = n-1; i>=0; i--)
cin>>this->dMN;
}
void Multinominal:: GetMN (void)
{
//выводим наш многочлен, соответственно тоже задом наперед,
//так как вводили тоже задом наперед
for (int i = n-1; i>=1; i--)
{
cout.flags(ios::showpos);
cout<<dMN<<"*x"<<"^";
cout.unsetf(cout.flags());
cout<<i;
}
cout.flags(ios::showpos);
cout<<dMN[0];
cout.unsetf(cout.flags());
}
Multinominal& Multinominal::operator =(const Multinominal &MN)
{
if (&MN == this) //проверка на самокопирование
return *this;
delete [] dMN; //уничтожить ранее существовавший массив
this->n = MN.n; //задаем новому массиву новую размерность
this->dMN = new double [this->n]; //динамически создаем новый массив
//заполняем массив значениями копируемого объекта
for (int i = n-1; i>=0; i--)
this->dMN = MN.dMN;
return *this; //возвращаем указатель на данный объект
}
Multinominal Multinominal::operator +(Multinominal& MN)
{
usi s,n1; //s - кол-во элементов в меньшем многочлене
//n1 - кол-во элементов в большем массиве
double * dmn; //массив элементов
if (this->n < MN.n) //если кол-во элементов текущего класса больше передаваемого, то
{
n1 = MN.n; //n1- кол-во элементов передаваемого объекта
s = this->n-1; //s - кол-во элементов текущего многочлена - 1
}
else //иначе наоборот
{
n1 = this->n;
s = MN.n-1;
}
dmn = new double [n1]; //создаем массив временных элементов
//складываем элементы первого многочлена с элементами второго
for (int i = 0; i<n1; i++)
{
if (i>s)
{
dmn = this->n > MN.n ? this->dMN : MN.dMN;
}
else
{
dmn = this->dMN + MN.dMN;
}
}
return Multinominal(n1-1,dmn);//возвращаем новый объект
}
//все тоже самое, только вместо операции '+' используется операция '-'
Multinominal Multinominal::operator -(Multinominal & MN)
{
usi s,n1;
double * dmn;
if (this->n <= MN.n)
{
n1 = MN.n;
s = this->n-1;
}
else
{
n1 = this->n;
s = MN.n-1;
}
dmn = new double [n1];
for (int i = 0; i<n1; i++)
{
if (i>s)
{
dmn = this->n > MN.n ? this->dMN : MN.dMN;
}
else
{
dmn = this->dMN - MN.dMN;
}
}
return Multinominal(n1-1,dmn);
}
//все тоже самое, только вместо операций '+' или '-' используется операция '*'
Multinominal Multinominal::operator *(Multinominal & MN)
{
usi s,n1;
double * dmn;
if (this->n < MN.n)
{
n1 = MN.n;
s = this->n-1;
}
else
{
n1 = this->n;
s = MN.n-1;
}
dmn = new double [n1];
for (int i = 0; i<n; i++)
{
if (i>s)
{
dmn = this->n > MN.n ? this->dMN : MN.dMN;
}
else
{
dmn = this->dMN * MN.dMN;
}
}
return Multinominal(n1-1,dmn);
}
double Multinominal::value (double _x)
{
double value = 0, x;
//вычисляем значение многочлена от аргумента х
for( int i = n-1; i>=1; i-- )
{
x = _x;
//для этого вычисляем степенные значения аргумента х
for ( int j = i; j>1; j--)
x *= x;
value+=(this->dMN)*x;//умножаем его на коэффициент многочлена и прибавляем к основной сумме
}
return value+=this->dMN[0]; //прибавляем к основной сумме последний элемент и возвращаем значение
} |
|
код верный и рабочий, есть ошибка :
fatal error C1014: слишком много включаемых файлов: глубина = 1024 с комментом // здесь проблема.
что я делаю не так? как мне решить проблему?