#include<iostream.h>
#include<conio.h>
#include<math.h>
#define EPS 0.001
#define PRESS cout<<"\n Нажми че нибудь";getch()
typedef struct polinom STR;
struct polinom { float a[60];
		 int n[60];
		 int k;
		} ;
class action {
	      public:
				 void add(char,STR*,STR*,STR*);
				 void inpol(STR*,char*);
				 void outpol(STR*,char*);
				 void copypol(STR*,STR*);
				 void normpol(STR*);
				 void delpol(STR*,STR*,STR*);
				 void umn(STR*,STR*,STR*);
				 void number(STR*,float);
				 float point(STR*,float);
				};
action p;
void main(void)
{ int i;char key;float num;STR pol[2],pold[2],polr;STR * polin;
  do{clrscr();
  cout<<"\n\t\t\t ╒══════════════════════════════════╕"
      <<"\n\t\t\t │ Ввод 1 полинома.............. F1 │"
      <<"\n\t\t\t │ Ввод 2 полинома.............. F2 │"
      <<"\n\t\t\t │ Сложение 1 и 2 полиномов..... F3 │"
      <<"\n\t\t\t │ Вычитание 1 и 2.............. F4 │"
      <<"\n\t\t\t │ Деление 1 на 2............... F5 │"
      <<"\n\t\t\t │ Умножение 1 на 2............. F6 │"
      <<"\n\t\t\t │ Умножение 1 на число......... F7 │"
      <<"\n\t\t\t │ Вычисление 1 в точке......... F8 │"
      <<"\n\t\t\t │ Выход........................ Esc│"
      <<"\n\t\t\t ╘══════════════════════════════════╛";
       key=getch();
	switch(key)
	{case 0:key=getch();
		switch(key)
		{case 59 : p.inpol(&pol[0],"Первый  ");
			   p.normpol(&pol[0]);
			   p.outpol(&pol[0],"Норм. Первый :");
			   PRESS;break;
		 case 60 : p.inpol(&pol[1],"Второй ");
			   p.normpol(&pol[1]);
			   p.outpol(&pol[1],"Норм. Второй :");
			   PRESS;break;
		 case 61 : p.add(0,&pol[0],&pol[1],&pold[0]);
			   p.outpol(&pold[0],"Результат :");
			   PRESS;break;
		 case 62 : p.add(1,&pol[0],&pol[1],&pold[0]);
			   p.outpol(&pold[0],"Результат :");
			   PRESS;break;
		 case 63 : p.copypol(&pol[0],&pold[0]);
			   p.copypol(&pol[1],&pold[1]);
			   p.delpol(&pold[0],&pold[1],&polr);
			   p.outpol(&pold[1],"Результат :");
			   p.outpol(&pold[0],"Остаток :");
			   PRESS;break;
		 case 64 : p.umn(&pol[0],&pol[1],&pold[0]);
			   p.outpol(&pold[0],"Результат :");
			   PRESS;break;
		 case 65 : cout<<"\nВведи число";cin>>num;
			   p.copypol(&pol[0],&pold[0]);
				 p.number(&pold[0],num);
				 p.outpol(&pold[0],"Результат :");
				 PRESS;break;
		 case 66 : cout<<"\nВведи точку ";
				 cin>>num;
				 num=p.point(&pol[0],num);
				 cout<<"Результат :"<<num;
			   PRESS;break;
		 } key=0;break;
	}
       }while(key!=27);
 }
void action::add(char flag,STR* pol1,STR* pol2,STR* polr)
{int i,j;
copypol(pol1,polr);
  for(i=(polr->k),j=0;j<(pol2->k);i++,j++)
   {if (flag) polr->a[i]=-1.0*(pol2->a[j]);
    else polr->a[i]=pol2->a[j];
    polr->n[i]=pol2->n[j];
   } polr->k=i;
  normpol(polr);
}
void action::umn(STR*pol1,STR*pol2,STR*polr)
{ int i,j,jj;
  polr->k=0;
  for(i=0;i<(pol1->k);i++)
  {for(j=0,jj=(polr->k);j<(pol2->k);j++,jj++)
   {polr->n[jj]=pol1->n[i]+pol2->n[j];
    polr->a[jj]=pol1->a[i]*pol2->a[j];
   }
 polr->k=jj; normpol(polr);
  }
  normpol(polr);
}
void action::number(STR* pol,float num)
{ int i;
  for(i=0;i<(pol->k);i++)
  pol->a[i]*=num;
} 
float action::point(STR* pol,float num)
{ float buf;int i;
 for(i=0,buf=0;i<(pol->k);i++)
 {buf+=(pol->a[i])*pow(num,(pol->n[i])*1.0);
	}
 return buf;
}
void action::normpol(STR *pol)
{int bufn,fn,max,maxi,i,j,jj,polk;
 float bufa,fa; polk=pol->k;
  if ((pol->k)<=1) return ;
  for(i=0;i<polk;i++)
  { for(j=i,max=pol->n[i],maxi=i;j<polk;j++)
     if (max<(pol->n[j])){maxi=j;max=pol->n[j];}
     bufn=pol->n[i];bufa=pol->a[i];
     pol->n[i]=pol->n[maxi];pol->a[i]=pol->a[maxi];
     pol->n[maxi]=bufn;pol->a[maxi]=bufa;
   }
   for(i=0;i<polk;i++)
    {while(((pol->n[i])==(pol->n[i+1]))&&(i<(polk-1)))
	{pol->a[i]+=pol->a[i+1];
	 for(j=i+1;j<polk;j++) {pol->n[j]=pol->n[j+1];pol->a[j]=pol->a[j+1];}
	 polk--;pol->k=polk;
	 }
     }

   for(i=0;i<polk;i++)
    { up:if ((fabs(pol->a[i]))<EPS)
       { for(j=i;j<polk;j++)
	  {pol->n[j]=pol->n[j+1];
	   pol->a[j]=pol->a[j+1];
	  } polk--;pol->k=polk;goto up;
       }
     }
}
void action::inpol(STR *pol,char *ch)
{ int i,j,jj,fn;float fa;
  pol->k=0;
	cout<<"\nВведи "<<ch<<"полином до 30 элементов ,закончить [0] :";
  for(i=0;i<20;i++)
  {cin>>fa;
   if (fa==0) break;
   cin>>fn;pol->k+=1;;pol->n[i]=fn;pol->a[i]=fa;
  }
}
void action::outpol(STR *pol,char *ch)
{ int i,ii;
  ii=pol->k;
  cout<<"\n"<<ch;
  for(i=0;i<ii;i++)
  cout<<pol->a[i]<<"*x^("<<pol->n[i]<<")+";
}
void action::copypol(STR* pol1,STR* pol2)
{int i,polk;polk=pol1->k;
 for(i=0;i<polk;i++)
  {pol2->n[i]=pol1->n[i];pol2->a[i]=pol1->a[i];}
   pol2->k=pol1->k;
}
void action::delpol(STR* pol1,STR* pol2,STR* pold)
{ int i,j,jj,fn;float fa;
  pold->k=0;
  for(i=0;(pol1->n[0])>=(pol2->n[0])&&(pol1->k)>0;i++)
  { pold->n[i]=(pol1->n[0])-(pol2->n[0]);
    pold->a[i]=(pol1->a[0])/(pol2->a[0]);
    pold->k+=1;
    for(j=(pol1->k),jj=0;jj<(pol2->k);j++,jj++)
     {fn=pold->n[i];fa=-1.0*(pold->a[i]);
      fn+=(pol2->n[jj]);
      pol1->n[j]=fn;
      fa*=(pol2->a[jj]);
      pol1->a[j]=fa;
      pol1->k+=1;
     }
    normpol(pol1);
  } copypol(pold,pol2);
}
