Ответы 2011 вариант 3 (Коллоквиум. Варианты заданий и ответы)
Описание файла
Файл "Ответы 2011 вариант 3" внутри архива находится в папке "Коллоквиум. Варианты заданий и ответы". Документ из архива "Коллоквиум. Варианты заданий и ответы", который расположен в категории "". Всё это находится в предмете "практикум (прикладное программное обеспечение и системы программирования)" из 4 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "Ответы 2011 вариант 3"
Текст из документа "Ответы 2011 вариант 3"
Ответы_Вариант 3_2011
1. Ответ: x = c.g (p);
x = c.A::f (); // x = c.B::f ();
x = c.C::f (x); x = c.C::f (x, 1);
x = p -> C::f ();
x = p -> C::f (x); x = p -> C::f (x, 1);
Ошибочен 1 оператор, который можно исправить (выделен шрифтом).
Критерии: За пропуск ошибки: -4. За каждое не отмеченное или неверное уточнение области видимости (из 7): -1. За каждую лишнюю обнаруженную "ошибку" -4.
2. Ответ: k = s; // Приведение производного указателя к базовому
// s = dynamic_cast<S *>(k); // Тип К – не полиморфный
// l = dynamic_cast<L *>(k); // Тип К – не полиморфный
m = s; // Приведение производного указателя к базовому
// p = dynamic_cast<S *>(l); // Тип L – не полиморфный
q = dynamic_cast<Q *>(m);
r = dynamic_cast<R *>(q);
// s = dynamic_cast<S *>(p); // Тип P – не полиморфный
Критерии: За каждое не найденное лишнее преобразование (из двух): –2. За каждое не удаленное ошибочное преобразование (из 4-х): –2.
3. Ответ: f (s); // f (int), (б) целочисленное расширение
f (i); // f (int), (а) точное отождествление
f (b); // f (int), (б) целочисленное расширение
f (f); // (в) неоднозначность при стандартном преобразовании
f (d); // (в) неоднозначность при стандартном преобразовании
Критерии: За каждую ошибку –2.
4. Ответ: A B C A B C B(B&) D ~D ~B ~C ~B ~A ~C ~B ~A.
Критерии: За каждую ошибку –2.
5. Ответ: template<class T> class ObjPtr { /* ... */ cl<T> * c; public: /* ... */
ObjectPtr<T> & operator= (const ObjectPtr<T> & s)
{ if (this != & s)
{ delete c; c = new cl<T>; * c = * (s.c); }
return * this; }
ObjectPtr<T> & operator= (const int & s)
{ delete c; c = new cl<T>; * c = s;
return * this; }
friend const ObjectPtr<T> operator- (const ObjectPtr<T> & s);
};
template<class T> const ObjectPtr<T> operator- (const ObjectPtr<T> & s)
{ ObjectPtr<T> v; v.c = new cl<T>; * v.c = (T) 0 - * s.c; return v; }
Критерий: За отсутствие каждого примера (из 3-х) или ошибки в нем: -4. За отсутствие реализации унарного минуса функцией-другом при правильной реализации этой операции методом класса: -2. За попытку реализации присваивания функцией-другом: -5.
6. Ответ: 1. Инкапсуляция обеспечивает сокрытие состояния объекта от остальных объектов, процедур. Инкапсуляция защищает данные от несанкционированного доступа со стороны посторонних алгоритмов. Инкапсуляция изолирует внешнее представление об объекте от его внутренней реализации. Доступ к связанным между собой алгоритмам и данным контролируется интерфейсом (формальным описанием способов доступа к алгоритмам и данным).
2. Пример инкапсуляции (доступ к полю “n” возможен только из методов класса и функций-друзей):
class A: { int n; public: f () ... };
Критерий: За демонстрацию непонимания сущности инкапсуляции: -5. За отсутствие примера: -5.
7. Ответ: l a l f i k e n
Критерий: За каждую неверную (лишнюю или пропущенную) печать -2.
8. Ответ: 1. Чтобы преобразование из класса “W” в функции “h()” в класс “Z” стало возможным, это преобразование надо исправить: pz = (Z *)(X *)(new W);
2. Дополнительно необходимо сделать открытым вид наследования класса “W” классом “X” и класса “X” классом “Z”:
class X: public W { ... }; class Z: public X,Y { ... };
3. Необходимо уточнить область видимости поля “w” в теле функции “h()”:
(*pz).X::w=& hi;
4. Открытости наследования можно добиться, заменяя в наследующем классе слово “class” словом “struct”.
5. Других ошибок нет.
Критерий: За пропуск любой из пяти ошибок или неправильное исправление: -2. За указание ошибки там, где ее нет: -5.
9. Ответ:
-
Имеется иерархия классов, хотя бы из двух классов – базового и производного
-
В базовом классе функция объявлена с ключевым словом virtual
-
В производном классе есть функция с таким же именем, с таким же списком параметров (количество, типы и порядок параметров совпадают) и с таким же типом возвращаемого значения
-
Вызов функции производного класса осуществляется через указатель на объект базового класса (или с помощью ссылки на объект базового класса) без указания самого объекта и уточнения с помощью операции разрешения области видимости
class B { public: virtual void print (); };
class P: public B { public: void print (); };
void B::print () { ... }
void P::print () { ... }
B * ps = new P; ... ps -> print ();
Критерий: За пропуск любого условия включения механизма виртуальности: -3. За пропуск примера: -2.
10. Ответ:
typedef vector <float *> V;
V::size_type g (V & vect)
{ V::size_type count = 0;
V::size_type vs = vect.size () – 1;
for (int i = 0; i < vs; i += 2)
{ if (* vect [i + 1] < 0) {
* vect [i] = 0;
++ count; }
}
for (int i = vs; i > 0; -- i)
cout << * vect [i];
return count;
}
КРИТЕРИИ:
За каждую существенную ошибку: -3.
Отсутствие ссылки в списке формальных параметров - -3.
Если вместо индексации использованы указатели, но программа правильная – не снижать. Использование вместо типа size_type типа int - не наказывать.