Задача 8 урок 22
Primary tabs
"Калькулятор":
Напишите функцию, которая получает на вход произвольную строку вида:5*(3+4)-7*9+3*(2+(2-7))(арифметическое выражение со скобками любого уровня вложенности и операциями умножения, вычитания и сложения)
и в качестве ответа возвращает результат этого выражения.
Рекомендация: сначала убедитесь, что число открывающих скобок, равно числу закрывающих.
Решение :
var
s: string;
i: integer;
function arithmetic(num1,num2: integer; oper1: string): integer;
begin
if (oper1 = '*') then
num1:= num1 * num2
else if (oper1 = '-') then
num1:= num1 - num2
else
num1:= num1 + num2;
result:= num1;
end;
function calc(var i: integer; s: string): integer;
var l,Code,num2,num3,num1,n1: integer; oper1,oper2, numstr1, numstr2, numstr3: string;
begin
n1:=0;
num1:= 0;
num2:= 0;
num3:= 0;
oper1:='';
l:= length(s);
while(i <= l) do
begin
if n1<> 0 then
begin
if (s[i]<>'*') then
begin
num1:= arithmetic(n1,num1,oper1);
n1:=0;
oper1:='';
end
else
begin
num2:= num1;
num1:= n1;
n1:= 0;
end;
end;
if (s[i]>= '0') and (s[i] <= '9') then
begin
if (num1 = 0) then
begin
numstr1:= s[i];
val(numstr1,num1,Code);
if ((i=l) and (n1 <> 0)) then
n1:= arithmetic(n1,num1,oper1);
end
else
begin
numstr2:= s[i];
val(numstr2,num2,Code);
if (i = l)or(oper1 = '*')or(s[i+1]= ')') then
begin
num1:= arithmetic(num1,num2,oper1);
num2:= 0;
oper1:= '';
if (s[i+1]=')')then
begin
if (i+1<>l) then
inc(i);
break;
end;
end;
end;
end
else if(s[i] = '(') then
begin
if i<>1 then
n1:= num1;
inc(i);
num1:= calc(i,s);
end
else if(s[i] = ')') then
begin
if i = l then
dec(i);
if num2<>0 then
num1:= arithmetic(num1,num2,oper1);
num2:= 0;
oper1:= '';
break;
end
else if (oper1 = '') then
oper1:= s[i]
else
begin
oper2:= s[i];
if (oper2 <> '*') then
begin
num1:= arithmetic(num1,num2,oper1);
numstr2:='';
oper1:= oper2;
oper2:= '';
num2:=0;
end
else
begin
if(s[i+1] <> '(') then
begin
inc(i);
numstr3:= s[i];
val(numstr3,num3,Code);
num2:= arithmetic(num2,num3,oper2);
num3:= 0;
oper2:= '';
num1:= arithmetic(num1,num2,oper1);
num2:= 0;
oper1:= '';
break;
end
else
begin
inc(i,2);
num3:= calc(i,s);
num2:= arithmetic(num2,num3,oper2);
num3:= 0;
oper2:= '';
if (i = l) then
begin
num1:= arithmetic(num1,num2,oper1);
num2:= 0;
oper1:= '';
end;
end;
end;
end;
inc(i);
end;
if n1 = 0 then
result:= num1
else
result:= n1;
end;
begin
i:= 1;
s:= '(1+8)*(1+1)';
write(s);
write(' = ',calc(i,s));
readln();
end. - Log in to post comments
- 423 reads