описания переменных (var) указать его размеры и тип его компонент.

Общий вид описания (одномерного) массива:

array[<тип_индексов> ] 3Напоминаем, что жирная квадратная скобка является обязательным элементом синтаксиса. of <тип_компонент>;

Чаще всего это трактуется так:

array[<левая_граница>..<правая_граница>] of <тип_компонент>;

Например, одномерный (линейный) массив , состоящий не более чем из 10 целых чисел, можно описать следующим образом:

var a1: array of integer;

Нумерация

Нумерация компонент массива не обязана начинаться с 1 или с 0 - вы можете описывать массив, пронумерованный любыми целыми числами. Необходимо лишь, чтобы номер последней компоненты был больше, чем номер первой:

var a1: array [-5..4] of integer;

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

type char = "a","c".."z"; (- отсутствует символ "b")

var a1: array of integer; - 256 компонент

a2: array of integer; - 256 целых компонент

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

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

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

var a4: array of real; - массив из компонент простого типа

a5: array of record1; - массив из записей 4См. лекцию 7.

a6: array[-10..10] of ^string; - массив из указателей 5См. лекцию 12. на строки

a7: array[-1..1] of file; - массив из имен файловых переменных 6См. лекцию 6.

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

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

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

a10 : array of word; - четырехмерный массив 2 х 3 х 256 х 21

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

Описание переменных размерностей

Если ваша программа должна обрабатывать матрицы 7Матрица - двумерная таблица, состоящая из чисел. переменных размерностей (скажем, N по горизонтали и М по вертикали), то вы столкнетесь с проблемой изначального задания массива, ведь в разделе var не допускается использование переменных. Следовательно, самый логичный, казалось бы, вариант

var m,n: integer; a: array of real;

придется отбросить.

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

Предположим, однако, что вам известны максимальные границы, в которые могут попасть индексы обрабатываемого массива. Скажем, N и М заведомо не могут превосходить 100. Тогда можно выделить место под наибольший возможный массив, а реально работать только с малой его частью:

const nnn=100; var a: array of real; m,n: integer;

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

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

Доступ к компонентам линейного массива осуществляется так 8Жирные квадратные скобки являются обязательным элементом синтаксиса. :

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

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

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

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

  1. Индекс компоненты может быть константой, переменной или выражением, куда входят операции и вызовы функций.
  2. Тип каждого индекса должен быть совместим с типом, объявленным в описании массива именно для соответствующего "измерения"; менять индексы местами нельзя.
  3. Количество индексов не должно превышать количество "измерений" массива. Попытка обратиться к линейному массиву как к многомерному обязательно вызовет ошибку. А вот обратная ситуация вполне возможна: например, если вы описали N- мерный массив , то его можно воспринимать как

"Array of const" это массив переменных, декларированных как константы. Непосредственно они представлены структурой TVarRec. Скобки просто ограничивают массив. Массив констант дает вам возможность передавать процедуре переменное количество параметров type-safe (безопасным) способом. Вот пример:

type

TVarRec = record

Data: record case Integer of

0 : (L: LongInt ) ;

1 : (B: Boolean ) ;

2 : (C: Char ) ;

3 : (E: ^Extended) ;

4 : (S: ^string) ;

5 : (P: Pointer ) ;

6 : (X: PChar ) ;

7 : (O: TObject ) ;

end ;

Tag: Byte ;

Stuff: array [ 0 ..2 ] of Byte ;

end ;

function PtrToStr(P: Pointer ) : string ;

const

HexChar: array [ 0 ..15 ] of Char = "0123456789ABCDEF" ;

function HexByte(B: Byte ) : string ;

begin

Result:= HexChar[ B shr 4 ] + HexChar[ B and 15 ] ;

end ;

function HexWord(W: Word ) : string ;

begin

Result:= HexByte(Hi (W) ) + HexByte(Lo (W) ) ;

end ;

begin

Result:= HexWord(HiWord(LongInt (P) ) ) + ":" + HexWord(LoWord(LongInt (P) ) ) ;

end ;

procedure Display(X: array of const ) ;

I: Integer ;

begin

for I:= 0 to High (X) do

with TVarRec(X[ I] ) , Data do

begin

case Tag of

0 : ShowMessage("Integer: " + IntToStr (L) ) ;

1 : if B then

ShowMessage("Boolean: True" )

else

ShowMessage("Boolean: False" ) ;

2 : ShowMessage("Char: " + C) ;

3 : ShowMessage("Float: " + FloatToStr (E^) ) ;

4 : ShowMessage("String: " + S^) ;

5 : ShowMessage("Pointer: " + PtrToStr(P) ) ;

6 : ShowMessage("PChar: " + StrPas (X) ) ;

7 : ShowMessage("Object: " + O.ClassName ) ;

end ;

end ;

end ;

procedure TForm1.Button1Click (Sender: TObject ) ;

P: array [ 0 ..5 ] of Char ;

begin

P:= "Привет" #0 ;

Display([ -12345678 , True , "A" , 1.2345 , "ABC" , Ptr ($1234 , $5678 ) , P,

Form1] ) ;

end ;

Массив констант (array of const) фактически является открытым массивом TVarRec (описание предекларированных типов Delphi вы можете найти в электронной справке). Приведенный ниже "псевдокод" на языке Object Pascal может послужить скелетом для дальнейшего развития:

procedure AddStuff(const A: array of const ) ;

var i: Integer ;

begin

for i:= Low (A) to High (A) do

with A[ i] do

case VType of

begin

{ добавляем натуральное число, все real-форматы

Автоматически приводятся к extended }

end ;

begin

{ добавляем целое число, все integer-форматы

Автоматически приводятся к LongInt }

end ;

begin

if VObject is DArray then

with DArray(VObject) do

begin

{ добавляем массив double-типа }

else if VObject is IArray then

with IArray(VObject) do

begin

{ добавляем массив integer-типа }

end ;

end ;

end ; { Case }

end ; { AddStuff }

Для получения дополнительной информации загляните в главу "open arrays" электронной справки.
Взято из Советов по Delphi от Валентина Озерова
Сборник Kuliba

Массив констант во время выполнения приложения

Автор: Peter Below
...хорошо, непосредственно это синтаксис не поддерживает, поскольку массив констант Array of Const подобен открытым массивам, главным образом в части характеристик времени компиляции. Но вы можете обойти этот неприятный момент, обладая хотя бы начальными знаниями того, как реализован открытый массив. Что нам для этого необходимо: динамически размещенный массив array of TVarRec, который "принимает" ваши параметры, и "псевдоним" (alias) функции Format, позволяющий работать с таким массивом без "ругани" со стороны компилятора.

type

{ объявляем тип для динамического массива array of TVarRecs }

TVarArray = array [ 0 ..High (Word ) div Sizeof (TVarRec) - 1 ] of TVarRec;

PVarArray = ^TVarArray;

{ Объявляем alias-тип для функции Format. Передаваемые параметры будут иметь

В стеке тот же самый порядок вызова, что и при нормальном вызове Format }

FormatProxy = function (const aFormatStr: string ; var aVarRec: TVarRec;

HighIndex: Integer ) : string ;

{ AddVarRecs копирует параметры, передаваемые в массиве A в pRecs^, начиная

С pRecs^. highIndex - самый большой доступный индекс pRecs, число

Распределенных элементов - 1. }

procedure AddVarRecs(pRecs: PVarArray; atIndex, highIndex: Integer ; const A:

array of const ) ;

I: Integer ;

begin

if pRecs <> nil then

for i:= 0 to High (A) do

begin

if atIndex <= highIndex then

begin

PRecs^[ atIndex] := A[ i] ;

Inc (atIndex) ;

end { If }

else

Break ;

end ; { For }

end ; { AddVarRecs }

procedure TScratchMain.SpeedButton2Click (Sender: TObject ) ;

S: string ;

Proxy: FormatProxy;

begin

{ распределяем массив для четырех параметров, индексы - 0..3 }

GetMem (p, 4 * Sizeof (TVarRec) ) ;

{ добавляем параметры последующими вызовами AddVarRecs }

AddVarRecs(p, 0 , 3 , [ 12 , 0.5 , "Шаблон" ] ) ;

AddVarRecs(p, 3 , 3 , [ "Тест" ] ) ;

{ получаем полномочия Format }

@Proxy:= @SysUtils.Format ;

{ Вызов с динамически сгенерированным массивом параметров.

Естественно, строка формата может также быть сформирована

И во время выполнения программы. }

S:= Proxy("Целое: %d, Реальное: %4.2f, Строки: %s, %s" , p^[ 0 ] , 3 ) ;

{ выводим результат }

ShowMessage(S) ;

finally

FreeMem (p, 4 * Sizeof (TVarRec) ) ;

end ;

end ;


Я надеюсь вы поняли принцип. Естественно, имеются ограничения. Вы можете передавать в AddVarRecs числовые величины, строковые переменные и литералы, но не в коем случае не строковые выражения! В этом случае компилятор должен для хранения результата сформировать в стеке временную строку, передать ее в AddVarRecs (или лучше по адресу в TVarRec), и она может прекратить свое существование или может быть перезаписана в стеке другими данными, если в конечном счете вы передадите в Proxy целый массив!
Тестировалось только в Delphi 1.0!

Массив значений (или константа массива или массив констант) – это совокупность чисел или текстовых значений, которую можно использовать в . Константы массива необходимо вводить в определенном формате, например, для чисел {1:2:3:4:5} или для текстовых значений {"Север":"ЮГ":"Восток":"Запад"}.

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

Создание одномерного массива констант

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

  • в диапазон ячеек A 1: A 5 введите, например, 5 последовательных чисел от 1 до 5.
  • в ячейке B1 введите формулу =A1:A5 ;

  • в выделите A1:A5 и нажмите клавишу ;
  • получим некую запись {1:2:3:4:5}, представляющую собой набор значений из диапазона A1:A5

Этот набор значений, как и , обрамлен в фигурные скобки, сами значения разделены двоеточиями. Если бы значения были размещены в строке (в диапазоне A1:E1 ), а не в столбце, то значения были бы разделены точкой с запятой {1;2;3;4;5}.

Создадим константу массива в ячейке B2 . Для этого введем в ячейку выражение ={1:2:3:4:5} и нажмем ENTER . Массив значений не заключается в скобки автоматически, как формулы массива после нажатия CTRL+SHIFT+ENTER . Это необходимо делать вручную. В ячейке отразится только первое значение массива, т.е. 1.

Обычно массив значений не вводят в одну ячейку, т.к. в этом случае невозможно вытащить отдельные значения. Чтобы отобразить все значения нашего массива значений нужно выделить 5 ячеек в столбце (например, B1:B5 ), в ввести выражение ={1:2:3:4:5} и нажать CTRL+SHIFT+ENTER .

Теперь попробуем удалить один элемент массива, например из ячейки B 3 . Получим предупреждение «Нельзя изменить часть массива » - это определенного вида защита массива.

Чтобы избежать утомительного ввода для вертикального массива констант можно воспользоваться формулой =СТРОКА(1:5) . Записав ее любой пустой ячейке, выделите ее в строке формул и нажмите , а затем нажмите ENTER . Получите массив констант {1:2:3:4:5} . Скопируйте содержимое ячейки в буфер обмена (CTRL+C ), затем выделите вертикальный диапазон ячеек, соответствующий размерности массива, вставьте в активную ячейку содержимое Буфера обмена и нажмите CTRL+SHIFT+ENTER.

Чтобы избежать утомительного ввода последовательных чисел для горизонтального массива констант используйте формулу =ТРАНСП(СТРОКА(1:5)) или =СТОЛБЕЦ(A:E) . Получите массив констант ={1;2;3;4;5} . Значения массива будут разделены точкой с запятой.

Применение массива констант

А. Умножение векторов (столбец на столбец, строку на строку)
С помощью формулы массива умножим столбец значений (B 2: B 6 ) на массив констант {1:2:3:4:5} и просуммируем. Массив констант записан в «вертикальном» виде с использованием двоеточия, т.е. также представляет собой столбец. Размерности столбца и массива должны совпадать.

СУММ(B2:B6*{1:2:3:4:5})

После ввода формулы необходимо нажать CTRL+SHIFT+ ENTER .

Формула массива сначала выполнит поэлементное умножение значений из столбца и констант из массива. Эквивалентом данной формулы является следующее обычное выражение:

СУММ(B2*1;B3*2; B4*3; B5*4; B6*5)

В последнюю очередь выполняется сложение значений при помощи функции СУММ() .

Б. Проверка значений
Проверим, равно ли значение в ячейке А1 одному из определенных значений: 4, 6 или 9.

ИЛИ(A1={4;6;9})

После ввода формулы нет необходимости нажимать CTRL+SHIFT+ENTER . Такая запись может существенно сократить время создания формулы по сравнению с использованием вложенных функций ЕСЛИ() .

Именование массива констант

Массиву констант можно присвоить . Обычно так поступают с константами, образующими группу однотипных значений, например последовательности с конечным количеством элементов ={1:2:3} .

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

  • на вкладке Формулы в группе Определенные имена выберите команду Присвоить имя .
  • В поле Имя введите Массив123 .
  • В поле Диапазон введите массив констант (не забудьте ввести скобки вручную), например {1:2:3} ;
  • Нажмите кнопку ОК.

Пример, найдем , записав формулу =СУММПРОИЗВ(НАИБОЛЬШИЙ(A1:A10;Массив123)) .

Предполагается, что в диапазоне A1:A10 имеется список числовых значений.

Создание двумерного массива констант

Чтобы создать двумерный массив констант необходимо сделать следующее:

  • выделите в книге диапазон ячеек из четырех столбцов и трех строк (A1:D3 ).
  • в активной ячейке (А1 ), в Cтроке формул введите выражение ={1;2;3;4: 5;6;7;8: 9;10;11;12}
  • нажмите сочетание клавиш CTRL+SHIFT+ ENTER

Тема 4. Формулы с массивами

Массивы являются удобным средством обработки групп однотипных данных. Массиы могут быть аргументами в некоторых функциях или формулах, возвращающих в результате вычислений либо единственное значение, либо массив новых значений. Формулы, возвращающие массив результатов, называются табличными формулами или формулами массива . Блок ячеек, в котором используется общая формула, называется интервалом массива . Массив представляет собой определенным способом организованный список каких-либо данных.

В формулах Excel можно использовать массивы констант. Массив констант строится как совокупность значений, заключенных в фигурные скобки и разделенных точкой с запятой. Массивы могут иметь различную размерность. Различают одномерные и двумерные массивы. Например, одномерный массив, размерностью 1×3, состоящий из одной строки и трех элементов в этой строке и содержащий элементы:

записывается как {5;7;9} , т.е. представляет собой совокупность значений массива, заключенных в фигурные скобки и разделенных точкой с запятой. Это горизонтальный одномерный массив (вектор-строка). Чтобы записать одномерный массив вертикально (вектор-столбец):

следует записать {5:7:9} , т.е. записать совокупность значений массива в фигурных скобках и разделить их двоеточием.

Двумерный массив состоит из нескольких строк и столбцов. Например, двумерный массив, размерностью 2×3, (состоящий из двух строк и трех столбцов), содержащий элементы:

записывается как {11;13;15:17;19;21} , т.е. представляет собой совокупность значений массива, заключенных в фигурные скобки, при этом значения, расположенные в одной строке отделяются друг от друга точкой с запятой, а строки двоеточием.

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

представляется как {«a»;«b»;«c»:1;2;3} .

Пусть имеются два двумерных массива:

Найти массив, каждый элемент которого представляет собой сумму соответствующих элементов исходных массивов:

Выполним следующие действия:

Выделим блок ячеек, в котором должны расположиться элементы результирующего массива: В2:С3.

Не сбрасывая выделения, в текущую ячейку (или в строку формул) введем выражение:

={1;2:3;4}+{10;20:30;40}.

Одновременно нажмем комбинацию клавиш Ctrl+Shift+Enter. Использование такой комбинации клавиш сообщает Excel, что вводится формула с массивами. Excel автоматически добавляет фигурные скобки при вводе табличной формулы. Эти скобки видны в строке формул, но если эти скобки ввести «вручную», формула будет воспринята как текст. Операндами этой формулы являются массивы констант.



В выделенном диапазоне получим элементы результирующего массива. Формулы с массивами выдали более одного результата: в режиме решения видим массив чисел изображенный на рисунке 224, в режиме показа формул – массив формул на рисунке 225.

Рисунок 224

Рисунок 225

Как видно из рисунка 225, в каждой ячейке выделенного диапазона записана формула, введенная в текущую ячейку. Эта «единичная» формула как бы существует одновременно в четырех ячейках в виде различных формул выделенного диапазона. Но внести изменения в них по отдельности нельзя. Это можно сделать, только выделив весь интервал В 2:С 3. Интервал В 2:С 3 представляет собой интервал массива, и табличная формула хранится в каждой ячейке.

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

Например, пусть одна из компонент – двумерный массив, состоящий из двух строк и трех столбцов. Для представления результатов вычисления по формуле ={1;2;3:4;5;6}*2 требуется выделить блок ячеек 2×3.

Одна из компонент исходного массива – массив 2×3, а другая – одиночное значение. При вычислении по этой формуле автоматически будет расширена вторая компонента до массива размерности 2×3 и произойдет вычисление по этой формулы как ={1;2;3:4;5;6}*{2;2;2:2;2;2}. Результат представлен на рисунке 226.