Удаление подмассива (Pascal)

Помечено: ,

  • В этой теме 0 ответов, 1 участник, последнее обновление 1 месяц, 2 недели назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #7077
      @admin

      Чтобы удалить часть массива можно многократно выполнить удаление одного элемента, при этом если мы хотим удалить k элементов из массива размера n, то мы выполним k раз код удаления одного элемента, который, в свою очередь, выполняет обработку n-k элементов. Проще говоря, такой алгоритм является достаточно медленным и относительно сложен в реализации.

      Более эффективный вариант заключается в сдвиге элементов массива, расположенных правее удаляемой части влево на k позиций. Подробно такой алгоритм рассмотрен в теме «Алгоритм — удаление части массива«. Блок-схема алгоритма:

      Реализация алгоритма на языке Pascal:

      program remove_subarray;
      const
        M = 100;
      var
        arr: array [1..M] of integer;
        i, posA, posB, k, tmp, n: integer;
      begin
        write('размер массива: ');
        readln(n);
        
        for i := 1 to N do
        begin
          write('элемент массива: ');
          readln(arr[i]);
        end;
        
        writeln('ваш массив: ');
        for i := 1 to n do
          write(arr[i], ' ');
        writeln('');
          
        write('позиция начала удаляемого фрагмента: ');
        readln(posA);
        write('позиция конца удаляемого фрагмента: ');
        readln(posB);
        
        if posA > posB then begin
          tmp := posA;
          posA := posB;
          posB := tmp;
        end;
        
        if (posA < 1) or (posA > n) or 
           (posB < 1) or (posB > n) then
          write('введен неправильный индекс')
        else begin
          k := posB - posA;
          
          for i := posA to n-k do
              arr[i] := arr[i+k];
          n := n-k;
          
          writeln('ваш массив: ');
          for i := 1 to n do
              write(arr[i], ' ');
          writeln('');
        end
      end.

      Результаты работы программы:

Просмотр 0 веток ответов
  • Для ответа в этой теме необходимо авторизоваться.
×