Ветвления. Массивы. Циклы. Использование константы для ввода значений в строку. Константы - многомерные массивы

"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!

В Microsoft Excel можно создавать массивы, которые не хранятся в диапазонах ячеек. Их принято называть массивами констант . В этом уроке Вы узнаете, что же такое массивы констант и как с ними работать в Excel.

Коротко о массивах констант

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

Такой массив можно использовать в формулах Excel. Например, следующая формула суммирует значения этого массива:

СУММ({1;2;3;4;5;6})

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

МАКС({1;2;3;4;5;6}+{7,8,9,10,11,12})

Массивы констант могут содержать числа, текст, логические значения и значения ошибки #Н/Д :

={12;"Текст";ИСТИНА;ЛОЖЬ;#Н/Д}

У Вас может возникнуть резонный вопрос: Зачем нужен такой массив? Отвечу на него в виде примера.

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

На рисунке ниже приведен список студентов, которые получили определенные оценки:

Наша задача перевести оценку из числового вида в ее словесное описание и вывести соответствующие значения в диапазоне C2:C7. В данном случае создавать отдельную табличку для хранения текстового описания оценок не имеет смысла, поэтому выгоднее создать следующий массив констант:

={"";"Неудовл.";"Удовл.";"Хорошо";"Отлино"}

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

Тогда формула, возвращающая нужный нам результат, будет выглядеть следующим образом:

В этом примере функция ИНДЕКС возвращает значение элемента из массива констант, положение которого задано порядковым номером (оценкой).

Данная формула не является формулой массива, хоть она и содержит массив. Поэтому при ее вводе достаточно нажать клавишу Enter .

Конечно же, мы в силах скопировать данную формулу в остальные ячейки и получить нужный нам результат:

Но грамотнее будет использовать многоячеечную формулу массива. Выглядеть она будет следующим образом:

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

Не забывайте указывать знак равенства в поле Диапазон , иначе Excel воспримет массив как текстовую строку.

Теперь формула выглядит менее пугающей:

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

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

Массив значений (или константа массива или массив констант) – это совокупность чисел или текстовых значений, которую можно использовать в . Константы массива необходимо вводить в определенном формате, например, для чисел {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
описания переменных (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- мерный массив , то его можно воспринимать как