Прикреплённый файл «vyr4.py»

Загрузка

   1 #!/usr/bin/python
   2 # coding: UTF8
   3 
   4 '''Ввести арифметическое выражение c шестью приоритетами (or, and, < > ==, + -, * /, **) и круглыми скобками -- и вычислить результат'''
   5 
   6 import re
   7 
   8 # таблица операций в человеческом виде
   9 Ops={ # знак, приоритет, свойства, функция, шаблон
  10         'or':   (0,   '',  lambda a,b: a or b , r'or' ),
  11         'and':  (1,   '',  lambda a,b: a and b, r'and'),
  12         '<':    (2,   '',  lambda a,b: a < b  , r'<'),
  13         '>':    (2,   '',  lambda a,b: a > b  , r'>'),
  14         '==':   (2,   '',  lambda a,b: a == b , r'=='),
  15         '+':    (3,   '',  lambda a,b: a + b  , r'\+'),
  16         '-':    (3,   '',  lambda a,b: a - b  , r'-'),
  17         '*':    (4,   '',  lambda a,b: a * b  , r'(?<!\*)\*(?!\*)'),    # из-за **
  18         '/':    (4,   '',  lambda a,b: a / b  , r'/'),
  19         '**':   (5,  'r',  lambda a,b: a ** b , r'\*\*'),
  20     }
  21 
  22 MaxLevel=max([o[0] for o in Ops.values()])
  23 
  24 rBrs=re.compile(r"(\([^)]+\))")
  25 
  26 # Регулярные выражения для распознавания 
  27 # групп операций с одинаковым приоритетом
  28 pOps=["|".join([op[3] for op in Ops.values() if op[0]==i]) for i in xrange(MaxLevel+1)]
  29 rOps=[re.compile("\s*("+op+")\s*") for op in pOps]
  30 
  31 def bcalc(String):
  32     '''Вычислить выражение со скобками'''
  33     while rBrs.search(String):
  34         G=rBrs.split(String)
  35         for i in xrange(1,len(G),2):
  36             G[i]=str(calc(G[i][1:-1],0))
  37         String="".join(G)
  38     return calc(String)
  39 
  40 def calc(String,level=0):
  41     '''Вычислить выражение без скобок,
  42     состоящее из операций с приоритетом не ниже level'''
  43     # Если добрались до числа
  44     if level > MaxLevel: return int(String)
  45     seq = rOps[level].split(String)
  46     # Если операций данного приоритета нет
  47     if len(seq) == 1: return calc(seq.pop(),level+1)
  48     # предполагается, что на одном уровне приоритетов 
  49     # порядок выполнения операций одинаков
  50     t = 'r' in Ops[seq[1]] and -1 or 0
  51     ret = calc(seq.pop(t),level+1)
  52     while seq:
  53         op,arg = seq.pop(t),seq.pop(t)
  54         ret = Ops[op][2](ret,calc(arg,level+1))
  55     return ret
  56 
  57 print bcalc(raw_input())

Прикреплённые файлы

Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.

Вам нельзя прикреплять файлы к этой странице.