Урок 17. Задача №8. Решение.

Урок 17. Задача №8.

На вход вашей программы подается строка вида:

5 + 6 -34 + 56  - 7 + 2

("сколько угодно" чисел с операциями суммы и разности в любом порядке). Вычислите результат (пробелов между символом операции и числом может и не быть).

type
  MyArr = array[1..6] of integer;
  ArrSt = array[1..5] of string;

function Check_tmp(s: string; mas: MyArr): MyArr;
var a: integer;
begin
  if(s <> '') then
  begin
    val(s, a);
    mas[6] := a;
  end;
  result := mas;
end;

function GetRes(arrInt: MyArr; arrStr: ArrSt; x: integer): integer;
var j, i: integer;
begin
  if(arrStr[1] = '+') then
    x := arrInt[1] + arrInt[2]
  else
    x := arrInt[1] - arrInt[2];
  j := 3;
  for i := 2 to length(arrStr) do
  begin
    if(arrStr[i] = '+') then
      x := x + arrInt[j]
    else
      x := x - arrInt[j];
    j += 1;
  end;
  result := x;
end;

var str, tmp: string;
  key: boolean;
  i, j, k, conv, res: integer;
  arr: MyArr;
  arrSig: ArrSt;
begin
  writeln('Enter math operation string: ');
  readln(str);
  for i := 1 to length(str) do
  begin
    key := false;
    if(str[i] >= '0') and (str[i] <= '9') then
      tmp += str[i]
    else if(str[i] = '+') or (str[i] = '-') then
    begin
      k += 1;
      arrSig[k] := str[i];
      key := true;
    end;

    if(key = true) and (tmp <> '') then
    begin
      val(tmp, conv);
      j += 1;
      arr[j] := conv;
      tmp := '';
    end;
  end;
  arr := Check_tmp(tmp, arr);
  writeln();
  writeln('Result is this math operation = ', GetRes(arr, arrSig, res));

  readln(); // Удержание консоль
end.// Завершение программы 
vedro-compota's picture

завернуть в процедуру получение массива действий и значений

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

Firons's picture

type
  MyArr = array[1..6] of integer;
  ArrSt = array[1..5] of string;

function Check_tmp(s: string; mas: MyArr): MyArr;
var a: integer;
begin
  if(s <> '') then
  begin
    val(s, a);
    mas[6] := a;
  end;
  result := mas;
end;

procedure parsingString(var otherArr: MyArr; var otherSig: ArrSt);
var str, tmp: string;
  key: boolean;
  i, j, k, conv: integer;
begin
  k := 1;
  readln(str);
  for i := 1 to length(str) do
  begin
    key := false;
    if(str[i] >= '0') and (str[i] <= '9') then
      tmp += str[i]
    else if(str[i] = '+') or (str[i] = '-') then
    begin
      otherSig[k] := str[i];
      k += 1;
      key := true;
    end;

    if(key = true) and (tmp <> '') then
    begin
      val(tmp, conv);
      j += 1;
      otherArr[j] := conv;
      tmp := '';
    end;
  end;
  otherArr := Check_tmp(tmp, otherArr);
end;

function GetRes(arrInt: MyArr; arrStr: ArrSt; x: integer): integer;
var j, i: integer;
begin
  if(arrStr[1] = '+') then
    x := arrInt[1] + arrInt[2]
  else
    x := arrInt[1] - arrInt[2];
  j := 3;
  for i := 2 to length(arrStr) do
  begin
    if(arrStr[i] = '+') then
      x := x + arrInt[j]
    else
      x := x - arrInt[j];
    j += 1;
  end;
  result := x;
end;

var res: integer;
  arr: MyArr;
  arrSig: ArrSt;
begin
  writeln('Enter math operation string: ');
  parsingString(arr, arrSig);
  writeln();
  writeln('Result is this math operation = ', GetRes(arr, arrSig, res));

  readln(); // Удержание консоль
end.// Завершение программы 
vedro-compota's picture

GetRes(arr, arrSig, res)

-- переделать без третьего аргумента.

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

Firons's picture

type
  IntArr = array[1..6] of integer;
  ArrSt = array[1..5] of string;

function Check_tmp(s: string; mas: IntArr): IntArr;
var a: integer;
begin
  if(s <> '') then
  begin
    val(s, a);
    mas[6] := a;
  end;
  result := mas;
end;

procedure parsingString(var otherArr: IntArr; var otherSig: ArrSt);
var str, tmp: string;
  key: boolean;
  i, j, k, conv: integer;
begin
  k := 1;
  readln(str);
  for i := 1 to length(str) do
  begin
    key := false;
    if(str[i] >= '0') and (str[i] <= '9') then
      tmp += str[i]
    else if(str[i] = '+') or (str[i] = '-') then
    begin
      otherSig[k] := str[i];
      k += 1;
      key := true;
    end;

    if(key = true) and (tmp <> '') then
    begin
      val(tmp, conv);
      j += 1;
      otherArr[j] := conv;
      tmp := '';
    end;
  end;
  otherArr := Check_tmp(tmp, otherArr);
end;

function GetRes(arrInt: IntArr; arrStr: ArrSt): integer;
var j, i, x: integer;
begin
  if(arrStr[1] = '+') then
    x := arrInt[1] + arrInt[2]
  else
    x := arrInt[1] - arrInt[2];
  j := 3;
  for i := 2 to length(arrStr) do
  begin
    if(arrStr[i] = '+') then
      x := x + arrInt[j]
    else
      x := x - arrInt[j];
    j += 1;
  end;
  result := x;
end;

var arr: IntArr;
  arrSig: ArrSt;
begin
  writeln('Enter math operation string: ');
  parsingString(arr, arrSig);
  writeln();
  writeln('Result is this math operation = ', GetRes(arr, arrSig));

  readln(); // Удержание консоль
end.// Завершение программы   
vedro-compota's picture

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

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