Разбор решения. Урок 15 Задача 13

Разбор решения. Урок 15 Задача 13

1) Объявим переменные. Объявим тип - массив из пяти чисел. Если указать отдельно тип array в секции var и в процедуре, то в процедуре элементы будут считаться с нуля, а не с единицы. Заполним исходный массив случайными числами.

type Arr= array[1..5] of integer;
 
var a: Arr; b: array[1..3] of integer; i,l, min,max: integer;
 
procedure shiftArr(var promArr: Arr; k:integer);
var j:integer;
begin
  for j:=k to 4 do
    promArr[j]:=promArr[j+1];
  promArr[high(promArr)]:=0;
end;

begin
  randomize();
  min:=1;
  max:=8;
  for i:=low(a) to high(a) do
  begin
    a[i] := min + random(max - min + 1);
    write (a[i],' ');
  end;
  writeln();
  
  b[1]:=3;
  b[2]:=4;
  b[3]:=6;

2) Вложенный цикл: проверка соответствия элемента исходного массива элементу массива пользователя. В случае совпадения - процедура shiftArr и разрыв вложенного цикла.

for i:=low(a) to high(a) do
for l:=low(b) to high(b) do
if a[i]= b[l] then
begin
shiftArr (a, i);
break;
end;

При таком решении возникает проблема: в случае, если элемент из исходного массива совпадает с элементом массива пользователя, следующий за ним элемент не проверяется, так как за счёт сдвига приобретает порядковый номер предыдущего элемента.
Самый простой способ решить эту проблему - перебирать исходный массив с конца. Тогда в случае сдвига порядковый номер изменится только у перебранных элементов.

for i:=high(a) downto low(a) do
    for l:=low(b) to high(b) do
      if a[i]= b[l] then
      begin

Чтобы не выйти за пределы исходного массива, добавляем проверку:

   if i=high(a) then
          a[i]:=0
        else
          shiftArr (a, i);
        break;
      end; 

3)Выводим на экран, что получилось.

for i:=low(a) to high(a) do
    write(a[i],' ');
  readln();
end.