задание 8 Урок 21
Primary tabs
Напишите функцию, которая получает на вход произвольную строку вида:
5*(3+4)-7*9+3*(2+(2-7))(арифметическое выражение со скобками любого уровня вложенности и операциями умножения, вычитания и сложения)
и в качестве ответа возвращает результат этого выражения.
var s1: string;
i: integer;
function count(num,calc: integer; var buf: integer): integer;
begin
result:=calc+num*buf;
buf:=1;
end;
function compute(var i: integer; s: string): integer;
var str: string;
num,buf,calc,skip,code: integer;
begin
str:='';
buf:=1; // число в буфере
calc:=0; // сборное итоговое число
skip:=0; // пропуск сборного числа (при умножении)
i:=i+1;
while i <= length(s) do
begin
if (s[i]>='0') and (s[i]<='9') then
str:=str+s[i]
else //если не цифра - предыдущее число запишем в num
begin
val(str,num,code);
str:='';
if (s[i]=')') then
begin
result:=count(num,calc,buf); //запись результата из выражения в скобках
exit;
end
else if (s[i]='(') then
begin
num:=compute(i,s); //рекурсия для выполнения вычислений в скобках)
i:=i+1;
end;
if (s[i]='*') then
buf:=count(num,skip,buf) //результат умножения в буфер
else if (s[i]='+') then
calc:=count(num,calc,buf) //сложение текущего числа и буфера
else begin // если минус
calc:=count(num,calc,buf);
buf:=buf*(-1); //число в буфере делаем со знаком минус
end;
end;
i:=i+1;
end;
result:=calc;
end;
begin
//writeln('input expretion');
//readln(s1);
s1:= '5*(3-4)-7*9+3*(2+(2-7)';
i:=0;
writeln(compute(i,s1));
readln();
end.
- Log in to post comments
- 1658 reads
vedro-compota
Sat, 02/12/2022 - 20:20
Permalink
засчитано
засчитано
_____________
матфак вгу и остальная классика =)