К. Йенсен, Н. Вирт - Паскаль - Руководство для пользователя (1109480), страница 10
Текст из файла (страница 10)
Дает в качестве результата: 70 Руководство для пользователя Поскольку Т2 может быть любым типом, то компоненты массива могут быть и составного типа. В частности, если Т2 опять задает массив, то про исходный массив говорят, что он многомерный. Следовательно, многомерный массив можно описать так: маг М: аггау [А..В] о1 аггау [С..П] о1 Т; В этом случае через М [1] [.)] орозначается Л-я компонента (типа Т) 1-й компоненты массива М. Обычно для многомерных массивов удобнее пользоваться такой сокращенной формой описания: маг М: аггау [А..В,С..П] о1 Т; а компоненты обозначать через М[1, 3]. Массив М можно рассматривать как матрицу и говорить, что М[!, 3] относится к компоненте, находящейся в 3-м столбце 1-й строки этой- матрицы. Дело не ограничивается двумерными массивами: Т снова может быть составным типом.
В общем случае схема (сокращенного) описания такова: Р и с. б.4. Сиитаксическая диаграмма яля Хвасспвового тппа Если задано и типов индексов, то массив называется п-мерным, а его компоненты обозначаются с помощью п индексных выражений. Если есть переменные-массивы А и В одного типа, то присваивание: А:=В возможно, если массивы допускают покомпонентное присваивание А[1] .= В [1] (для всех 1, относящихся к типу индекса), и представляет собою сокращенную запись такого покомпонентного присваивания. ргоВгав ИаСг(хИи1(1приС, ОиСриС); (П рограмма 6.3 — Умножение матриц. ) оопзС И = 4; Р = 3; И = 2; уаг 1: 1..И; 1..И; К; 1..Р; Зив, Е1евепС: 1пСеВег; l А: аггау [1..И, 1..Р] о! 1поеВег; В: аггзу [1..Р, 1..И] о! 1пееВег; С: аггау [1..И, 1..И] о! 1поеВег; ЬеВ!и Начальньи значения для Я н В.
(ог 1 := 1 Со И до ЬеВтп !ог К := 1 Со Р до ЬеВтп йеад(1приС,Е!евепС); Иг1Се(ОиСриС,Е1евепС); А[1,К] := Е1евепС еп0; Игтое)п(риорие) епд; Иг(Се1п(ОиориЦ; !ог К:= ! Со Р до Ьеа1п !ог 3 := 1 Со И 0о ЬеВ1п Веао(1приС,Е1евепС); Иг!Се(ОиСриС,Е1евепС); В[К,1] := Е1евепС епд; Ыг!Се1п(ОиСриС) епд; Ыг)Се!п(ОиСриЦ; [ Умножение Я на В, С вЂ” результат ) !ог 1:= 1 Со И 0о ЬеВ1п (ог д := 1 Со И до ЬеВ[п Вив := О; 1ог К:= 1 Со Р йо Зив:= Зив + А[1,К] ' В[К,1]' С[1,1] := Зив; Иг(Се(ОиСриС,Зив) еаза; 72 Руководство для пользователя 'пг!ье1п(ОиприЦ епд; . 14г1ье1п(Оиьриь) епд Дает в качестве результата: г 3 -2 О 2 1 О ~ 1 .-1 2 -3 -1 е 3 -2 2 2 1 1 1О б -4 1 -9 -2 Обратите внимание, что в приведенной выше программе для массивов А, В и С типы индексов фиксированы.
Если бы мы захотели написать обобщенную подпрограмму перемножения матриц для библиотеки, то нам потребовался бы некоторый 'механизм согласования типов индексов. В Паскале для таких целей предусмотрены совмещаемые параметры-массивы (см. равд. 11.1.2). Программа 11.4 (Ма1пхМц!2) иллюстрирует использование таких параметров. 6.2.
СТРОКОВЫЕ ТИПЫ Строки уже ранее были определены как последовательности символов,,заключенные в апострофы (см. равд. 1.5). Строки, состоящие из одного-единственного символа, представляют собою константы стандартного типа СЬаг (см. равд. 2.4) . Строки, состоящие из Х символов ()ч) ) 1), считаются константами типа, определяемого следующим образом: рас)тес) аггау 11..Х] о1 Сваг Такой тип называется строковым. Если переменная-массив А и выражение Е относятся к различным строковым типам, но содержат одно и то же число компонент, допустимо такое присваивание: А:= Е б. Обзор составных типов. АГассивсс 78 Аналогично и операции сравнения (=; -'), (,.), «-= и )=) можно использовать для сравнения двух строк, если в ннх одинаковое число компонент, причем упорядоченность «начинается» с первого элемента (А]1] ) и определяется порядком, существующим для предописанного типа Сваг.
6.3. УПАКОВКА И РАСПАКОВКА Доступ к отдельным компонентам упакованных массивов часто обходится довольно дорого и зависит от ситуации и особенностей конкретной реализации. Поэтому иногда следует упаковывать нли распаковывать уже упакованные массивы с помощью одной операции. Это можно сделать с помощью предописанных процедур преобразования РасК н 11прасК.
Предположим, ()в неупакованная переменная-массив, относящаяся к типу: аггау [А..Р] о! Т(Т не может быть типом, содержащим файловый тип], а Р— упакованный массив типа расКед аггау ]В..С] о! Т причем огд(0) — огд(А) )= огб(С) огд(В). Тогда РасК(13, 1, Р) означает, что речь идет об упаковке части Б, начиная с компоненты 1, в Р. Обращение же (.)прасК(Р, (3, 1) означает распаковку Р в (3, начиная с компоненты !.
ЗЛПИСНЫЕ ТИПЫ По-видимому наиболее гибким механизмом построения данных являются записные типы. Концептуально любой записной тип задает некоторый образ (шаблои) структуры объектов данного типа, каждая часть которой может иметь совершенно различные характеристики. Предположим, например, что иам необходимо записать информацию о человеке. Мы знаем его имя, номер страхового полиса, пол, дату рождения, число иждивенцев и семейное положение. Если человек женат (замужем)'или вдов, то указывается дата свадьбы (последией); если разведеи, то указывается дата развода (последиего) и сообщается, первый развод или иет; если — одинокий, то можно ничего ие указывать. Вся зта ииформация может быть выражена одной «записьюь, к частям которой допускается отдельное обращение. 7.1. ФИКСИРОВАННЫЕ ЗАНИСИ Более формально запись — зто некоторое построение, состоящее из фиксированного числа компонент, называемых полями. В отличие от массивов компоненты могут относиться к различным типам и иепосредствеиио индексировать их с помощью выражений нельзя.
В определении записного типа для каждой из компонент задаются ее тип и имя, имя поля, обозначающее зту компоненту. Область действия инеии поля — самая внутренняя запись, в которой оио определяется. Целиком ко всей переменной-записи примеиимы лишь две операции: присваиваиие и селекция компоненты (выделеиие) . Для того чтобы тип выбранной компоненты был очевиден из текста программы (без ее выполнения), селектор для записей состоит ие из вычисляем!ого значения индекса, а представляет собою постоянное имя поля.
В качестве примера предположим, что мы хотим проводить вычислеиие с комплексными числами вида а + Ь|, где а и Ь вЂ” веществеииые числа, а ! — корень квадратный из — Е Никакого предопределеииого типа согпр!ех вет. Однако мы легко можем определить записной тип для представления комплексных чисел. Такие 7. Записные типы 75 записи должны состоять из двух полей, причем оба поля типа Кеа!: одно — действительная часть, другое — мнимая.
Прн определении типа в данном случае используются следующие синтаксические конструкции: Р и с. 7З. Синтаксическая диаграмма для Записного типа Р и с. 7ли Синтаксическая диаграмма для Списка полей Р и с. 7.3. Синтаксическая диаграмма для фиксированной части Р н с. 7ги Синтаксическая диаграмма для Секции записи С помощью этих правил мы можем составить'такие определение и описание: туре Совр!ех = гесого' !!е,1я: !1еа! Еоо! наг У: Саар!ех; 76 Руководство для пользователя здесь Сотпр!ех — ' имя типа, 1«е и 1гп — имена полей, а Х вЂ” переменная типа Согпр)ех.
Следовательно, Х представляет собою запись, содержащую две компоненты или поля (см. программу 7.!). Для обращения к компоненте записи следом за именем записи ставится точка, а затем — имя соответствующего поля (см. рис. 6,3). Например, значение 5 + 31 переменной Х присваивается так*: И.йс:= 5: 2.!т:= 3 Аналогично определению типа Согпр!ех можно определить и тип, соответствующий понятию «дата», Оаве = расйеб гесогб Уеаг: 1900..2100; Ио: (Лап, ГеЬ, Иаг, Арг, Иау, Лип, Ли1, Аий, Зер, Осс, Иои, Оес); Оау: 1..31 епб Заметим, что среди значений этого типа присутствует и дата «31 апреля». Можно определить тип для понятия «игрушка» ((оу): Тоу гесогб К1пб: (Ва11, Тор, Вове, Оо11, В1осйв, Ваае, Иоде!, Воой); Свети йеа1; йесе1иеб: Оаве; Еп)оуеб: (А1ос, Зове, А11ЬС1е, Ионе); Вгойеп, Сов(п Воо1еап епд Можно определить и «домашнее задание»: Авв(йпеепс = расйеб гесогб ЗиЬЗесс«(Н1всогу, Еапйизйе.
11$', Изей, Рвусй,. Зс1епсе); Авв(йпеб: Оаве; Вгабе: 0..4; Ые(ВЬ(п 1..10 епб ' Формально такая запись может быть и перна (без последней «тс»«ки с запятой»), но производит впечатление неряшливой. Примеч. пер. ргойгаа Соар1ехпг(ФЬаес(с(ОисриФ); ( Программа 7.1 — Пример операций над комплексными числами. ) сопес - 1псгеаепс = Я; Фуре Соар1ех = гесог6 йе, 1а: йеа1 еп6; маг Х, У: Соар1ех; Ра1г: 1псейег; Ьей1п Х.йе:= 2; Х.1а: 5; (инициация Х ) У:= Х; ( инициация У ) (ог Ра1г := 1 Фа 5 6о Ьей1п Иг(се1п(ОисриФ, 'Х = ', Х.йе : 5: 1, Х. 1а :5: 1, ' 1'); 'пг1Фе1п(ОисриФ, 'У = ', У.йе :5:1, У.1а :5:1, '1'); «Х+ У) Ыг1Фе1п(ОисриФ, '5иа ', Х.йе + У.йе:5:1, Х.1а + 1.1а:5:1, 'т'); (Х е у) Иг(се1п(0исриФ, 'Ргоаисс = ', Х.йе ' У.йе — Х.1а'У.1а :5:1, Х,йе ' У.1а + Х.1а ' У.йе:5:1, '1'); Иг(се1п(Оисрис); Х.йе ;= Х.йе + 1псгеаепФ; Х.1а:= Х.1а - 1псгеаепФ еп6 еп6 .
Дает в качестве результатов: Х = 2.0 5.01 У = 2.0 5.01 Зиа = Я.О 10.01 Р йисс = -21.0 20.01 РВ Руководство для яольвователя Х = 6.0 1.01 Ч = 2.0 5.0! Зов = 8.0 6.0! Ргодисе = 1.0 32.01 Х = !0.0 -3.0! У = 2.0 5 О! Кап = 12.0 2.0! Ргооосе = 35.0 44.0! Х = 14.0 -7 О! у = 2.0 5 О! Зов = 16 бе-2.0! Ргоеосе = 63.0 56.0! Х = 18 О-!! О! У = 2.0 5.0! Зов = 20.0 л6.0! Ргодисе = 9!.0 68.0! Если некоторая запись сама входит в состав данных более сложной структуры, то эта структура отражается и на имени записи. Предположим, что нам надо записать дату самой последней прививки оспы для каждого из членов семьи.
Членов семьи можно представить с помощью некоторого перечисляемого типа, а соответствующие даты хранить в массиве записей: Ьуре Гав!1укевЬег = (Гаспег, МоЬЬег, СИ!41, СЬ1И1, СИ!43); еаг Часе!паИоппаЬе: аггау [Гав11уневЬег) о[ Юаее; Формирование даты после этого можно записать так: Часе!паИоппаЬе[СИ!43) .Мо;= Арг; Часе)паИоппаее[СИ)03) .Оау:= 23; Часе!пащоппаее[СИ103) .Чеаг:= 1923 7.2. ВАРИАНТНЫЕ ЗАПИСИ Иногда в запись необходимо включать информацию, зависящую от другой, уже включенной в эту же запись информации.
Поэтому мы можем определить вариантный записной тип, где есть дополнительные поля, зависящие от значений дРугих полей. 7. Записные типы 7Р Синтаксис записного типа предусматривает вариантную чисть, рассчитанную иа то, что можно задавать тип, содержащий определение нескольких вариантов структуры. Это означает, что разные переменные, хотя оии и относятся к одному типу, могут иметь отличающуюся друг от друга структуру. Различие может касаться как числа компонент, так и их типов. Каждый вариант характеризуется задаваемым в скобках списком описаний присущих ему компонент.