Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
readln(a[i, j]); end;{for j}
{Здесь происходит обработка данных массива}
//Вывод элементов массива на экран for i:=1 to n do
begin
for j:=1 to m do
write(' a[', i, ',', j, ']=', a[i, j]:6:2);
writeln; end;{for i}
readln;
end.
Для начала рассмотрим вставку элемента в массив. Для простоты будем рассматривать только одномерные массивы. Массив состоит из некоторого количества элементов nmax (емкость массива). Текущее количество элементов массива находится в переменной n.
Перед вставкой очередного элемента проверяем, что текущее количество элементов массива меньше, чем его емкость.
Далее проверяем, вставляется ли элемент в конец массива или нет. Если элемент вставляется в конец массива, то увеличиваем n на единицу и добавляем элемент. Иначе сдвигаем элементы массива индекс которых больше или равен индексу вставляемого элемента.
Приведенный алгоритм реализован в программе приведенной в листинге 5.
program InsElt;
{$APPTYPE CONSOLE}
const nmax=5; //емкость массива
var a:array [1..nmax] of real; //массив |
|
|
||
element:real; |
//элемент для вставки |
|
||
index |
:integer; |
//индекс элемента |
для |
вставки |
n |
:integer; |
//число элементов |
массива |
|
i |
:integer; |
|
|
|
begin
writeln('Vvedite chislo elementov massiva'); readln(n);
//Ввод массива for i:=1 to n do
begin
write('a[', i, ']='); readln(a[i]);
end;
//Элемент для вставки writeln('Vvedite element'); readln(element);
//Индекс элемента
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
writeln('Vvedite index elementa'); readln(index);
//Вставка элемента if index<n+1 then
begin
inc(n); //увеличиваем длину массива if (Low(a)<=index)and(index<=n) then
for i:=n downto index do a[i]:=a[i-1]; //сдвиг массива
a[index]:=element; end
else begin
writeln('Invalid index'); readln;
Halt(0);
end;
//Вывод элементов массива на экран
for i:=1 to n do writeln('a[', i, ']=', a[i]:6:2);
readln;
end.
Удаление элемента происходит аналогично. Сначала проверяется, что индекс элемента не выходит за диапазон допустимых значений, а затем сдвигаем элементы таким образом, чтобы закрыть удаляемый элемент.
program DelElt;
{$APPTYPE CONSOLE}
const nmax=5; //емкость массива
var a:array [1..nmax] of real; //массив |
|
||
index:integer; |
//индекс элемента |
для вставки |
|
n |
:integer; |
//число элементов |
массива |
i |
:integer; |
|
|
begin
writeln('Vvedite chislo elementov massiva'); readln(n);
//Ввод массива for i:=1 to n do
begin
write('a[', i, ']='); readln(a[i]);
end;
//Индекс элемента writeln('Vvedite index elementa'); readln(index);
//Удаление элементов if index<n+1 then
begin
if (Low(a)<=index)and(index<=n) then
for i:=index to n do a[i]:=a[i+1]; //сдвиг массива
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
dec(n); //уменьшаем длину массива end
else begin
writeln('Invalid index'); readln;
Halt(0);
end;
//Вывод элементов массива на экран
for i:=1 to n do writeln('a[', i, ']=', a[i]:6:2);
readln;
end.
Поиск – это действие, заключающееся в просмотре набора элементов и выделении из этого набора интересующего элемента. Если элементы в массиве не отсортированы, то может использоваться только один алгоритм поиска – последовательный поиск. В случае если массив отсортирован, то возможен бинарный поиск.
Последовательный поиск заключается в выборе каждого элемента массива и сравнения его с искомым. Быстродействие алгоритма пропорционально числу элементов. Реализация этого алгоритма с помощью цикла for … to … do приведена в листинге 5
Листинг 5
program Search;
{$APPTYPE CONSOLE}
const nmax=5; //емкость массива
var a:array [0..nmax] of real; //массив
index:integer; |
//индекс искомого элемента |
|
Value:real; |
//значение элемента для поиска |
|
i |
:Integer; |
|
begin
writeln('Vvedite massiv ', nmax+1, 'elements');
//Ввод массива for i:=1 to nmax do
begin
write('a[', i, ']='); readln(a[i]);
end;
//элемент для поиска
writeln('Input element for search'); readln(Value);
//поиск index:=-1;
for i:=Low(a) to High(a) do if a[i]=Value then
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
begin index:=i; break;
end;
if index>=0 then //если элемент найден writeln('Element found in ', index, ' position')
else //если элемент не найден writeln('Element not found!');
readln;
end.
Алгоритм бинарного поиска применим только для отсортированного массива. Бинарный поиск работает следующим образом. Берем средний элемент массива и проверяем равен ли он искомому элементу,. если равен, то поиск окончен. В противном случае, если искомый элемент меньше среднего, то можно сказать, что если элемент присутствует в массиве, то он находится в первой его половине. С другой стороны, если искомый элемент больше среднего, то он находится во второй части массива. Таким образом, одним сравнением удалось локализовать искомый элемент в массиве двое меньшей размерности. Описанная операция повторяется до тех пор, пока искомый элемент не будет найден (если он присутствует в массиве). Так как при каждом выполнении цикла размер массива уменьшается в два раза, то быстродействие алгоритма будет пропорционально log2 n . Так, например для поиска в массиве из 256 элементов
понадобится произвести всего 8 сравнений. Реализация алгоритма приведена в листинге 6.
Листинг 6
program Search2;
{$APPTYPE CONSOLE}
const n=10;//длина массива
var a:array [0..n-1] of integer=(1,2,3,4,5,16,17,56,78,110);
l, |
//левый индекс |
r, |
//правый индекс |
m:integer; //индекс среднего элемента el:integer;//значение искомого элемента
begin
write('Vvedite element dlia poiska '); readln(el);
l:=0; r:=n-1;
while l<=r do begin
m:=(l+r) div 2;//вычисляем индекс среднего элемента
{если значение среднего элемента меньше искомого значения, то переместить левый индекс на позицию до среднего индекса} if a[m]<el then l:=succ(m)
{если значение среднего элемента больше искомого значения, то переместить правый индекс на позицию после среднего
индекса} else
if a[m]>el then r:=pred(m)
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
else //иначе элемент найден begin
writeln('Search result a[', m, ']=', a[m]); break;
end; end;{while}
if l>=r then writeln('Element ', el,' not found'); readln;
end.
Поиск минимального или максимального элемента массива можно осуществить с помощью алгоритма приведенного в листинге 7.
Листинг 7
program MinMax;
{$APPTYPE CONSOLE}
const n=10;//длина массива
var a:array [0..n-1] of integer;
i:integer; |
|
|
min, |
//значение |
минимального элемента |
max:integer; //значение |
максимального элемента |
|
begin
//инициализируем массив случайными числами
Randomize;
for i:=0 to n-1 do a[i]:=random(10);
max:=a[0];
min:=a[0];
for i:=1 to n-1 do begin
if a[i]>max then max:=a[i]; if a[i]<min then max:=a[i];
end;{for}
writeln('min ', min); writeln('max ', max); readln;
end.
Сортировка это упорядочение данных в соответствии с заданными критериями. С данными удобнее работать если они отсортированы. Например алгоритм бинарного поиска работает гораздо быстрее алгоритма последовательного поиска. Существуют десятки различных видов сортировки. Каждый со своими достоинствами и недостатками. Рассмотрим некоторые простейшие алгоритмы сортировки.