Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 65
Текст из файла (страница 65)
Элементы матрицы МАТ, которые требуется присвоить массиву ЫБТ, находятся путем присваивания индексу 1 значений из диапазона изменения индексов первого измерения матрицы МАТ. 240 Глава 5. Типы данных 5.б. Ассоциативные массивы Ассоциативным массивом называется неупорядоченное множество элементов дан-. ь. индексированных таким же количеством величин, называемых ключами. В иеассогоативных массивах индексы никогда не надо запоминать (поскольку они идут по лов:яку). В ассоциативном же массиве определяемые пользователем ключи должны со.;ржаться в самой структуре массива.
Таким образом. каждый элемент ассоциативного '..ссива фактически является парой элементов: ключом и величиной. Для пояснения этой . руктуры данных мы используем структуру языка Рег!. Другим языком. имеющим ассонативные массивы, является язык )ача. в котором подобная структура поддерживаются .-андартной библиотекой классов. Для ассоциативных массивов характерны следующие вопросы разработки. ° Какова форма обращений к элементам". ° Каким является размер ассоциативного массива: статическим или линамическим? 5.6.1. Структура и ааерац)ии Ассоциативные массивы языка Рег! часто называются хешами. поскольку их элемен-ы записываются в память и извлекаются из нее с помощью функций хеширования.
))ро.гранство имен хешей в языке Рег! четко очерчено; каждая хешированная переменная :олжна начинаться со знака процента (8). Хешам могут присваиваться литеральные веччины, например: гяа1агуея = ("Сес)гус" => 75000, "Реггу" => 57000, "Магу" => 55750, "Сагу" => 47850); Обращение к отдельным значениям элементов производится с помощью записи.
хагзктерной только для языка Рег!. Значение ключа помещается в фигурные скобки. а имя теша заменяется тем же самым именем сказярной переменной с присоединенным к ней :наком лоллара (8) в позиции первого символа. Например; Яяа1агйея("Реггу") = 58850; Новый элемент присоелиняется к хешу с помощью той же формы оператора. Удалить :лемент из хеша можно оператором с)е1ег е: с)е1еге 8яа1агйея("Сагу")г Весь хеш может быть обнулен п> тем присвоения ему пустого литерала: йяа1агйея = () г Размер хеша в языке Рег! является динамическим: он увеличивается при добавлении нового элемента и уменьшается при удалении элемента или при присвоении ему пустого итерала. Оператор ехйягя возвращает значение ггце или йа1яе в зависимости оз то: о.
является ли его операнд (ключ массива) элементом массива. Например: 18 (ехйяся 8яа1агйея("Б))е11у" ) ) ~)ператор кеуя при применении к хешу возвращает массив ключей хеша. Оператор з1цея выполняет то же для значений хеша. Оператор еас)з выполняется лля каждой пары элементов хеша. 5.6. Ассоциативные массивы 2Я1 Для поиска элемента хеш значительно лучше массива, поскольку неявные операции хеширования, используемые для доступа к элементу хеша, очень эффективны.
С другой стороны, для обработки каждого элемента списка лучше использовать массивы. 5.6.2. Реализация ассоциативных массивов Для реализации ассоциативных массивов в языке Рег! сначала фиксируется некоторый объем памяти. Когда структура достигает заранее определенного уровня заполнения.
этот объем увеличивается. Такой процесс расширения памяти неэффективен, поскольку для его выдолнения приходится использовать новую функцию хеширования и повторно хешировать все существующие в структуре элементы. 5.7. 3888тиси Записью (гесогд) называется возможно неоднородная совокупность данных, в которой отдельные элементы идентифицируются именами.
В программах часто требуется моделировать совокупность неоднородных данных. Например, информация о студенте колледжа должна содержать его имя, номер, средний балл н так далее. Переменная, моделирующая такую совокупность, может имя хранить как строку символов, номер — как целое число, средний балл — как число с плавающей точкой. и так далее.
Для удовлетворения потребности в таком общем типе и были разработаны записи. Впервые появившись в языке СОВОГО в начале 1960-х годов записи вошли во все наиболее популярные языки программирования, за исключением версий языка РОКТКАМ, предшествовавших языку РОКТКАХ 90. В объектно-ориентированных языках программирования записи обеспечиваются консгр>кцией классов.
Язык С++ по-прежнему содержит оператор всгцсс из языка С для сзруктур, представляющих собой записи, хотя он является излишним. В язык Зача данньш оператор уже не включался. В следующих разделах показано, как можно обьявить или определить записи, как осуществить ссылку на поле записи, а также описываются общие операции над записями.
Для записей характерны следующие вопросы разработки. ° Какова синтаксическая форма ссылок на поля записи? ° Возможны ли эллиптические ссылки? 5.7.1. Описания записей фундаментальное различие между записью и массивом заключается в однородности элементов массивов по сравнению с возможной неоднородностью элементов записей.
Од>ем из следствий этого различия является то, что к элементам записи, или полям, не всегда можно обратиться с помощью индексов. Взамен них для указания полей используются идентификаторы, а ссылки на поля реализуются с помощью этих идентификаторов. Еше одним существенным различием между массивами и записями является то, что в некоторых языках записи могут содержать объединения, рассматриваемые в разделе 5.8. Ниже показан пример объявления записи в языке СОВОГО, являющегося частью раздела данных программы на этом языке.
2Я2 Гдово 5. Типы донных 01 ЕИРЬОУЕЕ-ВЕСОВР. 02 ЕМРЬОУЕЕ-МАМЕ. 05 Г1ВЯТ 05 М1РРг Е 05 1,АЯТ 02 НОРВЬУ-ВАТЕ отстсче тя х(20) РТСТСВЕ ТЯ Х(10) . Р1СТРВЕ Я Х,'20). Р СТОКЕ ТЯ 99)(99. В языке С записи также предусмотрены и называются стрултурами. Они во многом полобны записям языка Рааса!, за исключением того, что структуры не содержат вариантных записей, или объединений, рассматриваемых в разделе 5.8.
Объявления записей в языке РОКТВАМ 90 требуют предварительного описания люоых вложенных записей в качестве типов. Таким образом, в приведенной выше записи информации о сотруднике, запись имени сотрудника требует предварительного описания, после чего в первом поле записи сотрудника она просто называется как тип. 5.7.2. Ссылки на поля записи Ссылки на отдельные поля записи синтаксически задаются несколькими различными методами, в двух из которых называются нужное поле и запись, которая их содержит. Ссылки к полям языка СОВОЬ имеют следующий вид: имя поля ОГ имя записи 1 ОГ ... ОГ имя записи и Здесь первая запись называет наименьшую или наиболее глубоко вложенную запись.
содержащую нужное поле. Следующее имя записи в этой последовательности относится к записи, содержащей предылушую, и так далее. Таким образом, к полю М1РРЬЕ из приведенного выше примера записи языка СОВОЬ можно обратиться следующим образом: М1РРЬЕ ОГ ЕИРЬОУЕЕ-МАМЕ ОГ ЕМРЬОУЕЕ-ВЕСОВР 243 5.7.
Записи Запись ЕИРЬОХЕЕ-ВЕСОКР состоит из записи ЕМРЬОУЕЕ-МАМЕ и поля НОСК:ч-ВАТЕ. Числа 01, 02 и 05, с которых начинаются строки объявления записи. являются номерамн уровни (1ече) пцшЬегз), которые определяют иерархическую структуру записи. Любая строка, за которой следует строка с более высоким номером уровня, также является записью. Оператор РТСТОВЕ показывает формат ячеек памяти, содержащих данное поле: Х (20) указывает на 20 буквенно-цифровых символов, а 99ч 99 — на четыре десятичные цифры с десятичной точкой посерелине. Языки Разса1, Модо!а-2 и Аба в записях используют собственные синтаксические правила, а не принятые в языке СОВО) номера уровней: в этих языках лля создания структуры записей используется ортогональная структура, позволяющая просто вкладывать олин объявления записей в другие.
Рассмотрим следующее обьявления языка Ада: ЕМРЬОУЕЕ ВЕСОВР а ЕМРЬОУЕЕ МАМЕ кеоокс) Г1ВЯТ : ЯТВ1Н6 (1..20); И1РРЬЕ : ЯТВ1НЯ (1..10); ЬАЯТ : ЯТВ1МС (1..20]; епс( кеооксзз НООВЬУ ВАТЕ : ГЬОАТ; епс1 кеоокс11 Большинство других языков использует для обращений к полям точечную запись, в которой компоненты обращения соединяются точками. Имена в точечной записи идут в противоположном языку СОВОЬ порядке: вначале пишется имя наибольшей внешней зашюн, а последнии — наименьшей.
Ниже показан пример обращения к полю И1001.Е цз приведенной выше записи языка Ада. ЕИРЬОУЕЕ КЕСОКО.ЕИРЬОУЕЕ ИАИЕ.И100ЬЕ В языке ГОКТКАХ 90 используется та же форма, за исключением того, что вместо точки ) потребляется знак процента (з). Полностью определенной ссылкой (ГоПу г)ца11Г!ед геГегепсе) на поле записи называется ссылка. в которой названы все имена промежуточных записей, начиная с наибольшей внешней записи и заканчивая требуемым полем. Обе приведенные выше ссылки (ддя языка СОВОЬ и для языка Аба) являются полностью определенными. Помимо таких ссылок. языки СОВОЬ и РЬ!! допускают эллиптические ссылки на поля записи.
В эллиптической ссылке поле называется, но некоторые или все имена внешних записей могут пропускаться, пока получающееся в результате обращение остается однозначным в данной среде ссылок. Например, ссылки Р1КВТ, Р1КЕТ ОР ЕИРЬОТЕЕ-ККИЕ и : . КЯТ ОР ЕИРЬОТЕЕ-КЕСОК0 являются эллиптическими ссылками к имени сотрудника в объявленной выше записи языка СОВО1.. Несмотря на то что эллиптические ссылки удобны для программиста, оии вынуждают компилятор обрабатывать структуры данных и процедуры, чтобы правильно определить требуемое поле. Стоит также отметить.
что такой вил ссылок наносит некоторый ущерб читабельности программы. В языке Разса1 определенные эллиптические ссылки допускаются только в спецнатьных структурах. Фрагмент программы может помешаться в оператор ийкЬ, где часть квазнфикаторов указывается неявно. Рассмотрим, например, следующие два фрагмента программ: первый написан без использования оператора насЬ, а во втором этот оператор используется. ев1оуее.паве := 'ВоЬ'г ев1оуее.аде := 421 евр1оуее.вех ."= 'И'; евр1оуее.еа1агу := 23750.01 идсЬ евр1оуее йо Ьедйп газе := 'ВоЬ'; аде := 42г вех :- 'И'г аа1агу := 23750.0 епс); ( конец блока и1гЬ 1 Если в оператор нЕКЬ помещается относительно небольшой блок команд, то это повышает читабельность, если же в этом операторе содержатся несколько страниц команд.