Задача 12 урок 18
Primary tabs
Задана последовательность символов, имеющая следующий вид: 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 s: string; function arithmetic (num1,num2: integer; x: string): integer ; var num: integer; begin if x = '*' then num:= num1 * num2 else if x = '-' then num:= num1 - num2 else num:= num1 + num2; result:= num; end; function calculation(s: string): integer; var i,// см ниже Code,//код ошибки при преобразовании строки в число l,//длина строки. была нужна для нахождения последнего символ в строке, //но чтоб убрать каждый раз проверку добавил "num" num,//результат выраж.(когда строка кончается остается оператор и 2 числа) num1, num2, num3: integer;//3 перем. на случай если 2ой оператор * а 1й +/- oper1, oper2,// операторы (знаки *,+,- между числами) numstr1, numstr2, numstr3: string;// строковые значения чисел begin i:= 1;//счетчик цикла и индекс символа в строке num1:= 0;//в начале чтения 1е число далее промежуточный результат num2:= 0;//2е число либо результат умножения 2го на 3е num3:= 0;//если 2ой оператор * а 1й +/- l:= length(s); while (i <= l) do begin if (s[i]>= '0') and (s[i] <= '9') then begin while (s[i]>= '0') and (s[i] <= '9') do begin if (num1 = 0) then begin numstr1:= s[i]; inc(i); end else if (num2 = 0) then begin numstr2:= numstr2 + s[i]; inc(i); end; end; if (numstr2 <> '') then val(numstr2,num2,Code) else val(numstr1,num1,Code) ; end else if (oper1 = '') then begin oper1:= s[i]; inc(i); if (oper1 = '*') then begin while (s[i]>= '0') and (s[i] <= '9') do begin numstr2:= numstr2 + s[i]; inc(i); end; val(numstr2,num2,Code); num1:= arithmetic(num1,num2,oper1); oper1:= ''; num2:= 0; numstr2:= ''; end; end else if (oper2 = '') then begin oper2:= s[i]; inc(i); if (oper2 = '*') then begin while (s[i]>= '0') and (s[i] <= '9') do begin numstr3:= numstr3 + s[i]; inc(i); end; val(numstr3,num3,Code); num2:= arithmetic(num3,num2,oper2); numstr3:= ''; num3:= 0; oper2:= ''; end else begin num1:= arithmetic(num1,num2,oper1); numstr2:= ''; num2:= 0; oper1:= oper2; oper2:= ''; end; end; end; num:= arithmetic(num1,num2,oper1); result:= num; end; begin s:= '5*6+7-3*2*3+11'; write(s); write(' = ',calculation(s)); readln(); end.
- Log in to post comments
- 372 reads
vedro-compota
Sat, 03/09/2024 - 20:38
Permalink
аналогично вот этому
аналогично вот этому замечанию, просьба прокомментировать назначение переменных, в т.ч. этих:
-- смущает то, их три, а не напр. десять)
_____________
матфак вгу и остальная классика =)
Andrey
Sun, 03/10/2024 - 12:27
Permalink
Дополнение
Дополнение к комментарию "l" : эту переменную можно убрать и просто писать
"length(s)" ).