Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def find_last(char, s):
- last = -1
- for i in range(len(s)):
- if char == s[i]:
- last = i
- return last
- def find_first_from(i, char, s):
- # naðe prvi kraj zagrade of pocetka prosle koja je zadnja
- for i in range(i, len(s)):
- if char == s[i]:
- return i
- return -1
- def is_float(n):
- try:
- float(n)
- return True
- except ValueError:
- return False
- def solve(s):
- s = s.replace("*--", "*").replace("/--", "/").replace("+--", "+").replace("---", "-")
- print(s)
- # jednostavni
- if is_float(s):
- return float(s)
- count, op = 0, None
- for operator in operators:
- count += s.count(operator)
- if s.find(operator) != -1 and op == None:
- op = operator
- if count == 1:
- # 1 operator, a + b oblik
- a = float(s[:s.find(op)])
- b = float(s[s.find(op) + 1:])
- if op == "*":
- return a * b
- elif op == "/":
- return a / b
- elif op == "+":
- return a + b
- elif op == "-":
- return a - b
- else:
- print("error??")
- elif count == 2 and (s.count("+-") + s.count("--") + s.count("/-") + s.count("*-")):
- # ERROR: nekad se moze nagomilati jos vise minusa i onda ne radi, ne da mi se ispravljat
- # ako imamo minus, npr 6*-0.4 kod (20+4)*(20+4)+(((16-3)*5)*(3/5-1))
- # onda obrni predznak
- a = float(s[:s.find(op)])
- b = float(s[s.find(op) + 1:])
- op = op[0] # uzmi prvi dio operatora
- if op == "*":
- return a * b
- elif op == "/":
- return a / b
- elif op == "+":
- return a + b
- elif op == "-":
- return a - b
- else:
- print("error??")
- # kompleksni
- if s.find("(") != -1:
- # ima zagrade
- start = find_last("(", s)
- kraj = find_first_from(start, ")", s)
- s = s[:start] + str(solve(s[start + 1: kraj])) + s[kraj + 1:]
- return solve(s)
- if s.find("+") != -1:
- a = s[:s.find("+")]
- b = s[s.find("+") + 1:]
- return solve(a) + solve(b)
- # za minus treba gledat sve jer u situaciji tipa: "-5-5" nam ce gledat samo prvi i nema rjesenja
- for i in range(len(s)):
- if s[i] == "-":
- # treba razlikovat je li negativan broj ili minus kao operator
- if i == 0 or s[i - 1].isnumeric() == False:
- pass
- else:
- a = s[:i]
- b = s[i + 1:]
- return solve(a) - solve(b)
- if s.find("*") != -1:
- # ima puta
- # s = a * b
- # a i mogu biti slozeni
- a = s[:s.find("*")]
- b = s[s.find("*") + 1:]
- return solve(a) * solve(b)
- if s.find("/") != -1:
- a = s[:s.find("/")]
- b = s[s.find("/") + 1:]
- return solve(a) / solve(b)
- return s
- operators = ["(", ")", "*", "/", "+", "-"]
- s = input()
- print(solve(s))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement