Untitled
unknown
python
2 years ago
3.4 kB
9
Indexable
f = open("in.txt", "r") #Otwieramy plik in.txt. Musi on byc w folderze z plikiem .py | Po przecinku mamy "r" co oznacza, ze bedziemy z pliku czytac.
fs = open("out.txt", "w") #Tworzymy plik out.txt | Po przecinku mamy "w" co oznacza, ze mozemy edytowac plik (czyli wpisywac wyniki ONP). UWAGA - utworzenie pliku nadpisze stary plik o tej samej nazwie
for y in f: #Petla ktora bierze za x nastepna linie z pliku in.txt | Petla powtarza sie tyle razy, ile jest linijek w pliku in.txt (Zalozmy ze plik in.txt ma dwie linijki, w pierwszej jest 493 a w drugej 233, w pierwszej iteracji x bedzie rowne 493 a w drugiej iteracji 233)
STOS = [] ## Definiujemy stos do ktorego bedziemy dodawac nasze liczby
ONP = y ## Bierzemy cala linijke do zmiennej ONP by moc na niej operowac.
for x in ONP.split(): ## ONP.split przeksztalca Stringa z pierwszej linijki w listę znaków bez spacji (czyli z "2 3 5 - 3 * -" robi ['2', '3', '5', '-', '3', '*', '-'])
if x.isdigit(): ## x to kolejny element z listy, a instrukcja .isdigit() sprawdza czy x (string) jest liczba. Jezeli jest liczba to zwraca wartosc True, a jak wiemy warunek if aby wykonac kod musi byc prawdziwy (True)
STOS.append(int(x)) ## Dodajemy liczbe do stosu poprzez .append | Jezeli chcemy operowac na liczbach a nie slowach, to pamietajmy o przeksztalceniu wartosci za pomoca int().
else: ## Jezeli NIE JEST liczbą to:
if x == "-": ## Skoro nie jest liczba, to musi byc ktoryms znakiem operatora (dzielenie mnozenie dodawanie odejmowanie)
liczba1 = STOS.pop() ## Usuwamy pierwsza liczbe z gory stosu i dodajemy ją do zmiennej liczba1
liczba2 = STOS.pop() ## Usuwamy pierwsza liczbe z gory stosu i dodajemy ją do zmiennej liczba2
wynik = liczba2 - liczba1 ## Obliczamy wynik działania z użyciem ww. operatora. ZAWSZE najpierw liczba 2 potem 1
STOS.append(wynik) ## Dodajemy wynik dzialania na gore stosu
# print(f"Wynik dzialania: {liczba2} - {liczba1} to {wynik}")
elif x == "*": ## To samo co w linijce 12-17 tylko z operatorem mnozenia
liczba1 = STOS.pop()
liczba2 = STOS.pop()
wynik = liczba1 * liczba2
STOS.append(wynik)
# print(f"Wynik dzialania: {liczba2} * {liczba1} to {wynik}")
elif x == "+":
liczba1 = STOS.pop()
liczba2 = STOS.pop()
wynik = liczba2 + liczba1
STOS.append(wynik)
# print(f"wynik dzialania: {liczba2} + {liczba1} to {wynik}")
elif x == "/":
liczba1 = STOS.pop()
liczba2 = STOS.pop()
wynik = liczba2 / liczba1
STOS.append(wynik)
# print(f" wynik dzialania {liczba2} / {liczba1} to {wynik}")
if len(STOS) > 1: ## Jezeli po wykonaniu obliczen dlugosc wyrazenia bedzie wieksza niz 1, znaczy to ze podano nieprawidlowe wyrazenie ONP
fs.write("Bledne wyrazenie") #Zapisujemy do pliku wiadomosc o blednym wyrazeniu poniewaz dlugosc wyrazenia jest wieksza niz 1
fs.write("\n") #Dodajemy Entera
else:
fs.write(str(STOS[0])) #Zapisujemy do pliku wynik wyrazenia
fs.write("\n") #Dodajemy EnteraEditor is loading...