Python: kalkulator ONP

Autor: Arkadiusz Tobiasz 5 lutego 2009

Kolejny programik napisany w Pythonie, jaki zdarzyło mi się stworzyć pewien czas temu. Otóż wczytuje on z pliku wyrażenia matematyczne i zamienia je na postać ONP. Oczywiście zaprezentowany kod pozostawia wiele do życzenia, bowiem (jeszcze :)) specjalistą od Pythona nie jestem. Program obsługuje wyjątki.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
operators = {
    '+': float.__add__,
    '-': float.__sub__,
    '*': float.__mul__,
    '/': float.__truediv__,
}



def wczytaj(plik):
   plik = plik.strip()
   try:
       plik = open(plik)
       for line in plik:
           onp = calc_onp(line)
           if sprawdz(onp) == 1:
               print onp
           
   except IOError, e:
       print e
   except:
       print "Blad: kolejne wyrazenie jest bledne, popraw je, aby zobaczyc reszte wynikow"

def sprawdz(wyrazenie):
    stack=[]
    for token in wyrazenie.split():
        if token in operators:
            stack.append(operators[token](stack.pop(-2), stack.pop()))
        else:
            stack.append(float(token))
    return 1          

def calc_onp(wyrazenie):
    wyrazenie_onp = ""
    stos = []
    operatory= ["-", "+", "/", "*"]
    for i in wyrazenie:
        if i == " ":
            continue
        elif i.isdigit():
            wyrazenie_onp += i + " "
        elif i in operatory:
            if len(stos) > 1 and (stos[-1] == "("
                   or stos[-1] in operatory
                   and operatory.index(stos[-1]) < operatory.index(i)) \
                   or stos == []:
                stos.append(i)
            else:
                for j in stos[::-1]:
                    if j in operatory and operatory.index(j) >= operatory.index(i):
                        wyrazenie_onp += j + " "
                        stos.pop()
                    else:
                        break
                stos.append(i)
        elif i == "(":
            stos.append(i)
        elif i == ")":
            for j in stos[::-1]:
                if j != "(":
                    wyrazenie_onp += j + " "
                stos.remove(j)
    for i in stos: wyrazenie_onp += i + " "
    return wyrazenie_onp
wyrazenie =""
while wyrazenie != "q":
    try:
        print "Kalkulator ONP\nAby wyjsc nalezy wcisnac \"q\" i nastepnie Enter"
        wyrazenie = raw_input('Podaj nazwe pliku z zadaniami > ')
        if wyrazenie != "q":
            print wczytaj(wyrazenie)
    except (ValueError, IndexError) as e:
        print('Bad input:', e)

Odpowiedz

 

Arkadiusz Tobiasz student Akademii Ekonomicznej im. Karola Adamieckiego w Katowicach na specjalnościach informatyka ekonomiczna oraz rachunkowość. Więcej...

jQuery Validation i funkcja remote

Jakiś czas temu zwrócił się do mnie użytkownik z problemem. Chodzi o to, że korzysta on z pluginu walidacji jQuery, […]

Zend Framework: integracja z Uploadify

W tym wpisie postaram się przedstawić Wam w jaki sposób zintegrować skrypt Uploadify z Zend Frameworkiem. Dzięki temu będziemy mogli […]

Javascript: Czasowe wyświetlanie reklamy

Czasami chcemy, aby na pewnym elemencie naszej strony wyświetlała się reklama przez jakiś czas, a następnie zniknęła. W tym wpisie […]

Linux: backup wszystkich baz danych MySQL

Swego czasu pisałem o tym jak z poziomu konsoli można szybko i przyjemnie zrobić backup bazy MySQL. Wszystko jest ładnie […]