Главная » Просмотр файлов » Н. Вирт - Программирование на языке Модула-2

Н. Вирт - Программирование на языке Модула-2 (1160777), страница 14

Файл №1160777 Н. Вирт - Программирование на языке Модула-2 (Н. Вирт - Программирование на языке Модула-2) 14 страницаН. Вирт - Программирование на языке Модула-2 (1160777) страница 142019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 14)

Теперь, по аналогии, введем оператор, который служил бы для работы скомпонентами записи в удобном виде. Поскольку каждая компонента записи имеет свой тип, товсе они, вообще говоря, требуют различных действий. Следовательно, обработка записи не можетбыть выражена как применение одного и того же действия к различным компонентам. Поэтомуболее подходящая Форма - последовательность отдельных операторов, включающихсоответствующие компоненты записи.

Поскольку все они принадлежат одной и той же записи,последовательность операторов можно снабдить заголовком присоединения, образовав тем самымоператор присоединения. Оператор присоединения задает переменную-запись, и он позволяет69использовать имена ее компонент внутри последовательности операторов без предшествующегообозначения самой переменной и точки. Например, операторWITH d1 DOдень := 10;мес := сент;год := 1981 ENDэквивалентен последовательности операторовdl.день := 10;d1.мес := сент;d1.год := 1981Синтаксис оператора присоединения:$$ОператорПрисоединения = "WITH" Обозначение "DO"ПослОператоров "END".Кроме того что оператор присоединения обеспечивает, возможно, более короткую Формузаписи, он может также давать и повышение эффективности в случае, если обозначение взаголовке присоединения содержит индексы. Индексные выражения вычисляются только одинраз, поэтому рекомендуется соблюдать такое правило:В последовательности операторов внутри оператора присоединения не должносодержаться присваиваний переменным, находящимся в заголовке присоединения, кроме,конечно, компонент присоединяемой записи.Это правило подобно ограничению, запрещающему присваивания объектам, записанным взаголовке цикла с параметром.

Программист должен отдавать себе отчет в том, что это правило лишь рекомендация хорошего стиля программирования. Если правило нарушается, то последствияэтого труднопредсказуемы, если вообще определены (* вероятно, будут зависеть от реализации. Прим. перев.*). Более того, программист не должен надеяться, что компилятор обнаружит такиенарушения.20. ЗАПИСИ С ВАРИАНТНЫМИ ЧАСТЯМИТип запись обеспечивает и другого рода гибкость. Запись определенного типа может приниматьразличные вариантные Формы.

Имеется в виду, что число и типы компонент записи у разныхпеременных, могут различаться, хотя все эти переменные будут одного типа. Очевидно, что такаягибкость ведет к труднообнаружимым ошибкам в программе. В частности, теперь возможен такойслучай, когда в некотором Фрагменте программы будет предполагаться, что в переменнойпредставлен один определенный вариант, в то время как на самом деле представлен совсем другойвариант. Следовательно, такой возможностью нужно пользоваться очень аккуратно.Возможность образования вариантной записи иллюстрируется следующим примером:Человек = RECORDФамилия,Имя,Отчество: Строка;CASE мужчина: BOOLEAN OFTRUE: ВоенноеЗвание: CARDINAL |70FALSE: ДевичьяФамилия: СтрокаEND;ИдентНомер: CARDINAL;Родился: Дата;CASE Положение: СемейноеПоложение OFодинок: |вБраке: Супруг: CARDINAL;СколькоДетей: CARDINAL;Свадьба: Дата|вдов: Смерть: ДатаEND ENDВ этом примере содержится пять списков компонент, два из которых - вариантные списки.Они образованы согласно синтаксису:$ВариантныйСписокКомпонент = "CASE"$[Идентификатор] ":" КвалИдент "OF"$Вариант {"|" Вариант}$$$$$$$["ELSE" ПослСписковКомпонент] "END".Вариант = [СписокМетокВарианта ":"ПослСписковКомпонент].СписокМетокВарианта = МеткиВарианта{"," МеткиВарианта}.МеткиВарианта = КонстВыражение["..

" КонстВыражение].Вариантный список состоит из заголовка выбора, за которым следуют списки компонент,разделенные символом "|". Вариантный список компонент имеет следующий смысл: можноработать лишь с тем списком компонент, который помечен текущим значением компоненты (невариантной), указанной в заголовке выбора.

Эта компонента называется селектором вариантов илидискриминантом.Если обратиться к приведенному выше примеру и описать переменные p1 и р2 этого типа,то обозначение p1.ДевичьяФамилия допустимо, только если p1.Мужчина = FALSE, т.е. когда р1представляет женщину. Аналогично, р2.Свадьба допустимо, только если р2.Положение = вБраке,т.е. р2 представляет человека, состоящего в браке. Селектор вариантов служит разделителеммежду разными вариантами и играет важную роль в уменьшении опасности ошибки обращения кнедопустимым компонентам, как, например, к p1.Супруг, если p1.Положение = одинок.Вероятность ошибки еше уменьшается, если правильность обращения к компонентам сочевидностью следует из надлежащей структуры программы. Для таких целей вводится такназываемый оператор выбора, который используется для разделения и различной обработки разных71вариантов.

Его можно рассматривать как обобщение условного оператора, учитывающего большечем два случая. Синтаксис оператора выбора определяется так:$ОператорВыбора = "CASE" Выражение "OF"$Альтернатива {"|" Альтернатива}["ELSE" ПослОператоров] "END".$$Альтернатива = [СписокМетокВарианта$":" ПослОператоров].Сходство синтаксиса оператора выбора с вариантным списком компонент весьмапримечательно и отражает их тесную взаимосвязь. Это иллюстрируется следующим примером,который генерирует в доступной для чтения Форме распечатку данных, представленныхпеременнойЛица: ARRAY [1..N] OF ЧеловекОбратите внимание на сходство структуры описания типа со структурой программы.Массив состоит из записей, содержащих вариантные части; оператор цикла с параметромсодержит оператор присоединения, который в свою очередь содержит операторы выбора.FOR i := 1 ТО N DOWITH Лица[i] DOWriteString(Фамилия): Write(" ");WriteString(Имя): Write(" ");WriteString(Отчество);CASE мужчина OFTRUE: WrlteString(" мужчина, звание =");WriteCard(ВоенноеЗвание,4)|FALSE: WriteString(" женщина, девичья Фамилия=");WriteString(ДевичьяФамилия)END:WriteCard(ИдентНомер,8);ПечатьДаты(Родился); WriteLn;CASE Положение OFодинок: WriteString(" одинок")|вБраке: WrlteString(" в браке");WriteCard(Супруг,10);WriteCard(СколькоДетей,4);ПечатьДаты(Свадьба)|вдов:WriteString(" вдов");72ПечатьДаты(Смерть)ENDENDWriteLnENDОператор выбора может, конечно, использоваться вне связи с вариантными записями.

Новсе же его следует применять только в таких ситуациях, когда величины, появляющиеся вкачестве меток вариантов, расположены достаточно компактно. Проиллюстрируем это правилонегативным примером: он показывает, как не нужно использовать оператор выбора.CASE i*j OF1:S1 |11:S2 |121:S3ELSE S4ENDЗдесь предпочтение отдается записи с помощью условных операторов. В частности, ELSEследует резервировать для исключительных ситуаций, т.е.

таких вариантов, доля которых маласреди всех возможных вариантов и которые редко случаются во время выполнения.21. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ ИУКАЗАТЕЛИМассивы, записи и множества имеют одно общее свойство: они статичны. Этоподразумевает, что переменные с такой структурой сохраняют ее неизменной в течение всеговремени их существования. Во многих приложениях это ограничение чересчур обременительно; вних требуется, чтобы переменные меняли не только свое значение, но и размер, составные части иструктуру.

Типичными примерами являются списки и деревья, которые растут и сокращаютсядинамически. Вместо того чтобы вводить дополнительные структуры типа' "список" и "дерево",которых опять же оказалось бы недостаточно для других приложений, Модула предлагает базовоесредство для построения произвольных структур.

Это средство - указательный тип или указатель.Любая сложная структура данных в конечном счете состоит из элементов, имеющихстатическую структуру. Сами указатели, т.е. значения типа указатель, не структурированы, онилишь используются для установления связей между структурированными элементами, обычноназываемыми узлами. Мы говорим также, что указатели связывают элементы или указывают наэлементы. Очевидно, что различные указатели могут указывать на один и тот же элемент, темсамым обеспечивая возможность создавать сколь угодно сложные структуры и в то же времяоткрывая массу возможностей для совершения трудноуловимых ошибок.

Работа с указателямитребует чрезвычайной тщательности и аккуратности.Указатели в Модуле не могут указывать на произвольные переменные. Тип переменной, накоторую ссылается указатель, должен быть задан в описании указателя, и говорят, что типуказателя получен типу объекта, на который он ссылается. Пример:TYPE УкУзел = POINTER TO Узел;VAR р0,р1: УкУзел73Здесь тип УкУзел (и, следовательно, переменные р0 и p1) подчинен типу Узел, т.е. этипеременные могут указывать на переменные только типа Узел.

Однако сами такие переменныепри описании P0 и p1 не возникают. Они создаются вызовом процедуры выделения памяти,имеющейся обычно в стандартном библиотечном модуле. Обычно модуль Storage (память)экспортирует процедуру Allocate (выделить память). Оператор Allocate(p0,SIZE(Узeл)) создаетпеременную типа Узел и присваивает указатель на нее (указатель имеет тип УкУзел) переменнойрй.

О такой появившейся переменной говорят, что она создана (выделена) динамически. Она неимеет имени, и доступ к ней возможен только через указатель с использованием операцииразыменования "^". В некоторых реализациях оператор Allocate(р0,SIZЕ(Узел)) можетсокращаться как NEW(p0).$ТипУказатель = "POINTER" "TO" Тип.Чрезвычайно мощным средством делает указатели то обстоятельство, что они могутуказывать на переменные, которые сами содержат указатели. Это напоминает процедуры,вызывающие процедуры и тем самым вводящие рекурсию. Фактически указатели -средствореализации рекурсивно определенных структур данных (таких, как списки и деревья).

Природарекурсивной структуры данных очевидна из описания типа ее элементов.Так же как любая рекурсия при активации процедуры должна когда-нибудь закончиться,любая рекурсия ссылок тоже где-нибудь заканчивается. Роль условного оператора в прекращениипроцедурной рекурсии берет на себя в рекурсивных структурах данных специальное значениеуказателя NIL, завершающее рекурсию ссылок. NIL не указывает ни на какой объект. Можнопредставить себе, что каждый указательный тип описан как запись с двумя вариантами: одинвариант указывает на объект заданного типа, а другой не указывает на объекты, т.е. имеет NIL вкачестве единственного значения.

Характеристики

Тип файла
PDF-файл
Размер
2,76 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6280
Авторов
на СтудИзбе
315
Средний доход
с одного платного файла
Обучение Подробнее