Массивы и переменные с индексами
В языке Object Pascal для хранения и обработки упорядоченных совокупностей данных различной природы (различных типов, в частности, векторов и матриц, элементами которых являются вещественные или целые числа) введено понятие массив. Массив – это упорядоченная совокупность однотипных данных, которая характеризуется: - своими именами; - типом хранимых данных; - нумерацией элементов; - размером (числом хранимых элементов); - размерностью. В программе на языке Object Pascal (в дальнейшем просто в программе) каждый массив должен быть описан (объявлен) в разделе описания типов (после ключевого слова type(тип)) или в разделе описания переменных (после ключевого слова var).Описания записываются перед началом записи исполняемых операторов модуля. Под типом в Object Pascal понимают множество допустимых значений, которые может иметь каждый элемент массива, множество допустимых операций для массива и формат внутреннего представления каждого элемента массива в памяти ПК. Для компилятора описание типа массив определяет: - объём памяти, который необходимо выделить для размещения всех элементов массива; - набор допустимых операций, который программист может применять для элементов массива. Каждое описание массива заканчивается символом “;” и иногда называется неисполняемым оператором (т.е. только представляющем информацию компилятору о массиве) или строкой программы. Например, - если необходимо описать вектор x(x1,x2 …,x20), элементами которого являются целые числа, следует после слова var записать:
… var x: array [1..20] of integer; (7.9) … - если необходимо описать две матрицы A={aij}, B={aij} (i=1,2, … 13; j=1,2, …, 21), элементами которых являются вещественные числа, то следует записать: … var a,b: array [1..13, 1..21] of real; (7.10) … Как следует из примеров, описаниe массива начинается с записи имени (или нескольких имён, перечисленных через”,”), после которого через символ “:” записывается ключевое слово array (массив). За словом array в квадратных скобках указывается диапазон, т. е. нижняя и верхняя границы изменения индекса, разделённых символов.., с помощью которых компилятор определяет общее количество элементов массива. Запись <Нижняя граница>.. <Верхняя граница> образует тип-диапазон. Если массив двумерный (т. е. матрица), то тип-диапазон второго индекса записывается через,. За словом of (из) указывается тип элементов, образующих массив. Трёхмерный массив (совокупность “плоских” матриц), элементами которого имеют строковый тип, можно описать: … var massiv: array [1..20, 1..30, 1..7] of string; … В общем случае описание массивов задастся следующим образом: … var <Список имён>: array [<Список типа-диапазон>] of <Тип>; где: <Тип> – любой тип Object Pascal. В памяти ПК элементы массива следуют друг за другом так, что при переходе от младших адресов к старшим наиболее быстро меняется самый правый индекс. Иногда описания массивов производят в такой последовательности: в разделе type (тип) указывают имя типа, диапазоны изменения индексов и тип элементов массива, а затем в разделе var указывают конкретные имена массивов (переменных, имеющих тип массив). Например, описание массивов в примерах (9), (10) можно выполнить следующим образом: … type vector = array [1..20] of integer; matr = array [1...13, 1...21] of real; var x: vector; a, b: matr; … Доступ к элементам массива осуществляется по индексу (номеру). Этот индекс указывается в квадратных скобках сразу за именем массива (такое действие называется индексированием). Запись: <Имя массива> [<Список индексов>] называется переменной с индексом, где <Список индексов> – один или несколько индексов, перечисленных через ”,”. Переменная с индексами именует значение, являющееся одним элементом массива. Элемент массива, именуемый данной переменной с индексами, определяется текущими значениями индексов этой переменной. Каждый индекс по своему смыслу принимает целочисленное значение, т.е в простейшем случае может иметь тип integer(целый). Примеры: 1. Значением переменной а [2,3] является элемент матрицы а23; 2. Значение переменной а[i,j] определяется текущими значениями i и j; 3. Для получения вещественной матрицы В={bij} (i,j=1,2,…7) каждый элемент, который равен 0 необходимо: - в разделе описания переменных дать описание двухмерного массива с именем b и двух переменных целого типа i,j: … var b: array [1..7,1..7] of real; i,j: integer; … - в разделе реализации (после ключевого слова implementation (реализация)) в нужном месте записать операторы цикла, в которых оператором присваивания каждому элементу массива b присваивается значение 0.0: … for i:=1 to 7 do for j:=1 to 7 do b[i,j]:=0.0; … В Object Pascal введены динамические массивы - это массивы у которых нижняя граница индексов по любому измерению равна 0, а верхняя граница (следовательно и объем памяти ПК для размещения всех элементов массива) устанавливается при выполнении программы с помощью стандартной процедуры SetLength (установить длину). Динамические массивы обычно применяются когда, размер обрабатываемых массивов неизвестен и определяется при выполнении программы в зависимости от действий пользователя или объема обрабатываемой информации. Описание (объявление) массива содержит только его имя и тип элементов, при этом компилятором не выделяется память для элементов массива. Например; -описание вещественного вектора а(а1,а2,…аn) может выглядеть так: … var a:array of real; … - описание вещественных матриц B={bij} и C={cij}(i=1,2,…m; j=1,2,…n) может выглядеть: … var b, c: array of array of real; … Это описание в переводе можно читать так: b и с – это массивы из массивов, элементами которых является вещественный тип. Для выделения компилятором памяти для элементов динамических массивов следует вызвать стандартную подпрограмму SetLength операторами: SetLength(а,10); которая выделит для массива a место в памяти под 10 элементов и задаст нулевые значения всех элементов; SetLength(b,7,8); которая выделит для массива b место в памяти под 7*8=56 элементов и задаёт нулевые значения всех элементов; SetLength(с,10,5); которая выделит для массива с место в памяти под 10*5=50 элементов и задаст нулевые значения всех элементов; Поскольку индексы динамического массива – всегда целые числа, начинающиеся с 0, то: массив а содержит элементы от а[0] до а[9]; массив b содержит 7 строк с нумерацией от 0 до 6 и 8 столбцов с нумерацией от 0 до 7; массив с содержит 10 строк с нумерацией от 0 до 9 и 5 столбцов с нумерацией от 0 до 4. Доступ к элементам динамических массивов осуществляется так же, как и для статических массивов. Например,
Повторный вызов SetLength к уже существующему в памяти массиву изменяет его размер. Если новое значение верхней границы больше предыдущего, то все значения элементов сохраняются и в конце добавляются новые нулевые элементы. Если же новое значение верхней границы меньше предыдущего, то массив усекается и в нем остаются значения первых элементов. Удалить из памяти динамический массив можно одним из 3-х способов: -оператором присваивания: … a:=nil; ... т.е. массиву а присвоить значение nil(ничего); -вызвать стандартную процедуру Finalize оператором … Finalize(a); … -вызвать стандартную процедуру SetLengthоператором … SetLength(a,0); …
|