Задача 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Как решать: Сделать за 1 проход
var
loopCount, errorCode: integer;
inputString, stringToInt, lastCh: string;
flag1: boolean;
newInt1, multInt, res: integer;
begin
writeln('Введите строку');
// readln(inputString); //закоментил для отладки
inputString := '-2-5-8-7-33*15+520+3*2*5';
writeln(inputString);
newInt1 := 0;
multInt := 0; //число для следующего умножения с newInt1
res := 0;
flag1 := false; //флаг умножения
stringToInt := ''; // строка для получения числа
lastCh := '+'; //память на последние + и -
for loopCount := 1 to length(inputString) do //прохожу по строке
begin
//ищу число
if (inputString[loopCount] >= '0') and (inputString[loopCount] <= '9') then
begin
stringToInt := stringToInt + inputString[loopCount]; //добавляю цифру в числовую строку
end
else //если не цифра, а знак
begin
val(stringToInt, newInt1, errorCode); //получаем число из прошлого набора цифр
stringToInt := '';
if flag1 then //если проходили знак * перед последним числом
begin
newInt1 := newInt1 * multInt;
flag1 := false;
end;
if inputString[loopCount] = '*' then // если сейчас знак *, то запоминаем число
begin
multInt := newInt1; //запомнили
flag1 := true; //надо умножить в след раз
end
else //если сейчас не знак умножения,
// то получаем результат от предыдущего + или -
begin
if lastCh = '+' then // +
begin
res := res + newInt1;
end
else // -
begin
res := res - newInt1;
end;
lastCh := inputString[loopCount]; // если сейчас + или -, то запоминаем
end;
end;
end;
// блок для отработки последнего числа и конечного результата
val(stringToInt, newInt1, errorCode);
if flag1 then
begin
newInt1 := newInt1 * multInt;
flag1 := false;
end;
if lastCh = '+' then //отработка последнего числа
begin
res := res + newInt1;
end
else
begin
res := res - newInt1;
end;
writeln('Ответ: ', res);
readln();
end.
КОНСОЛЬ
Введите строку -2-5-8-7-33*15+520+3*2*5 Ответ: 33
- Log in to post comments
- 779 reads
vedro-compota
Sun, 01/09/2022 - 13:14
Permalink
засчитано
засчитано
_____________
матфак вгу и остальная классика =)