Ответы 2011 вариант 2 (Коллоквиум. Варианты заданий и ответы)
Описание файла
Файл "Ответы 2011 вариант 2" внутри архива находится в папке "Коллоквиум. Варианты заданий и ответы". Документ из архива "Коллоквиум. Варианты заданий и ответы", который расположен в категории "". Всё это находится в предмете "практикум (прикладное программное обеспечение и системы программирования)" из 4 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "Ответы 2011 вариант 2"
Текст из документа "Ответы 2011 вариант 2"
Ответы_Вариант 2_2011
1. Ответ: x = c.C::g (& b);
x = c.A::f (); x = c.B::f ();
x = c.A::f (x); x = c.B::f (x);
x = c.C::f (x, 1); x = p -> A::f ();
x = p -> A::f (x); x = p -> A::f (x, 1);
Ошибочны 2 оператора, которые можно исправить (подчеркнуты).
Критерии: За пропуск ошибки (из 2-х): -3. За каждое не отмеченное или неверное уточнение области видимости (из 7): -1. За каждую лишнюю обнаруженную "ошибку" -3.
2. Ответ: 1. Чтобы функцию f() можно было вызывать для констант (t->f(3)), надо поставить модификатор const после списка формальных параметров этой функции в классе C. Чтобы из функции C::f() можно было вызвать функцию C::h(), надо поставить модификатор const после списка формальных параметров функции C::h(). Чтобы функцию преобразования operator int() можно было вызывать для констант (t->f(d)), надо поставить модификатор const после списка формальных параметров этой функции в классе D. Чтобы функцию g() можно было вызывать для констант (t->g()), надо поставить модификатор const после списка формальных параметров этой функции в классе C. При таких исправлениях все функции станут невиртуальными, и будет выдано в поток:
C::f,3 C::h,3 C::f,100 C::h,100 C::g C::h,5
Если будут сделаны синхронные исправления описания функций f(), g() и h(), в классе D, чтобы функции остались виртуальными, будет выдано в поток:
D::f,3 D::h,3 D::f,100 D::h,100 C::g D::h,5
Критерии: За каждое неправильное исправление и неправильно вызванную функцию -2.
3. Ответ: f (); // (а) неоднозначность определения числа параметров
f (4); // (в) неоднозначность при стандартном преобразовании
f (f); // f (double), (б) вещественное расширение
f (d); // f (double), (а) точное отождествление
f (ld); // f (long double), (а) точное отождествление
Критерии: За каждую ошибку –2.
4. Ответ: A(),B(),A(const A&),D(),A(),B(),C(),~C(),~B(),~A(),~D(),~A(),~B(),~A().
Критерии: За каждую ошибку –2.
5. Ответ: template<class T> class ObjPtr { /* ... */ cl<T> * c; public: /* ... */
const bool operator==(const ObjPtr<T> & s) const
{ return * c == * s.c; }
const bool operator==(const T & s)
{ return * c == s; }
friend const bool operator==(const T & s, const ObjPtr<T> & t);
};
template<class T> const bool operator==(const T & s, const ObjPtr<T> & t)
{ return * t.c == s; }
Критерий: За отсутствие каждого примера (из 3-х) или ошибки в нем: -4. За отсутствие реализаций методами класса (из 2-х) при правильной реализации этих же операций функциями-друзьями: -2.
6. Ответ: 1. Наследование есть способ упорядочения абстракций, путём создания иерархии классов. Наследование позволяет производному объекту наследовать от базового объекта общие атрибуты, определяя собственные дополнительные характеристики.
2. Наследование может одиночным (единичным) и множественным, когда наследуются атрибуты сразу нескольких классов. Ограничений на длину цепочек в языке нет. Одиночное наследование:
class A: { ... }; class B: A { ... }; class C: B { ... };
3. Множественное наследование:
class A: { ... }; class B: { ... }; class C: A, B { ... };
Критерий: За неверный ответ: -5. За отсутствие ответа на вопрос о видах наследования: -5. За отсутствие любого из двух примеров: -2.
7. Ответ: d b e d e m e
Критерии: За каждую неверную (лишнюю или пропущенную) печать -2.
8. Ответ: 1. Необходимо заменить вид наследования класса “S” на открытый, чтобы поле “s” стало доступным в классе “U”:
class T: public S { public int t; void tp (int ti) { t = ti; s = ti; }};
2. Необходимо дополнительно заменить вид наследования класса “T” на открытый, чтобы стали возможными преобразования указателей в процедуре “g()”:
class U: public T { public int u; void up (int ui) { u = ui; t = ti; s = ti; }};
3. Открытости наследования можно добиться, заменяя в наследующем классе слово “class” словом “struct”.
4. Других ошибок нет.
Критерий: За пропуск любой из двух ошибок или неправильное исправление: -5. За указание ошибки там, где ее нет: -5.
9. Ответ:
Функция-друг, не являясь методом класса, имеет доступ к защищённым и закрытым членам класса. Функция может быть объявлена другом нескольких классов, а метод всегда относится к одному классу.
class Matrix;
class Vector { friend Vector operator*(const Matrix&, const Vector&); };
class Matrix { friend Vector operator*(const Matrix&, const Vector&); };
Vector operator*(const Matrix&, const Vector&) { ... }
Критерий: За пропуск объяснения понятия “дружбы”: -5. За пропуск ответа на вопрос об отличиях методов и “друзей”: -3. За пропуск примера: -2.
10. Ответ:
typedef list <long int *> L;
L::size_type g (L & lst)
{ L:: reverse_iterator lp, lq;
L:: size_type count = 0;
lp = lst.rbegin ();
while (lp != lst.rend ())
{ lq = lp;
++ lp;
if (lp == lst.rend ())
break;
if (** lp < 0) {
** lq = - ** lq;
++ count;
}
++ lp;
}
L:: iterator lr = lst.begin ();
while (lr != lst.end ()) {
cout << ** lr;
++ lr;
}
return count;
}
КРИТЕРИИ: За каждую существенную ошибку: -3. Отсутствие ссылки в списке формальных параметров - -3. Использование вместо типа size_type типа int - не наказывать.