#include <iostream>
#include <cassert>
#include <cstdlib>
#include <cctype>

int Suma(int a,int b) { return(a+b); }
int Roznica(int a,int b) { return(a-b); }
int Iloczyn(int a,int b) { return(a*b); }
int Iloraz(int a,int b) { return(a/b); }

typedef int (*Operacja)(int,int);

struct { int Waga; char Znak; Operacja Op; } Opr[]=
  {
    {1,'+',Suma},
    {1,'-',Roznica},
    {2,'*',Iloczyn},
    {2,':',Iloraz}
  };
const unsigned RozmiarOpr=sizeof(Opr)/sizeof(*Opr);

int Licz(const char *Napis)
  {
   int Waga=RozmiarOpr;
   Operacja Op=0;
   const char *WZnak=0;
   for(const char *w=Napis;*w;++w)
     {
      for(unsigned i=0;i<RozmiarOpr;++i)
        {
         if((Opr[i].Znak==*w)&&(Waga>=Opr[i].Waga))
           {
            Waga=Opr[i].Waga;
            Op=Opr[i].Op;
            WZnak=w;
           }
        }
     }
   if(!WZnak) return(atoi(Napis));
   char Znak=*WZnak;
   *(char*)WZnak=0;
   int Wynik=Op(Licz(Napis),Licz(WZnak+1));
   *(char*)WZnak=Znak;
   return(Wynik);
  }

int main()
  {
   cout<<"Podaj wyraz: 2*3-3*2+2";
   cout<<Licz("2*3-3*2+2")<<endl<<endl;
   while(true)
     {
      char Bufor[1024];
      cout<<"Podaj wyraz: ";
      cin.getline(Bufor,sizeof(Bufor),'\n');
      if(!*Bufor) break;
      cout<<Licz(Bufor)<<endl<<endl;
     }
   return 0;
  }


