Задача 9 Урок 17
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
(задачка взята из книги Е. В. Андреевой)
program lesson17_9;
type
myArrStr = array[1..9] of string;
myArrInt = array[1..9] of integer;
function strToArrStr(s: string): myArrStr;
var
a: myArrStr;
b: boolean;
i, k: integer;
begin
k := 0;
b := false;
for i := low(a) to high(a) do
a[i] := '';
for i := 1 to length(s) do
if (s[i] >= '0') and (s[i] <= '9') then
begin
if not b then
begin
k := k + 1;
if k > high(a) then
begin
k := k - 1;
break;
end;
end;
a[k] := a[k] + s[i];
b := true;
end
else if b then
b := false;
result := a;
end;
function arrStrToArrInt(a: myArrStr): myArrInt;
var
n: myArrInt;
i: integer;
begin
for i := low(a) to high(a) do
begin
if a[i] <> '' then
val(a[i], n[i])
else
n[i] := 0;
end;
result := n;
end;
function strToStrSym(s: string): string;
var
sym: string = '';
i: integer;
begin
for i := 1 to length(s) do
if (s[i] = '+') or (s[i] = '-') or (s[i] = '*') then
sym := sym + s[i];
result := sym;
end;
procedure mult(s: string; var num: myArrInt);
var
i: integer;
begin
for i := length(s) downto 1 do
if (s[i] = '*') then
begin
num[i] := num[i] * num[i + 1];
num[i + 1] := 1;
end;
end;
var
arr: myArrStr;
num: myArrInt;
s, symbol: string;
i, n: integer;
begin
writeln('enter the expression: ');
readln(s);
arr := strToArrStr(s);
num := arrStrToArrInt(arr);
symbol := strToStrSym(s);
mult(symbol, num);
n := num[1];
for i := 1 to length(symbol) do
if symbol[i] = '+' then
n := n + num[i + 1]
else if symbol[i] = '-' then
n := n - num[i + 1]
else if symbol[i] = '*' then
n := n * num[i + 1];
writeln(n);
readln();
end.- Log in to post comments
- 1579 reads
vedro-compota
Sat, 09/11/2021 - 11:30
Permalink
arr := strToArrStr(s);
лучше массив чисел выделять за один обход строки
_____________
матфак вгу и остальная классика =)
Aleksandr
Tue, 09/14/2021 - 19:31
Permalink
решение
program lesson17_9; type myArrInt = array[1..9] of integer; procedure arrIntAndSign(s: string; var sign: string; var num: myArrInt); var c: string = ''; i, k: integer; begin k := 1; for i := 1 to length(s) do begin if (s[i] >= '0') and (s[i] <= '9') then c := c + s[i] else sign := sign + s[i]; if (s[i] < '0') or (s[i] > '9') or (i = length(s)) then begin val(c, num[k]); k := k + 1; c := ''; end; end; end; function res(sign: string; num: myArrInt): integer; var i, n: integer; begin for i := length(sign) downto 1 do if (sign[i] = '*') then begin num[i] := num[i] * num[i + 1]; num[i + 1] := 1; end; n := num[1]; for i := 1 to length(sign) do if sign[i] = '+' then n := n + num[i + 1] else if sign[i] = '-' then n := n - num[i + 1] else if sign[i] = '*' then n := n * num[i + 1]; result := n; end; var num: myArrInt; s, sign: string; i, n: integer; begin writeln('enter the expression: '); readln(s); sign := ''; for i := low(num) to high(num) do num[i] := 0; arrIntAndSign(s, sign, num); n := res(sign, num); writeln(n); readln(); end.vedro-compota
Tue, 09/14/2021 - 22:10
Permalink
решение засчитано
решение засчитано
_____________
матфак вгу и остальная классика =)