Лекции по информатике (984119), страница 32
Текст из файла (страница 32)
сх, су: геа1): ТЪ'а1пе; маг Х: РТг!апа!е; Ьенш пеи (Х); Х .Л.х; ах; Х .Л.у: ау; Х".В.х: Ьх; Х".В.у: Ьу; Х".С.х: сх; Х".С.у: су: й! 1й 1г1апа!е Холл Тг!аглд!е: ТЧа!пс(Х); ( Здесь треуголььлллковьллл элемент приводится, к илиму же универсалтлому типу элементов очереди л! епс1; Гппсйюп 1челгЕхеспьаЫе(Т: 1-'Ргосейпге): ТЧа1пе; айаг Х: РЕхеспгаЫе: 400 Ьеиш пеи (Х); Х".РгосРсг:=Т; Х дс)г- 1с11ьхеспсаЫе; Хев ЕхеспФаЫск -21'Чс!пе(Х); ( Здесь приведение. также возмозя;ао, поскольку все указатели в ЕэХепсЭесЭ, Разса1 росЭствентсъс сг епс1; Для правильного уничтожения объектов очереди необходимо использовать процедуру РевсгоуОЬ)ес1, а не стандартную процедуру с11ярояе: ргосес1пге ПевугоуОЬ|ест(айаг Р: ТЧа1пе); Ьеиш саяе РПЭНесогс1(Р) зс1 оГ ( для, отсределения, писпа реального обвекта используется привесЭепие указатпеля.
на него к идентифицируюгцему типу РПЖссотсс ~С 1с1С1гс1е: с11врове(РС1гс1е(Р)): 1сГГг1ащ1е: с11врове(РТг1аггд1е(Р))1 сс1ЕхеспгаЫе: с11врове(РЕхессгьа1>1е(1')); ( Если бы. не было бьс приведения гпипов, д1зрозе не смог бы вычиссслсть размер уссичтозссаелсого обвекта и корректно его удалипсь 3 епс1; епс1; Рассмотрим пример добавления нескольких разнородных элементов в очередь: ргосес1пге Ехапгр1е1Эгаи", ( Этно единственная процедура, насаей програлслсьс, являлосцесйся обьектом, а пе субяектпом.
Зтпо кслселпанта простейисего проиедурного тпипа, копсорая может быть согласна и разыменоьана. Чтобы вьсзвать процедурную переметсную, надо употребить ее и ия (процесЭуртсой переменной, а, не конкретнойс процедурьсЦ с фактичесъими параметрами вызова и с точкой с запятой. Если процедурная переменная, доступна по ссылке, ее надо Разыменоватпь сг Ьеиш тьтйе1п('ВЫПОЛНЯЕМЫЙ' ); ( Здесь можно было бы сбацать на Роз1Ясттр1 чтпо — то вьссокохудожестпвенное или фрактальное. т епс1; айаг Ч: Чпепе; РпвЬЯ, Хеч С1гс!е(10,10,5)): РпвЩ, ХежТг1апц!е(1,2,3,4,5,6)); РпвЬ(СЕ. Хеи ЕхеспьаЫе(ОЕхагпр!е1Эгач )); 1Э1вр1ау(®; 401 7.3.8.2 Реализация с использованием указателей процедурного типа В предыдущем варианте для реализации действий с элементами очереди использовались процедуры (например, Ртам ), выполняющие определенные действия над объектом в зависимости от типа объекта.
Такой подход неудобен тем, что при добавлении нового обьекта приходится модифицировать все соответствующие процедуры (ЕЕгаъ., ВезсгоуОЬ1есС и др). Кроме того, процедуры, присущие обьектам, концептуально отделяготся от самих обьектов. В данном примере процедуры, присущие объектам, задаются в самих обьектах как поля процедурного типа. Кроме того, добавляются догюлнительпые свойства объектов, необходимые для реализации сортировки. Необходимость в идентификаторе оЬ)есСЮ отпадает: 1' Осдро1 уор2: Сошников Д.В.
) Суре ТРо1пг -- гесогс1 х,у: геа1 епсЕ; !' тип, то'чки, используемый в описании геометрических фигур ) Суре СгпрТуре — (!езз, Ес1па!, Моге, Хо1Ес1па1, Хо!Сотар); !' результат сравнения ключей ) !' тип ТОЕуесг заменяет используемую в предыдущем примере ТП)ЛесогсЕ ) 1' он содержит поля — ссь лки на родовые процедуры. которые должны располагаться в том же порядке, что и в самих обьектах ) Суре РОЬ)есС вЂ” "ТОЬ1есс; Суре ТСп1рГппсС1оп == СппсСЕоп (1ЕХ: РОЬ)есС): СпгрТуре; РСгпррппс! юп 'ГСпгрГппсС1огц Суре ТРгоссс1пге РгосесЕпге(Р: РОЬ1ес1,); 1' процедурный тип, ) РРгосес1пгс -- ТРгосес1пге; ТУгаяРгос — Ргосес1п'е; 1' процедурный тпип для Тс:хссигаЬ1е ) РЕЕгая Ргос — " '1'Е)гаъ.Ргос; '!" О Ь) есС вЂ” гесогс1 1)гам: РРгоссс1пге; Согпраг: РСгпрГппсС1огц епсЕ; Суре РС1гс!е - ТС1гс1е; ТС1гс!е -- гесогс1 !Егия: РРгосес1пге; Согпраге: РСпгрГппсСЕоп; сеп1,ег: ТРо1п1;, гас11пз: геа1; епс1; Суре ТТС1агц,1е - гесогс1 1Эгагг: РРгосес1пге; Сопграге: РСшрГппссюп; А, В, С: ТРо1ггС! епс1; РТг1апй!е 'Г! г1ащ1е; Суре ТЕхеспсаЫе — гесогс1 !)гагт; РРгосес1пге; Сошрагс: РСпгрГггпсС!огг; РгосРСг: РЕ)гагг Ргос; епс1; РЕхеспсаЫе ТЕхесггсаЫе; Тип данных для элемента очереди ТЪа1гге теперь определяется как указатель на абстрактный объект ТОЬгесС.
Необходимость в бестиповом указателе отпадает: Суре ТЪа!гге РО!>1есС; Везде. где для печати элемента очереди вызывается процедура ъ.г1Се!и, необходимо заменить се на. вызов процедуры, на ксггоруго ссылается поле Пгагя конкретной записи. Начальные значения этому полю присваиваются в процедурах инициализапии. ргосес1пге ИгагтС1гс1е(Р: РОЬ1есг): !' соответствует типу ТРгоседиге ~ 1' Особенности отрисовки или вывода объекта на экране определяются конкретной реализацией.
В данном примере мы просто печатаем геометрическое описание. гг ггаг Т: РСггс!е; Ьеиш Т:=- РСггс1е(Р): глт1Се1п('ОКРУЖНОСТЬ(Х=-',Т".сепсег.х,', У-=-',Т".Сеггсег.у,', В,-=', Т .гаг11гга); епс1; ргосес1пге 1ЗгаггТг1ап~!е(Р; РОЬ1ес!); маг Г: РТг1атц,!е: Ьеиш Т; РТг!ап~!е(Р); от!Се('ТРЕУГ(А (',Т .А.х,'.,„',Т,Л.у, '),'); глгг1Се('В (',Т .В.х,',. ',Т .В.у, ').,'): ът1Се1п('С (',Т .С.х,',„',Т .С.у, ') '); епс1; ргосес1пге 11гагтЕхесггСаЫе(Р: РОЬгесС); Ьеиш 11' РЕхеспуаЫе(Р) ".РгосРСг<:>ш! СЬеп РЕхеспгаЫе(Р) .Ргосргг"; 1' выполнение процедуры по указателю эг епс1; Для печати (отрисовки) объекта следует использовать конструкцинх Р) Л)гаго)' (Р), где Р -- указатель на объект типа, РОЬ1'есй К солсалению, каждый раз приходится пе- редавать в процедуру ВгавО указатель на сам ооьект, т.
к. процедура Огаы() не молсет о|гределить, по указателю из какой конкретной записи она была вызвана. Объектноориентированный ггодход, рассмотренный в следующем примере, избавляет нас от такой необходимости. Определение процедур сравнения: йшсС1оп ЕЧТуре(11, Ъ': РОЬ)есС): Ьоо1еап; 1'проверка эквивалентпности типов3 Ьеиш Ес1Туре: =(В .Ргали == Ъ' .1)гам); 1' если указатели на родовые процедуры совпадают — типы одииаковы! г епс1; ГппсСюп СгпрС1гс1е(С1Х: РОЬ1есг): СпгрТуре; 1' соответствуегп ТСтрРипс 1 Ьеиш 1Г поС Ес1Туре(ЕХ) СЬеп СгпрС1гс1е:==1ч1оССогпр е1ве Ьепш 1Г РС1гс!е(11)".гас11па - РС1гс1е®".гас1йгз СЬеп Сп1рСпс1е:-- Ес1па1; 1Г РСьгс!е(В),гас1шв < РС1гс1с(Ъ)".гас1йга СЬеп Сп1рС1гс1е:-- 1.езз1 1Г РС1гс!е(11)".га<11па > РС1гс1с('ч')".гас11па СЬеп СшрС1гс1е:-- Моте; епс1:, епс1; ГппсСюп с11з1(Л,В: ТРо1пС): геа1: (расстояписс между точками ~ Ьеиш с11ьт: вс1гС(зс1г(Л,х — В.х)+юг(Л.у — В.у)ч-зс1г(Л.и — В.и)); епс1; ГппсС1оп Впш(Е: ТТг1ащ1о): геа1; (срмма длин стоРон — кРитеРий сРагвнспил тРвУгольников зс Ьеи1п Вптп::-с11зС(с1.АЛ1.В) — , 'с11з1(Е.С, С1.А)-'с11зС(Е.В, Е.С); епс1; ГппсС1оп СгпрТг1апи1е(ЕХ: РОЬ1ес1): СшрТуре; 1'соогпветспгвует ТСгпрРигс3 Ьеиш 1Г поС Ес1Туре(ЕХ) СЬеп СгпрТг1ап~1еэ- г1оССогпр е1ве Ьеиш 1Г Вппг(РТг1апа!е(Е)") -- Яппг(РТг1апц1е® ) СЬеп СгпрТг1апи1е: — Ес1па1; 1Г Впгп(РТг1апо!е(В)") < Яшп(РТг1апр1е(Ъ') ) СЬеп СгпрТг1апи1е:-- 1.езз; 1Г Впгп(РТг1апи!е(Е) ) > Яшп(РТг1апр1е(Ъ) ) СЬеп СгпрТг1ап~1е:-- Моте; епс1; епс1; ГппсСюп СпгрЕхеспСа1э1е(ЕХ: РОЬ)есС): СшрТуре: Ьеиш 404 1Г поФ !'.с!Туре(11,Ч) ФЬеп Ехссп1аЫе: — Ко1,Сопср е1ве 1Г РЕхесп1аЫе(1с) ".РгосР! г — РЕхесп1 а!>1е(Ъ') ".РгосР1г ФЬеп Опр1"хесп$аЫе:--Евана! е1ве СпсрЕхесШаЫс; — Хо1Ес1па1; епс1; епс1; Для сравнения объектов Ьг и ч' (где ГУ и ч' типа РОЬ)ес1 -- указатели на объекты) следует вызывать функцию сравнения в виде У '( .Ссчпраге(У, 'ч') либо ч''!" .Сотраге(К 'ч'); кроме того, для сравнения можно гсереопределить операции =, (, >: орегс1сог — (11,'ч': РОЬ1есг) С: Ьоо1еап; Ьеиш С: -(с1 .Соспраге(1.'.,Ъ') -Ес1па!); епс1; орегалог < (с,',ч': РОЬ1есг) С: Ьоо1еап; Ьеиш С: --(сэ' .Ссипраге(13,7) -1.евв); епс1; орега$ог ъ (Е,У: РОЬ1есг) С: Ьоо1еап; Ьеиш С: — (11 .Согпраге(с1,'ч')--Моте); епс1; Для создания нового объекта и помещения его в очередь используются следующие функции-конструкторы: ГппсС1оп ХеччС1гс1е(х,у,г: геа1): Тчга1пе; чаг Х: РСгс;1е; Ьеи1гг ггелч(Х); !' создание нового обвекпса типа ТСлтс1е у' Х".сепгсг.х; х; Х".сепсег.у: у; Х .гас!!ив:--г; Х" .Огалч; -- оозйгалс С1 гс1е; Х ".
Сопсрагс: - -'с1СпгрС1гс1е„ МеччС1гс1е: =-Т'чга1пе(Х); !' приведение типа к типу элементов очереди 3 епс1; Гппсс1оп Хе~чТг1апд1е(ах,ау,Ьх,Ьу,сх,су: геа1): Т'ча1це; чаг Х: РТг1апи1е; Ьеиш пелч(Х); Х".А.х:---ах; Х".А.у: — -ау; Х .В.х:=--Ьх; Х .В.у::-Ьу; Х .С.х:=-сх; Х .С.у: — су: Х .1Эгаччг-1эгаччТг!апо!е; Х".Соп1раге: - СгпрТг!ащ1е; МеччТг1апГ!е: -ТЧа!пе(Х); епс1; 405 ГппсС1оп ХсвЕхесп!аЫе('Г: РРгосес1пге): ТЪа1пе; айаг Х: РЕхеспса!з!е; Ьеи1п пеж(Х); Х ".
Ргос Р! г: — Т; Х .Пгаж; Пгая ЕхеспсаЫе; Х .Сошраге; СшрЕхес1йаЫе; Хея ЕхесшаЫс'. ТЧа!пе(Х); епс1; Программа добавления разнородных объектов в очередь; пример идентичен предыдущему, хотя очередь реализована совершенно по-другому: ргосес1пге Ехап1р!еРга1т! Ье! 1п иггйе1п('ВЬ1 ПОЛН ЯКМЫЙ'); епс1; айаг Ч: Чпепе; Рпй(ц. Хев С!гс!е(10,10.,5)!! Рпэ!1 Я, .Хси Тг!ап а!е(1,2,3, 1,5,6Я; Рцэр. Хеи ЕхесгпаЫе(ОЕхагпр!е1)гав))! П!эр!ау(®; 7.4 Объектно-ориентированное программирование 7.4.1 Наследование До сих пор мы интересовались созданием программ «с пуля>, не учитывая гютребпость использовать имеющиеся программные услуги при создании новых. Соответствующее свойство языка принято называть развиваемостью !2Ц.