Вычислить значение арифметического выражения. - Pascal
Формулировка задачи:
Дана последовательность символов, имеющая следующий вид: p1q1p2q2p3...qnpn, где pi — цифра, а qi — знак арифметического действия из набора {+, –, *}. Вычислите значение выражения, предполагая, что действия выполняются согласно правилам арифметики. Гарантируется, что n ≤ 9.
Решение задачи: «Вычислить значение арифметического выражения.»
textual
Листинг программы
var
s:string;
p:array[1..9] of integer;
q:array[1..8] of '*'..'-';
n:byte;
i:byte;
o:boolean=true;
procedure roll(const i:byte);
var j:byte;
begin
for j:=i+1 to high(p) do
p[j]:=p[j+1];
for j:=i to high(q) do
q[j]:=q[j+1];
end;
begin
s:='1*2-3*4+5*6-7';
n:=(length(s)-1) div 2+1;
for i:=0 to length(s) do
if i mod 2 = 1 then p[i div 2+1]:=ord(s[i])-ord('0')
else q[i div 2]:=s[i];
writeln(s);
//Вырезаем умножения
i:=1;
while i<=n do
begin
o:=false;
if q[i]='*' then
begin
p[i]:=p[i]*p[i+1];
roll(i);
o:=true;
end;
if o then begin dec(i); dec(n); end;
inc(i);
end;
//Операции + -
i:=1;
while i<=n do
begin
o:=false;
if q[i]='+' then
begin
p[i]:=p[i]+p[i+1];
roll(i);
o:=true;
end
else if q[i]='-' then
begin
p[i]:=p[i]-p[i+1];
roll(i);
o:=true;
end;
if o then begin dec(i); dec(n); end;
inc(i);
end;
writeln(p[1]);
readln;
end.
Объяснение кода листинга программы
- Создаются переменные s, p, q и n.
- Значение переменной s присваивается строковое выражение '12-34+5*6-7'.
- Значение переменной n вычисляется как (длина s - 1) / 2 + 1.
- Цикл for проходит по каждому символу в строке s.
- Если текущий символ в строке s является четным числом (т.е. * или +), то выполняется следующая последовательность действий:
- Проверяется следующий символ в строке. Если он является символом '*', то:
- Значение переменной p[i] присваивается значение произведения значения переменной p[i] и значения переменной p[i+1].
- Затем выполняется функция roll, которая перемещает все символы в массиве p на одну позицию вправо.
- Значение переменной o устанавливается в true.
- Если значение переменной o равно true, то выполняется шаг dec для переменных i и n.
- Значение переменной i увеличивается на 1.
- Значение переменной n уменьшается на 1.
- Значение переменной o устанавливается в false.
- Если значение переменной o равно false, то выполняется шаг inc для переменных i и n.
- Значение переменной i увеличивается на 1.
- Значение переменной n увеличивается на 1.
- Значение переменной o устанавливается в true.
- Проверяется следующий символ в строке. Если он является символом '*', то:
- Значение переменной p[1] выводится на экран.
- Программа завершается, ожидая ввода пользователя.