2015 экзамен ответы вариант 1 (Решённые задачи прошлых лет)
Описание файла
Файл "2015 экзамен ответы вариант 1" внутри архива находится в папке "Решённые задачи прошлых лет". PDF-файл из архива "Решённые задачи прошлых лет", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Ответы на вопросы экзамена по курсу«Языки программирования» 09.01.2016В ответах курсивом выделены необязательные пояснения, которые можно опустить(особенно на экзамене)Вариант 1Задача 1-1Объясните, что означает понятие «виртуальное множественное наследование» в языкеС++. Объясните, какие проблемы возникают при реализации этого понятия (неперечисляйте общих для множественного наследования проблем, а ограничьтесь толькоспецифическими проблемами виртуального наследования)?ОтветЕдиничное виртуальное наследование — это наследование виртуальной базы, котороепроисходит с помощью ключевого слова virtual:class VBase { … };class Der : public virtual VBase {...};Множественное виртуальное наследование – это наследование нескольких виртуальныхбаз.
Особенностью виртуальной базы является то, что при виртуальном множественномнаследовании одинаковые виртуальные базы объединяются а один экземпляр базы. Темсамым реализуется так называемое ромбовидное (diamond) наследование.Здесь должен быть рисунок ромба ABCD…На лекциях мы разбирали одну специфичную для виртуального наследования проблему, аименно, организацию доступа к виртуальной базе при виртуальном множественномнаследованииПроблема состоит в том, что функции наследника виртуальной базы Der должнытранслироваться СПЕЦИАЛЬНЫМ образом при единичном виртуальном наследовании.Множественного наследования еще в помине нет, а его уже нужно учитывать…Специфика проявляется при доступе функций класса Der к унаследованным членамданным из виртуальной базы.
Проблема в том, что при трансляции функций-членов классаDer реальное размещение (и, следовательно, смещения) членов-данных виртуальной базыVBase неизвестны.Так при размещении переменнойDer x;виртуальная база VBase может находиться непосредственно перед частью от Der. А принаследовании:class Der1 : public virtual VBase {...};class W : public Der1, public Der {...};при размещении переменнойW y;получается такая ситуация: пусть виртуальная база размещеается сразу перед частью отDer1, тогда между виртуальной базой и частью от Der в переменной y находитсяпромежуток (то, что унаследовано от Der1).
А функции из класса Der должны бытьоттранслированы так (без всякого знания о деталях будущего множественногонаследования), чтобы работать с виртуальной базой и для this=&x и для this=&y.Хотя относительные смещения от виртуальной базы до части Der в этих случаяхсовершенно разные. И это, конечно, проблема, которую надо решать.На этом можно и закончить — ведь проблема объяснена. Но можно (хотя инеобязательно) добавить и про возможные решения проблемы. Стандартный подходсостоит в том, что при единичном виртуальном наследовании добавляется еще односкрытое поле — указатель (ссылка) на виртуальную базу. Это указатель определяетсяпри размещении конкретной переменной (инициализируется, конечно, системной частьюконструктора).
Смещение этого поля от указателя this всегда фиксировано и неменяется при множественном наследовании. Функции производного класса никогда неработают с виртуальной базой напрямую, а только косвенно — через эту ссылку.Конечно, это требует некоторых дополнительных накладных расходов.Задача 1-2Объясните, что означают термины «семантика возобновления» и «семантика завершения».Приведите примеры языков, в которых реализована семантика завершения. Опишитепример моделирования семантики возобновления через семантику завершения.ОтветСемантика возобновления: после обработки исключения управление может вернутьсянепосредственно в точку, где возникло исключение (варианты: на следующий операторили на любой оператор из того же блока).Семантика завершения: после возникновения исключения блок, в котором оно возникло,обязательно завершается.
Обработка исключения происходит в блоках, вызвавших блок сисключением.Примеры языков: С++, Ада, Java, C#, Python, JavaScript.в некоторых случаях семантика возобновления может быть смоделирована, например, вслучае выделения возобновляемого ресурса (типа динамической памяти):Resource GetResource() {for (;;)try {Resource r = … // попытка получить ресурс, например// выделить памятьif (success) return r;throw NoResourceException();} catch (NoResourceException) {// попытка найти дополнительные ресурсы (например,// динамически собрать мусор)if (!success) throw;}}Задача 1-3Дайте определение языковой конструкции «интерфейс».
Что означает термин «интеграцияинтерфейсов в язык программирования»? Приведите два различных примера интерфейсов,интегрированных с языком Java.ОтветИнтерфейс можно рассматривать как абстрактный класс, доведенный до «абсолюта».Интерфейс состоит только из публичных абстрактных методов. Поскольку реализацииметодов нет (равно как нет и невиртуальных методов), то интерфейс не имеетнестатических членов (статические члены, например, константы допустимы). Вобъявлении интерфейса присутствуют только сигнатуры методов (а также свойств вязыках, где есть это понятие), и, возможно, статических членов и вложенных интерфейсов.Интерфейс представляет собой «чистый» контракт. Производный класс, наследуяинтерфейс, «подписывается» под контрактом.
Производный класс, наследующийинтерфейс и замещающий все его методы, называют реализацией интерфейса.Интеграция интерфейсов в язык означает, что язык (компилятор) поддерживает рядстандартных интерфейсов, позволяющих интегрировать семантику языковых конструкцийи пользовательские классы, реализующие эти интерфейсы. Например, в языке Javaстандартный интерфейс Iterable используется в цикле for-each для прохода поколлекциям. Если пользовательский класс реализует этот интерфейс, то он тоже можетиспользоваться в цикле for-each, как это можно делать со стандартными массивами иколлекциями.Другой пример — интерфейс Cloneable.
Если класс реализует интерфейс-маркерCloneable, то это означает, что класс будет реализовывать открытый метод сlone()создания своей копии:class CloneAttack implements Cloneable{public Object сlone(){// возвращает свою копию}}Тут следует отметить, что любой класс уже содержит версию метода сlone(),унаследованную от класса Object. Этот метод возвращает поверхностную копиюобъекта. Однако проблема в том, что этот метод - защищенный, поэтому можетиспользоваться только из производных классов или из классов своего пакета.
Для того,чтобы позволить копирование себя внешним классам и используется интерфейсCloneable.Задача 1-4Дайте определение «пространства имен» в языке C# и пакета в языке Java. В чем состоитосновное сходство и основное отличие этих понятий?ОтветЗадача 1-5Что будет напечатано в результате работы следующей программы на языке Python?s= range(1,5)sqr = TrueprocessFunc = sqr and (lambda s: s*s) or (lambda s: s)print([processFunc(i) for i in s])Что будет напечатано, если sqr = True заменить на sqr = False?ОтветБудет напечатан список квадратов чисел от 1 до 4: [1, 4, 9, 16].
Если sqr = Trueзаменить на sqr = False, то список самих чисел [1, 2, 3, 4]. Вспомним, чтофункция range работает с полуоткрытым диапазоном и не включает правую границу вдиапазон. Особенность выполнения логических операций в Python состоит в том, чторезультат логической операции — это всегда значение одного из операндов. В случае,если значения всех операндов — логические, то, конечно, резултат тоже будетлогическим (True или False). Если операнд не логический, то его значения 0, '', [], (),{} и None интерпретируются как ложь, все остальные значения — как истина.
Приэтом результатом выражения является не интерпретация значения соотвествующегооперанда, а его значение. Поэтому результатом операции «and» в операторе вышебудет либо False (в случае, если первый операнд - False), либо значение ее второгооперанда БЕЗ ПРЕОБРАЗОВАНИЯ ТИПА (Python вообще не любит преобразования) — тоесть лямбда-функция возведения в квадрат. Аналогично результатом операции «or» воператоре выше будет либо лямбда-функция возведения в квадрат (если sqr есть True),либо (если значение sqr - False) значение второго операнда также безпреобразования типа, то есть тождественная лямбда-функция.
Далее эта функцияприменяется для генерации списка квадратов (sqr – True), либо списка самих чисел (sqr –False).Задача 1-6Переписать программу из задачи №5 на языке С# с использованием механизма лямбдафункций и обобщенных делегатов так, чтобы она выдавала в стандартный вывод те жесамые значения.ОтветЗдесь требуется написать эквивалентный фрагмент программы, который делает то жесамое. Особенность этого искусственного примера в том, что он демонстрируеттехнику, которая позволяет экономить на проверке условия sqr – True или False длякаждого элемента списка (в C# аналогом питоньего списка будет, конечно, массив).