Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Массивы в параметрах процедур и функций
Массивы, как и другие типы данных, могут выступать в качестве параметров процедур и функций. Вот как может выглядеть функция, вычисляющая среднее значение в массиве действительных чисел:
Функция Average принимает в качестве параметра массив известной размерности. Требование фиксированного размера для массива-параметра часто является чрезмерно сдерживающим фактором. Процедура для нахождения среднего значения должна быть способна работать с массивами произвольной длины. Для этой цели в язык Delphi введены открытые массивы-параметры. Такие массивы были заимствованы разработчиками языка Delphi из языка Modula-2. Особенности: 1. Открытый массив-параметр описывается с помощью словосочетания array of, при этом границы массива опускаются:
2. Внутри подпрограммы Average нижняя граница открытого массива A равна нулю (Low(A) = 0), а вот значение верхней границы (High(A)) неизвестно и выясняется только на этапе выполнения программы. 3. Существует только два способа использования открытых массивов: обращение к элементам массива и передача массива другой подпрограмме, принимающей открытый массив. Нельзя присваивать один открытый массив другому, потому что их размеры заранее неизвестны. Вот пример использования функции Average:
4. Во втором операторе открытый массив конструируется в момент вызова функции Average. Конструктор открытого массива представляет собой заключенный в квадратные скобки список выражений. В выражениях могут использоваться константы, переменные и функции. Тип выражений должен быть совместим с типом элементов массива. Конструирование открытого массива равносильно созданию и инициализации временной переменной. 5. Открытые массивы могут быть переданы в подпрограммы только по значению или как параметры-константы. 6. Некоторые библиотечные подпрограммы языка Delphi принимают параметры типа array of const — открытые массивы констант. Массив, передаваемый в качестве такого параметра, обязательно конструируется в момент вызова подпрограммы и может состоять из элементов различных типов (!). Физически он состоит из записей типа TVarRec, кодирующих тип и значение элементов массива (записи рассматриваются ниже). Открытый массив констант позволяет эмулировать подпрограммы с переменным количеством разнотипных параметров и используется, например, в функции Format для форматирования строки.
Передача параметров по значению Этот режим передачи параметров применяется по умолчанию. Если параметр передается по значению, создается локальная копия данной переменной, которая и предоставляется для обработки в процедуру или функцию. Посмотрите на следующий пример: procedure Test(s: string); При вызове указанной процедуры будет создана копия передаваемой ей в качестве параметра строки s, с которой и будет работать процедура Test. При этом все внесенные в строку изменения никак не отразятся на исходной переменной s. Однако это не относится к объектам. Например, если в функцию передается переменная (а точнее экземпляр объекта) TStringList, то в данном случае произойдет передача по ссылке (даже если это не указано явно). Одномерные и двумерные статические массивы. Описание и обращение к элементам. Передача массивов как параметров в подпрограммы. Примеры. Для объявления массива используется конструкция: array [indexType1,..., indexTypen] of baseType, где каждый indexType – это порядковый тип, размерность которого не превосходит 2GB. Для этого можно воспользоваться идентификатором некоторого типа (например, boolean или ansichar), однако на практике обычно явно задается поддиапазон целых чисел. Число элементов массива в каждом измерении задается соотвествующим порядковым типом. Количество элементов массива равно произведению количеств элементов во всех измерениях. Словосочетание array of является зарезевированным. Квадратные скобки после слова array являются требованием синтаксиса, а после слова of — тип элементов массива. 1. Примеры. Простейший случай – это одномерный массив:
После описания типа можно переходить к определению переменных и типизированных констант:
2. Обратите внимание, что инициализация элементов массива происходит в круглых скобках через запятую. 3. Массив может быть определен и без описания типа:
4. Чтобы получить доступ к отдельному элементу массива, нужно в квадратных скобках указать его индекс, например
5. Объявленные выше массивы являются одномерными, так как имеют только один индекс. Одномерные массивы обычно используются для представления линейной последовательности элементов. Если при описании массива задано два индекса, массив называется двумерным, если n индексов — n-мерным. Двумерные массивы используются для представления таблицы, а n-мерные — для представления пространств. Вот пример объявления таблицы, состоящей из 5 колонок и 20 строк:
То же самое можно записать в более компактном виде:
Чтобы получить доступ к отдельному элементу многомерного массива, нужно указать значение каждого индекса, например
или в более компактной записи
Эти два способа индексации эквивалентны. Одномерные и двумерные динамические массивы. Описание и обращение к элементам. Процедура SetLength, функции Length, Low, High. Примеры. Одним из мощнейших средств языка Delphi являются динамические массивы. Их основное отличие от обычных массивов заключается в том, что они хранятся в динамической памяти. Этим и обусловлено их название. Чтобы понять, зачем они нужны, рассмотрим пример:
Задать размер массива A в зависимости от введенного пользователем значения невозможно, поскольку в качестве границ массива необходимо указать константные значения. А введенное пользователем значение никак не может претендовать на роль константы. Иными словами, следующее объявление будет ошибочным:
На этапе написания программы невозможно предугадать, какие именно объемы данных захочет обрабатывать пользователь. Тем не менее, придется ответить на два важных вопроса:
Можно поступить следующим образом. В качестве верхней границы массива установить максимально возможное (?) количество элементов, а реально использовать только часть массива. Если пользователю потребуется большее количество элементов, чем зарезервировано, то ему можно попросту вежливо отказать. Например:
Такое решение проблемы является неоптимальным. Если пользователю необходимо всего 10 элементов, программа работает без проблем, но всегда использует объем памяти, необходимый для хранения 100 элементов. Память, отведенная под остальные 90 элементов, не будет использоваться ни Вашей программой, ни другими. А теперь представьте, что все программы поступают таким же образом. Эффективность использования оперативной памяти резко снижается.
Динамические массивы позволяют решить рассмотренную проблему наилучшим образом. Размер динамического массива можно изменять во время работы программы. Динамический массив объявляется без указания границ: array of baseType Например:
Работа с динамическими массивами: 1. Переменная DynArray представляет собой ссылку на размещаемые в динамической памяти элементы массива. 2. Изначально память под массив не резервируется, количество элементов в массиве равно нулю, а значение переменной DynArray равно nil. 3. Создание динамического массива (выделение памяти для его элементов) осуществляется процедурой SetLength.
4. Изменение размера динамического массива производится этой же процедурой:
При изменении размера массива значения всех его элементов сохраняются. При этом последовательность действий такова: выделяется новый блок памяти, значения элементов из старого блока копируются в новый, старый блок памяти освобождается. При уменьшении размера динамического массива лишние элементы теряютяся. При увеличении размера динамического массива добавленные элементы не инициализируются никаким значением и в общем случае их значения случайны. Однако если динамический массив состоит из элементов, тип которых предполагает автоматическую инициализацию пустым значением (string, Variant, динамический массив, др.), то добавленная память инициализируется нулями. 5. Определение количества элементов производится с помощью функции Length:
6. Элементы динамического массива всегда индексируются от нуля. 7. Доступ к ним ничем не отличается от доступа к элементам обычных статических массивов:
8. К динамическим массивам, как и к обычным массивам, применимы функции Low и High, возвращающие минимальный и максимальный индексы массива соответственно. Для динамических массивов функция Low всегда возвращает 0. 9. Освобождение памяти, выделенной для элементов динамического массива, осуществляется установкой длины в значение 0 или присваиванием переменной-массиву значения nil (оба варианта эквивалентны):
Однако Вам вовсе необязательно по окончании использования динамического массива освобождать выделенную память, поскольку она освобождается автоматически при выходе из области действия переменной-массива (удобно, не правда ли!). Данная возможность обеспечивается механизмом подсчета количества ссылок. 10. При присваивании одного динамического массива другому, копия уже существующего массива не создается.
В приведенном примере, в переменную B заносится адрес динамической области памяти, в которой хранятся элементы массива A (другими словами, ссылочной переменной B присваивается значение ссылочной переменной A). Как и в случае со строками, память освобождается, когда количество ссылок становится равным нулю.
11. Для работы с динамическими массивами вы можете использовать знакомую по строкам функцию Copy. Она возвращает часть массива в виде нового динамического массива. 12. Для многомерных динамических массивов:
То есть память выделяется для каждой размерности. 12. Множества. Описание, задание, операции над множествами. Примеры. Объявление множества Множество — это составной тип данных для представления набора некоторых элементов как единого целого. Область значений этого типа — набор всевозможных подмножеств, составленных из его элементов, включая и пустое множество. Все элементы множества принадлежат к некоторому порядковому типу, который называется базовым типом множества. Базовый тип не может иметь больше, чем 256 возможных значений. Поэтому, в качестве базового типа выбирают либо однобайтовые порядковые типы (AnsiChar, Byte, ShortInt, Boolean, WordBool), либо их некоторое подмножество. Описание Для описания множественного типа используется словосочетание set of, после которого записывается базовый тип множества. set of baseType Пример:
Теперь можно объявить переменную множественного типа:
Можно объявить множество и без предварительного описания типа:
Доступ · В выражениях значения элементов множества указываются в квадратных скобках: [2, 3, 5, 7], [1..9], ['A', 'B', 'C']. · Если множество не имеет элементов, оно называется пустым и обозначается как [ ]. · Пример инициализации множеств:
Операции над множествами
При работе с множествами допускается использование операций отношения (=, <>, >=, <=), объединения, пересечения, разности множеств и операции in. Операции сравнения (=, <>). Два множества считаются равными, если они состоят из одних и тех же элементов. Порядок следования элементов в сравниваемых множествах значения не имеет. Два множества A и B считаются неравными, если они отличаются по мощности или по значению хотя бы одного элемента.
Операции принадлежности (>=, <=). Выражение A >= B равно True, если все элементы множества B содержатся во множестве A. Выражение A <= B равно True, если выполняется обратное условие, т.е. все элементы множества A содержатся во множестве B.
Операция in. Используется для проверки принадлежности элемента указанному множеству. Обычно применяется в условных операторах.
Операция in позволяет эффективно и наглядно выполнять сложные проверки условий, заменяя иногда десятки других операций. Например, оператор
можно заменить более коротким:
Операцию in иногда пытаются записать с отрицанием: X not in S. Такая запись является ошибочной, так как две операции следуют подряд. Правильная запись имеет вид: not (X in S). Объединение множеств (+). Объединением двух множеств является третье множество, содержащее элементы обоих множеств.
Пересечение множеств (*). Пересечение двух множеств — это третье множество, которое содержит элементы, входящие одновременно в оба множества.
Разность множеств (–). Разностью двух множеств является третье множество, которое содержит элементы первого множества, не входящие во второе множество.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2017-02-08; просмотров: 1006; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.188.252.23 (0.027 с.) |