задача 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
- 1091 reads
vedro-compota
Sun, 11/07/2021 - 13:27
Permalink
засчитано
засчитано
_____________
матфак вгу и остальная классика =)