2014 экзамен ответы вариант 1 (Ответы на вопросы экзамена 2014)
Описание файла
Файл "2014 экзамен ответы вариант 1" внутри архива находится в папке "Ответы на вопросы экзамена 2014". PDF-файл из архива "Ответы на вопросы экзамена 2014", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Ответы на вопросы экзамена по курсу«Языки программирования» 19.01.2015В ответах курсивом выделены необязательные пояснения, которые можно опустить(особенно на экзамене)Вариант 1Задача 1-1Что означает операция «>>>» в языке Java? Почему её нет в языках С/C++, C#?ОтветОперация «>>>» в языке Java означает побитовый логический сдвиг влево. В языках С,C++, C# есть только операция «>>», которая в зависимости от типа левого операндаозначает либо арифметический сдвиг (знаковый операнд), либо логический (беззнаковыйоперанд).
Поскольку в Java нет беззнаковых типов (кроме byte), то операция «>>» можетозначать только арифметический сдвиг. В то же время операция логического сдвиганеобходима для эффективного выполнения ряда критически важных действий, поэтомуее добавили в язык со специальным обозначением «>>>».Задача 1-2Напишите спецификацию шаблона template <int N> struct Fun {....}; наязыке С++ так, чтобы значение Fun<N>::result было равно сумме квадратов целыхчисел от 1 до N для любого неотрицательного целого константного значения N.ОтветПоскольку речь идет о шаблоне, то подразумевается, что вычисления производятсястатически (во время трансляции).
Текст программы(в ответе достаточно былоописания шаблонов):#include <iostream>template <int N> struct Fun{enum {result = Fun<N-1>::result + N*N// используем конкретизацию этого же шаблона};};// полная специализация для значения N=1template <> struct Fun<1>{enum {result = 1};};int main(){std::cout << Fun<10>::result << std::endl;return 0;}Задача 1-3В каких из перечисленных ниже языков можно объявлять приватные абстрактныефункции? Если можно, то для каждого языка приведите пример.Си++, Java, C#, Оберон, Оберон-2ОтветОберон, Оберон-2 не подходят, так как в них нет такой языковой конструкции, какабстрактный класс. Заметим, что в Си++, Java, C# абстрактные функции — виртуальны(имеют динамическое связывание) и должны быть замещены в потомке.
Однако в C#любые виртуальные функции (не только абстрактные) не могут быть приватными.Что касается Java, то в этом языке приватные члены являются НЕВИДИМЫМИ впроизводных классах (то есть работают правила видимости, а не доступа). Поэтомуприватная функция не может быть замещена в производном классе, отсюда приватныеабстрактные функции невозможны, и компилятор языка выдает ошибку в этом случае.Остается только С++.
В этом языке можно объявлять приватные виртуальные функции,которые можно замещать в производных классах. Они отличаются от защищенныхвиртуальных тем, что приватные функции нельзя вызывать в производных классах (номожно — в самом абстрактном классе). Необходимость в таком механизме достаточноредка, но он допустим.
Так что приватные виртуальные функции разрешены только в С++(из перечисленных языков). Вот где они практически бессмысленны, так это винтерфейсах (где нет конкретных функций).Задача 1-4Напишите определение класса Fib на языке C# так, чтобы следующий фрагментпрограммы выдавал первые 10 чисел Фибоначчи (Fib1 = Fib2 = 1, Fibn = Fibn-1 + Fibn-2):foreach (var f in new Fib(100)) System.Console.WriteLine(f);В оригинале вместо 10 было 100 (без комментариев)...ОтветТекст программы(в ответе достаточно было только описания класса Fib):using System.Collections;namespace Test{class Fib : IEnumerable{int _n;public Fib(int n){_n = n;}public IEnumerator GetEnumerator(){int a = 1; int b = 1;for (int i = 1; i <= _n; i++){yield return a;int c = a + b;a = b;b = c;}}}}class Program{static void Main(string[] args){foreach (var x in new Fib(10))System.Console.WriteLine(x);}}Задача 1-5Дайте общее определение операции индексирования в языке программирования.Напишите пример пользовательского переопределения операции индексирования в языкеС++ (определение операции и ее вызов).
Есть ли аналогичные средства в языке C#? Еслиесть, то приведите пример на этом языке, аналогичный приведенному для С++.ОтветОперация индексирования – это функция:[]: (ContainerType, IndexType) => ElementRefTypeПрименима к контейнерным типам ContainerType (прежде всего - массивы), по индексутипа IndexType (обычно целочисленный, начиная с 0), возвращает тип ссылки на элементконтейнера.Переопределение в С++ (все, что нежирным шрифтом — в ответе необязательно):class Vector {int *body;int size;public:Vector (int sz){body = new int[size = sz];}Vector (const Vector & v){body = new int [size = v.size];for (int i = 0; i < size; i++)body[i] = v.body[i];}Vector &operator = (const Vector& v){if (this != &v) {delete [] body;body = new int [S size = v.size];for (int i = 0; i < size; i++)body[i] = v.body[i];}return *this;}~Vector() { delete [] body; }int& operator[] (int index) { return body[index]; }};Пример вызова:Vector v(20);for (int i = 0; i < 20; i++)v[i] = i*i;В языке C# операции, не являющиеся арифметико-логическими, переопределять нельзя,однако специально для возможности переопределения семантики индексирования тудаввели специальную языковую конструкцию — индексатор.
Пример индексатора:class ContainerType{private Dictionary<string, int> _dic = new Dictionary<string, int>();}public int this[string k]{get { return _dic[k.ToLower()];}set { _dic.Add(k.ToLower(), value); }}Задача 1-6Дайте определение и пример использования анонимной (лямбда-функции) в языке Python.В каких языках из перечисленных ниже есть аналогичное понятие? Для каждого такогоязыка приведите пример.JavaScript, Ада, Си++, Оберон, Оберон-2ОтветЛямбда-функция — это безымянная функция, тело которой — выражение, котороевозвращается как результат функции:lambda arguments : expressionВыражение может включать в себя не только аргументы, но и доступные переменныеиз окружающих областей видимости, которые «захватываются» лямбда-функцией исоставляют так называемое «замыкание».Пример:r = [1,2,3,4,5]# применяем лямбда-функцию к списку rr1 = map(lambda x: x*x, r)for x in r1:print(x)Вывод (список квадратов):1491625Лямбда-функции есть также (из перечисленных в условии языков) в JavaScript,Си++.JavaScript:f = function(x) { return x*x; }Си++:// определим лямбда-функцию и немедленно применим ее к 5auto twentyfive = [](int x) {return x*x; }(5);Задача 1-7Дайте определение понятия «защищенный член класса» в языке Java.
Перечислите егоотличия от аналогичного понятия в языке C#.Ответ«Защищенный член класса» в языке Java — это член, помеченный атрибутом доступаprotected.Защищенный член класса Х:1. Доступен из всех функций этого же класса2. Доступен из всех функций производных классов через ссылку this3. Доступен из функций-членов классов пакета, где находится класс ХВ языке C# защищенность означает то же, что и 1. и 2., только без ограничения на ссылку.Объяснять, что значит «доступность через ссылку this не надо (так как долго и не вформате этого экзамена). Желающие могут прочитать в конспектах лекций этого года(if any), либо, например, в книге Арнольда, Гослинга, Холмса (3-е издание) в п.3.5 «Что вдействительности означает protected»Задача 1-8Задача №8 имела 2 варианта. Первый:Что будет напечатано в результате работы следующей программы на С#?using System;namespace test{class Program {static void Main() {B a = new B(), b = new B(); P(a, b);Console.WriteLine("------------------------------");C c = new C(), d = new C(); P(c, d);}static public void P(A a, B b) {a.f(); a.g();b.f(); b.g();}}}class A {public void f() { Console.WriteLine("A.f"); g(); }public virtual void g() { Console.WriteLine("A.g"); }}class B : A {public virtual new void f() { Console.WriteLine("B.f"); }public override void g() { Console.WriteLine("B.g"); f(); }}class C : B {public override void f() { Console.WriteLine("C.f"); }public override void g() { Console.WriteLine("C.g"); f(); }}ОтветA.fB.gB.fB.gB.fB.fB.gB.f-----------------------------A.fC.gC.fC.gC.fC.fC.gC.fВторой вариант задачи №8:Что будет напечатано в результате работы следующей программы на С#?using System;namespace test{class Program {static void Main() {B a = new B(), b = new B(); P(a, b);Console.WriteLine("------------------------------");C c = new C(), d = new C(); P(c, d);}static public void P(A a, B b) {a.f(); a.g();b.f(); b.g();}}class A {public void f() { Console.WriteLine("A.f"); g(); }public virtual void g() { Console.WriteLine("A.g"); }}class B : A {public void f() { Console.WriteLine("B.f"); }public override void g() { Console.WriteLine("B.g"); f(); }}class C : B {public void f() { Console.WriteLine("C.f"); }public override void g() { Console.WriteLine("C.g"); f(); }}}ОтветA.fB.gB.fB.gB.fB.fB.gB.f-----------------------------A.fC.gC.fC.gC.fB.fC.gC.f.