И.Г. Головин - Варианты письменного экзамена (1129118), страница 3
Текст из файла (страница 3)
Дайте определение абстрактного типа данных (АТД) и абстрактногокласса (АК). Перечислите сходства и различия этих понятий. Приведитепримеры АК и АТД на каких-нибудь языках программирования (толькоспецификации – тела процедур и функций писать не надо).156. В каких из перечисленных ниже языков есть понятие «перегрузкаимен» (или «перекрытие имен»)? Объясните, что оно означает (на примерекакого-либо языка).Чем перегрузка отличается от замещения?Ада 83, Ада 95,Си, Си++, Оберон, Оберон-2, Модула-2, Java, Delphi, C#7.
Объясните, чем отличается понятие «структура» от понятия «класс»в языке C#?8. Что означает ключевое слово override в языках C# и Delphi? Почемуэто ключевое слово (или аналогичное ему) отсутствует в языке Java?16III. ОТВЕТЫ, УКАЗАНИЯ И РЕШЕНИЯ3.1. Вариант 20031.B::fB::gB::hA::hB::fB::gB::hB::h----C::fC::gA::hC::fC::gB::h2.
Ада 83, Ада 95, Delphi, C#3. Конструкция языка Delphi «uses список_имен_модулей» служит дляимпорта всех имен, объявленных в интерфейсе модулей из списка. При этомимпортированные имена становятся непосредственно видимыми (если нетконфликтов с именами из других модулей).Конструкция языка Ада «use список_имен_пакетов» обеспечиваетнепосредственную видимость имен из спецификаций пакетов из списка (еслинет конфликтов).Сходство: конструкции обеспечивают непосредственную видимостьимен из интерфейсов (спецификаций) при отсутствии конфликтов.Различие: вDelphi «uses» импортирует имена из интерфейсовбиблиотечных модулей, в Аде импорт имен обеспечивается другимиконструкциями, а «use» служит только для разрешения непосредственнойвидимости.4. Си++.Пример динамического массива в языке Java (или C#):void f(int N) {byte [] dynArray = new byte [N];// ...обработка ...}Замечание: в языках Оберон и Модула-2 длина формальныхпараметров — открытых массивов является динамическим атрибутом.
Вдругих случаях длина массива — статический атрибут. В Аде формальные17параметры неограниченных типов-массивов также имеют динамическийатрибут-длину (равно как и динамические массивы-локальные переменные).5.Семантика возобновления: после обработки исключенияуправление может вернуться непосредственно в точку, где возниклоисключение (варианты: на следующий оператор или на любой оператор изтого же блока).Пример языка: Visual Basic.Семантика завершения: после возникновения исключения блок, вкотором оно возникло, обязательно завершается. Обработка исключенияпроисходит в блоках, вызвавших блок с исключением.Пример языка: Си++.6.
В языке Ада 83 подпрограммы не могут быть параметрамиподпрограмм (еще пример: Java).7. Классы памяти:• статическая;• квазистатическая;• динамическая.В языке C# объекты классов размещаются только в динамическойпамяти.8. Один из вариантов:template <typename T, int size> class Stack{public:Stack() {top = 0;}void Push(T x);T Pop(T& x);bool IsEmpty();bool IsFull();private:Stack (const Stack& s);T body[N];int top;};183.2. Вариант 20041.X::fX::gX::gY::fY::gY::f-----------------------------Y::fX::gZ::fY::gZ::f2.Ада 95, Си++, Оберон-2, Java, Delphi, C#.3. Полностью эквивалентный фрагмент написать нельзя, поскольку Адатребует полной инкапсуляции структуры типа, а Оберон позволяет открыватьполя структуры (в примере - I открыто, а J – закрыто).
Однако можно на Аденаписать написать подпрограммы доступа для I (get/set) и добиться того жеэффекта.type T is tagged private;type T1 is new tagged T with private;procedure P(X:T; L: integer);procedure P(X:T1; L: integer);Замечание: на языке Оберон процедуры P динамически привязаны ктипу (T и T1 соответственно), однако на Аде динамическая привязка — этосвойство не метода, а вызова. Поэтому разницы между динамически истатическими привязанными методами в Аде нет.4.Ада, Delphi, C#Язык C#:try {// блок try...} finally {// блок finally...}19Блок finally обязательно выполнится после завершения блока tryнезависимо от того, нормально или аварийно (с возбуждением исключения)произойдет это завершение.5.
Класс S имеет два конструктора:–явно описанный explicit S(int);–сгенерированный конструктор копирования S(const S&);Замечание: конструктор умолчания не генерируется, так как в классеесть явно описанный конструктор.6. Конструкция package имеет вид:package имя_пакета;Она может быть только первой в единице компиляции. Смысл состоитв том, что класс, описанный в единице компиляции, относится к указанномупакету. Пакет является единицей дистрибуции Java-классов, а такжеединицей контекста.7. Тип, имя которого экспортируется, но все поля — закрыты (неэкспортируются).TYPE OpaqueT* = RECORD I:TT; J: TTT END;8.void f(){try {}}}}g(); h();catch (E1){throw;catch (E2){throw;catch (E3){throw;catch (...) {unexpected();}}3.3. Вариант 20051.A::fA::gA::gB::fB::g20B::f-----------------------------B::fA::gC::fB::gC::f2.
Семантика возобновления: после обработки исключения управлениеможет вернуться непосредственно в точку, где возникло исключение(варианты: на следующий оператор или на любой оператор из того же блока).В языке Си++ реализована другая семантика: завершения, но в некоторыхслучаях семантика возобновления может быть смоделирована, например, вслучае выделения возобновляемого ресурса (типа динамической памяти):Resource GetResource() {for (;;)try {Resource r = … // попытка получить ресурс, например// выделить памятьif (success) return r;throw NoResourceException();} catch (NoResourceException) {// попытка найти дополнительные ресурсы (например,// динамически собрать мусор)if (!success) throw;}}3.
Язык Ада (реализация в виде двунаправленного списка):generictype T is private;package G_Deque istype Deque is limited private;procedure PushRight(Deq: inout Deque; X:T);procedure PushLeft(Deq: inout Deque; X:T);procedure PopRight(Deq: inout Deque; X: out T);procedure PopLeft(Deq: inout Deque; X: out T);procedure Init(Deq: out Deque);procedure Destroy(Deq: inout Deque);function IsFull(Deq: Deque);function IsEmpty(Deq: Deque);–- другие процедуры ...privatetype PLink is access;type Link is record inf : T; next, prev : PLink; end record;type PLink is access Link;type Deque is record Left, Right: PLink; end record;end G_Deque;21Язык Java;interface IDeque<T>{void PushLeft(T x);void PushRight(T x);T PopLeft();T PopRight();bool IsFull();bool IsEmpty();// другие функции}Замечания:а). Обобщенные конструкции употреблять не обязательно (надо тольконаписать, что тип Т должен быть непосредственно видимым в точкеописания типа Deque).
Хотя обобщения здесь подходят больше.б). Структуру типа в Аде полностью выписывать необязательно.Главное — указать наличие приватной части, например:private...type Deque is …; –- структура типа Dequeend G_Deque;в). Для языка Java можно выписать не инетерфейс, а конкретный классс приватной структурой и публичными функциями-операциями. Телафункций в этом случае можно не выписывать. Но интерфейс в данном случаебольше подходит к понятию абстрактного типа данных.4.
Языки;Ада 95, Си++, Java, Delphi, C#Например, в языке Си++ абстрактная функция — это чистаявиртуальная функция. Она не обязана иметь тела и должна быть обязательнозамещена в каком-либо производном классе.5. Ключевое слово super означает в языке Java ссылку на базовыйкласс. Такое же понятие есть в языке C#, но оно называется base.Пример на Java:class A{public A(int I) { … }...}class B extends A{public B() { super(0); … }...}22Пример на C#:class A{public A(int I) { … }...}class B : A{public B() : base(0) { … }...}6.Delphi, C#«Свойство» - это член класса, который с точки зрения обращения кнему выглядит как член-данное, но с точки зрения реализации представлендвумя методами, один из которых возвращает значение свойства, а второй —устанавливает его значение.
При этом один из методов может отсутствовать,делая недоступной соответствующую операцию над свойством.Пример для языка Delphi – целое свойство Prop:type PropSample = class…privateprocedure SetPropVal(V : integer);function GetPropVal:integer;publicproperty Prop: integer read SetPropVal write GetPropVal;…end;7. Ада 83, Ада 95, Си++, Java, Delphi, C#Понятие «перегрузка» означает, что одному имени в одной областивидимости может соответствовать несколько определений. В современныхязыках программирования перегружаться могут только имена подпрограмм,но не типов, переменных, модулей.8. Основное отличие деструктора языка C# от деструктора Си++состоит в том, что неизвестен момент его вызова.
Деструктор (вдействительности — финализатор) вызывается сборщиком мусора в моментутилизации памяти, занимаемой объектом. Для ряда объектов деструкторвообще может быть не вызван. В Си++ момент вызова деструкторадостаточно точно определен.233.4. Вариант 20061. Ада, Модула-2, ПаскальОбъединение типов (или запись с вариантами) — это конструкция,объединяющая в один тип несколько различных структур (вариантов). Всеварианты в объединении начинаются с одного адрес и занимают одну и ту жепамять.Размеченное объединение типов содержит одно выделенное поле(дискретного типа данных) — общее для всех вариантов. Такое поленазывается дискриминантом.
Значение дискриминанта определяетопределяет, по какому варианту выделена память в переменной-экземпляреразмеченного объединения.2. Указатели языка Ада 83 ссылаются только на объекты издинамической памяти. Указатель языка Си++ может ссылаться на любойобъект данных (динамический, локальный, статический), что можетприводить к труднообнаружимым ошибкам.Также в языке Ада отсутствует адресная арифметика (арифметическиеоперации над указателями), что также уменьшает вероятность появленияошибки работы с памятью.3. Си, Си++Раздельная трансляция означает то, что программа разбивается начасти — физические модули или единицы компиляции. Каждая единицаможет или обязана транслироваться отдельно от остальных.Независимая раздельная трансляция означает то, что транслятор необладает информацией об уже оттранслированных единицах и поэтому неможет проверить корректность межмодульных связей.4.
Конструкция where используется в языке C# для определенияограничений на параметры родовых (другое название - обобщенных)конструкций.Ее вид: where имя_типа : список_ограничений.Виды ограничений:–интерфейс — означает, что параметр-тип должен реализовыватьэтот интерфейс;–имя класса (может быть только одно такое ограничение в списке)— означает, что параметр-тип должен быть наследником этого класса;–struct или class – означает, что параметр-тип должен бытьструктурой или классом;–new() - означает, что параметр-тип должен иметь конструкторумолчания (без параметров).245.11212331122222222336.