Tyto stránky již nejsou udržovány. Obsah je postupně přesouván/aktualizován na adrese chytrosti.marrek.cz.
1575/14246
1 #!/usr/bin/python
2 # -*- coding: utf8 -*-
3 # Soubor: 20120327-Tue-komplexhi-k.py
4 # Datum: 20.03.2012 08:22
5 # Autor: Marek Nožka, nozka <@t> spseol <d.t> cz
6 # Licence: GNU/GPL
7 # Úloha: kalkulátor s poslkou reverzní notací
8 #########################################
9
10 import math, cmath, numpy, readline, sys
11
12 zasobnik = [] # globální proměnná
13
14 def Push(cislo):
15 zasobnik.append(cislo)
16
17 def Pop():
18 if len(zasobnik)>0:
19 return zasobnik.pop()
20 else:
21 return None
22
23
24 tvarCisla = 'alg'
25 def vypisZasobnik():
26 global uhelFnc2deg
27 if tvarCisla == 'alg':
28 print zasobnik
29 elif tvarCisla == 'exp':
30 sys.stdout.write('[ ')
31 for cislo in zasobnik:
32 sys.stdout.write(' ')
33 if type(cislo) == complex:
34 sys.stdout.write('({0}L{1})'.\
35 format(numpy.abs(cislo),uhelFnc2deg(numpy.angle(cislo))))
36 else:
37 sys.stdout.write(cislo)
38 sys.stdout.write(' ')
39 sys.stdout.write(' ]\n')
40
41 #################################################################
42 def rad2rad(rad):
43 return rad
44
45 uhelFnc2rad = numpy.deg2rad
46 uhelFnc2deg = numpy.rad2deg
47
48 #################################################################
49 funkce2operandy = None
50 funkce1operand = None
51
52 def plusObal(a,b):
53 return a+b
54 def minusObal(a,b):
55 return b-a
56
57 def druhaMocninaObal(a):
58 return a*a
59
60 def vypocet1operand():
61 operandA = Pop()
62 if operandA != None:
63 vysledek = funkce1operand(operandA)
64 Push(vysledek)
65 print vysledek
66 else:
67 print 'CHYNA: nelze provést',polozka,'-- zásoník je prázdný'
68
69 def vypocet2operandy():
70 operandA = Pop()
71 operandB = Pop()
72 if operandA != None and operandB != None:
73 vysledek = funkce2operandy(operandA,operandB)
74 Push(vysledek)
75 print vysledek
76 else:
77 print 'CHYNA: nelze provést','-- zásoník je prázdný'
78 if operandA != None: # poslední číslo v zásobníku tam vrátím
79 Push(operandA)
80
81 def zpracujRadek(radek):
82 global funkce2operandy
83 global funkce1operand
84 global uhelFnc2deg
85 global uhelFnc2rad
86 global tvarCisla
87 vstupy = radek.split() # získám pole vstupů
88 for polozka in vstupy: # procházím vstupy
89 if polozka == '+':
90 funkce2operandy = plusObal
91 vypocet2operandy()
92 elif polozka == '-':
93 funkce2operandy = minusObal
94 vypocet2operandy()
95 elif polozka == '^2':
96 funkce1operand = druhaMocninaObal
97 vypocet1operand()
98 elif polozka == 'p' or polozka == 'print':
99 vypisZasobnik()
100 elif polozka == 'd' or polozka == 'deg':
101 uhelFnc2rad = numpy.deg2rad
102 uhelFnc2deg = numpy.rad2deg
103 elif polozka == 'r' or polozka == 'rad':
104 uhelFnc2rad = rad2rad
105 uhelFnc2deg = rad2rad
106 elif polozka == 'a' or polozka == 'alg':
107 tvarCisla = 'alg'
108 elif polozka == 'e' or polozka == 'exp':
109 tvarCisla = 'exp'
110 elif polozka.count(',') == 1:
111 try:
112 slozky = polozka.split(',')
113 cislo = float(slozky[0]) + float(slozky[1])*1j
114 Push(cislo)
115 except:
116 print 'CHYBA: neznámý operand:', polozka
117 elif polozka.count('L') == 1:
118 try:
119 slozky = polozka.split('L')
120 uhel = uhelFnc2rad( float(slozky[1]) )
121 cislo = float(slozky[0]) * cmath.exp(uhel*1j)
122 Push(cislo)
123 except:
124 print 'CHYBA: neznámý operand:', polozka
125 else:
126 try:
127 cislo = float(polozka) # převedu řetězec na číslo
128 Push(cislo)
129 except:
130 print 'CHYBA: neznámý operand:', polozka
131
132
133 ########################################################
134 # hlavní programová smyčka
135 while True:
136 try:
137 radek = raw_input('kalkulacka ->> ')
138 zpracujRadek(radek)
139 except EOFError:
140 exit(0)
141