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

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

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

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

получим:

|1|9|8|0|0|0|0|
  type inArr = array[1..9] of Integer;

var a: array [1..9] of integer;
    L,z, i, min, max: integer;

// a[i] - основной массив
// x[k] - вспомогательный процедурный массив для работы с оснвовным

procedure SS2(x: inArr; L,z: integer);
var k,c: integer;
begin
  c := L; //счетчик записи нулей справа
  k := 1; //счетчик записи уникальных значений слева
  for i := low(x) to high(x) do
    begin
      if(x[i] <> z) then // если элемент массива не равен числу заменителю(из функции)
        begin
          a[k] := x[i]; //слева пишем число
          k := k + 1;    // меняем счетчик
        end
      else
        begin
          a[c] := 0; // иначе пишем 0 справа
          c := c - 1;  //меняем счетчик
        end;
    end;
  for i := low(a) to high(a) do //цикл вывода на экран итогового массива
    begin
      write(a[i], ' ');
    end;
end;


function SS1(x: inArr; L: integer): integer;    // изменяет основной массив и возвращает число на которое изменены все неуникальныеэлементы
var k,z: integer;
    flag: boolean;
begin
  flag:=true;
  for k := 1 to L do  // цикл прохода в зависимости от длины массива (L)
    begin
      for i := low(x) to high(x) do
        begin
          if((x[k] = x[i]) and (i<>k) and (flag)) then  //условие для заопоминания первого дубликата
             begin
               z:=x[k];       //запоминаем дубликат
               flag:=false;   // меняем флаг чтобы больше не запоминать другие дубликаты
             end;
               if((x[k] = x[i]) and (i<>k)) then    //условие нахождения дубликатов
             begin
               a[k] := z;  // заменяем все дубликаты на первый найденый
             end;
        end;
      write(a[k], ' ');  // вывода на экран промежуточного массива
    end;
  result := z;
end;

begin
  min := 1;
  max := 15;
  randomize();
  for i := 1 to 9 do
    a[i] := random(max - min + 1) + min;
  for i := low(a) to high(a) do //цикл вывода на экран начального массива
    begin
      write(a[i], ' ');
      L := i; // узнаем длину массива для отправки в функцию.
    end;
  writeln();
  z := SS1(a,L);
  writeln();
  SS2(a,L,z);
  readln();
end.

//   алгоритм
// 1. генерируем массив
// 2. выводим на экран и считаем число элементов(размер массива)
// 3. вызываем функцию сс1 и передаем туда массив и его размер
// 4. в функции изменяем начальный массив заменяя все повторяющиеся элементы(даже если их пары разные)
// на одинаковое число(первый попавшийся неуникальный элемент) и запоминаем это число
// 5. функция возвращает это число(на которое заменены все неуникальные элементы)
// 6. вызываем процедуру cc2 и передаем в нее новый массив, размер массива, то самое число.
// 7. в процедуре сверяем с этим числом массив и отличающиеся значения записываем слева а справа только нули     

Пример работы:

7 15 3 8 3 7 15 2 1
7 7 7 8 7 7 7 2 1
8 2 1 0 0 0 0 0 0
vedro-compota's picture

дать подрограммам нормальные имена

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

type inArr = array[1..9] of Integer;

var a: array [1..9] of integer;
    L,z, i, min, max: integer;

// a[i] - основной массив
// x[k] - вспомогательный процедурный массив для работы с оснвовным

procedure deleter(x: inArr; L,z: integer);
var k,c: integer;
begin
  c := L; //счетчик записи нулей справа
  k := 1; //счетчик записи уникальных значений слева
  for i := low(x) to high(x) do
    begin
      if(x[i] <> z) then // если элемент массива не равен числу заменителю(из функции)
        begin
          a[k] := x[i]; //слева пишем число
          k := k + 1;    // меняем счетчик
        end
      else
        begin
          a[c] := 0; // иначе пишем 0 справа
          c := c - 1;  //меняем счетчик
        end;
    end;
  for i := low(a) to high(a) do //цикл вывода на экран итогового массива
    begin
      write(a[i], ' ');
    end;
end;


function reNameing(x: inArr; L: integer): integer;    // изменяет основной массив и возвращает число на которое изменены все неуникальныеэлементы
var k,z: integer;
    flag: boolean;
begin
  flag:=true;
  for k := 1 to L do  // цикл прохода в зависимости от длины массива (L)
    begin
      for i := low(x) to high(x) do
        begin
          if((x[k] = x[i]) and (i<>k) and (flag)) then  //условие для заопоминания первого дубликата
             begin
               z:=x[k];       //запоминаем дубликат
               flag:=false;   // меняем флаг чтобы больше не запоминать другие дубликаты
             end;
               if((x[k] = x[i]) and (i<>k)) then    //условие нахождения дубликатов
             begin
               a[k] := z;  // заменяем все дубликаты на первый найденый
             end;
        end;
      write(a[k], ' ');  // вывода на экран промежуточного массива
    end;
  result := z;
end;

begin
  min := 1;
  max := 15;
  randomize();
  for i := 1 to 9 do
    a[i] := random(max - min + 1) + min;
  for i := low(a) to high(a) do //цикл вывода на экран начального массива
    begin
      write(a[i], ' ');
      L := i; // узнаем длину массива для отправки в функцию.
    end;
  writeln();
  z := reNameing(a,L);
  writeln();
  deleter(a,L,z);
  readln();
end.

//   алгоритм
// 1. генерируем массив
// 2. выводим на экран и считаем число элементов(размер массива)
// 3. вызываем функцию сс1 и передаем туда массив и его размер
// 4. в функции изменяем начальный массив заменяя все повторяющиеся элементы(даже если их пары разные)
// на одинаковое число(первый попавшийся неуникальный элемент) и запоминаем это число
// 5. функция возвращает это число(на которое заменены все неуникальные элементы)
// 6. вызываем процедуру cc2 и передаем в нее новый массив, размер массива, то самое число.
// 7. в процедуре сверяем с этим числом массив и отличающиеся значения записываем слева а справа только нули          

Пример работы:

7 15 3 8 3 7 15 2 1
7 7 7 8 7 7 7 2 1
8 2 1 0 0 0 0 0 0
vedro-compota's picture

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

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