Массивы констант. Ветвления. Массивы. Циклы
Тема 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.
Массив значений (или константа массива или массив констант) – это совокупность чисел или текстовых значений, которую можно использовать в . Константы массива необходимо вводить в определенном формате, например, для чисел {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
Если ввести формулу массива , вы чаще всего использовать диапазон ячеек на листе, но вам не нужно. Вы также можете использовать константы массива , просто введите в строке формул фигурные скобки значения: {}. Затем вы можете имя константы чтобы облегчить для повторного использования.
Константы можно использовать как в формулах массива, так и отдельно от них.
Использование константы для ввода значений в столбец
Чтобы ввести значения в один столбец, например в три ячейки столбца C, сделайте следующее.
Использование константы для ввода значений в строку
Чтобы быстро ввести значения в одну строку, например в ячейки F1, G1 и H1, сделайте следующее.
Использование константы для ввода значений в несколько столбцов и строк
Использование константы в формуле
Теперь, когда вы уже познакомились с константами массива, рассмотрим практический пример.
Введите или скопируйте и вставьте в любую пустую ячейку следующую формулу, а затем нажмите клавиши CTRL+SHIFT+ВВОД:
=СУММ(A1:E1*{1,2,3,4,5})
В ячейке A3 появится значение 85 .
Что произошло? Вы умножили значение в ячейке A1 на 1, значение в ячейке B2 на 2 и т. д, а затем с помощью функции СУММ выполнили сложение этих результатов. Эту же формулу вы могли ввести в виде =СУММ(A1*1,B1*2,C1*3,D1*4,E1*5) .
А при желании можно ввести оба набора значений в виде констант массива:
=СУММ({3,4,5,6,7}*{1,2,3,4,5})
Для этого скопируйте формулу, выделите пустую ячейку, вставьте формулу в строку формул, а затем нажмите клавиши CTRL+SHIFT+ВВОД. Вы получите такой же результат.
Примечания: Если константы не работают
описания переменных (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Жирные квадратные скобки являются обязательным элементом синтаксиса. :
<имя_массива>[<индекс_компоненты>]
а многомерного - так:
<имя_массива>[<индекс>,_,<индекс>]
Правила употребления индексов при обращении к компонентам массива таковы:
- Индекс компоненты может быть константой, переменной или выражением, куда входят операции и вызовы функций.
- Тип каждого индекса должен быть совместим с типом, объявленным в описании массива именно для соответствующего "измерения"; менять индексы местами нельзя.
- Количество индексов не должно превышать количество "измерений" массива. Попытка обратиться к линейному массиву как к многомерному обязательно вызовет ошибку. А вот обратная ситуация вполне возможна: например, если вы описали N- мерный массив , то его можно воспринимать как
Константы типа массивов
Объявление константы типа массива определяет значения компонентов массива.
Тип компонентов массива может быть любым, кроме файлового .
Пример
type
Status = (Active, Passive, Waiting);
StatusMap = array of String;
const StatStr: StatusMap = ("Active", "Passive", "Waiting");
{ компоненты StatStr:
StatStr = "Active"
StatStr = "Passive"
StatStr = "Waiting" }
Символьные массивы
Упакованные константы со строковым типом (символьные массивы) могут быть определены и как одиночные символы, и как строки. Например, такое определение:
const Digits: array of Char = ("0", "1", "2", "3", "4", "5",
"6", "7", "8", "9");
может быть выражено более коротко:
const Digits: array of Char = "0123456789";
Нуль-основанные символьные массивы
Нуль-основанный символьный массив - это такой массив, в котором индекс первого элемента равен нулю, а последнего - положительному ненулевому целому числу. Например:
array of Char;
Если вы включаете расширенный синтаксис (с помощью директивы компилятора {$X+} ), то нуль-основанный символьный массив может быть инициализирован строкой, длина которой меньше, чем объявленная длина массива. Например:
const FileName = array of Char = "TEST.PAS";
Если строка короче, чем длина массива, то оставшиеся символы устанавливаются равными NULL (0), и массив будет содержать строку с нулевым окончанием .
Константы - многомерные массивы
Такие константы определяются заключением констант каждой размерности в отдельные наборы круглых скобок, разделенные запятыми.
Например, такое объявление:
type
Cube = array of Integer;
const Maze: Cube = (((0, 1), (2, 3)), ((4, 5), (6, 7)));
создаёт инициализированный массив Maze:
Maze = 0
Maze = 1
Maze = 2
Maze = 3
Maze = 4
Maze = 5
Maze = 6
Maze = 7
Ада
Агрегаты (так они называются в языке Ада) можно использовать не только при инициализации констант, но и вообще в любых выражениях. В ЛЮБЫХ!
procedure Arr_Agg is
Type Cube is array (0 .. 1, 0 .. 1, 0 .. 1) of Integer;
Maze: Cube:= (((0, 1), (2, 3)), ((4, 5), (6, 7)));
Begin
Maze:= (((7, 6), (5, 4)), ((3, 2), (1, 0)));
end Arr_Agg;
Подобные скобочные выражения могут быть восприняты компилятором двояко, и в этом случае нужно явно указывать тип с помощью конструкции тип"(значение). Например:
Cube"(((7, 6), (5, 4)), ((3, 2), (1, 0)))
будет всегда воспринято однозначно. В приведённом выше примере тип указывать не потребовалось, потому что сопоставление типов в языке Ада производится не только снизу вверх, но и сверху вниз. Переменной Maze можно присвоить только выражение типа Cube, поэтому указание типа было необязательно.
Одним из следствием двустороннего сопоставления типов является возможность перегружать функции не только по типу аргументов , но и по типу результата.
Также внутри агрегатов можно указывать индексы:
Демонстрация гибкости массивных агрегатов
Cube"(0 => (1 => (0 | 1 => 7), 0 => (1 => 5, others => 4)),
1 => ((0 .. 1 => 3), others => (others => <>)))
Индексированные элементы должны следовать за неиндексированными. На порядок элементов нет ограничений. Индексированный элемент может задавать значение сразу нескольким элементам массива. Для этого отдельные индексы и диапазоны индексов перечисляются через | (знак трубы). Также можно в конце списка использовать зарезервированное слово others, чтобы задать значение оставшимся элементам:
(1 | 3 .. 5 | 7 | 9 .. 11 | 13 .. 15 => True, others => False)
Лексема <> означает значение по умолчанию.
Как и в Borland Pascal, строковый литерал эквивалентен агрегату символов.