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) |
Popularity: 6%