Решение №8 из главы 17.На вход вашей программы подается строка вида:5 + 6 -34 + 56 - 7 + 2

Задача №8 из главы 17.

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

 5 + 6 -34 + 56  - 7 + 2

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

program pascal_expression_sum_delete;
type mmas = array[1..4,1..10] of string;
type int_arr = array[1..10] of integer;
type str_arr = array[1..10] of string;

{ функция заполнения масссива }
function fill_mmas_array( s : string ): mmas;
var i, k, n, m, l : integer;
  symbol, acc_str, str1, str2 : string;
  arr_int_sign : mmas;
begin // начало тела функции
  i := 1;
  k := 1;
  n := 1;
  m := 0;
  l := 0;
  while( i < length( s ) ) do // пока истинно условие выполняем
  begin
    acc_str := ' ' ; // пустая строка
    symbol := s[i]; // первый символ строки
    { пока условие выполняется в пустую строку добавляем символы строки}
    while( symbol >= '0' ) and ( symbol <= '9' ) do
    begin
      acc_str += symbol; // добавляем
      i+=1; //  увеличиваем индекс элемента строки
      if( i <= length( s ) ) then // если не вышли за длинну строки
        symbol := s[i] // символ равен символу строки с индексом i
      else
        break; // иначе завершаем
    end;
    if( symbol = '+' ) or ( symbol = '-' ) then
    begin 
        arr_int_sign [1,n] := symbol; // первый массив
        n += 1; // индекс массива
        m += 1; // количество знаков
    end;
    if ( acc_str <> ' ' ) then // если строка не пуста 
    begin
       arr_int_sign[2,k] := acc_str; // второй массив
       k += 1; // индекс массива
       l += 1; // количество чисел
    end;
    i += 1;
  end;
  str( m, str1 ); // преобразование в строку
  str( l, str2 ); // преобразование в строку
  arr_int_sign[3,1] := str1; // третий массив
  arr_int_sign[4,1] := str2; // четвертый массив
  fill_mmas_array := arr_int_sign; // возвращение  значения функции
end;

{ функция сдвига массива с числами }
function change_arr_int( arr : int_arr; len, numb, numb2 : integer ): int_arr;
   var i : integer;
begin // начало тела функции
  for i := numb to  len - 1 - numb2  do
      arr[i] := arr[i+1];
  arr[len - numb2] := 0;
  change_arr_int :=  arr; // возвращение  значения функции
end;

{ функция сдвига массива со знаками }
function change_arr_str( str_in : str_arr; len, number, number2 : integer ): str_arr;
   var i : integer;
begin
  for i := number to ( len - 1 - number2 ) do
      str_in[i] := str_in[i + 1];
  str_in[len - number2] := '';
  change_arr_str :=  str_in; // возвращение значения функции
end; // завершение тела функции

 { функция извлечения массива с числами из многомерного массива }
function extract_int_arr( in_arr : mmas ): int_arr;
  var new_arr : int_arr; // новый массив
      i, int_number1, int_number2, code : integer;
begin // начало тела функции
  val( in_arr[4,1], int_number1, code ); // преобразование в число
  for i := 1 to int_number1 do // обход до значения количества чисел
  begin
      val( in_arr[2,i], int_number2, code ); // преобразование в число
      new_arr[i] := int_number2; // присваивание элемента массива
  end;
  extract_int_arr :=  new_arr; // возвращение значения функции
end; // завершение тела функции

{ функция извлечения массива со знаками из многомерного массива }
function extract_str_arr( in_arr : mmas ): str_arr;
  var new_arr_str : str_arr; // новый массив
      i, int_number1, code : integer;
begin // начало тела функции
  val( in_arr[3,1], int_number1, code ); // преобразование в число
  for i := 1 to int_number1 do // обход до значения количества знаков
  begin
      new_arr_str[i] := in_arr[1,i]; // присваивание элемента массива
  end;
  extract_str_arr :=  new_arr_str; // возвращение значения функции
end; // завершение тела функции

{ процедура подсчета и вывода результата }
procedure get_print_arr( in_str : str_arr; l_int : int_arr; len_arr_3, len_arr_4: string );
   var  l, count, count1, f, code, fix_len_three_arr, fix_len_four_arr : integer;
begin // начало тела процедуры
  l := 1;
  count := 0;
  count1 := 0;
  f := 0;
  val( len_arr_3, fix_len_three_arr, code ); // преобразование в число
  val( len_arr_4,fix_len_four_arr, code ); // преобразование в число

  while( count < fix_len_three_arr ) do
  begin
      if( in_str[l] = '+' ) then
      begin
          l_int[l] := l_int[l] + l_int[l+1];
          l_int := change_arr_int( l_int, fix_len_four_arr, l + 1, f );
          in_str := change_arr_str( in_str, fix_len_three_arr, l, f );
          f += 1;
          count1 += 1;
          count += 1;
      end
      else
          if( in_str[l] = '-' ) then
          begin
              l_int[l] := l_int[l] - l_int[l+1];
              l_int := change_arr_int( l_int, fix_len_four_arr, l + 1, f );
              in_str := change_arr_str( in_str, fix_len_three_arr, l, f );
              f += 1;
              count1 += 1;
              count += 1;
          end;
      if( count1 = 1 ) then
      begin
          l := 1;
          count1 := 0;
      end
      else
         l += 1;
    end;
    writeln( l_int[1] );
end; // завершение тела процедуры

var str : string;
    arr : mmas;
    arr_integer : int_arr;
    arr_string : str_arr;
begin // начало тела основной программы
  writeln( 'input string: ' );
  readln( str );;
  arr := fill_mmas_array( str );
  arr_integer := extract_int_arr( arr );
  arr_string := extract_str_arr( arr );
  get_print_arr( arr_string, arr_integer, arr[3,1], arr[4,1] );
  readln();
end. // завершение тела основной программы
vedro-compota's picture

Сделать решение, в котором массив чисел и массив знаков получаются за один проход исходной строки (получение двух массивов можно вынести в процедуру)

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

program pascal_expression_sum_delete;
type mas_str = array [1..10] of string; // секция обьявления типов

{ процедура заполнения двух массивов }
procedure fill_mmas_array( s: string; var arr_str, arr_int: mas_str; var fix_sign, fix_int: integer );
var i, j, k, n, number, code : integer;
  symbol, acc_str : string;
begin // начало тела процедуры
  i := 1;
  k := 1;
  n := 1;
  while( i <= length( s ) ) do // пока истинно условие выполняем
  begin
    acc_str := ' ' ; // пустая строка
    symbol := s[i]; // первый символ строки
    while( symbol >= '0' ) and ( symbol <= '9' ) do
    begin
      acc_str += symbol; // прибавляем в переменную элемент строки  
      i += 1;
      if( i <= length( s ) ) then // если не вышли за длинну строки
        symbol := s[i] // символ равен символу строки с индексом i
      else
        break; // иначе завершаем
    end;
    if( symbol = '+' ) or ( symbol = '-' ) then
    begin
        arr_str[n] := symbol; // первый массив
        n += 1; // увеличиваем индекс
        fix_sign += 1; // считаем кол-во знаков
    end;
    if ( acc_str <> ' ' ) then // если строка не пуста
    begin
       arr_int[k] := acc_str; // второй  массив
       k += 1; // увеличиваем индекс массива
       fix_int += 1; // считаем кол-во чисел
    end;
    i += 1;
  end;
end; // завершение тела процедуры

{ функция сдвига массива }
function change_arr( arr : mas_str; len_fix, number, number2 : integer ) : mas_str;
   var i : integer;
begin // начало тела функции
    for i := number to ( len_fix - 1 - number2 ) do
        arr[i] := arr[i+1];
    arr[len_fix - number2 ] := '';
    change_arr := arr; // возврат функции
end; //завершение тела функции

{ процедура подсчета и вывода результата }
procedure get_print_arr(  in_str, in_int: mas_str; sign_fix, int_fix: integer );
   var  l, count, lab, value_arr1, value_arr2, code, f : integer;
     str_value : string;
begin // начало тела процедуры
  l := 1; // начальный индекс массива
  count := 0; // счетчик цикла
  lab := 0;
  f := 0; // кол-во сдвигов массивов для уменьшения обхода в цикле 
  while( count < sign_fix ) do
  begin
      if( in_str[l] = '+' ) then
      begin
          val( in_int[l], value_arr1, code );
          val( in_int[l + 1], value_arr2, code );
          value_arr1 := value_arr1 + value_arr2;
          str( value_arr1, str_value );
          in_int[l] := str_value;
          in_int := change_arr( in_int, int_fix, l + 1, f );
          in_str := change_arr( in_str, sign_fix, l, f );
          f += 1;
          lab += 1;
          count += 1;
      end
      else
          if( in_str[l] = '-' ) then
          begin
              val( in_int[l], value_arr1, code );
              val( in_int[l + 1], value_arr2, code );
              value_arr1 := value_arr1 - value_arr2;
              str( value_arr1, str_value );
              in_int[l] := str_value;
              //in_int[l] := in_int[l] + in_int[l+1];
              in_int := change_arr( in_int, int_fix, l + 1, f );
              in_str := change_arr( in_str, sign_fix, l, f );
              f += 1;
              lab += 1;
              count += 1;
          end;
      if( lab = 1 ) then
      begin
          l := 1;
          lab := 0;
      end
      else
         l += 1;
    end;
    writeln( in_int[1] );
end; // завершение тела процедуры


var str : string;
   str_arr : mas_str;
   int_arr : mas_str;
   fix_number_sign, fix_number_int : integer;
begin // начало тела основной программы
  fix_number_sign := 0;
  fix_number_int := 0;
  writeln( 'input string: ' );
  readln( str );
  fill_mmas_array( str, str_arr, int_arr, fix_number_sign, fix_number_int );
  get_print_arr( str_arr, int_arr, fix_number_sign, fix_number_int );
  readln();
end. //завершение тела основной программы








vedro-compota's picture

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

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