03 Программирование на ЭВМ - массивы.pptx
- Количество слайдов: 28
Программирование на ЭВМ Массивы Доцент, к. т. н. Исаев А. В. avisz@yandex. ru Ауд. 7 или 234
Массивы • Массивы — упорядоченная совокупность нескольких однотипных объектов (чисел, символов, строк и т. п. ), рассматриваемых как единое целое.
Массивы • Необходимость применения массивов возникает всякий раз, когда требуется связать и использовать целый ряд родственных величин. • Например, результаты многократных замеров температуры воздуха в течение года могут быть описаны массивом измерений. • Еще пример — двухмерный или трехмерный объект может быть описан массивом характерных точек, имеющих определенные координаты.
Описание массива • При описании обычного массива необходимо указать общее количество входящих в массив элементов и тип этих элементов.
Характеристики массивов • Каждый компонент (элемент) массива может быть явно обозначен • К каждому компоненту массива имеется прямой доступ; • Число компонентов т. н. статического массива определяется при его описании и в дальнейшем не меняется.
Структура описания массива <имя>: ARRAY [нач. номер_элемента. . конечный_номер_элемента] OF <тип>; Например: var a: array [1. . 10] of Real; b: array [0. . 50] of Char; c: array [0. . 4] of byte; d: array [-5. . 10] of integer; Здесь ARRAY, OF — ключевые слова (массив, из). За словом ARRAY в квадратных скобках указывается тип-диапазон, определяющий общее количество элементов в массиве. За словом OF указывается тип элементов, образующих массив. Тип может быть любым, в том числе и массивом.
Доступ к элементам массива • Доступ к каждому элементу массива в программе var осуществляется по индексу — a: array [1. . 10] of Real; целому числу, служащему своеобразным именем элемента b: array [0. . 50] of Char; в массиве. В правильно c: array [0. . 4] of byte; d: array [-5. . 10] of integer; составленной программе индекс не должен выходить за пределы, определяемые типомдиапазоном. • Например, в вышеприведенном примере можно использовать обращение a[1], b[12], c[0], но нельзя a[0], b[153], c[– 3];
Ввод и вывод массива • Вводить и выводить массивы можно только поэлементно. Program massiv_1; // рассмотрим другой вариант описания массива const n = 5; type mas = array[1. . n] of integer; var a: mas; // в данном случае можно было не писать все предыдущие строки, //а записать в разделе var просто a: array[1. . n] of integer; i: byte; begin writeln('введите элементы массива'); for i: =1 to n do readln(a[i]); writeln('вывод элементов массива: '); for i: =1 to n do writeln(a[i]); end.
Еще о типах массивов Если массивы a и b описаны как: var a: array [1. . 5] of integer; b: array [1. . 5] of integer; то переменные a и b считаются разных типов. Для обеспечения совместимости надо применять описание переменных через предварительное описание типа (см. предыдущий слайд). • Если типы массивов идентичны, то в программе один массив может быть присвоен другому. В этом случае значения всех переменных одного массива будет присвоены соответствующим элементам второго массива. • Вместе с тем, над массивами не определены операции отношения. Сравнивать два массива можно только поэлементно.
Многомерные массивы • Каждый элемент массива может быть массивом любой размерности (то есть тип элемента — тоже массив). Такие массивы называются многомерными, у них более одного измерения. • Пример двумерного массива — матрица, трехмерного — трехмерная матрица.
Описание многомерных массивов • Способ 1: type mas 1=array [1. . 10] of array [1. . 15] of real; var arr: mas 1; • Способ 2 (упрощенный): type mas 2=array [1. . 10, 1. . 15] of real; var arr: mas 2; • Способ 3 (непосредственный) var mas: array [1. . 10, 1. . 15] of real;
Обращение к элементу многомерного массива • Чтобы обратиться к элементу многомерного массива, нужно указать имя переменноймассива и в квадратных скобках перечислить индексы: • a[3, 6]
Ввод и вывод многомерных массивов • Работа с многомерными массивами почти всегда связана с организацией вложенных циклов. Так, чтобы заполнить двумерный массив (матрицу) случайными числами, используют конструкцию вида: for i: =1 to m do for j: =1 to n do a[i, j]: =random(10); • Для "красивого" вывода двухмерной матрицы на экран можно использовать такой цикл: for i: =1 to m do for j: =1 to n do writeln(a[i, j]); end;
Динамические массивы • Вышерассмотренные массивы являются статическими, то есть не могут изменять свою размерность в ходе выполнения программы. Существуют так же динамические массивы, которые могут менять свою размерность. • Динамические массивы есть в среде Delphi и Lazarus, а в стандартном языке Pascal не определены!!!
Описание динамических массивов • При объявлении динамических массивов в программе не указывают границы индексов: var a: array of integer; b: array of real;
Инициализация динамического одномерного массива • Для начала работы с массивом его нужно инициализировать — указать его размерность. Это делается функцией Set. Length(<имя_массива>, <размерность>). Например: Set. Length(a, 3); • В этом примере инициируется массив а, размер которого устанавливается равным трём элементам. • Нижняя граница индексов по любому измерению динамического массива всегда равна 0, поэтому верхней границей индексов для A в рассматриваемом случае станет значение 2.
Другие функции для работы с динамическими массивами • Уничтожение динамического массива: Set. Length(a, 0); • Номер первого и последнего элемента массива (граничные элементы): low(a); // к первому элементу high(a); // к последнему элементу • Эти же функции определены для типадиапазона.
Инициализация динамического многомерного массива • Инициализация динамического многомерного массива может также происходить разными способами: var a: array of integer; begin setlength(a, 3); //устанавливаем количество столбцов //далее задаем длину каждого столбца setlength(a[0], 1); setlength(a[1], 2); setlength(a[2], 3); // получился треугольный массив! . . . end.
Инициализация динамического многомерного массива • Функция Setlength является одной из немногих в Delphi/Lazarus, которая допускает обращение с переменным количеством параметров. • Например, для задания квадратного массива 3 x 3 можно записать одну строку: Set. Length(a, 3, 3);
Пример работы с массивом • • Дан массив целых чисел из N элементов. Найти минимальный элемент массива и его номер. Определим количество используемых переменных и их тип. Из условия задачи можно сделать вывод, что у нас будет массив целых чисел и три переменных (как минимум) целого типа (количество элементов, минимум, номер минимума). Дадим имена этим переменным: N — количество элементов массива; Min — переменная для хранения минимума; Nom. Min — номер минимального элемента; A[N] — массив из N элементов целого типа. Также для работы с массивом в цикле понадобится целочисленная переменная i — счетчик цикла; Число элементов массива не определено однозначно, значит, можно предположить, что мы работаем с динамическим массивом. Заполняем массив целыми числами (в цикле) Далее производим поиск минимума в уже заполненном массиве. Предположим, что начальное значение Min равно первому элементу массива, т. е. Min = a[0]. После этого надо сравнить значение переменной Min со всеми остальными элементами массива (необходимо использовать еще один цикл). Если какой-либо элемент массива будет больше Min, то делаем переприсваивание и запоминаем номер этого элемента. После полного прохода этого цикла выводим на экран Min и Nom. Min.
Начало N Min = 0 Nom. Min = 0 i=0 i≤N Min = a[0] a[i] i=0 i=i+1 i≤N Min > a[i] Min = a[i] Nom. Min=i Конец i=i+1
Сортировка массивов • Существует множество алгоритмов сортировки (упорядочивания) массивов; Один из простейших методов — сортировка простым обменом или пузырьковая сортировка; • Пузырьковая сортировка основана на многократном обходе массива а 1, а 2, . . . аn При каждом обходе сравниваются два соседних элемента аi и ai+1. Если элементы неупорядочены. то они меняются местами. • Вследствие последовательных перестановок, например, при упорядочивании массива по возрастанию, максимальный элемент массива постепенно продвигается вправо и становится на свое место. • При втором обходе длина массива уменьшается на 1 (исключается последний элемент) и процесс повторяется; • Последний обход выполняется для массива из 2 элементов.
Пример пузырьковой сортировки
Еще пример пузырьковой сортировки
Ввод массива размерностью N i=N J=1 нет i>1? нет да J
Программа пузырьковой сортировки массива по возрастанию Program bubble_sort; var a: array [1. . 10] of real; i, j: integer; x: real; // вспомогательная переменная, используемая при перемене мест элементов массива begin randomize; for i: =1 to 10 do // в этом цикле заполняем массив случайными числами от 0 до 100 a[i]: =random(101); for i: =10 downto 1 do //определяем часть массива для рассмотрения for j: =1 to i-1 do //и в оставшейся для рассмотрения части выполняем сортировку: if a[j]>a[j-1] then //если значение текущего элемента больше предыдущего(т. е. если неверный порядок), begin x: =a[j]; // то меняем местами эти два элемента с помощью вспомогательной переменной х a[j]: =a[j-1]; // это т. н. метод трех ведер для перемены мест значений двух переменных a[j-1]: =x; end; for i: =1 to 10 do // выводим получившийся отсортированный массив writeln(a[i]); end;
Другие виды сортировки массивов • Пузырьковая сортировка — один из самых неэффективных алгоритмов (медленный); • Существуют иные алгоритмы сортировки разной степени эффективности: – Сортировка Шелла; – Сортировка выбором; – Гномья сортировка; – Быстрая сортировка; – Сортировка вставками; – И другие…
Спасибо за внимание!


