задание 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
- 1284 reads
vedro-compota
Sat, 02/12/2022 - 20:20
Permalink
засчитано
засчитано
_____________
матфак вгу и остальная классика =)