maxim Kazachek
Профи
(952)
1 год назад
Данный код на языке PascalABC представляет собой реализацию калькулятора, который принимает строку с математическим выражением, разбивает ее на операции и операнды, преобразует выражение в постфиксную форму и вычисляет результат.
Код разбит на три функции-расширения (extension method), которые применяются к строке с математическим выражением:
1. Pazdel - функция, которая корректирует строку и разделяет ее на операции и операнды. Внутри функции используется цикл foreach, который проходит по каждому символу в строке. Если символ является операцией (+, -, *, /), то функция добавляет в список операндов все символы, которые были собраны до этого момента, а затем добавляет в список операцию. Если символ не является операцией, то он добавляется к текущему операнду.
2. Znahenie - функция, которая преобразует выражение в постфиксную форму. Внутри функции используется стек, который хранит операции. Функция проходит по каждому элементу в списке операций и операндов. Если элемент является операцией, то функция проверяет приоритет этой операции и при необходимости выталкивает из стека операции с более высоким приоритетом. Если элемент не является операцией, то он добавляется в список постфиксной формы. В конце функции все оставшиеся операции из стека также добавляются в список постфиксной формы.
3. EvalExpr - функция, которая вычисляет выражение из постфиксной формы. Внутри функции используется стек, который хранит операнды. Функция проходит по каждому элементу в списке постфиксной формы. Если элемент является операцией, то функция извлекает из стека нужное количество операндов и выполняет соответствующую операцию. Если элемент не является операцией, то он добавляется в стек операндов. В конце функции в стеке остается один элемент - результат вычисления выражения.
Что касается комментариев в коде, то символ // используется для добавления комментариев в коде. Все, что идет после //, является комментарием и не влияет на выполнение программы.
Чтобы убрать строку с pi, нужно удалить следующую строку из функции Znahenie:
else begin if token = 'pi' then postfixList.Add(pi.ToString) else postfixList.Add(token) end;
@ChatGPT
function Pazdel(self: string): sequence of string; extensionmethod;
begin //коррекция строки и разделение её по операциям и операндам
var s := self.replace(' ', ''); //self = -3 + 2( -4 + 1) >> -3+2(-4+1) >>
var y := '';
foreach var x in s do
if x in '+-*/' then
begin
if y.Length<>0 then yield y; //Result += y
y := '';
yield x //Result += Arr(x)
end
else y := y + x;
if y.Length<>0 then yield y //Result += y
end;
function Znahenie(self: sequence of string):sequence of string; extensionmethod;
begin
var op := '+ 1, - 1, * 2, / 2'; //приоритет операций
var opStack := new Stack<string>;
var postfixList := new List<string>;
foreach var token in self do
case token of
'+','-','*','/':
begin //пока стек не пуст и приоритет операции на стеке больше равен приоритету текущей операции то
while (opStack.Count>0) and (op.IndexOf(opStack.Peek)+1 >= op.IndexOf(token)+1) do
postfixList.Add(opStack.Pop);
opStack.Push(token);
end;
else begin if token = 'pi' then postfixList.Add(pi.ToString) else postfixList.Add(token) end;
end;
while opStack.Count <> 0 do postfixList.Add(opStack.Pop);
Result := postfixList;
end;
function EvalExpr(self: sequence of string): real; extensionmethod;
begin //вычисление выражения из постфиксной формы
var st := new Stack<real>;
foreach var entr in self do
case entr of
'+': st.Push(st.Pop + st.Pop);
'-': st.Push(- st.Pop + st.Pop);
'*': st.Push(st.Pop * st.Pop);
'/': begin var x:=st.Pop; st.Push(st.Pop / x) end;
else st.Push(entr.ToReal);
end;
Result := st.Pop;
end;
begin
'4+4+5/6*6*7-7+5/4+6'
.Pazdel.Println //коррекция и разделение
.Znahenie//.Println //вывражение в постфиксной форме
.EvalExpr.Println;//вычисление выражения
end.