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

Задача №9 из главы 15

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

1
|1|-3|5|-3|9|5|8|

получим:

1
|1|9|8|0|0|0|0|
program pascal_array_unique_zero;
 type b = array[ 1..10 ] of integer; // секция обьявления типов
 
function fill_array( new_arr : b ): b; // заполнение массива
  var i, min, max : integer;
begin // начало тела функции
  min := 5;
  max := 20;
  randomize;
  for i:= low( new_arr ) to high( new_arr ) do
  begin
    new_arr[i] := random( max - ( min + 1 ) - min );
    write( new_arr[i], ' ' );
  end;
  fill_array := new_arr; // возвращаем массив в глобальную область
end; // завершение тела функции

{ функция сдвигa значений массива }
function change_arr( in_arr : b; number : integer ): b;
  var k : integer;
begin // начало тела функции
   for k := number to high( in_arr ) - 1  do
   begin
     in_arr[k] := in_arr[k+1];
   end;
   in_arr[high( in_arr )] := 0;
   change_arr := in_arr; // возвращаем массив
end; // завершение тела функции

function get_array( list_in : b ) : b; // обход массива
var i, j, n, k : integer;
begin // начало тела функции
  n := 0;
  i := 1;
  k := 2;
  while( i < length( list_in ) - n )  do // внешний цикл
  begin
    j := k;
    while( j <= length( list_in ) - n ) do // вложенный цикл
    begin
      if( list_in[i] = list_in[j] ) then // если равны
      begin
        list_in := change_arr( list_in, j ); // вызов функции
        n += 1; // увеличиваем значение
      end
      else
         j += 1; // увеличиваем счетчик
    end;
    i += 1; // увеличиваем счетчик внешнего цикла
    k += 1; // увеличиваем счетчик вложенного цикла
    if( length( list_in ) - n ) = 1 then // досрочный выход из внешнего цикла
        break;
  end;
  get_array := list_in; // возвращаем значение функции
end; // завершение тела функции

procedure conclusion_array( new_arr : b ); // процедура  вывода массива
 var l : integer;
begin // начало тела процедуры
 for l:= low( new_arr ) to high( new_arr ) do
    write( new_arr[l], ' ' );
end; // завершение тела процедуры

var arr : b;
begin  // начало основной программы
 arr := fill_array( arr ); // вызов функции
 writeln(); // перенос строки
 conclusion_array( get_array( arr ) ); // вызов процедуры
 readln();
end. // завершение основной программы


vedro-compota's picture

Прокомментировать назначение переменных:

  n := 0;
  i := 1;
  k := 2;
  j := k;

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

1
n := 0; // значение на которое уменьшаем обход массива при удалении дубликата
i := 1; // первое значение для сравнения во цикле
k := 2; // второе значение для сравнения во вложенном цикле
j := k; // переприсваивание  начального  значения вложенного цикла при новом витке
vedro-compota's picture

k := 2;
  while( i < length( list_in ) - 1 )  do // внешний цикл
  begin
    j := k;
    while( j <= length( list_in ) - n ) 

-- внешний цикл тоже можно оптимизировать.

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

vedro-compota's picture

j явно лишняя переменная

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