2015 экзамен ответы вариант 1 (Решённые задачи прошлых лет), страница 2
Описание файла
Файл "2015 экзамен ответы вариант 1" внутри архива находится в папке "Решённые задачи прошлых лет". PDF-файл из архива "Решённые задачи прошлых лет", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
Тоесть мы должны один раз сконфигурировать функцию (значение делегатского типа в C#)в зависимости от значения sqr, а затем вызывать эту функцию для каждого элементамассива без лишней проверки sqr. В случае Питона — это просто (можно было бы ещепроще, но здесь это опустим), однако в случае C# (статически типизированного языка),лямбда-выражение само не является делегатом, а должно рассматриваться как«генератор» делегатов (функций) в зависимости от настройки типа аргументовлямбда-выражения.
Поэтому очевидное, на первый взгляд, присваиваниеvar procFunc = x=>x*;выдает ошибку компиляции: левая часть требует, чтобы ее тип определялся из правойчасти, а правая часть — лямбда-выражение — само требует информации из левойчасти о типе для настройки на конкретную функцию-делегат.Так что надо вместо var объявить нужный делегатский тип.
Для этого-то очень удобныобобщенные делегаты: нам нужен, очевидно, делегат — функция от int, возвращающаяint. В пространстве имен System уже любезно заготовлен нужный обобщенный делегат -Func<TRes, Targ>. Нужная нам конкретизация – Func<int,int>. Поэтому имеем (опускаяантураж полной программы, а также скобки [ и ]):int [] s = {1,2,3,4};var sqr = true;Func<int,int> procFunc;if (sqr)procFunc = x=>x*x;elseprocFunc = x=>x;foreach (var i in s)System.Console.Write(procFunc(i).ToString() + ", ");Обязательно ли использовать обобщенный делегат? Конечно, нет, точно также, какнеобязательно использовать лямбды — можно описать две функции (тут уже антуражпрограммы не опустишь), далее вместо лямбда-выражений использовать имена этихфункций.
Точно также, вместо обобщенного делегата можно использовать конкретныйделегат Func, описав его как delegate int Func(int x); там же, где описывались функции,иоесть в районе метода main в главном классе программы и т. д. Поэтому в заданиитребуется использовать лямбда-выражения и обобщенные делегаты, хотя я ненаказывал за использование конкретного делегата. Лямбда-функции и выражения впроцедурном программировании — это вообще вопрос удобства, можно и без них, но сними — компактнее и нагляднее во многих случаях.Задача 1-7Рассмотрим файл на языке Java, содержащий определение класса С:package test;class C { public void f() { g(); } }При трансляции этого файла выдается ошибка.
Объясните, в чем она состоит, и чтонужно добавить в программу, не меняя ничего в классе С, чтобы данный файлтранслировался без ошибок? Можно добавлять в программу новые файлы, а также новыестроки в заданный файл, но нельзя менять определение класса С.ОтветОшибка состоит в вызове неопределенной функции g();Значит, надо сделать так, чтобы эта функция была определена и видима (в Java –управление видимостью!) в классе C. Не меняя объявление класса С это можно сделатьдвумя способами: включить класс С в качестве внутренноего класса в какой-нибудьобъемлющий класс:package test;class Outer{void g() { ; }class C { public void f() { g(); } }...}либо использовать статический импорт (именно это и предполагалось автором):package test2;class Extern{public void g() { ; }}package test;import static test2.Extern.g; // либо import static test2.Extern.*;class C { public void f() { g(); } }Можно и еще проще — вообще без дополнительного пакета.Задача 1-8Что будет напечатано в результате работы следующей программы на Java? Считаем, чтокаждый пакет находится в своем файле.package P2;class CC extends P1.AC {public void f1() { print("CC.f1");}public void f2() { print("CC.f2");}public void f3() { print("CC.f3");}public void f4() { print("CC.f4");}}public class TT {public static void main(String [] args) { new CC().show(); }}package P1;public abstract class AC {public static final void print(String s) { System.out.println(s);}public void f1() { print("AC.f1");}void f2() { print("AC.f2");}protected void f3() { print("AC.f3");}private void f4() { print("AC.f4");}public final void show() { f1();f2();f3();f4();}}ОтветCC.f1AC.f2CC.f3AC.f4Напомним, что в Java – управление видимостью, а не доступом.
Это означает, вчастности, что замещаться могут только ВИДИМЫЕ методы. Приватные методы,поэтому замещаться не могут ни в каком производном классе (поэтому AC.f4), а в другомпакете невидимы ( и не могут замещаться методы с пакетным доступом, поэтомуAC.f2). В другом варианте наследование происходит в том же пакете, поэтому метод f2видим для замещения, и поэтому там будет выдано СC.f2.