Задача 9 Урок 17

Задача 9 Урок 17

Задана последовательность символов, имеющая следующий вид: 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.
vedro-compota's picture

    arr := strToArrStr(s);
    num := arrStrToArrInt(arr);

лучше массив чисел выделять за один обход строки

_____________
матфак вгу и остальная классика =)

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's picture

решение засчитано

_____________
матфак вгу и остальная классика =)