[C++] Операции с полиномами
Класс Term:
public:
int a,pow;
Term();
Term(int t);
Term(int b,int c);
friend Term operator+(const Term &obj1,const Term &obj2);
Term operator+=(const Term &obj);
friend Term operator*(const Term &obj1,const Term &obj2);
Term &operator=(const Term obj);
friend ostream &operator<<(ostream &stream,Term &obj);
friend Polynomial;
};
Класс Polynomial:
public:
Term poly[6];
int degree;
Polynomial();
Polynomial(int a);
Polynomial(Term b);
friend ostream &operator<<(ostream &stream,Polynomial obj);
friend istream &operator>>(istream &stream,Polynomial &obj);
friend Polynomial operator+(Polynomial &obj1,Polynomial &obj2);
friend Polynomial operator*(Polynomial &obj1,Polynomial &obj2);
void sort();
private:
bool Order;
};
Реализация методов класса Term:
a=obj.a;
pow=obj.pow;
return *this;
}
Term operator+(const Term &obj1,const Term &obj2) {
Term tmp;
tmp.a=obj1.a+obj2.a;
tmp.pow=obj2.pow;
return tmp;
}
Term operator*(const Term &obj1,const Term &obj2) {
Term tmp;
tmp.a=obj1.a*obj2.a;
tmp.pow=obj1.pow+obj2.pow;
return tmp;
}
Term Term::operator+=(const Term &obj) {
a+=obj.a;
pow=obj.pow;
return *this;
}
Term::Term() {
a=pow=0;
}
Term::Term(int t) {
a=t;
pow=0;
}
Term::Term(int b,int c) {
a=b;
pow=c;
}
ostream &operator<<(ostream &stream,Term &obj) {
stream << obj.a << "x^" << obj.pow;
return stream;
}
Реализация методов класса Polynomial:
Term A(0,0);
degree=0;
poly[0]=poly[1]=poly[2]=poly[3]=poly[4]=poly[5]=A;
}
Polynomial::Polynomial(int a) {
Term A(a,0);
Term B(0,0);
degree=0;
poly[0]=A;
poly[1]=poly[2]=poly[3]=poly[4]=poly[5]=B;
}
Polynomial::Polynomial(Term A) {
Term B(0,0);
degree=0;
poly[0]=A;
poly[1]=poly[2]=poly[3]=poly[4]=poly[5]=B;
}
ostream &operator<<(ostream &stream,Polynomial obj) {
for(int i=0;i<6;i++) {
stream << obj.poly << endl;
}
return stream;
}
Polynomial operator+(Polynomial &obj1,Polynomial &obj2) {
Polynomial tmp;
int p;
bool flag=false;
obj1.sort();
obj2.sort();
for(int i=0;i<6;i++) {
p=obj1.poly.pow;
tmp.poly=obj1.poly;
for(int j=0;j<6;j++) {
if(obj2.poly[j].pow==p) {
tmp.poly+=obj2.poly;
flag=true;
}
if(flag==false) {
tmp.poly=obj2.poly;
flag=true;
}
}
}
return tmp;
}
Polynomial operator*(Polynomial &obj1,Polynomial &obj2) {
int i;
int j;
Polynomial tmp;
Term A(0,0);
for(i = 0; i <6; i++) {
tmp.poly = A;
}
for(i = 0; i <6; i++) {
for(j = 0; j <6; j++) {
tmp.poly = tmp.poly+obj1.poly[j]*obj2.poly;
}
}
return tmp;
}
void Polynomial::sort() {
Term tmp;
int k;
for(int i=0;i<6;i++) {
k=i;
tmp=poly;
for(int j=i+1;j<6;j++) {
if(poly[j].pow>tmp.pow) {
k=j;
tmp=poly[j];
}
}
poly[k]=poly;
poly=tmp;
}
}
istream &operator>>(istream &stream,Polynomial &obj) {
Term A;
int i=0,k=0;
char buf[20];
char c=0;
while(c!='\n') {
c=getchar();
if(c=='+' || c=='-' || c=='\n') {
buf=' ';
A=Parse(buf);
obj.poly[k]=A;
k++;
i=0;
}
buf=c;
i++;
}
return stream;
}
Вспомогательные функции для парсинга:
Term tmp;
int k;
for(int i=0;i<6;i++) {
k=i;
tmp=poly;
for(int j=i+1;j<6;j++) {
if(poly[j].pow>tmp.pow) {
k=j;
tmp=poly[j];
}
}
poly[k]=poly;
poly=tmp;
}
}
int CountDigits(char *p) {
int k=0;
for(int i=0;i<strlen(p);i++) {
if((int)p>=47 && (int)p<=58) k++;
}
return k;
}
Term Parse(char *t) {
Term A;
int l=0,m=0,pow,num;
unsigned int i,k,h;
char *pows,*nums;
bool flag=false;
pows=(char *)malloc(CountDigits(t));
nums=(char *)malloc(CountDigits(t));
for(i=0;i<strlen(t);i++) {
if(t=='^') {
k=i+1;
while(t[k]!='+' && t[k]!='-' && t[k]!='\n' && k<strlen(t)) {
pows[l]=t[k];
l++;
k++;
}
pow=atoi(pows);
break;
}
else {
Label: if((int)t>=48 && (int)t<=57) {
if(flag==true) {
i++;
goto Label;
}
h=i;
while(t[h]!='x' && t[h]!='\n' && h<strlen(t)) {
nums[m]=t[h];
m++;
h++;
}
num=atoi(nums);
flag=true;
}
}
}
A.pow=pow;
A.a=num;
free(pows);
free(nums);
return A;
}
Функция main()
Polynomial B,C;
cout << "First: ";
cin >> B;
cout << "Second: ";
cin >> C;
cout << B;
cout << "\n";
cout << C;
cout << "\n";
cout << B+C;
cout << "\n";
cout << "B*C:" << endl;
cout << B*C;
getch();
}
1. в чем собственно ошибка заключается
2. если один из многочленов = 8x^4+9x^3+5x^2+1x^1, а во втором содержится х^5, то как Вы храните в памяти первый (так как есть или как 0*х^5+8x^4+9x^3+5x^2+1x^1)
2. Храню так, как есть. Была идея выискивать различия между многочленами и дополнять какой-либо из них термом 0x^k, но на чем-то споткнулся в плане реализации. Если предложите какой-нибудь стоящий алгоритм, то буду очень признателен.
8x^4+9x^3+5x^2+1x^1 === (0,1,5,9,8)
начиная с нулевой степени
тогда все будет очень просто - все действия можно производить как векторами сложение и тп и тд
даже дифференцирование это не более чем умножение вектора мн-а на матрицу )
я так просмотрел код ваш слишком все там усложнено
8x^4+9x^3+5x^2+1x^1 === (0,1,5,9,8)
начиная с нулевой степени
тогда все будет очень просто - все действия можно производить как векторами сложение и тп и тд
даже дифференцирование это не более чем умножение вектора мн-а на матрицу )
я так просмотрел код ваш слишком все там усложнено
Я так тоже хотел сначала сделать. Но задание есть задание. Там четко описано, какие классы должны быть. Да и потом, смотрите: ввожу я полином - 4x^1+5x^2+9x^4+8x^3+189x^256
Так это вектор тогда будет vector={0,4,5,8,9,0,0,...,256}. Это же ужасть.
пытаюсь вспомнить и не могу - в С++ есть библиотека для работы с векторами или надо класс писать руками?
Так это вектор тогда будет vector={0,4,5,8,9,0,0,...,256}. Это же ужасть.
ну чтож поделать - за все хорошее приходится платить
Вариант 1. Думать
Вариант 2. Ждать пока кто-нибудь не найдет баг в Вашем коде или не изобретет работающий алгоритм.
P.S. А заданьицем не поделитесь? Хотя бы в сокращенном виде - какие классы и функции обязательно должны быть реализованы
2. Храню так, как есть. Была идея выискивать различия между многочленами и дополнять какой-либо из них термом 0x^k, но на чем-то споткнулся в плане реализации. Если предложите какой-нибудь стоящий алгоритм, то буду очень признателен.
ну если уж так нужно то сумму наверно так искать
берем один многочлен (слагаемое) и затем все присутствующие степени второго ищем в первом
если находим то коэф складываем если нет то добавляем в нужное место еще один элемент нужной степени
в таком наверно ключе
здесь будем за счет выйгрыша в памяти проигрывать по скорости в поиске вставках и тп
если там умножение то (распишите себе на бумажке умножение полиномов) и станет ясно как подыскивать нужные коэффиценты и перемножать
[ATTACH]1804[/ATTACH]