Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1800

.pdf
Скачиваний:
5
Добавлен:
15.11.2022
Размер:
925.77 Кб
Скачать

Элементы массива х1 имеют тип Real и нумеруются целыми числами от 1 до 100 включительно. Нумеровать элементы массива можно не только числами, но и значениями любого другого перечислимого типа, например, Char:

c1 : array [’a’..’z’] of Real;

Элементы массива с1 имеют тип Real и индексируются буквами латинского алфавита.

Другой способ описания массивов — описание типа массива в разделе типов. Для перечисленных выше примеров это будет выглядеть так:

Type

TMassiv1 = array [Integer] of Integer;

TMassiv2=array [1..100] of Real; TMass = array [‘a’..’z’] of Real;

После этого типами TMassiv1, TMassiv2, TMass мож-

но пользоваться как стандартными, то есть в разделе описания переменных описывать переменные этих типов:

Var

A,b,c,d : TMassiv1; x1 : TMassiv2; c1 : TMass;

Действия над элементами массивов

Доступ (обращение) к отдельным элементам массива осуществляется путем указания имени переменной массива, за которым в квадратных скобках помещается значение индекса (порядкового номера) элемента. Примеры задания индекса: M[5] - непосредственно числом; M[n] — косвенно через переменную n; M[n+5] - косвенно через выражение n+5; M[Succ(i)]

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

Var x, y : array [1..10] of integer ; z : array [1..10] of integer;

30

то допустим следующий оператор присваивания:

X:=Y;

но недопустим оператор Z:=X; так как массивы X и Z не идентичных типов. В Паскале над массивами не определены операции отношения. Сравнивать массивы можно только поэлементно. К отдельным элементам массива можно применять стандартные процедуры и функции, предусмотренные в языке.

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

For i:=1 to 25 do mas[i]:=0;

всем элементом массива присваивается нулевое значение. Использование массивов вместо одиночных переменных

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

Пример. Дана последовательность температур t1 ... t31. Организовать массив для хранения этих чисел. Определить среднемесячную температуру.

Program Primer1;

 

var

{описание массива}

t: array[1..30] of real;

i: integer;

{параметр цикла for}

tsr: real;

{средняя температура}

begin

{заполнение массива}

for i:=1 to 31 do

begin

write('введите температуру',i);

readln(t[i]);

 

end;

{обнуление счётчика суммы}

tsr:=0;

for i:=1 to 31 do tsr:=tsr+t[i]; {вычисление суммы}

31

tsr:=tsr/31; {вычисление среднего}

write('среднемесячная температура равна ',tsr); readln; { пауза }

end.

Заполнение массивов

Работа с массивами требует их предварительного заполнеия, то есть присваивания начального значения каждому элементу массива. Для заполнения массива можно, например, использовать ввод с клавиатуры:

WriteLn(‘Введите значение для элементов массива:’); For i:=1 to 100 do

begin Write(‘x1[’,i,’]=’); ReadLn(x1[i]);

end;

Однако, при отладке программы приходится вводить с клавиатуры много элементов массива. Чтобы избавиться от этой утомительной работы целесообразно заполнять массивы случайными числами. Для этого в начале программы один раз запускается датчик случайных чисел процедурой Randomize. Затем каждому элементу массива присваивается случайное значение с помощью функции Random. Использование функции Random может быть разнообразным. Если ее использовать с аргументом, например x1[i]:=Random(M); то она генерирует целое равномерно распределенное случайное число из отрезка [0,M-1], где М — целое положительное число. Если Random использована без аргументов x1[i]:=Random; генерируется вещественное равномерно распределенное случайное число из отрезка [0,1). Таким образом, заполнение массива случайными числами из отрезка [150,200) будет выглядеть так:

Randomize;

For i:=1 to 100 do x1[i]:=150+50*Random;

{Инициализируем датчик} {Для каждого элемента} {Присваиваем случайное}

32

Поиск элементов, удовлетворяющих заданному условию

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

Следующая программа заполняет массив целыми случайными числами от -100 до 100, определяет количество положительных элементов и выдаёт сообщение на экран.

Program Primer2;

 

 

var

 

{Описание массива}

m: array[1..30] of Integer;

i: integer;

 

{параметр цикла for}

n: integer;

{счётчик положительных эл-ов}

begin

 

{Инициализация датчика}

Randomize;

 

for i:=1 to 30 do

 

{заполнение массива}

m[i]:=Random(201)-100;

{обнуление счётчика п. эл-ов}

n:=0;

for i:=1 to 30 do

{Условие положительности}

if m[i]>=0

then n:=n+1;

{Наращиваем на 1 счетчик}

write('в массиве ',n,' положительных эл-ов'); readln; { пауза }

end.

Определение максимального элемента и его положения в массиве

Рассмотрим пример программы, которая заполняет вещественный массив случайными числами и определяет значение и индекс (номер) максимального элемента этого массива

Programm Primer3;

 

var

{Описание массива}

m: array[1..30] of real;

i: integer;

{параметр цикла for}

33

max: real;

{значение максимального элемента}

t: integer;

 

{индекс (номер) макс. элемента}

begin

 

 

Randomize;

 

 

for i:=1 to 30 do

 

{заполнение массива}

m[i]:=10*Random;

max:=m[1]; {допустим, что 1-й элемент - максимален}

t:=1;

{Для всех остальных элементов}

for i:=2 to 30 do

if m[i]>max then

{Сравниваем с максимальным}

begin

 

max:=m[i];

t:=i;

end; writeln('максимальный элемент = ',max);

writeln('номер максимального элемента ',t); readln; { пауза }

end.

Упорядочивание (сортировка) массивов

Задача сортировки массива довольно актуальна при программировании баз данных. Базы данных должны обеспечивать возможность удобного и быстрого поиска нужной информации. В массиве с неупорядоченными данными поиск нужной информации возможен только способом последовательного перебора всех элементов. С одной стороны это самый простой метод поиска, с другой стороны он является самым медленным способом поиска. Значительно быстрее поиск нужной информации происходит в упорядоченном массиве. Поэтому часто возникает задача об упорядочивании массива.

Пусть числовой массив x[1..n] с попарно различными элементами требуется упорядочить по возрастанию значений элементов, чтобы выполнялись неравенства x[1] < x[2] < ... < x[n]. Существует несколько алгоритмов решения этой задачи.

34

Алгоритм сортировки перебором

Первое место в массиве должен занять минимальный элемент, второе — наименьший среди оставшихся и т.д. Следовательно, необходимо выполнить следующую последовательность действий:

1)найти минимальный среди элементов x[1]..x[n] и поменять его местами с первым элементом;

2)найти минимальный элемент среди элементов x[2]..x[n] и поменять его местами со вторым элементом;

i) найти минимальный элемент среди элементов x[i]..x[n] и поменять его местами с элементом с номером i;

n-1) найти минимальный элемент среди элементов x[n-1]..x[n] и поменять его местами с предпоследним элементом.

Таким образом, за n-1 шаг можно добиться полного упорядочивания массива. Каждый такой шаг содержит более простые задачи. Первая — поиск минимального элемента среди элементов с номерами i..n. Величина i должна быть равна сначала 1, затем 2, 3 и т.д до n-1. Вторая — замена местами минимального элемента с номером t и элемента номером i. Поменять местами две переменные x и y можно двумя способами:

с использованием вспомогательной переменной v:=x; x:=y; y:=v;

без использования вспомогательной переменной x:=x+y; y:=x-y; x:=x-y;

Структурная схема алгоритма сортировки перебором изображена на рис. 2.1.

35

 

i:=1...n-1

 

 

Поиск минимального элемента

 

 

среди m[i]…m[n]

Обмен

 

min:=m[i]; t:=i;

местами

 

m[t] и

 

 

m[i]

 

j:=i+1...n

 

Нет

m[j]<min

 

 

Да

 

 

min:=m[j]; t:=j;

 

Рис. 2.1. Структурная схема алгоритма сортировки перебором

36

Алгоритм сортировки методом пузырька

Если два соседних элемента расположены не в нужной последовательности, то их меняют местами. Так повторяют до тех пор, пока в очередном проходе не произойдет ни одного обмена, т.е. массив будет упорядоченным. На рис. 2.2 показана структурная схема алгоритма сортировки по возрастанию методом пузырька (m - массив для сортировки с начальным индексом 1, n - размерность массива).

 

 

 

 

 

 

 

 

Flag:=False;

 

 

 

i:=1...n-1

 

 

Нет

m[i]>m[i+1]

 

 

 

 

 

Да

 

 

 

 

 

 

 

 

 

 

 

Обмен

 

 

Да

 

 

местами

 

Flag

 

 

m[i] и

 

 

 

 

m[i+1]

 

Нет

 

 

 

 

 

 

 

 

 

 

 

Flag:=True;

 

 

 

 

 

 

 

 

 

Рис. 2.2. Структурная схема алгоритма сортировки методом пузырька

37

Алгоритм быстрой сортировки

Под термином «быстрая сортировка» обычно понимают группу методов упорядочивания элементов массива с высокими скоростными показателями. Один из методов быстрой сортировки был предложен К.Хоаром (C. Hoare). Он основан на разделении массива на два непересекающихся подмассива таким образом, чтобы алгоритм сортировки можно было применить отдельно к каждому подмассиву.

Рассмотрим этот алгоритм сортировки более подробно. Его структурная схема изображена на рис. 2.3. Пусть исходными данными для алгоритма сортировки являются номера первого Left и последнего Right элементов сортируемой части массива. При сортировке всего массива Left=1, Right=n. Для разбиения массива на две части выбирается произвольный элемент массива, например, посередине — элемент с номером (Left+Right) div 2. Далее элементы массива меняют местами так, чтобы в одной части оказались элементы, не большие выбранного элемента, а в другой части — не меньшие него (при сортировке по возрастанию). Для этого перемещаясь от начала массива к концу, находят первый элемент, превосходящий выбранный. Пусть он имеет номер I. Затем, перемещаясь от конца массива к началу, находят первый элемент, меньший выбранного. Пусть он имеет номер J. Если I<=J, то элементы следует поменять местами и продолжить движение по массиву пока не выполнится условие I>J. В результате массив оказывается разделенным на две части. Далее следует тот же алгоритм сортировки применить к полученным частям массива. Заметим, что в процессе перемещения элементов сам первоначально выбранный элемент может изменить свой расположение. Поэтому его значение запоминается в вспомогательной переменной Y.

38

I:=Left;

 

J:=Right;

 

Y:=m[(I+J) div 2]

 

Пока m[I]>Y

 

Inc(I)

 

Пока Y>m[J]

 

Dec(J)

 

I<=J

Да

 

Нет

Обмен

местами

 

m[I] и m[J]

Inc(I)

 

Dec(J)

 

I>J

Да

 

Нет

 

Рис. 2.3. Структурная схема алгоритма быстрой сортировки Хоара

39

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]