Zadanie na użycie operacji sprawdzenia następnego znaku w strumieniu wejścia (metodą peek()) oraz rekurencję.
Zadanie
Napisz program, który ze standardowego wejścia wczyta wyrażenie matematyczne składające się z
- liczb rzeczywistych,
- operatorów binarnych (dwu-argumentowych) dodawania, odejmowania, mnożenia i dzielenia,
- operatorów unarnych (jedno-argumentowych)"+" i "-",
- nawiasów okrągłych "()"
oraz wypisze na standardowe wyjście liczbę powstałą w wyniku ewaluacji tego wyrażenia zaokrągloną do dwóch miejsc po przecinku.
Przykład
Wejście
2+2*-(1+1/2)
Wyjście
-1.00
Uwaga: w zamyśle zadanie miało na celu przećwiczenie używania operacji pobierania znaku ze strumienia i operacji anulowania pobrania znaku (w jezyku C funkcją ungetc()). Ze względu na ograniczenia systemu ZawodyWEB używanie funkcji typu ungetc() nie jest możliwe. Dlatego sugerowane było stworzenie funkcji które będą "próbować" odczytać znaki "+", "-", "*", "*", "/", "(", ")" poprzedzone ewentualnie białymi znakami oraz zwracać informację, czy ten odczyt się powiódł (można było np. próbować odczytać ciąg czarnych znaków długości 1 składący się tylko z konkretnego znaku). W języku C++ można natomiast użyć metody peek() (wywołanej z obiektu strumienia cin)...
Wskazówka:
Stwórz metody:
- czynnik() - odpowiedzialną za odczyt operatorów unarnych (ewentualnie wywołując siebie rekurencyjnie) i liczb rzeczywistych oraz wywołującą funkcję wyrazenie() w pozostałych przypadkach (dla nawiasów),
- skladnik() - odpowiedzialną za składanie operatorów mnożenia i dzielenia (ta funkcja ma wywoływać funkcję czynnik(),
- wyrazenie() - odpowiedzialną za składanie operatorów binarnych (dwuargumentowych) dodawania i odejmowania (wywołując funkcję skladnik()) oraz odczyt nawiasów (wywołując siebie rekurencyjnie).