Задача 9 урок 17
Primary tabs
Задача 9 урок 17
Задана последовательность символов, имеющая следующий вид: 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 sum: integer; s: string; swich: boolean; procedure ravers (m: string; var s: string); var w: char; begin if length(m)=1 then s:=m else if length(m)=2 then begin w:=m[2]; m[2]:=m[1]; m[1]:=w; s:=m; end; writeln('ravers ',m); end; procedure replacement (p, s: string; k, j: integer; var Z: string); var i, g, n, L: integer; begin L:=0; //длина произведения N1*N2 n:=0; //счетчик L for i:=1 to length(p) do//цикл вычисления длены L inc(L); for i:=k to j do //цикл подмены значения внешний begin if n >= L then begin s[i]:=' '; break; end; for g:=1 to 2 do //цикл подмены значения вложеный begin s[i]:=p[g]; break; end; inc(n); end; s[j]:=' '; Z:=s; end; procedure choice (str: string; var swich: boolean); var i: integer; begin for i:=1 to length(str) do if str[i]='*' then begin swich:=true; break; end else swich:=false; end; procedure addition(s: string; var sum: integer); var i, N, Code: integer; m, z: string; begin z:=''; //хранит значение арефмитич знака +/- // m переменная текущего числа sum:=0; //переменная текущейсуммы по строке for i:=1 to length(s) do begin Val(s[i], N, Code); if Code=0 then m:=m+s[i] else if (s[i]='+') OR (s[i]='-') then begin if z = '' then //определение первого числа в строке begin Val(m, N, Code); sum:=N; //сумма = первое число m:=''; //обнуляем строку числа end else //если число не первое begin Val(m, N, Code); if z='+' then sum:=sum+N else sum:=sum-N; m:=''; end; if s[i]='+' then z:='+' else z:='-'; end; if i = length(s) then begin Val(m, N, Code); if z='+' then sum:=sum+N else sum:=sum-N; end; end; end; procedure multiplication(s: string; var sum: integer); var i, y, B1, B2, N1, N2, C1, C2, B12, C22, Code: integer; M1, M2, M3, P, SS: string; begin for i:=1 to length(s) do if s[i] = '*' then begin B1:=i+1;//начальный индекс следующего числа C1:=i-1;//начальный индекс предыдующего числа for y:=B1 to length(s) do//цикл записи следующей цифры в string begin if (s[y]='+') OR (s[y]='-') OR (s[y]='*') OR (s[y]=' ') then begin B12:=y-1;//запоминаем конечный индекс следующего чиссла break; end else begin M1:=M1+s[y]; B12:=y; //запоминаем конечный индекс следующего чиссла end; end; Val(M1, N1, Code);//след цифра=N1 for y:=C1 downto 1 do//цикл записи предыдущей цифры в string begin if (s[y]='+') OR (s[y]='-') OR (s[y]='*') OR (s[y]=' ') then begin C22:=y+1;//запоминаем конечный индекс предыдущего чиссла break; end else begin M2:=M2+s[y]; C22:=y; //запоминаем конечный индекс предыдущего чиссла end; end; ravers(M2, M3);//"разворачиваем" предыдущее число Val(M3, N2, Code);//пред-щая цифра=N2 str((N1*N2), P); replacement(P, s, C22, B12, SS); s:=SS; end; writeln('multiplication ',s); end; begin writeln('Vvedite stroku'); readln(s); choice(s, swich); if swich then multiplication(s, sum) else addition(s, sum); writeln('Result = ', sum); readln(); end.
- Log in to post comments
- 996 reads
vedro-compota
Sun, 09/05/2021 - 12:30
Permalink
перейти на выделение двух
перейти на выделение двух массивов:
_____________
матфак вгу и остальная классика =)
boris68
Tue, 09/14/2021 - 13:13
Permalink
Исправлено
vedro-compota
Sun, 09/19/2021 - 12:22
Permalink
решение засчитано
решение засчитано
_____________
матфак вгу и остальная классика =)