задача 10 урок 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Как решать: Посчитайте результат за одно прочтение строки, без использования массивов (в нашем курсе решение в таком стиле для этой задачки было впервые добавлено участником slavina036).
Решение
program task_10_lesson18; var s, ch: string; i, n, n1, code: integer; flag1, flag2: boolean; // сигнал к изменению числа otv: integer; // записывать ответ begin n1 := 0; // - для хранения числа при умножение otv := 0; flag1 := false; flag2 := false; s := '-300*3+500-600*2-100'; // -1700 ch := ''; for i := 1 to length(s) + 1 do // последний виток цикла обработка последнего числа begin if ((s[i] >= '0') and (s[i] <= '9')) then ch := ch + s[i] else begin val(ch, n, code); ch := ''; // действие зависит от флага if flag1 then begin n := n * n1; flag1 := false; end; if flag2 then begin n := n * (-1); flag2 := false; end; // условия изменения флага if s[i] = '*' then begin flag1 := true; n1 := n; // сохранить число для операции умножения end else begin if s[i] = '-' then flag2 := true; otv := otv + n; // делаю только одно действое - складываю числа end; // если надо, то видоизменяю при условии флага1 и флага2 end; end; writeln(s); writeln(otv); readln end.
Консоль
-300*3+500-600*2-100 -1700
- Log in to post comments
- 949 reads
vedro-compota
Sun, 11/07/2021 - 13:27
Permalink
засчитано
засчитано
_____________
матфак вгу и остальная классика =)