Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
attachments_03-09-2012_10-20-12 / Массивы.doc
Скачиваний:
42
Добавлен:
21.05.2015
Размер:
149.5 Кб
Скачать

Массивы. Основные операции над ними. Алгоритмы обработки массивов. Структурные типы данных. Способы представления в памяти.

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

Память, выделяемая под переменные структурного типа, по умолчанию, выравнивается по границам Word(блоками, кратными машинному слову – 4 байта) для более быстрого доступа. Например, для типовByte,BooleanилиCharбудет выделено 4 байта, хотя фактический размер хранимых данных составляет 1 байт. При объявлении структурного типа можно включить зарезервированное слово packedдля того, чтобы уменьшить память, которую занимают данные. В этом случае данные структурного типа будут упакованы. Использование этого слова замедляет доступ к данным, но обеспечивает их компактное хранение.

Описание статических массивов в программе. Доступ к элементам.

Все рассмотренные ранее типы данных позволяют обрабатывать одиночные объекты: числа, символы и т.д. Однако, часто при решении задач необходимо использовать структуры данных, содержащие множество однотипных элементов. Для обработки таких данных и служит массив.

Массив - структурированный тип данных, состоящий из фиксированного числа элементов одного типа. Например, при обработке результатов многократных замеров температуры воздуха в течение года удобно рассматривать значения температур как массив вещественных чисел. Число элементов массива фиксируется при описании типа и в процессе выполнения программы не изменяется. Для доступа к элементу массива необходимо указать имя массива и в квадратных скобках его номер. Для описания массивов используется служебное слово array. Описание переменной типа массив имеет вид:

var<имя переменной>: array[i..i1,j..j1]of<тип элементов>,

где i, i1 - границы первого индекса массива,

j, j1 - границы второго индекса массива.

Например:

var a: array [1..10] of integer; {массив из 10 целых чисел с номерами 1,2, …10}

Каждый элемент массива помечается целым числом или элементом другого порядкового типа, который называется индексом элемента. Массив задается указанием верхней и нижней границ индексов элементов массива (диапазоном индексов) и типом элементов массива. Диапазоном служат разделенные двумя точками (знак “..”) верхняя и нижняя границы массива. Память для статического массива выделяется в процессе компиляции программы, поэтому в качестве границ диапазонов могут выступать либо целые числа, либо константы, определенные в разделе констант, либо составленные из них выражения. Но необходимо помнить, что эти константы должны быть определены до использования. Статический массив не может быть переменной длины!

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

Примеры:

const N=100;

type

color = (white, black, red, blue, green, yellow, brown);

var

a,s,g:array [1 ..N] of integer;{целочисленные индексы}

b:array [color] of char;{ индексы перечисляемого типа}

c:array [char] of color;{ индексы символьного типа}

d:array[‘a’..’z’] of real;{ индексы символьного типа}

k:array[Boolean] of byte;{ индексы логического типа}

Доступ к каждому элементу массива осуществляется с помощью индекса, т.е. порядкового номера элемента массива. Когда мы хотим обратиться к элементу массива, надо указать имя массива и порядковый номер элемента: a[1],b[red],c['z'],d['s']. Если указано только имя массива - речь идет обо всем массиве (a, s иdи т.д.). Для массивов определена единственная операция – операция присваивания для однотипных массивов. Например,s:=a(такая операция означает, что все элементы массиваaкопируются в соответствующие элементы массиваs). Все остальные операции определены для элементов согласно их типу. При обработке массива нужно последовательно обрабатывать все его элементы; при вводе массива необходимо последовательно вводить 1-й, 2-й и 3-й и т.д. элементы массива; аналогично и при выводе. Если статический массив создан, но значения назначены не во все элементы, неиспользованные элементы занимают память и содержат произвольные данные.

Массив в памяти располагается непрерывным блоком. Для доступа к элементу массива программе необходимо определить его адрес An. Этот адрес определяется по адресу начала массива в памятиAbase, размеру одного элементаRи номеру элементаn. Если нумерация массива начинается с нуля, то программе для вычисления адреса элемента с номеромnпотребуется три целочисленные операции –An=Abase+n*R(к адресу начала массива необходимо прибавить смещение - номер элементаnумноженный на размер элементаR). Если нумерация начинается с ненулевого значенияk, то требуется 4 целочисленные операции -An=Abase+(n-k)*R. Из вышесказанного можно сделать вывод о том что, при описании массивов выгоднее индексацию начинать с нуля (в некоторых языках программирования индексация массивов всегда начинается с нуля). Время обработки такого массива может оказаться на 10 –20% меньше времени обработки массива аналогичной длины, но с начальным индексом, отличным от нуля. Этот факт желательно учитывать при многократной обработке больших массивов данных. При работе с небольшим объемом данных разница во времени будет несущественна.

Второй способ описать массив – это ввести новый тип данных, а потом ввести переменные нового типа. В этом случае формат описания следующий:

type

<имя типа> = array[ <тип индекса>]of <тип компонентов>;

Второй способ предпочтительнее тогда, когда одинаковый тип используется несколько раз. Второй способ обязателен, если вы хотите сделать совместимыми несколько переменных (в операторе присваивания) или переменные и параметры (при вызове процедуры или функции).

Пример:

const n=100;

type

vector:array[0..n] of integer;

var a,b,c:vector;

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

Пример описания типа матрицы.

const n=3;m=5;

type

vector:array[1..n] of integer;

matrix: array[1..m] of vector;

var v : vector;

C,D:matrix;

При таком описании вектором (vector) является строка матрицы из 3-х целых чисел, а сама матрица (matrix) это набор из 5 строк (векторов). Матрицы в памяти располагаются построчно – элементы первой строки, второй и т.д. Для обращения к элементу матрицы необходимо указывать два индекса через запятую, первый индекс определяет – номер строки, второй – положение элемента в строке (номер столбца). Приведем примеры возможных операций для матрицСиD. Если после имени такой переменной не указывается никаких индексов, то это матрицы целиком, если один индекс – это строка матрицы с указанным номером, если два индекса – это элемент в заданной строке в заданном столбце.

D:=C; {все элементы матрицыСскопировать в соответствующие элементы матрицыD}

V:=C[1];{все элементы первой строки матрицыCскопировать в одномерный массивv}

C[2,3]:=5;или C[2][3]:=5; {в третий элемент второй строки матрицыCзаписать число 5}

V:=D[1]; D[1]:=D[m]; D[m]:=V; {поменять местами первую и последнюю строки матрицыD, используя третью переменнуюV}

Такую же структуру можно получить, используя другую форму записи (обратите внимание, что первыми указываются индексы строк, матрица mстрок иnстолбцов).

const n=3;m=5;

type matrix = array [1..m,1..n] of integer;

vector:array[1..n] of integer;

var C,D:matrix; v : vector;

или

var C,D:array [1..m,1..n] of integer; v : vector;

При таком описании доступ к отдельным строкам, как к единому целому, невозможен. Можно оперировать или матрицами целиком, или их элементами. Т.е. операция V:=D[1];недопустима.

Аналогично можно ввести 3-мерный массив или массив большего числа измерений

type MatrixArray=array [1..10,1..5,1..3] of integer;

varb: MatrixArray;

или

const n=3;m=5; k=10

type

vector:array[1..n] of integer;

matrix: array[1..m] of vector;

MatrixArray:array[1..k] of matrix;{массив, состоящий из матриц}

var b: MatrixArray;

Переменную bможно использовать для хранения оценок по нескольким предметам для нескольких групп. Тогдаvector– это оценки одного ученика по трем предметам,matrix– оценки одной группы из пяти человек. Для доступа к значениям такой структуры указываются три индекса, например,b[2,3,1]:=5 будет означать запись оценки 5 по первому предмету для третьего ученика из второй группы. Первый индекс обозначает номер группы, второй – номер ученика, а третий – номер предмета. Если переменнаяbиспользуется с одним индексом (b[2]) – это целиком оценки одной группы с номером два, если два (b[2,4]) – это оценки четвертого ученика из второй группы.