Форум сайта python.su
0
Задача
Дана строка вида “12-23+343+322” (арифметическое выражение, состоящее из цифр и знаков + и -, при этом два знака не идут подряд и выражение завершается цифрой). Вычислите его значение.
а вот ужас
s=“12-23+343+322”
i=1
while i<=len(s):
if (s=
“+” or “-”)) and (s>=0 and s<=9) and (s>=0 and s<=9):
c=s
j=i-1
k=1
s1=“”
while (s>=0 and s<=9) and j>=1:
s1=s+s1
j=j-1
k=k+1
j=j+1
s2=“”
while (s>=0 and s<=9) and j<=len(s):
s2=s2+s
j=j+1
k=k+1
p=int(s1)
t=int(s2)
if s==“-”:
r=p-t
if s==“+”:
r=p+t
print s1,c,s2,“=”,r
i=i+k
else:
i=i+1
raw_input()
примечание eval не использовать
Офлайн
25
pall
eval не использовать
s='12-23+343+322' exec('print ' + s)
Офлайн
0
нее, учус'ом тоже нельзя
вот решение на паскале
я не смог его адаптировать под
питон
uses crt;
const cf=;
zn=;
var s,s1,s2:string;
i,k,j:byte;
res:longint;
t,q,p:integer;
c:char;
begin
clrscr;
writeln('Введите строку, содержащую арифметические выражения со знаками +,-,*,/');
readln(s);
i:=1;
while i<=length(s) do
{если знак между цифрами}
if (s in zn)and(s in cf)and(s in cf) then
begin
c:=s;{запомним знак}
j:=i-1;k:=1;{идем назад}
s1:='';
while (s in cf)and(j>=1) do
begin
s1:=s+s1;{составляем строку из первого числа}
j:=j-1;
k:=k+1;
end;
j:=i+1;k:=1;{идем вперед}
s2:='';
while (s in cf)and(j<=length(s)) do
begin
s2:=s2+s;{составляем строку-второе число}
j:=j+1;
k:=k+1;
end;
val(s1,t,p);{преобразуем в числовой формат}
val(s2,q,p);
case c of{выполняем действие}
‘+’:res:=t+q;
‘-’:res:=t-q;
‘*’:res:=t*q;
‘/’:res:=t div q;
end;
writeln(s1,c,s2,'=',res);{выводим}
i:=i+k;{перепрыгиваем через второе число}
end
else i:=i+1;{иначе идем вперед}
readln
end.
Офлайн
88
Не зря запрещали студентам голову бэйсиками забивать.
from operator import __sub__, __add__ from functools import reduce import re expr = '12-23+343+322' opf = {'+':__add__, '-':__sub__} vals = list(map(int, re.split('[+-]', expr))) opl = iter(filter(lambda x:x in '+-', expr)) print(reduce(lambda x, y: opf[next(opl)](x, y), vals))
Офлайн
36
Shaman
list и iter - лишнее
Офлайн
88
pyuserСпасибо за внимательность. list явно указан умышленно, а iter действительно рудимент.
list и iter - лишнее
Офлайн
88
В порядке бреда:
import re expr = '12-23+343+322' vals = re.split('[+-]', expr) opl = re.split('\d+', expr)[1:-1] print(sum(map(lambda x, y: int(y+x), vals, ['+']+opl)))
Отредактировано Shaman (Июнь 1, 2013 19:25:12)
Офлайн
32
ShamanТоже поучаствую…
В порядке бреда:
import re expr = '12-23+343+322' print sum(map(int, re.findall(r'([+-]?\d+)', expr)))
Офлайн
88

expr = '12-23+343+322' def gv(expr): v = '' for c in reversed(expr): v = c + v if not c.isdigit(): yield int(v) v = '' yield int(v) print(sum(gv(expr)))
Офлайн