Урок 15 Задача 13

Урок 15 Задача 13:

Напишите функцию, которая определяет являются ли значения переданного массива целых чисел уникальными относительно друг друга, если среди есть неуникальные элементы, то удалите их, сдвинув значения влево, заполняя оставшиеся справа ячейки нулями.

Протестируйте работу функции на массиве из 7 случайных элементов из диапазона от 1 до 15-ти.

type
  massiv = array[1..7] of integer;
var
  mas: massiv;
  f: integer;
function unic (m: massiv): massiv;
var
  a,              // сюда записываем значение текущего элемента
  x,              // позиция начала обхода во вторичной проверке
  i, j, h, v,     // счетчики циклов
  k: integer;     // конечный элемент, справа от него нули
  pv,             // переключатель первичной-вторичной проверки
  s: boolean;     // сигнал для сдвига
begin
  i:=low(m);
  k:=high(m);
  pv := false;
  while (i < k) do     // внешний цикл
  begin
    a:=m[i];           // записываем значение текущего элемента
    for j:=i+1 to k do ////////////// первичная проверка, счетчик смещен на 1, чтобы не проверять число само с собой
      if a = m[j] then // если встретился равный элемент
      begin
        pv:= true;     // переключаемся на вторичную проверку
        break;         // выходим из цикла первичной проверки
      end;             ///////////// конец цикла первичной проверки
    if pv = false then // если переключатель не переключился (не встретился равный элемент)
      i:=i+1           // переходим на следующую позицию
    else begin         // если переключатель переключился на вторичную проверку (встретился равный элемент)
      h:=1;            // сбрасываем счетчик витков вторичной проверки
      while (pv = true) do /////////////// цикл вторичной проверки
      begin
        s:= false;       // сигнал выключен
        if (h <= 3) then // если мы на первом, втором или третьем витке вторичной проверки
        begin
          if h = 1 then        // если мы на первом витке вторичной проверки
            x:= j              // обход будем начинать с одного из двух равных значений (которое справа)
          else if h = 2 then   // если мы на втором витке вторичной проверки
              x:= i            // обход будем начинать со второго из двух равных значений (которое слева)
            else               // если мы на третьем витке
              x:=j-1;          // обход будем начинать со значения, которое оказалось на месте "правого" равного значения
          h:=h+1;              // увеличиваем счетчик цикла вторичной проверки
        end;
        for v:=x to k do  // обходим массив, начиная с соответствующей позиции
        begin
          if (m[v] = a) then  // если встретилось равное значение
          begin
            s:= true;         // включаем сигнал
            if h=4 then       // если мы на четвертом и более витке цикла вторичной проверки
              x:= v;          // присваиваем текущую позицию обхода для начала следующего витка
          end;
          if s = true then    // когда сигнал включен
          begin
            if v = k then     // если дошли до конечного элемента (за которым нули)
            begin
              m[v]:= 0;       // присваиваем этому элементу 0
              k:=k-1;         // уменьшаем конечный элемент на 1
            end else          // если не дошли до конечного элемента
              m[v]:= m[v+1];  // присваиваем текущему значение следующего
          end;
        end;
        if (s = false) then   // если после цикла сигнал не включился (не встретилось равное значение)
          pv := false;        // переключаемся на цикл первичной проверки
      end;     //////////////////// конец цикла вторичной проверки
    end;
  end;
  result:= m;
end;
begin                         // начало тела основной программы
  randomize();
  for f:=low(mas) to high(mas) do
  begin
    mas[f] := random(15) + 1;
    write(mas[f], ' ');
  end;
  mas:= unic (mas);
  writeln;
  for f:=low(mas) to high(mas) do
    write(mas[f], ' ');
  readln();
end.

Вывод в консоли:

2 2 2 15 8 8 9 
15 9 0 0 0 0 0 
13 1 14 2 8 9 7 
13 1 14 2 8 9 7 
11 8 10 2 2 11 15 
8 10 15 0 0 0 0 
11 11 6 11 7 6 13 
7 13 0 0 0 0 0 
5 12 12 13 1 1 13 
5 0 0 0 0 0 0 
6 12 4 4 6 6 12 
0 0 0 0 0 0 0 
vedro-compota's picture

предлагаю определить дополнительный массив элементов, на которые на сдвигать, а потом сдвинуть.
Для сдвига можно использовать функцию из новой задачки 11 http://fkn.ktu10.com/?q=node/8614

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