Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник.docx
Скачиваний:
36
Добавлен:
21.12.2018
Размер:
2.15 Mб
Скачать

Исключение одинаковых элементов массива

Задача:

Допустим, у нас есть массив, содержащий различные численные значения. Требуется исключить из него одинаковые элементы.

Для упрощения задачи будем копировать значения из одного массива в другой. Если значение повторяется, то оно не копируется. Обычно массивы до заполнения не пусты, а могут быть заполнены, например, нулями. Если исходный (сжимаемый массив) содержит нули, то с учетом нижеследующего алгоритма второй массив их содержать не должен.

Алгоритм решения задачи:

Рассмотрим непосредственно алгоритм копирования выбранных элементов.

  1. Массив под уникальные элементы заполняется значениями, которые точно не встречаются в сжимаемом массиве.

  1. Нам требуется просмотреть все элементы исходного массива (for i := 1 to n do).

  1. Будем копировать элемент и увеличивать индекс массива (s[k] := a[i]; k := k+1) только в том случае, если такого элемента нет во втором массиве.

  1. Чтобы определить, был уже такой элемент или нет, нужно просмотреть второй массив (for l := 1 to k do).

  1. И если элемент присутствует, то надо исключить его копирование.

  1. Для этого используется переменная логического типа (flag), играющая роль так называемого флага. Ей присваивается значение false.

  1. Копирование возможно лишь в том случае, если значение 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.

Выбор элементов массива

Задача:

Требуется из одного массива скопировать в другой массив значения, удовлетворяющие определенным условиям и посчитать их количество.

Алгоритм решения задачи:

Допустим, у нас будет исходный массив из 50 элементов, значения которых формируются функцией random и лежат в диапазоне от -50 до 49 включительно. Условием, при котором значения одного массива должны быть скопированы в другой, будет попадание значения в диапазон от -5 до 5 включительно.

Программа на языке Паскаль:

const

m = 50;

type

arr = array[1..m] of shortint;

var

arr1, arr2: arr;

k, i: byte;

begin

randomize;

writeln ('Исходный массив: ');

for i := 1 to m do begin

arr1[i] := random(100)-50;

write (arr1[i]:4);

end;

writeln; writeln;

k := 0;

for i := 1 to m do

if (arr1[i] >= -5) and (arr1[i] <= 5) then begin

k := k + 1;

arr2[k] := arr1[i];

end;

write ('Отфильтрованный массив: ');

for i := 1 to k do

write (arr2[i]:3);

writeln;

writeln ('Количество элементов: ', k);

readln

end.

Примечания:

В переменной k хранится количество элементов второго массива, а также она используется при занесении очередного удовлетворяющего условию элемента в массив.