Задача 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
- 845 reads