Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Программирование.pdf
Скачиваний:
28
Добавлен:
12.08.2019
Размер:
4.74 Mб
Скачать

vk.com/club152685050 | vk.com/id446425943

Лекция 10

2

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

type char = 'a','c'..'z'; (- отсутствует символ "b") var a1: array[charrr] of integer; - 25 компонент a2: array [char] of integer; - 256 целых компонент

a3: array [shortint] of real; - 256 вещественных компонент

Общий размер массива не должен превосходить 65 520 байт. Следовательно, попытка задать массив a4:array[integer]of byte; не увенчается успехом, поскольку тип integer покрывает 65 535 различных элементов. А про тип longint в данном случае лучше и вовсе не вспоминать.

Тип компонент массива может быть любым:

var a4: array[10..20] of real; - массив из компонент простого типа a5: array[0..100] of record1; - массив из записей

a6: array[-10..10] of ^string; - массив из указателей на строки a7: array[-1..1] of file; - массив из имен файловых переменных

a8: array[1..100] of array[1..100] of char; - двумерный массив (массив векторов)

Для краткости и удобства многомерные массивы можно описывать и более простым способом:

var a9: array[1..10,1..20] of real; - двумерный массив 10 х 20

a10: array[boolean, -1..1,char, -10..10] of word; - четырехмерный массив 2 х 3 х 256 х 21

Общее ограничение на размер массива - не более 65 520 байт - сохраняется и для многомерных массивов. Количество компонент многомерного массива вычисляется как произведение всех его "измерений". Таким образом, в массиве а9 содержится 200 компонент, а в массиве а10 - 32 256 компонент.

Обращение к компонентам массива

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

Доступ к компонентам линейного массива осуществляется так:

<имя_массива>[<индекс_компоненты>]

а многомерного - так:

<имя_массива>[<индекс>,_,<индекс>]

Правила употребления индексов при обращении к компонентам массива таковы:

1.Индекс компоненты может быть константой, переменной или выражением, куда входят операции и вызовы функций.

2.Тип каждого индекса должен быть совместим с типом, объявленным в описании массива именно для соответствующего "измерения"; менять индексы местами нельзя.

3.Количество индексов не должно превышать количество "измерений" массива. Попытка обратиться к линейному массиву как к многомерному обязательно вызовет ошибку. А вот обратная ситуация

vk.com/club152685050 | vk.com/id446425943

Лекция 10

3

вполне возможна: например, если вы описали N-мерный массив, то его можно воспринимать как линейный массив, состоящий из (N-1)- мерных массивов.

Примеры использования компонент массива: a2['z']:= a2['z']+1;

a3[-10]:= 2.5; a3[i+j]:= a9[i,j];

a10[x>0,sgn(x),'!',abs(k*5)]:= 0;

Задание массива константой

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

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

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

Исключение составляют только массивы, компонентами которых являются величины типа char. Такие массивы можно задавать проще:строкой символов.

Примеры задания массивов типизированными константами: type mass = array[1..3,1..2] of byte;

const a: array[-1..1] of byte = (0,0,0); {линейный} b: mass = ((1,2),(3,4),(5,6)); {двумерный}

s: array[0..9] of char = '0123456789';

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

Сортировка элементов в массиве

Сортировка представляет собой процесс упорядочения элементов в массиве по возрастанию или убыванию их значений.

Существует большое количество алгоритмов сортировки, но все они базируются на трех основных:

сортировка обменом;

сортировка выбором;

сортировка вставкой.

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

vk.com/club152685050 | vk.com/id446425943

Лекция 10

4

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

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

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

Итак, решим следующую задачу. Задан массив Т из n целых чисел. Расположить элементы массива в порядке возрастания их значений.

Сортировка методом пузырька

Сортировка методом «пузырька» использует метод обменной сортировки и основана на выполнении в цикле операций сравнения и при необходимости обмена соседних элементов. Рассмотрим алгоритм пузырьковой сортировки более подробно.

Сравним первый элемент массива со вторым. Бели первый окажется больше второго, то поменяем их местами. Те же действия выполним для второго и третьего, третьего и четвертого, i-го и (i + 1)-го, (n- 1)-го и n-го элементов. В результате этих действий самый большой элемент станет на последнее (n-е) место. Теперь повторим данный алгоритм сначала, но последний (n-й) элемент, рассматривать не будем, так как он уже занял свое место. После проведения данной операции самый большой элемент оставшегося массива встанет на (n- 1)-е место. Так повторяем до тех пор, пока не упорядочим весь массив.

В таблице подробно расписан процесс упорядочивания элементов в массиве. Нетрудно заметить, что для преобразования массива, состоящего из n элементов, необходимо просмотреть его (n - 1) раз, каждый раз уменьшая диапазон просмотра на один элемент. Для перестановки элементов (блок 4) используется буферная переменная b, в которой временно хранится значение ш$емёнта, подлежащего замене.

Процесс упорядочивания элементов в массиве по возрастанию

Исходный массив

7

3

5

4

2

Первый просмотр

3

5

4

2

7

Второй просмотр

3

4

2

5

7

Третий просмотр

3

2

4

5

7

Четвертый просмотр

2

3

4

5

7

vk.com/club152685050 | vk.com/id446425943

Лекция 10

5

 

j:=1,n-

 

1

 

i:=1,n-1

 

yi>yi+1

 

b:=yi+1;

 

yi+1:=yi;

 

yi:=b;

{Упорядочивание элементов в массиве по возрастанию их значений.

}

var

i,n,j: integer; b:word;

у: array [1..100] of word; begin

writeln ('введите размер массива '); readln (n); for i:=l to n do begin

writet 'yf ,i,'] = ') ; readln (y[i]); end;

writeln ('массив у '); for i:=l to n do write (y [i],' ') ; writeln;

for j:=1 to n-1 do

for i:=l to n-j do if уЦ] > yli+l] then { Если текущий элемент больше следующего, то }

begin { поменять их местами. }

b:=y[i]; { Сохранить значение текущего элемента. } yti]:=yli+l];

{Заменить текущий элемент следующим. } y[i+l]:=b; { Заменить следующий элемент текущим. }

end; writeln('упорядоченный массив1);

vk.com/club152685050 | vk.com/id446425943

Лекция 10

6

for i:=l to n do

 

write (y[i],'

'); writeln;

//Для перестановки элементов в массиве по убыванию их значений необходимо при их сравнении заменить знак > на <.

Сортировка выбором

 

 

 

i:=2,n

1

 

 

 

 

 

 

 

 

 

x:=y

 

2

 

 

 

 

 

 

 

6

 

 

 

i

 

 

 

 

 

 

 

 

3

 

y

 

:=x

 

 

 

 

j+1

j:=i-1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

j>0 and

4

 

 

 

 

 

 

 

 

 

x<y

 

 

 

 

 

 

 

i

 

 

 

 

 

 

y

:=y

 

 

5

 

 

 

j

 

 

 

 

j+1

 

 

 

 

 

j:=j-1

 

 

Найдем в массиве самый большой элемент (блоки 3-7) и поменяем его местами с последним элементом (блок 8). Повторим алгоритм поиска максимального элемента, уменьшив количество просматриваемых элементов на единицу (блок 9), и поменяем его местами с предпоследним элементом (блоки 3-7). Описанную выше операцию поиска проводим до полного упорядочивания элементов в массиве. Так как в блоке 9 происходит изменение переменной п, то в начале алгоритма ее значение необходимо сохранить (блок 1).