Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 63
Текст из файла (страница 63)
Например, процедуру, выполнявшую сортировку целочисленных массивов, можно было написать только для одною зафиксированного диапазона значений инлексов. В стандарте языка Рааса! (1БО, 1982) предусматривалась лазейка лля решения этой проблемы — совместимые массивы (сопГоппапг аггауз). Эти массивы являются формальными параметрами, содержащими определения типа массива.
Рассмотрим следующий пример: ргооацига виж11вс(чаг вша: 1псе9ег; 11вс : аггау [1оиег .. оррег Ьпсе9ег] об Тпсе9ег); 5.5. Массивы 23! чек Тпоех : зптеаег; Ьеазп в паз: = 0; йок Тпаех := 1оиег ко цррег оо еож := ецж е 11а"[1поех] еп6 Вызов этой процедуры выглядит следуюшим образом: чак всокев : аккау [1..100] ок 1пге0егг хцгл11лл[ецж, лсогеэ) 5.5.4.
Количество индексов массива В языке ЕОКТКАХ! количество инлексов массивов не превышало трех. поскольку во время разработки языка основное значение придавалось эффективности. Конструкторы языка ЕОКТКАХ 1 нашли очень быстрый метод получения доступа к элементам массивов. размерность которых не превышала трех. Начиная с языка ЕОКТКА14[Ч. число возможных измерений массива было увеличено до семи, ио большинство современных языков не содергкат и такого ограничения. Причин для введения ограничений, сушествук1ших в языке ЕОКТКА]ч'.
нет. Программист, который хочет использовать перемеину ю с десятью измерениями и готов платить за обрашение к элементам такого массива снижением эффективности программы, должен иметь такую возможность. Массивы языка С могут иметь только один индекс, но при этом элементами массивов могут быть другие массивы.
что позволяет создавать многомерные массивы. Такая возлюжность является примером использования ортогональной структуры языка. Рассмотрим следуюшее объявление языка С: дпк шаг[5][с]г Это объяачение созлает целочисленную переменную пае, прелстааляюшую собой массив из пяти элементов. каждый из которых является массивом из четырех элементов. Раьтичие межлу этой переменной и матрицей другого языка, например, языка ЕОКТКА1Ч, ничтожно.
Пользователь практически всегла может игнорировать тот факт. по в действительности переменная г.ас не является матрицей, лишь синтаксис обрашения к отдельному элементу матрицы требует использования пар квадратных скобок. вылеляюших каждый индекс. 5.5.5. Инициализация массива Некоторые языки прелусматривают возможность инициализации массивов во время их размешения в памяти. В языке ЕОКТКАХ 77 вся память размещается динамически, таким образом, возможна инициализация во врел|я загрузки с использованием оператора АТА. В этом языке мы можем. например, получить слелуюшее: '~г~ З0 К ~ тсе (31 0АТА ' ЯТ /О, "-, «/ Массив ЫЯТ инициатизируется значениями из списка, заключенного между символами Глава 5. Типы данных Языки А]Ч5! С и С++ также позволяют инициачизировать их массивы.
но с одной новой особенностью. Например. в объявлении З.пг 11вг [' .= (4, 5, 7, 83]; компилятор сам устанавливает длину массива. Это удобно. но не проходит даром: почобная инициализация не дает системе обнар)живать такие ошибки программирования. .ак случайное использование значения. выходящего за пределы списка. Символьные строки в языках С и С-' реачизованы как массивы сЬаг. Эти массивы чогут быть инициализнрованы строковыми константами; сЬаг гапе [] = "Г есс(1е" х)ассив папе будет солержать восемь элементов. поскольку все строки завершаются .имволом нуля. неявно лобавляемого системой к строковым константам.
Массивы строк в языках С и С++ также могут иннциализироваться строковымн лите",алами, В этом случае массив представляет собой массив указателей на символы. На.ример, сЬаг *папев [] = !"ВоЬ", " ахе", тйагсуе"]; )тот пример иллюстрирует природу символьных литералов языков С и С++. В предыз) шем примере лля инициализации символьного массива с именем папе использовачся строковый литерал, представляющий собой массив типа сЬаг. Однако в следующем за чим примере (папел) литерачы представляют собой указатели на символы. поэтому и .ам массив является массивом указателей на символы.
Например, напев [С] является ) казателем на букву ' В ' в массиве литеральных символов, содержащем символы ' В '. ' э', 'Ь' н символ нуля. В языках Разса! и Мог[о[а-2 инициализация массивов в разделе объявления программы невозможна. В языке Ада предусмотрены лва механизма инициализации массивов в операторе бъявления: перечисление их в том порядке. в котором они лолжны храниться в памяти, л непосредственное присваивание значений соответствующим индексным позициям с помощью оператора => (в языке Аба называемого стрелкой). Рассмотрим следующие команды: ЕТВТ : аггау (1..5) оЕ 1НТЕСЕВ := (1, 3, 5, 7, 9)з В()ИСН : аггау (1..5) ос 1БТЕСЕН := (1 => 3, 3 => 4, окЬагв => О); В первом операторе все элементы массива " 1ВТ содержат инициализированные значечия, присвоенные ячейкам массива в порядке нх появления.
Во втором операторе первый и третий элементы массива инициачизируются с помощью прямого присваивания, а опеэатор оеЬагв использован лля инициализации остальных элементов. Такие наборы значений, заключенных в круглые скобки. называются составными регулярными значениями (айбгейа(е та(цез). 5.5.6. Операции иад массивами Операцией над массивом называется действие, при выполнении которого массив считается елиным целым. В некоторых языках, например, РО[(ТНАХ 77, операции над массивами не предусмотрены. 233 5.5.Мсссивы В языке Ада возможны присваивания массивов, в том числе и те, в которых правая часть является множеством, а не массивом. В этом языке допустима также конкатенация. задаваемая знаком ь.
Конкатенация определена между двумя одномерными массивами и между одномерным массивом и скалярной величиной. Помимо этих операций практически все типы языка Ада содержат встроенные операторы отношений равенства и неравенства. В язык РОйТ)(АХ 90 включено значительное число операций над массивами, названных элементными (е1ешепга1), поскольку они представляют собой операции над парами элементов массива. Например, оператор сложения (ь).
помещенный между двумя массивами, приводит к созданию массива, состоящего из сумм соответствующих пар элементов двух массивов. Операторы присваивания, отношений. арифметические и логические операторы — все они перегружены для массивов любых размеров и видов. В языке РОКТКАХ 90 также есть встроенные, или библиотечные, функции, выполняющие операции умножения, транспонирования матриц и векторного произведения. Массивы и операции над ними являются основным компонентом языка АР(.; этот язык — самый мощный из когда-либо разработанных языков обработки массивов. Тем не менее, вследствие его относительной неизвестности и отсутствия влияния на последующие языки мы ограничимся беглым ознакомлением с его операциями над массивами.
В языке АР) для векторов (одномерных массивов) и матриц определены четыре основные арифметические операции, так же, как и для скалярных операндов. Наприл1ер. выражение А + В разрешено как для скалярных величин А и В, так и для векторов или матриц. Язык АР(. также содержит набор унарных операторов для векторов и матриц„некоторые из которых приведены ниже (и обозначает вектор, а Н вЂ” матрицу).
Фц обращает элементы вектора ч ФН обращает столбцы матрицы М ВН обращает строки матрицы И ЯН транспонирует матрицу Н (строки становятся столбцами и наоборот) ~+М инвертирует матрицу И В языке АР(. есть несколько особых операторов, принимающих в качестве операндов другие операторы. Одним из них является оператор скалярного произведения. указываемый точкой (.).
Он принимает два операнда, являющихся бинарными операторами. Например, оператор является новым оператором, принимающим два аргумента, векторы или матрицы. Вначале этот оператор выполняет умножение соответствующих элементов обоих арг) ментов. а затем суммирует результаты. Допустим, что А и  — векторы, тогда результатом действия АХ В будет вектор.
содержащий попарные произведения элементов векторов А и В. Результатом оператора А +.Х В 234 Глава 5. Типы данных является скалярное произведение объектов А и В. Если А и В являются матрицами. то это выражение залает матричное умножение матриц А и В. Особые операторы языка АРЕ фактически являются функциональными формами, рассматриваемыми в главе 14. 5.3.У. Сечения Сечением (яйсе) массива называется некоторая подструктура массива. Например, если А — матрица, то одним из возможных сечений булет первая строка матрицы А, то же относится и к последней строке или первому столбцу. Важно понимать, что сечение не является новым типом данных.
Это скорее механизм обращения к части массива как к единому целому. Если с массивами языка нельзя обращаться как с единым целым, то в таком языке нет и сечений. Одним из вопросов разработки, касающихся сечений, является синтаксис задания ссылки на отдельное сечение. Обращение к отдельному элементу целого массива представляет собой имя массива и выражение для каждого индекса.
Поскольку сечение является подструктурой массива. то обращение к нему требует меньшего числа выражений с индексами, чем обращение ко всему массиву. Каким-то образом пропущенные выражения с индексами должны быть обозначены так. чтобы существующие выражения были связаны с верными индексами. Пропущенный индекс или индексы, входящие в обращение к сечению, иногда указываются звездочками. Рассмотрим следующие объявления в языке ГОКТКАХ 90. 1ИТЕЯЕК НЕСТОВ(1: 10), ИАТ (1: 3, 1: 3), СВВЕ (1: 3, 1: 3, 1: 4) Объект ЧЕСТОК (3: б) является четырехэлементным массивом, содержащим с третьего по шестой элементы вектора ЧЕСТОВ, объект ИАТ(1: 3, 2) является обращением ко второму столбцу матрицы ИАТ; объект ИАТ (3, 1: 3) является ссылкой на третью строку матрицы ИАТ. Все эти обращения могут использоваться как одномерные массивы.
Ссылки на все сечения массива интерпретируются как массивы оставшейся размерности. Таким образом, ссылка на сечение ССВЕ(1: 3, 1: 3, 2) вполне может быть присвоена матрице ИАТ. Сечения могут также использоваться как целевые объекты операторов присваивания. Например, одномерный массив может присваиваться сечению матрицы. Примеры сечениЯ массивов ИАТ и СОВЕ приведены на рис. 5.4. В языке ГОКТКА)ч 90 могут задаваться и более сложные сечения.