Исключение одинаковых элементов массиваЗадача:
Допустим, у нас есть массив, содержащий различные численные значения. Требуется исключить из него одинаковые элементы.
Для упрощения задачи будем копировать значения из одного массива в
другой. Если значение повторяется, то оно не копируется. Обычно массивы
до заполнения не пусты, а могут быть заполнены, например, нулями. Если
исходный (сжимаемый массив) содержит нули, то с учетом нижеследующего
алгоритма второй массив их содержать не должен.
Алгоритм решения задачи:
Рассмотрим непосредственно алгоритм копирования выбранных элементов.
- Массив под уникальные элементы заполняется значениями, которые точно не встречаются в сжимаемом массиве.
- Нам требуется просмотреть все элементы исходного массива (for i := 1 to n do).
- Будем копировать элемент и увеличивать индекс массива (s[k] := a[i];
k := k+1) только в том случае, если такого элемента нет во втором
массиве.
- Чтобы определить, был уже такой элемент или нет, нужно просмотреть второй массив (for l := 1 to k do).
- И если элемент присутствует, то надо исключить его копирование.
- Для этого используется переменная логического типа (flag), играющая роль так называемого флага. Ей присваивается значение false.
- Копирование возможно лишь в том случае, если значение flag остается true. Оно таким и остается, если элемент уникален.
Программа на языке Паскаль:
const
n = 20;
var
a: array[1..n] of integer; //сжимаемый массив
s: array[1..n] of integer; //сжатый массив
i,k,l: integer;
flag: boolean;
begin
randomize;
for i := 1 to n do begin
a[i] := random(10);
write (a[i]:3)
end;
writeln;
for i := 1 to n do
s[i]:=-1;
k := 1;
for i := 1 to n do begin
flag := true;
for l := 1 to k do
if s[l] = a[i] then
flag := false;
if flag = true then begin
s[k] := a[i];
k := k+1
end;
end;
for i := 1 to k-1 do
write (s[i]:3);
readln
end.
|