Задача 12 Урок 18 (Задача 1 [!] Pascal.js Алгоритмическая практика. )
Primary tabs
Задача 1 [!] Pascal.js Алгоритмическая практика.:
Решите на Паскале и/или JS Задачку №12 Урока 18, про расчет выражений вида за один проход строки:
Задана последовательность символов, имеющая следующий вид:
p1q1p2q2p3...qn–1pn, где pi — число, а qi — знак арифметического действия из набора {+, –, *}. Вычислите значение выражения, предполагая, что действия выполняются согласно правилам арифметики.Входные данные: На вход программе подается строка указанного вида, состоящая не более чем из 9 чисел, разделенных символами арифметических операций.
Выходные данные: Выведите значение арифметического выражения.
Примеры:Входные данные Результат 5+2 7 1-2*5+2 -7 5*6+7-3*2+11 42 5*6+7-3*2*3+11 30Как решать: Посчитайте результат за одно прочтение строки, без использования массивов
Решение:
var
i, temp, res, num, n, code: integer;
s: string;
prevOp, currOp: char;
begin
s := '5*6+7-3*2*3+11';
currOp := ' ';
prevOp := '+';
res := 0;
temp := 0;
num := 0;
i := 1;
while(i <= length(s)) do
begin
val(s[i], n, code);
while (code = 0) do
begin
num := num * 10 + n;
inc(i);
val(s[i], n, code);
end;
if (s[i] = '*') then
begin
currOp := '*';
if (temp = 0) then
temp := num
else
temp *= num;
num := 0;
end;
if ((s[i] = '+') or (s[i] = '-') or (i >= length(s))) then
begin
if (currOp = '*') then
temp *= num
else
temp := num;
case prevOp of
'+': res += temp;
'-': res -= temp;
end;
prevOp := s[i];
temp := 0;
num := 0;
currOp := ' ';
end;
inc(i);
end;
writeln(res);
readln();
end.Вывод консоли:
Входные данные Результат 5+2 7 1-2*5+2 -7 5*6+7-3*2+11 42 5*6+7-3*2*3+11 30
- Log in to post comments
- 753 reads