Advertisement
Guest User

Untitled

a guest
Feb 8th, 2016
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.01 KB | None | 0 0
  1. def find_last(char, s):
  2.     last = -1
  3.     for i in range(len(s)):
  4.         if char == s[i]:
  5.             last = i
  6.     return last
  7.  
  8.  
  9. def find_first_from(i, char, s):
  10.     # naðe prvi kraj zagrade of pocetka prosle koja je zadnja
  11.     for i in range(i, len(s)):
  12.         if char == s[i]:
  13.             return i
  14.     return -1
  15.  
  16.  
  17. def is_float(n):
  18.     try:
  19.         float(n)
  20.         return True
  21.     except ValueError:
  22.         return False
  23.  
  24.  
  25. def solve(s):
  26.     s = s.replace("*--", "*").replace("/--", "/").replace("+--", "+").replace("---", "-")
  27.     print(s)
  28.  
  29.     # jednostavni
  30.     if is_float(s):
  31.         return float(s)
  32.     count, op = 0, None
  33.     for operator in operators:
  34.         count += s.count(operator)
  35.         if s.find(operator) != -1 and op == None:
  36.             op = operator
  37.     if count == 1:
  38.         # 1 operator, a + b oblik
  39.         a = float(s[:s.find(op)])
  40.         b = float(s[s.find(op) + 1:])
  41.         if op == "*":
  42.             return a * b
  43.         elif op == "/":
  44.             return a / b
  45.         elif op == "+":
  46.             return a + b
  47.         elif op == "-":
  48.             return a - b
  49.         else:
  50.             print("error??")
  51.     elif count == 2 and (s.count("+-") + s.count("--") + s.count("/-") + s.count("*-")):
  52.         # ERROR: nekad se moze nagomilati jos vise minusa i onda ne radi, ne da mi se ispravljat
  53.         # ako imamo minus, npr 6*-0.4 kod (20+4)*(20+4)+(((16-3)*5)*(3/5-1))
  54.         # onda obrni predznak
  55.         a = float(s[:s.find(op)])
  56.         b = float(s[s.find(op) + 1:])
  57.         op = op[0]  # uzmi prvi dio operatora
  58.         if op == "*":
  59.             return a * b
  60.         elif op == "/":
  61.             return a / b
  62.         elif op == "+":
  63.             return a + b
  64.         elif op == "-":
  65.             return a - b
  66.         else:
  67.             print("error??")
  68.  
  69.     # kompleksni
  70.     if s.find("(") != -1:
  71.         # ima zagrade
  72.         start = find_last("(", s)
  73.         kraj = find_first_from(start, ")", s)
  74.         s = s[:start] + str(solve(s[start + 1: kraj])) + s[kraj + 1:]
  75.         return solve(s)
  76.  
  77.     if s.find("+") != -1:
  78.         a = s[:s.find("+")]
  79.         b = s[s.find("+") + 1:]
  80.         return solve(a) + solve(b)
  81.  
  82.     # za minus treba gledat sve jer u situaciji tipa: "-5-5" nam ce gledat samo prvi i nema rjesenja
  83.     for i in range(len(s)):
  84.         if s[i] == "-":
  85.             # treba razlikovat je li negativan broj ili minus kao operator
  86.             if i == 0 or s[i - 1].isnumeric() == False:
  87.                 pass
  88.             else:
  89.                 a = s[:i]
  90.                 b = s[i + 1:]
  91.                 return solve(a) - solve(b)
  92.  
  93.     if s.find("*") != -1:
  94.         # ima puta
  95.         # s = a * b
  96.         # a i mogu biti slozeni
  97.         a = s[:s.find("*")]
  98.         b = s[s.find("*") + 1:]
  99.         return solve(a) * solve(b)
  100.  
  101.     if s.find("/") != -1:
  102.         a = s[:s.find("/")]
  103.         b = s[s.find("/") + 1:]
  104.         return solve(a) / solve(b)
  105.  
  106.     return s
  107.  
  108.  
  109. operators = ["(", ")", "*", "/", "+", "-"]
  110. s = input()
  111. print(solve(s))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement