Advertisement
desdemona

onp

Mar 9th, 2013
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.76 KB | None | 0 0
  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <stack>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. string wyrazenie;
  9. //i to indeks wyrazenia
  10. int i;
  11. //j to indeks tablicy po przerobieniu na onp
  12. int j;
  13. int dlugosc;
  14.  
  15. void error()
  16. {
  17.     cout << "krokodyle i ograngutany" << endl;
  18. }
  19.  
  20. struct element_stosu
  21. {
  22.     bool czy_liczba;
  23.     int wartosc;
  24.     char dzialanie;
  25. };
  26.  
  27. stack<char> stos;
  28.  
  29. stack<int> onp_stos;
  30. element_stosu tablica[700];
  31.  
  32. int potega(int podstawa, int wykladnik)
  33. {
  34.     if(wykladnik==0)
  35.     {
  36.         return 1;
  37.     }
  38.     else if(wykladnik==1)
  39.     {
  40.         return podstawa;
  41.     }
  42.     else
  43.     {
  44.         int i=wykladnik;
  45.         int wynik = podstawa;
  46.         while (i>1)
  47.         {
  48.             wynik = wynik*podstawa;
  49.             i--;
  50.         }
  51.         return wynik;
  52.     }
  53. }
  54.  
  55. int ogarnij_liczbe()
  56. {
  57.     //mam miejsce w tablicy gdzie zaczyna sie liczba
  58.     //wiec wyrazenie[i] ma tam cos co jest cyfra w czarze
  59.     //teraz musze policzyc ile tych cyfr mam w rzadku
  60.  
  61.     int ilosc_cyfr=0;
  62.     int pomocnicza=i;
  63.     while(pomocnicza<dlugosc && wyrazenie[pomocnicza]>47 && wyrazenie[pomocnicza]<58)
  64.     {
  65.         pomocnicza++;
  66.         ilosc_cyfr++;
  67.     }
  68.     //cout << ilosc_cyfr << endl;
  69.     //ok, teraz wiem ze mam prawidlowo policzona ilosc cyfr
  70.  
  71.     int liczba=0;
  72.     int pom=ilosc_cyfr;
  73.     int wykl=0;
  74.     while(pom>0)
  75.     {
  76.         int nastepny= (wyrazenie[i+pom-1] - 48) * potega(10, wykl);
  77.         liczba=liczba+nastepny;
  78.         wykl++;
  79.         pom--;
  80.     }
  81.     i=i+ilosc_cyfr;
  82.     return liczba;
  83. }
  84.  
  85. void wyjscie_stos_top()
  86. {
  87.     if(!stos.empty())
  88.     {
  89.         cout << stos.top();
  90.         cout << ' ';
  91.         tablica[j].czy_liczba=0;
  92.         tablica[j].dzialanie=stos.top();
  93.         j++;
  94.         stos.pop();
  95.     }
  96. }
  97.  
  98.  
  99. int main()
  100. {
  101.     cout << "wprowadz wyrazenie w notacji infiksowej" << endl;
  102.    
  103.     getline(cin, wyrazenie);
  104.     dlugosc=wyrazenie.length();
  105.  
  106.     i=0;
  107.     j=0;
  108.  
  109.     cout << "to samo ale w onp wyglada tak:" << endl;
  110.  
  111.     for(i; i<dlugosc; i++)
  112.     {
  113.         if(wyrazenie[i]!=32)
  114.         {
  115.             switch(wyrazenie[i])
  116.             {
  117.             case '(':
  118.                 {
  119.                     stos.push(wyrazenie[i]);
  120.                     break;
  121.                 }
  122.             case ')':
  123.                 {
  124.                     while(stos.top()!='(')
  125.                     {
  126.                         wyjscie_stos_top();
  127.                     }
  128.                     break;
  129.                 }
  130.             case '+':
  131.             case '-':
  132.                 {
  133.                     while(!stos.empty() && stos.top()!='(')
  134.                     {
  135.                         wyjscie_stos_top();
  136.                     }
  137.                     stos.push(wyrazenie[i]);
  138.                     break;
  139.                 }
  140.             case '*':
  141.             case '/':
  142.                 {
  143.                     while(!stos.empty() && stos.top()!='+' && stos.top()!='-' && stos.top()!='(')
  144.                     {
  145.                         wyjscie_stos_top();
  146.                     }
  147.                     stos.push(wyrazenie[i]);
  148.                     break;
  149.                 }
  150.             case '^':
  151.                 {
  152.                     while(!stos.empty() && stos.top()=='^')
  153.                     {
  154.                         wyjscie_stos_top();
  155.                     }
  156.                     stos.push('^');
  157.                     break;
  158.                 }
  159.             }
  160.  
  161.             if(isdigit(wyrazenie[i]))
  162.             {
  163.                 int druk=ogarnij_liczbe();
  164.                 cout << druk;
  165.                 cout << ' ';
  166.                 tablica[j].czy_liczba=1;
  167.                 tablica[j].wartosc=druk;
  168.                 j++;
  169.                
  170.             }
  171.         }
  172.     }
  173.  
  174.     while(!stos.empty())
  175.     {
  176.         if(stos.top()!='(' && stos.top()!=')')
  177.         {
  178.             wyjscie_stos_top();
  179.         }
  180.         else
  181.         {
  182.             stos.pop();
  183.         }  
  184.     }
  185.  
  186.     cout << " " << endl;
  187.  
  188.  
  189.  
  190.     cout << "teraz bede kombinowac z obliczaniem tego" << endl;
  191.     //  struct element_stosu
  192.     //{
  193.     //  bool czy_liczba;
  194.     //  int wartosc;
  195.     //  char dzialanie;
  196.     //};
  197.     //struct element_stosu tablica[700];
  198.     //stack<int> onp_stos;
  199.     //element_stosu tablica[700];
  200.     //tyle mam. w tablicy jest pokolei wszystko co zostalo wypisane
  201.  
  202.     int k=0;
  203.     //nowy iterator tablicy
  204.     //nie wiem co jest teraz w porzednim wiec nie bede kombinowac
  205.  
  206.     //moze najpierw sprawdze co mam w tablicy
  207.     cout << "na wszelki wypadek sprawdzamy jest w talbicy programu" << endl;
  208.     int eustachy=j;
  209.     while(eustachy>0)
  210.     {
  211.         if(tablica[k].czy_liczba==1)
  212.         {
  213.             cout << tablica[k].wartosc << " ";
  214.         }
  215.         else
  216.         {
  217.             cout << tablica[k].dzialanie << " ";
  218.         }
  219.         eustachy--;
  220.         k++;
  221.     }
  222.     //ok, widze ze w tablicy mam co trzeba
  223.  
  224.     k=0;
  225.     eustachy=j;
  226.     while(eustachy>0)
  227.     {
  228.         if(tablica[k].czy_liczba==1)
  229.         {
  230.             onp_stos.push(tablica[k].wartosc);
  231.             //k++;
  232.         }
  233.         else if(tablica[k].czy_liczba==0)
  234.         {
  235.             if(!onp_stos.empty())
  236.             {
  237.                 int b=onp_stos.top();
  238.                 onp_stos.pop();
  239.                 if(!onp_stos.empty())
  240.                 {
  241.                     int a=onp_stos.top();
  242.                     onp_stos.pop();
  243.                     int wynik=0;
  244.                     switch(tablica[k].dzialanie)
  245.                     {
  246.                     case '+':
  247.                         {
  248.                             wynik=a+b;
  249.                             break;
  250.                         }
  251.                     case '-':
  252.                         {
  253.                             wynik=a-b;
  254.                             break;
  255.                         }
  256.                     case '*':
  257.                         {
  258.                             wynik=a*b;
  259.                             break;
  260.                         }
  261.                     case '/':
  262.                         {
  263.                             wynik=a/b;
  264.                             break;
  265.                         }
  266.                     case '^':
  267.                         {
  268.                             wynik=potega(a, b);
  269.                             break;
  270.                         }
  271.                     }
  272.                     onp_stos.push(wynik);
  273.                     //k++;
  274.                 }
  275.                 else
  276.                 {
  277.                     error();
  278.                 }
  279.             }
  280.             else
  281.             {
  282.                 error();
  283.             }
  284.         }
  285.         else
  286.         {
  287.             error();
  288.         }
  289.         eustachy--;
  290.         k++;
  291.     }
  292.     cout << " " << endl;
  293.     cout << "wynik to: " << endl;
  294.     cout <<  onp_stos.top() << endl;
  295.  
  296.  
  297.    
  298.     system("PAUSE");
  299.     return 0;
  300. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement