Untitled
python
10 days ago
3.4 kB
3
Indexable
Never
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 Entera