Задача 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
- 375 reads