#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;
}

