Film samouczek
Napisz program, który przekonwertuje wyrażenie arytmetyczne zapisane w notacji infiksowej na jego odpowiednik w odwrotnej notacji polskiej. Zauważ, że wyrażenie nie musi zawierać pełnego nawiasowania, jak było to założone w problemie omawianym w sekcji „Przeczytaj”, zatem istotna jest tu kolejność wykonywania działań.
Przetestuj działanie programu dla wyrażenia arytmetycznego:
Specyfikacja problemu:
Dane:
wyrazenie– ciąg znaków, wyrażenie arytmetyczne zapisane w notacji infiksowej, gdzie dozwolonymi znakami są jednoliterowe nazwy zmiennych, operatory: dodawania (+), odejmowania (-), mnożenia (*), dzielenia (/), potęgowania (^) oraz nawiasy okrągłe: otwierające (() i zamykające ()); znak równości (=) należy interpretować jako koniec wyrażenia arytmetycznego
Wynik:
wyrażenie arytmetyczne zamienione na ONP
Porównaj swoje rozwiązanie z przedstawionym w filmie.

Film dostępny pod adresem /preview/resource/Rgf04PIBlHbg9
Film zatytułowany Odwrotna notacja polska. Wprowadzenie notacji beznawiasowej. Algorytm i jego implementacja w języku Python.
Kod programu zaprezentowanego w filmie:
Uruchom symulację i przekształć wyrażenie arytmetyczne zapisane w notacji infiksowej na postfiksową. Informacje teoretyczne dotyczące tego zagadnienia znajdziesz w e‑materiale Odwrotna notacja polskaOdwrotna notacja polska.
Uwaga, w symulacji nie stosujemy pełnego nawiasowania.
W poniższej symulacji interaktywnej twoim zadaniem jest samodzielne przekształcenie wyrażenia arytmetycznego zapisanego w notacji infiksowej na notację postfiksową.
Czasem by przejść dalej, konieczne będzie dokonanie wyboru z podanych opcji. W przypadku slajdów wyjaśniających zawsze możesz przejść do kolejnego slajdu (opcja Przejdź do kolejnego slajdu) lub wrócić do poprzedniego slajdu (opcja Wróć do poprzedniego slajdu), natomiast w slajdach, gdzie konieczny jest wybór kolejnego kroku rozwiązania problemu, powrót do wcześniejszego slajdu jest możliwy, natomiast przejście do kolejnego już nie.
Od trzeciego slajdu możesz również zacząć od nowa i wrócić do pierwszego slajdu (opcja Wróć do pierwszego slajdu i zacznij od nowa).
W wyrażeniu zastosowaliśmy operator ^. Wykorzystujemy go jako operator potęgowania.
W jaki sposób czytać informacje w symulacji?
1. Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4)). Zwróć uwagę na to, że element 23 jest wyróżniony. To on jest analizowany.
2. Stos: + Ten element mówi, co w danym momencie znajduje się na stosie.
3. Przekształcone wyrażenie:n 27 5 * 23. Tak wygląda dotychczas przekształcone wyrażenie.
4. Co należy zrobić z analizowanym elementem?
Umieścić element na stosie.
Stos: +
Wyjście: 27 5 * 23 - .
5. Dodaj element do wyniku.
Stos: +
Wyjście: 27 5* 23-
Polecenia, które należy wykonać Pierwsze wiersze obu opcji wskazują kroki, które mają zostać wykonane, natomiast kolejne pokazują, jak powinny wyglądać stos oraz aktualny wynik po wykonaniu danego kroku.
6. Wróć do poprzedniego slajdu.
Wróć do poprzedniego slajdu i zacznij od nowa.
Kolejne opcje pozwalają na nawigację po symulacji.
Symulacja
Przekształć wyrażenie arytmetyczne zapisane w notacji infiksowej na notację ONP (postfiksową).
Przejdź do kolejnego slajdu
Dane jest wyrażenie arytmetyczne 27 * 5 + 23 - (26 / (24 ^ 4)). Twoim zadaniem jest zapisanie go w notacji postfiksowej.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))<img data‑id=”27” alt=”27”>
Stos:
Przekształcone wyrażenie:
Co należy zrobić ze wskazanym operandem (27)?
Umieść operand 27 na stosie. Stos: 27 Wyjście:
Dodaj operand 27 do wyniku. Stos: Wyjście: 27
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Jeśli pobranym elementem jest liczba (operand), umieszczamy ją na wyjściu.
W konsekwencji stos i wyjście wyglądają następująco:
Stos:
Wyjście: 27
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos:
Przekształcone wyrażenie: 27
Co należy zrobić z pobranym operatorem *?
Umieść operator * na stosie. Stos: * Wyjście: 27
Dodaj operator * do wyniku. Stos: Wyjście: 27 *
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Jeśli pobranym elementem jest operator, umieszczamy go na stosie.
W konsekwencji stos i wyjście wyglądają następująco:
Stos: *
Wyjście: 27
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: *
Przekształcone wyrażenie: 27
Co należy zrobić z pobranym operandem 5?
Umieść operand 5 na stosie. Stos: * 5 Wyjście: 27
Dodaj operand 5 do wyniku. Stos: * Wyjście: 27 5
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Zastanów się, co należy zrobić, jeśli pobranym elementem jest liczba (operand).
Stos i wyjście wyglądają następująco:
Stos: *
Wyjście: 27 5
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: *
Przekształcone wyrażenie: 27 5
Na stosie jest już operator (*).
Pamiętaj, że jeśli pobierany element jest operatorem, trafia na stos, ale najpierw ze stosu zdejmowane są kolejno te operatory, których priorytet jest większy od priorytetu pobieranego operatora lub mu równy. Następnie trafiają na wyjście, a pobierany operator trafia na stos.
Jak zatem będą wyglądać wyjście i stos?
Stos: + Wyjście: 27 5 *
Stos: * Wyjście: 27 5 +
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Zastanów się, który operator ma większy priorytet.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: * +
Przekształcone wyrażenie: 27 5
Na stosie są dwa operatory, należy zatem sprawdzić to, jaki mają priorytet.
Który operator ma wyższy priorytet?
Operator + ma wyższy priorytet niż operator *.
Operator * ma wyższy priorytet niż operator +.
Operator * oraz operator + mają takie same priorytety.
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Zastanów się, jak wygląda kolejność działań.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: * +
Przekształcone wyrażenie: 27 5
Ponieważ operator * ma priorytet wyższy niż operator +, nie musimy sprawdzać łączności.
Co należy zrobić?
Operator * umieszczamy na wyjściu, operator + zostaje na stosie. Stos: + Wyjście: 27 5 *
Operator + umieszczamy na wyjściu, operator * zostaje na stosie. Stos: * Wyjście: 27 5 +
Oba operatory umieszczamy na wyjściu. Stos: Wyjście: 27 5 * +
Oba operatory zostają na stosie. Stos: * + Wyjście: 27 5
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Wróć do e‑materiałów poświęconych ONP.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: +
Przekształcone wyrażenie: 27 5 *
Co należy zrobić z pobranym operandem 23?
Umieść operand 23 na stosie. Stos: + 23 Wyjście: 27 5 *
Dodaj operand 23 do wyniku. Stos: + Wyjście: 27 5 * 23
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Zastanów się, co należy zrobić, jeśli pobranym elementem jest liczba (operand).
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: +
Przekształcone wyrażenie: 27 5 * 23
Pamiętaj, że jeśli pobierany element jest operatorem, trafia na stos, ale najpierw ze stosu zdejmowane są kolejno te operatory, których priorytet jest większy od priorytetu pobieranego operatora lub mu równy. Następnie trafiają na wyjście, a pobierany operator trafia na stos.
Jak będą wyglądać wyjście i stos?
Stos: - Wyjście: 27 5 * 23 +
Stos: + Wyjście: 27 5 * 23 -
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Zastanów się, jakie są priorytety operatorów.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: + -
Przekształcone wyrażenie: 27 5 * 23
Na stosie są dwa operatory, należy zatem sprawdzić to, jaki mają priorytet.
Który operator ma wyższy priorytet?
Operator + ma wyższy priorytet niż operator -.
Operator - ma wyższy priorytet niż operator +.
Operator - oraz operator + mają takie same priorytety.
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Zastanów się, jak wygląda kolejność działań.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: + -
Przekształcone wyrażenie: 27 5 * 23
Ponieważ operatory mają takie same priorytety, należy sprawdzić ich łączność.
Jaka jest łączność tych operatorów?
Operatory + oraz - mają łączność lewostronną.
Operatory + oraz - mają łączność prawostronną.
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Operatory * / - + mają łączność lewostronną, natomiast operator ^ ma łączność prawostronną.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: + -
Przekształcone wyrażenie: 27 5 * 23
Ponieważ operator - ma łączność lewostronną, operacje powinny być wykonywane od lewej do prawej.
Co należy zrobić?
Operator + umieszczamy na wyjściu, operator - zostaje na stosie. Stos: - Wyjście: 27 5 * 23 +
Operator - umieszczamy na wyjściu, operator + zostaje na stosie. Stos: + Wyjście: 27 5 * 23 -
Oba operatory umieszczamy na wyjściu. Stos: Wyjście: 27 5 * 23 + -
Oba operatory umieszczamy na stosie. Stos: + - Wyjście: 27 5 * 23
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Skoro operator jest lewostronny, najpierw należy wykonać dodawanie, czyli przenieść operator + na wyjście.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: -
Przekształcone wyrażenie: 27 5 * 23 +
Pobrany element to nawias otwierający. Tworzymy tym samym grupę operatorów.
Co należy zrobić z analizowanym elementem?
Umieść element na stosie. Stos: - ( Wyjście: 27 5 * 23 +
Dodaj element do wyniku. Stos: - Wyjście: 27 5 * 23 + (
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Nawias otwierający należy umieścić na szczycie stosu.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: - (
Przekształcone wyrażenie: 27 5 * 23 +
Co należy zrobić z pobranym operandem 26?
Umieść operand 26 na stosie. Stos: - ( 26 Wyjście: 27 5 * 23 +
Dodaj operand 26 do wyniku. Stos: - ( Wyjście: 27 5 * 23 + 26
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Zastanów się, co należy zrobić, jeśli pobranym elementem jest liczba (operand).
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: - (
Przekształcone wyrażenie: 27 5 * 23 + 26
Co należy zrobić z operatorem? Pamiętaj, że na stosie jest nawias otwierający.
Należy umieścić operator na stosie. Stos: - ( / Wyjście: 27 5 * 23 + 26
Należy dodać operator do wyniku. Stos: - ( Wyjście: 27 5 * 23 + 26 /
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Zastanów się, co należy zrobić, jeśli pobranym elementem jest operator, a na stosie jest już nawias otwierający.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Nawias otwierający 2. Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: - ( /
Przekształcone wyrażenie: 27 5 * 23 + 26
Pobrany element to nawias otwierający. Tworzymy tym samym nową grupę operatorów.
Co należy zrobić z elementem?
Umieść element na stosie.
Dodaj element do wyniku.
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Zastanów się, co należy zrobić, jeśli pobranym elementem jest nawias otwierający.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: - ( / (
Przekształcone wyrażenie: 27 5 * 23 + 26
Co należy zrobić z operandem 24?
Umieść operand 24 na stosie. Stos: - ( / 24 Wyjście: 27 5 * 23 + 26
Dodaj operand 24 do wyniku. Stos: - ( / Wyjście: 27 5 * 23 + 26 24
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Zastanów się, co zrobić, jeśli pobranym elementem jest liczba (operand).
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: - ( / (
Przekształcone wyrażenie: 27 5 * 23 + 26 24
Uwaga! Operator ^ oznacza operację potęgowania.
Pamiętaj, że jeśli na stosie jest operator o mniejszym priorytecie niż pobierany operator, to nowy operator należy umieścić na stosie.
Co należy zrobić z operatorem ^?
Umieść element na stosie. Stos: - ( / ^ Wyjście: 27 5 * 23 + 26 24
Dodaj element do wyniku. Stos: - ( / Wyjście: 27 5 * 23 + 26 24 ^
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Zastanów się, co należy zrobić, jeśli pobierany operator ma wyższy priorytet niż operator znajdujący się już na wierzchu stosu.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: - ( / ( ^
Przekształcone wyrażenie: 27 5 * 23 + 26 24
Co należy zrobić z operandem 4?
Umieść operand 4 na stosie. Stos: - ( / ^ 4 Wyjście: 27 5 * 23 + 26 24
Dodaj operand 4 do wyniku. Stos: - ( / ^ Wyjście: 27 5 * 23 + 26 24 4
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Zastanów się, co zrobić, jeśli pobranym elementem jest liczba (operand).
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Nawias zamykający.
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: - ( / ( ^
Przekształcone wyrażenie: 27 5 * 23 + 26 24 4
Pobrany element to nawias zamykający.
Co należy zrobić? Zastanów się, a następnie przejdź do kolejnego kroku.
Sprawdź swoją odpowiedź
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Jeśli trafisz na nawias zamykający, należy przenieść ze stosu wszystkie operatory aż do napotkania nawiasu otwierającego. Ściągamy ze stosu również napotkany nawias otwierający, ale nie przenosimy go na wyjście. Nawiasu zamykającego nie przenosimy ani na stos, ani na wyjście.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Nawias zamykający 2.
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: - ( /
Przekształcone wyrażenie: 27 5 * 23 + 26 24 4 ^
Powtarzamy operację.
Jak będą wyglądać stos i wyjście?
Stos:- Wyjście: 27 5 * 23 + 26 24 4 ^ /
Stos:- / Wyjście: 27 5 * 23 + 26 24 4 ^
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Przypomnij sobie, co należy zrobić po napotkaniu nawiasu zamykającego.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Wyrażenie i pobierany element: 27 * 5 + 23 - (26 / (24 ^ 4))
Stos: -
Przekształcone wyrażenie: 27 5 * 23 + 26 24 4 ^ /
Nie ma więcej elementów do pobrania. Co należy zrobić z ostatnim elementem, który został na stosie?
Przenieś go na wyjście
Usuń go ze stosu, nie przenosząc na wyjście
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Niestety, to nie jest poprawna odpowiedź. Ostatni element ze stosu należy przenieść na wyjście.
Przejdź do kolejnego slajdu
Wróć do poprzedniego slajdu
Wróć do pierwszego slajdu i zacznij od nowa
Gratulacje, udało ci się przekształcić wyrażenie zapisane w notacji infiksowej na postfiksową.
Wyrażenie w notacji infiksowej: 27 * 5 + 23 - (26 / (24 ^ 4))
Wyrażenie w postaci postfiksowej: 27 5 * 23 + 26 24 4 ^ / -
Wróć na początek
Zmodyfikuj program przedstawiony w prezentacji tak, by przekształcał wyrażenie arytmetyczne zapisane w notacji postfiksowej na postać infiksową.
Uruchom swój program w środowisku lokalnym i przetestuj dla następującego wyrażenia arytmetycznego zapisanego w postaci postfiksowej:
Zastosuj pełne nawiasowanie.
Poprawny wynik dla powyższych danych: