-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmathforhuman.py
216 lines (171 loc) · 7.73 KB
/
mathforhuman.py
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
from math import pi, e, factorial, sqrt, pow
import math as mt
def constante(exp):
#esta funcao substitui as funcoes em numeros para utilizar no calculo
exp = exp
if "π" in exp:
exp = exp.replace("π", str(pi))
if "e" in exp:
exp = exp.replace("e", str(e))
return exp
def fatorial(exp):
exp = str(exp)
while "!" in exp:
#vai verificar a existencia de fatorial e repetir os processos para cada
local = exp.find("!")
#vai verificar o local da primeira fatorial
lista_exp = list(exp)
#transforma a exp em uma lista para ser modificada.
lista_exp.pop(local)
#vai apagar a fatorial
c = 1 #define o contador
value = "" #define a variável temporária que vai sofrer modificações
while True:
#aqui vai pegar os números e armazená-los em value para serem calculados
try:
#vai ser tratado erros como os de range
if lista_exp[local-c].isnumeric() and local-c > -1:
#verifica se o elemento da lista é um número e se corresponde ao range da esquerda pra a direita
value += str(lista_exp[local-c]) #caso verdade ele é atribuido ao value para ser calculado a fatorial
lista_exp.pop(local-c) #o número é apagado para ser substituído depois pelo valor da fatorial
pos = local-c #é salvo a posição do último número para ser innserido nesse espaço
c += 1 #aqui soma o contador
else:
break
#caso não seja um número ou esteja voltando a lista, ele encerra
except Exception:
#caso exista um erro, ele para a executação
break
value = value[::-1] #inversão do value
lista_exp.insert(pos,str(factorial(float(value)))) #calcula e insere a fatorial do value
exp = "".join(lista_exp) #atribui os resultados à expressão
return exp #retorna a expressão já com os resultados calculados
def raiz(exp):
#esta funcao resolve raizes
exp = str(exp)
while "√" in exp:
#verifica a existencia de raizes e faz um looping para repetir o processo para cada raiz.
local = exp.find("√")
#vai verificar o local da primeira raiz
lista_exp = list(exp)
#transforma a exp em uma lista para ser modificada.
lista_exp.pop(local)
#vai apagar a raiz
value = "" #define a variável temporária que vai sofrer modificações
#aqui detecta o fator de multiplicação
c = 1 #cria o contador
tmp = "" #cria a var tmp que vai conter o fator
while True: #cria um looping para pegaar todos os números
try:
if lista_exp[local-c].isnumeric() and local-c > -1:#verifica se o item da lista é um número e sua posição
tmp += lista_exp[local-c] #atribui a tmp
lista_exp[local-c] = ""#aqui vai substituir o valor, mas não vai mudar as casas
else:
break #para quando não é um número ou está voltando
except Exception: #interrope caso haja um erro
break
#aqui verifica se tmp tem valor senão é atribuído 1 para multiplicar
if tmp != "":
tmp = float(tmp[::-1]) #inverte a var
else:
tmp = 1
while True:
#aqui vai pegar os números e armazená-los em value para serem calculados
try:
#vai ser tratado erros como os de range
if lista_exp[local].isnumeric():
#verifica se o elemento da lista é um número e se corresponde ao range da esquerda pra a direita
value += str(lista_exp[local]) #caso verdade ele é atribuido ao value para ser calculado a fatorial
lista_exp.pop(local) #o número é apagado para ser substituído depois pelo valor da fatorial
pos = local #é salvo a posição do último número para ser innserido nesse espaço
else:
break
#caso não seja um número ou esteja voltando a lista, ele encerra
except Exception:
#caso exista um erro, ele para a executação
break
value = sqrt(float(value))
lista_exp.insert(pos,str(tmp*value)) #calcula e insere a fatorial do value
exp = "".join(lista_exp) #atribui os resultados à expressão
return exp #retorna a expressão já com os resultados calculados
#EXPRESSÕES TRIGONOMÉTRICAS
def sin(val):
mode = globals()["mode"] #busca mode que foi definida em resolve()
#verifica se está em graus, caso contrário, apenas calcula o seno
if mode[5:8] == "Deg":
tmp = mt.sin(mt.radians(float(val))) #calcula o sin
tmp = "{:.10f}".format(tmp) #arredonda o valor para melhor compreensão
else:
tmp = mt.sin(val)
tmp = f"{tmp:.10f}"
return float(tmp) #retorna tmp em float para retirar o zeros das casas decimais.
def cos(val):
mode = globals()["mode"] #busca mode que foi definida em resolve()
#verifica se está em graus, caso contrário, apenas calcula o cosseno
if mode[5:8] == "Deg":
tmp = mt.cos(mt.radians(float(val))) #calcula o cos
tmp = "{:.10f}".format(tmp) #arredonda o valor para melhor compreensão
else:
tmp = mt.cos(val)
tmp = f"{tmp:.10f}"
return float(tmp) #retorna tmp em float para retirar o zeros das casas decimais.
def tan(val):
mode = globals()["mode"] #busca mode que foi definida em resolve()
#verifica se está em graus, caso contrário, apenas calcula o cosseno
if mode[5:8] == "Deg":
tmp = mt.tan(mt.radians(float(val))) #calcula o cos
tmp = "{:.10f}".format(tmp) #arredonda o valor para melhor compreensão
else:
tmp = mt.tan(val)
tmp = f"{tmp:.10f}"
return float(tmp) #retorna tmp em float para retirar o zeros das casas decimais.
#FIM EXPRESSÕES TRIGONOMÉTRICAS
def potencia(exp):
exp = str(exp)
while "^" in exp: #verifica a existencia de potencias
local = exp.find("^") #localiza a primeira ocorrência de potencia
lista_exp = list(exp)
lista_exp.pop(local) #apaga a ^
lista_exp.pop(local) #apaga o parênteses
expoente = ""
base = ""
while True: #pega o expoente
if lista_exp[local] != ")":
expoente += lista_exp[local]
lista_exp.pop(local)
else:
lista_exp.pop(local)
break
c = 1 #define o contador
while True: #pega a base
try:
if lista_exp[local-c].isnumeric() and local-c > -1:
base += lista_exp[local-c]
lista_exp.pop(local-c)
pos = local-c #marca a posicao do ultimo
c += 1
else:
break
except Exception:
break
base = base[::-1] #inversao da base
x = str(pow(float(base), float(expoente)))
lista_exp.insert(pos, x)
exp = "".join(lista_exp)
return exp
def resolve(expressao, mode):
#define mode como uma variável global para ser usada nas expressões trignométricas
globals()["mode"] = mode
mode = mode
try:
expressao = expressao
expressao = constante(expressao)
expressao = fatorial(expressao)
expressao = raiz(expressao)
expressao = potencia(expressao)
valor = str(eval(expressao))
return valor
except ArithmeticError:
return "Erro matemático"
except Exception:
return "Erro de síntaxe"