Задание 11 Урок 15

Задание 11 Урок 15

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

|1|-3|5|-3|9|5|8|
получим:

|1|9|8|0|0|0|0|

type arr = array[0..6] of integer;
var i,min,max : integer;
  first_array,second_array: arr;
function check(f_array,s_array: arr): arr;
var c,z,counter_number,first_number,second_number,number_zero : integer;
label m1,m2;
  function shift(x: integer;var n_z: integer): arr;{функция смещения}
  var g : integer;
  begin
   for g := low(f_array) to high(s_array) do
     begin
       s_array[g] := f_array[g];
       if g = x then
       break;{остановка итераций для сдвига}
     end;
   for g := (x) to (high(s_array)-1) do
     begin
       s_array[g] := f_array[g+1];
     end;
    result := s_array;

    for g := low(f_array) to high(f_array) do
      f_array[g] := s_array[g];
      n_z +=1;{счетчик 0-ей, чтоб сократить second_number и не считать 0-ые
      значения при проверке повторов}
  end;
begin
 number_zero := 0;
 counter_number := 1;
 m1:
 for c := low(f_array) to high(f_array) do
   begin
     first_number := f_array[c];
     for z :=(low(f_array)+counter_number) to (high(f_array)-number_zero) do
       begin
         second_number := f_array[z];
         if first_number = second_number then// если есть повторения
           begin
             shift(c,number_zero);
             counter_number := 1;
             goto m1;
           end
         else
           if ((c = high(f_array)-1) and (z = high(f_array))) then{если нет
           повторов}
               begin
                 goto m2;
               end;
       end;
   counter_number += 1;{счетчик смещения первого числа от второго постоянно на
   "+" 1, воизбежании искуственных совпадений, когда сравнивается одно и то
   же значение}
  end;
 result := s_array;
 begin
  for z := low(f_array) to high(f_array) do
    write('|', result[z],'|');
  exit;
 end;
  m2:
  write('Массив уникален!');
end;

begin
  min := 1;
  max := 15;
  randomize;
  for i := low(first_array) to high(second_array) do// ниц.массивов
    begin
      first_array[i] := min + random(max - min + 1);
      second_array[i] := 0;// используется при смещении для 0-ых значений
    end;
  for i := low(first_array) to high(second_array) do
    write('|',first_array[i],'|');
  writeln();
  check(first_array,second_array);
  readln();
end.
vedro-compota's picture

переписать сдвиг без использования второго массива

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

Использован один массив

type arr = array[1..7] of integer;
var  i,min,max,value_zero, value_shift : integer;
  value_string : string;
  first_array : arr;

function uniqueness(f_array: arr; var value_z,value_sh: integer): string;
var g,k,t: integer;
begin
  t := (low(f_array)+1);
  for g := low(f_array) to (value_z-1) do
    begin
      for k := t to value_z do
        if f_array[g] = f_array[k] then
          begin
            result := 'Массив не уникален!';
            value_z -= 1;
            value_sh := g;
            exit;
          end;
      t += 1;
    end;
  result := 'Массив уникален!';
end;

function shift(value_s: integer; f_array: arr): arr;
var g: integer;
begin
  for g := value_s to (high(f_array)-1)  do
    f_array[g] := f_array[g+1];
  f_array[high(f_array)] := 0;
  result := f_array;
end;
begin
  value_shift := 0;
  value_string := 'Массив уникален!';
  value_zero := high(first_array);
  min:= -5;
  max:= 12;
  randomize;
  for i := low(first_array) to high(first_array) do
    begin
      first_array[i] := min + random(max - min + 1);
      write('|', first_array[i], '|');
    end;
  writeln();
  repeat
    value_string := uniqueness(first_array,value_zero,value_shift);
    if value_string = 'Массив уникален!' then
      for i := low(first_array) to high(first_array) do
        write('|', first_array[i], '|')
    else
      first_array := shift(value_shift,first_array);
  until value_string = 'Массив уникален!';
  readln();
end.

консоль

  • |7||5||-3||-5||6||3||-3|
    |7||5||-5||6||3||-3||0|
  • |10||10||3||5||12||-2||3|
    |10||5||12||-2||3||0||0|
  • |-2||-2||12||11||0||11||-2|
    |12||0||11||-2||0||0||0|
vedro-compota's picture

1) value_z и value_sh не необходимы на входе функции uniqueness()

function uniqueness(f_array: arr; var value_z,value_sh: integer): string;

--есть предположение, что на входе достаточно одного массива.

2)

result := 'Массив уникален!';

-- возвращайте из функции boolean

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

type arr = array [1..7] of integer;
var first_array : arr;

function init_array(f_array: arr): arr;
var i,min,max : integer;
begin
  min := 1;
  max := 15;
  randomize;
  for i := low(f_array) to high(f_array) do
    f_array[i] := min + random(max - min + 1);
  result := f_array;
end;

procedure print(f_array: arr);
var z : integer;
begin
  for z := low(f_array) to high(f_array) do
    write('|', f_array[z], '|');
end;

function uniqueness(f_array: arr): arr;
var g,k,t: integer;

function shift(): arr;
var m: integer;
begin
  for m := g to (high(f_array)-1)  do
    f_array[m] := f_array[m+1];
  f_array[high(f_array)] := 0;
  result := f_array;
end;

begin
  k := (low(f_array)+1);
  t := high(f_array);
  for g := low(f_array) to (high(f_array)-1) do
    begin
      repeat
        if f_array[g] = f_array[k] then
          begin
            f_array := shift();
            t -= 1;
          end
        else
          k += 1;
      until k > t;
      k := g + 2;
    end;
  result := f_array;
end;

begin
  first_array := init_array(first_array);
  print(first_array);
  writeln();
  first_array := uniqueness(first_array);
  print(first_array);
  readln();
end.
vedro-compota's picture

function shift(): arr;

-- вынести реализацию в глобальное пространство (без вложенных функций)

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

vedro-compota's picture

проверить логику решения по примеру:

из
|1|-3|5|-3|9|5|8|
получим:
|1|9|8|0|0|0|0|

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

  1. функция shift вынесена в глобальное пространство
  2. добавлена функция search_for_identical_values для поиска одинаковых значений
  3. подпрограмма shift теперь вызывается из search_for_identical_values
type arr = array [1..7] of integer;
var first_array : arr;

function init_array(f_array: arr): arr;
var i,min,max : integer;
begin
  min := 1;
  max := 15;
  randomize;
  for i := low(f_array) to high(f_array) do
    f_array[i] := min + random(max - min + 1);
  result := f_array;
end;

procedure print(f_array: arr);
var z : integer;
begin
  for z := low(f_array) to high(f_array) do
    write('|', f_array[z], '|');
end;

function shift(shift_array :arr; the_value_to_be_removed: integer): arr;
var m: integer;
begin
  for m := the_value_to_be_removed to (high(shift_array)-1)  do
    shift_array[m] := shift_array[m+1];
  shift_array[high(shift_array)] := 0;
  result := shift_array;
end;

function search_for_identical_values(f_arr:arr;y:integer;var l:integer):arr;
var e : integer;
begin
  e := low(f_arr);
  repeat
    if f_arr[e] = y then
      begin
        f_arr := shift(f_arr,e);
        l -= 1;
      end
    else
      e += 1;
  until e > l;
  result := f_arr;
end;

function uniqueness(f_array: arr): arr;
var g,k,t: integer;
begin
  k := (low(f_array)+1);
  t := high(f_array);
  for g := low(f_array) to (t-1) do
    begin
      repeat
        if f_array[g] = f_array[k] then
          begin
            f_array := search_for_identical_values(f_array,f_array[k],t);
            k := (g + 1);
          end
        else
          k += 1;
      until k > t;
      k := g + 2;
    end;
  result := f_array;
end;

begin
  first_array := init_array(first_array);
  print(first_array);
  writeln();
  first_array := uniqueness(first_array);
  print(first_array);
  readln();
end.

консоль

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

Просьба добавить альтернативное решение:

  1. Заведите доп. массив, в который сложите номера элементов, которые, подлежат замене сдвигом.
  2. Используя этот массив проведите сдвиг.

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