Лекция 7 Массивы и их обработка
Массивы l l l Массивом называется набор однотипных переменных, каждому элементу которого присвоен некоторый порядковый номер, что обеспечивает простоту доступа к каждому элементу. Массивы предназначены для хранения большого количества некоторых однотипных данных. Возможно использование одномерных ( «вектора» ), двумерных ( «матрицы» ) или многомерных массивов. Массивы в языке Паскаль описываются при помощи зарезервированного слова array. Каждый массив представляет собой новый тип данных. Удобнее присвоить этому типу данных новое имя и определить данный тип в разделе описания типов.
Описание одномерного массива l l l l Для описания одномерных массивов используется строка следующего вида в разделе описания типов: имя_типа = array [ диапазон ] of тип; Здесь array и of – зарезервированные слова, диапазон – диапазон порядковых номеров элементов, может быть любым порядковым типом кроме longint, тип – тип элементов массива. Примеры: Type // заголовок раздела описания типов atype = array [1. . 10] of real; // тип-массив из 10 вещественных чисел с номерами от 1 до 10 mass = array [byte] of char; // тип-массив из 256 элементов с номерами от 0 до 255 символьного типа
Описание одномерного массива l l l l Для введения переменной массивного типа надо в разделе описания переменных определить переменную определенного выше типа: Var a, b: atype; // a и b массивы типа atype c: mass; // c – массив типа mass Определить переменную как массив можно и непосредственно при описании этой переменной, без предварительного описания типа массива, например: Var а, b : array [0. . 100] of byte; // a и b – массивы из 101 элемента типа byte. Однако для структурирования программы упрощения работы с массивами рекомендуется предварительное описание массивов как типов данных. Для доступа к элементу массива необходимо указать имя массива и номер элемента в квадратных скобках: a[4], b[3]. Для однотипных массивов справедлива операция присваивания: a: =b;
Пример работы с массивом l l l Рассмотрим пример работы с массивом – генерацию случайного массива из целых чисел: program arr 1; type mass=array [1. . 10] of integer; //описание типа-массива var a: mass; // описание массива (массивной переменной) i: integer; begin randomize; for i: =1 to 10 do a[i]: =random(10); // генерация массива for i: =1 to 10 do write(a[i], ' '); //вывод массива на экран readln; end.
Многомерные массивы l l l l l В качестве типа элементов может использоваться любой тип языка Паскаль, в частности другим массивом, например: Type matrix = array [1. . 5] of array [1. . 3] of real; Получаем массив из массивов или двумерный массив. Такую запись можно заменить более компактной: Type matrix = array [1. . 5, 1. . 3] of real; Введем переменную типа матрица: Var m: matrix; // m – матрица из 5 строк и 3 столцов Доступ к элементам двумерного массива осуществляется при помощи одного из следующих эквивалентных обращений: m[2, 3] или m[2][3]. Аналогично можно определить массивы большей размерности: Type Quadarr = array [1. . 10, 0. . 2, 2. . 12] of real; // описание четырехмерного массива.
Пример: Генерация случайной матрицы l l l l program arr 2; const m=5; n=3; type matrix=array [1. . m, 1. . n] of integer; // тип-матрица из m строк и n столбцов var a: matrix; i, j: integer; begin randomize; for i: =1 to m do for j: =1 to n do a[i, j]: =random(10); for i: =1 to m do begin for j: =1 to n do write(a[i, j], ' '); //вывод строки writeln; // переход на другую строчку после выведенной строки end; readln; end.
Массивы и подпрограммы l l l l Для описания массивов как аргументов подпрограмм необходимо их предварительное описание как пользовательских типов данных. Таким образом подобное определение подпрограммы приведет к ошибке: Procedure S (a: array [1. . 10] of Real); Правильно будет определить параметр для данной процедуры следующим образом: Type atype = array [1. . 10] of Real; Procedure S (a: atype); В последних версиях языка Паскаль (Object Pascal и Free Pascal) массивы могут быть результатом пользовательских функций, так что будет справедливо следующее объявление: Function f(a: atype): atype;
Примеры функций работы с массивами program arr 3; const n=10; type mass=array [1. . n] of integer; var a: mass; i: integer; //--------------------function setarr(nn, c, d: integer): mass; var i: integer; begin randomize; for i: =1 to nn do setarr[i]: =random(d-c)+c; //создание случайных чисел от //c до d end; procedure printarr(m: mass; nn: integer); var i: integer; begin for i: =1 to nn do write(m[i], ' '); end; //--------------------begin a: =setarr(10, 0, 10); printarr(a, 10); readln; end. Пример работы программы: 1295170187
Алгоритмы работы с массивами l l l Использование массивов является наиболее популярным инструментом современного алгоритмического программирования. Среди наиболее важных методов обработки массивов являются алгоритмы суммирования, нахождения среднего арифметического, максимального и минимального значений массивов. Особое место в теории и практике современного программирования занимают алгоритмы сортировки массивов. Далее рассмотрим основные алгоритмы обработки массивов. Все примеры будут основаны на случайных целых массивах, описание которых началось на предыдущей странице.
Сумма и среднее арифметическое При вычислении суммы элементов массива вводится переменная суммирования с начальным значением 0. const n=100; type mass=array [1. . n] of integer; var a: mass; nn, i, s: integer; sa: real; //подпрограммы из предыдущего примера function sumarray (m: mass; nn: integer): integer; var i, s: integer; begin s: =0; for i: =1 to nn do s: =s+m[i]; sumarray: =s; end; function avearray(m: mass; nn: integer): real; begin avearray: =sumarray(m, nn)/nn; end; //--------------------begin nn: =10; a: =setarr(nn, -10, 10); printarr(a, nn); s: =sumarray(a, nn); sa: =avearray(a, nn); writeln('Summa elementov=', s); writeln('Srednee=', sa: 1: 3); readln; end.
Нахождение максимального и минимального элементов l l Основная идея нахождения максимального (минимального) элемента заключается в последовательном переборе всех элементов массива. Вначале максимальным (минимальным) элементом массива принимается его первый элемент. Далее берется второй элемент и сравнивается с максимальным (минимальным). Если второй больше (меньше) максимального (минимального) он становится максимальным (минимальным). Таким способом производится перебор всех элементов массива и определяется максимальный и минимальный элемент.
Нахождение максимального и минимального элементов const n=100; type mass=array [1. . n] of integer; var a: mass; i, nn, s, min, max: integer; sa: real; //подпрограммы из предыдущих примеров function maxarray(m: mass; nn: integer): integer; var i, x: integer; begin x: =m[1]; for i: =2 to nn do if m[i]>x then x: =m[i]; maxarray: =x; end; function minarray(m: mass; nn: integer): integer; var i, x: integer; begin x: =m[1]; for i: =2 to nn do if m[i]<x then x: =m[i]; minarray: =x; end; begin nn: =10; a: =setarr(nn, -10, 10); max: =maxarray(a, nn); min: =minarray(a, nn); writeln('Min=', min); writeln('Max=', max); readln; end.
Сортировка массивов l l l Под сортировкой будем понимать процесс перестановки элементов данного множества в определенном порядке. Цель сортировки – облегчить последующий поиск элементов в отсортированном множестве. Основное требование к методам сортировки массива – экономное использование памяти. Поэтому выполнять сортировку необходимо «на том же месте» , т. е. не используя копирование массива. Рассмотрим два распространенных простых метода сортировки: сортировку выбором и сортировку обменом. Данные алгоритмы не являются наиболее эффективными методами сортировки, однако достаточно эффективны и несложно реализуемы.
Сортировка выбором l l l При сортировке выбором по возрастанию вначале выбирается элемент массива с максимальным значением и меняется местами с последним элементом. Затем выбирается максимальный из оставшихся элементов и меняется местами с предпоследним элементом массива. И так продолжается до тех пор, пока массив не будет отсортирован.
Сортировка выбором. Пример подпрограммы procedure vsortarray(var m: mass; nn: integer); var i, j, k, max, nm: integer; begin for i: =1 to nn-1 do begin max: =m[1]; nm: =1; //поиск максимального значения и его номера for j: =2 to nn-i+1 do if m[j]>max then begin max: =m[j]; nm: =j; end; k: =m[nm]; m[nm]: =m[nn-i+1]; m[nn-i+1]: =k; //замена элементов end;
Сортировка выбором. Применение подпрограммы Program vsort; const n=100; type mass=array [1. . n] of integer; var a: mass; n: integer; // подпрограммы begin nn: =10; a: =setarr(nn, -10, 10); printarr(a, nn); vsortarray(a, nn); printarr(a, nn); readln; end. Пример реализации: 5 1 -5 -5 -9 0 -8 2 6 -9 -9 -9 -8 -5 -5 0 1 2 5 6
Сортировка обменом l l l При сортировке обменом (или “пузырьковом методе”) производится обмен между соседними элементами. При сортировке по возрастанию вначале сравниваются первые два элемента и, если первый больше второго, меняются местами. Затем второй и третий и т. д. После прохода всего массива на последнем месте окажется максимальный элемент. После чего проводим операцию заново, уже до предпоследнего элемента, и т. д. пока массив не будет полностью отсортирован.
Сортировка обменом. Пример подпрограммы procedure osortarray(var m: mass; nn: integer); var i, j, k, max, nm: integer; begin for i: =1 to nn-1 do begin for j: =1 to nn-i do if m[j]>m[j+1] then // сравнение соседних элементов begin k: =m[j]; m[j]: =m[j+1]; m[j+1]: =k; // обмен значениями end; Использование данного алгоритма аналогично предыдущему: osortarray(a, nn); printarr(a, nn);
Пример работы с матрицей Напишем программу, меняющую местами строки в случайно заданной целочисленной квадратной матрице. program arr 5; const n=5; type matrix=array [1. . n, 1. . n] of integer; var a: matrix; i, j, k 1, k 2: integer; //-----------------------function setmatr(nn: integer): matrix; var i, j: integer; begin randomize; for i: =1 to nn do for j: =1 to nn do setmatr[i, j]: =random(10); end; l procedure printmatr(a: matrix; nn: integer); var i, j: integer; begin for i: =1 to nn do begin for j: =1 to nn do write(a[i, j], ' '); writeln; end; procedure changematr(var a: matrix; nn, i 1, i 2: integer); var i, j, k: integer; begin for j: =1 to nn do begin k: =a[i 1, j]; a[i 1, j]: =a[i 2, j]; a[i 2, j]: =k; end;
Пример работы с матрицей l Основнаяпрограмма имеет вид: begin a: =setmatr(5); printmatr(a, 5); writeln; changematr(a, 5, 3, 4); printmatr(a, 5); readln; end. l Пример работы программы: