Odwrotna notacja polska - c++

0

Witam. Zaczynam swoją przygodę z programowaniem. Z pomocą stron i książek napisałem program który przekształca wyrażenia na ONP(Odwrotną notację polską). I mam pytanie. Moim zdaniem jest dość głupie...ale takie pytanie zadał mi prowadzący. Co muszę przekształcić w kodzie żeby np zamiast + zrobić ++. Chodzi o to że operacja dodawania ma być ++. No bo przecież zmiana w casie z + na ++ nie pomoze

Wklejam przykładowy program

#include <iostream>

using namespace std;

const int S_MAX = 100; // rozmiar stosu operatorów

int p(char c)
{
switch(c)
{
case '+' : ;
case '-' : return 1;
case '*' : ;
case '/' : return 2;
case '^' : return 3;
}
return 0;
}

int main()
{
char S[S_MAX]; // stos operatorów
int sptr = 0; // wskaźnik stosu
char c; // kolejny znak wyrażenia

while(true)
{
cin >> c;

if(c == '=')                            
{
  while(sptr) cout << S[--sptr] << ' ';  
                                         
  break;                                 
}

switch(c)                                
{
  case ' ' : break;                      
  case '(' : S[sptr++] = '(';           
             break;
  case ')' : while(S[sptr-1] != '(')     
             cout << S[--sptr] << ' ';  
                                         
             sptr--;                     
             break;
  case '+' : ;                           
  case '-' : ;
  case '*' : ;
  case '/' : ;
  case '^' : while(sptr)
             {
               if((p(c) == 3) || (p(c) > p(S[sptr - 1]))) break;
               cout << S[--sptr] << ' '; 
             }                           
             S[sptr++] = c;              
             break;
  default:   cout << c << ' ';         
             break;
}

}

return 0;
}

0

Lepiej byloby uzyc stringow jako struktury danych

0

Niestety nie od poczatku, ale fragment ksiazki Stroustrupa, ktory byl dostepny gratis mniej wiecej o tym traktuje.

Przy okazji sposoby wpisywania kodow nie sprawdzaja sie - chyba poprzedni system tagowania byl czytelniejszy...

0

A jakbym chciał zrobić coś na zasadzie default żeby mi w przypadku wpisania innego operatora niż te podane w switch zwrocil sie komunikat że wprowadzony znak jest bledny i zeby program nic nie przeliczal, a zakonczyl dzialanie to jak sie za to zabrac?

0

Jako że masz funkcję int która musi zwrócić zmienną tego typu możesz zrobić w default:

cout << "Nieobslugiwany znak" << endl;
return 0;

Dzięki return wyjdziesz z funkcji zwracając 0.

0

No właśnie nie działa chyba że w złym miejscu to robie ale tam na dole mam już default jedno

0

Ale tam masz break a nie return.

0

Tylko że w jednym switch nie mogę użyć dwukrotnie default

0

No tak, ale przecież ten default od tego jest że gdy znak nie jest obsługiwany wyświetlasz błąd i return.

0

Nie działa, chyba coś źle rozumiem

0

Wszystko ok już. A co jakbym chciał zrobić tak żeby np. takie wyrażenie 2(3+4) pomiędzy 2 i nawiasem automatycznie było traktowane jak mnożenie. Jak takiego ifa zapisac? Rozumiem ze na zasadzie jeśli obecny znak to nawias a poprzedni to liczba to wtedy jest to mnożenie tylko jak to zapisac?

1 użytkowników online, w tym zalogowanych: 0, gości: 1