Урок 15 Задача 13
Primary tabs
Напишите функцию, которая определяет являются ли значения переданного массива целых чисел уникальными относительно друг друга, если среди есть неуникальные элементы, то удалите их, сдвинув значения влево, заполняя оставшиеся справа ячейки нулями.
Протестируйте работу функции на массиве из 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
- Log in to post comments
- 989 reads
vedro-compota
Sun, 12/04/2022 - 14:17
Permalink
предлагаю определить
предлагаю определить дополнительный массив элементов, на которые на сдвигать, а потом сдвинуть.
Для сдвига можно использовать функцию из новой задачки 11 http://fkn.ktu10.com/?q=node/8614
_____________
матфак вгу и остальная классика =)