Прикреплённый файл «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 из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2011-09-26 11:35:39, 6.8 KB) [[attachment:corrnum.py]]
- [получить | показать] (2011-09-26 11:35:39, 0.6 KB) [[attachment:corrnumC.py]]
- [получить | показать] (2011-09-26 11:35:39, 2.4 KB) [[attachment:vyr4.py]]
- [получить | показать] (2011-09-26 11:35:39, 2.4 KB) [[attachment:vyr4G.py]]
- [получить | показать] (2011-09-26 11:35:39, 1.4 KB) [[attachment:wiki.py]]
- [получить | показать] (2011-09-26 11:35:39, 2.0 KB) [[attachment:word_number3.py]]
Вам нельзя прикреплять файлы к этой странице.