Задание 11 урок 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 calc(s: string): integer; var temp1, temp2, temp3, znak: string; flag1, flag2, flagZnak1: boolean; intChislo, intChislo1, intChislo2, intChislo3, Code, sum, sumTemp, i: integer; begin sum := 0; sumTemp := 0; temp1 := ''; temp2 := ''; temp3 := ''; flag1 := true; flag2 := true; flagZnak1 := false; znak := ''; i := 1; while (i < (length(s)+1)) do // итерируем по выражению begin if (i > 1) and (flagZnak1) then begin znak := s[i-1]; flagZnak1 := false; end; if (flag1) then begin temp1 := temp1 + s[i]; Val(s[i+1], intChislo, Code); if (Code = 0) then // если число то добавляем в temp1 и переходим к следующему begin i := i + 1; continue; end else begin if (s[i+1] <> '*') then begin Val(znak + temp1, intChislo1, Code); sum := sum + intChislo1; end else begin flag1 := false; i := i + 2; continue; end end end else begin if (flag2) then begin temp2 := temp2 + s[i]; Val(s[i+1], intChislo, Code); if (Code = 0) then // если число то добавляем в temp2 и переходим к следующему begin i := i + 1; continue; end else begin if (s[i+1] <> '*') then begin Val(znak + temp1, intChislo1, Code); Val(temp2, intChislo2, Code); sum := sum + intChislo1 * intChislo2; end else begin Val(znak + temp1, intChislo1, Code); Val(temp2, intChislo2, Code); sumTemp := intChislo2; flag2 := false; i := i + 2; continue; end end end else begin temp3 := temp3 + s[i]; Val(s[i+1], intChislo, Code); if (Code = 0) then // если число то добавляем в temp3 и переходим к следующему begin i := i + 1; continue; end else begin if (s[i+1] = '*') then begin Val(temp3, intChislo3, Code); sumTemp := sumTemp * intChislo3; temp3 := ''; i := i + 2; continue; end else begin Val(temp3, intChislo3, Code); Val(znak+temp1, intChislo1, Code); sumTemp := sumTemp * intChislo3; sum := sum + sumTemp * intChislo1; end end end end; temp1 := ''; temp2 := ''; temp3 := ''; flag1 := true; flag2 := true; flagZnak1 := true; znak := ''; i := i + 2; end; result := sum; end; begin writeln('vvedite virajenie'); readln(S); writeln(S, ' = ', calc(S)); readln(); end.
консоль:
vvedite vyrajenie 5*6+7-3*2*3+11 5*6+7-3*2*3+11 = 30 vvedite vyrajenie 10*10*10-10*10 10*10*10-10*10 = 900
- Log in to post comments
- 727 reads
vedro-compota
Sat, 02/03/2024 - 14:12
Permalink
sum := 0;
-- просьба прокомментировать назначение переменных, имена у них не сильно информативные
_____________
матфак вгу и остальная классика =)
Sergv1004
Sat, 02/03/2024 - 15:18
Permalink
var
vedro-compota
Tue, 03/05/2024 - 01:17
Permalink
Замечание по комментариям:
Замечание по комментариям: https://youtu.be/--sfOsVdfH4 (можно поправить в последнем комменте с кодом, без копирования)
_____________
матфак вгу и остальная классика =)
Sergv1004
Tue, 03/12/2024 - 14:43
Permalink
var