Задача 8 урок 21 Вычисление арифметического выражение со скобками
Primary tabs
Напишите функцию, которая получает на вход произвольную строку вида: 5*(3+4)-7*9+3*(2+(2-7))(арифметическое выражение со скобками любого уровня вложенности и операциями умножения, вычитания и сложения) и в качестве ответа возвращает результат этого выражения. Рекомендация: сначала убедитесь, что число открывающих скобок, равно числу закрывающих.
program recursion_string;
var i:integer; s:string;
// функция подсчета результата
function plus_minus(sign:string;numb,r:integer):integer;
begin
if(sign='+') then
r+=numb
else
r-=numb;
plus_minus:= r;
end;
// основная функция для обхода и проверки строкового выражения
function string_expression():integer;
var acc_multi,res,Code,number:integer;
acc,sign,sign_multi:string;
begin
acc:='';
acc_multi:=0;
sign:='+';
res:=0;
sign_multi:='';
number:=0;
while i <= (length(s)) do
begin
if(s[i] >= '0') and (s[i] <= '9') then
acc+=s[i];
if(s[i]='(') then
begin
i+=1;
// подсчет результата в скобках
number:=string_expression();
end;
//если проверяемая строка заканчивается на закрывающую скобку ")" необходима
// дополнительная проверка чтобы избежать выхода индекса за границы массива
if(length(s) >= i) and (s[i]=')') then
begin
// если number не результат возврата результата в скобках
if(number=0) then
val(acc,number,Code);
// если уже был знак умножения
if(sign_multi='*') then
begin
number*=acc_multi;
end;
i+=1;
// возврат результата в скобках
string_expression:= plus_minus(sign,number,res);
exit;
end
else
begin
// чтобы не выйти на границы индекса массива если строка завершается
// закрывающейся скобкой ")" и провести заключительный подсчет результата в скобках
// необходимо уменьшить индекс итерации
if(length(s) < i) then
i-=1;
if(i=length(s)) or (s[i]='*') or (s[i]='-') or (s[i]='+') then
begin
// если number не результат возврата результата в скобках
if(number=0) then
val(acc,number,Code);
// если уже был знак умножения
if(sign_multi='*') then
begin
number*=acc_multi;
sign_multi:='';
end;
// если сейчас знак умножения
if(s[i]='*') then
begin
sign_multi:='*';
acc_multi:=number;
end
else
begin
// считаем результат
res:=plus_minus(sign,number,res);
//writeln(res);
sign:=s[i]; // знак для следующего вычисления
end;
acc:='';
number:=0;
end;
end;
i+=1;
end;
// возвращаем результат строкового выражения
string_expression:= res;
end;
// основная программа
begin
s:='-(-2+(2-7)-(-90*2-80))';
i:=1;
writeln(string_expression());
end.- Log in to post comments
- 1102 reads