Untitled

mail@pastecode.io avatarunknown
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