Ответы 2009 вариант 2 (1119606)
Текст из файла
Вариант 2_2009 Ф.И.О.___________________________________№ группы________
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1. Для класса комплексных чисел template<class T> class complex { T r; T i; ... };
написать реализацию операции "==", выполняющей сравнение двух комплексных чисел методом класса и функцией-другом класса.
Ответ: template<class T> bool complex<T>::operator== (const complex<T>& x)
{ return r == x.r && i == x.i; }
template<class T> bool operator==
(const complex<T>& x, const complex<T>& y)
{ return x.r == y.r && x.i == y.i; }
Критерий: За отсутствие каждого примера или ошибки в нем: -5.
2. Объект x принадлежит классу X, для которого определены конструктор преобразования типа int в класс X и функция преобразования класса X в тип int. Описать прототипы двух перегруженных функций f() из некоторой области видимости, для которых будут верны следующие обращения к ним:
f ("p"); f (x, 0); f (0, 0); f (x, "q"); f (1, "r");
Ответ: void f (int, const char *); либо void f (X, const char *);
void f (const char *);
Критерии: За каждую ошибку –5. Если приводятся прототипы более, чем двух функций –10. Пропуск слова const в обеих функциях одновременно считать за одну ошибку.
3. Есть ли ошибки в реализации функции main()? Удалите неверные операторы из этой функции (если они есть). Для всех правильных операторов этой функции, используя операцию разрешения области видимости "::", также укажите, из какой области видимости вызываются используемые в них функции f().
int x = 0;
int f (int a) { return x = a; }
class A { int x;
public: A (int n = 1) { x = n; }
int f (int a) { return x = a; } };
class B { int x;
public: B (int n = 2) { x = n; }
virtual int f () { return x = ::x; } };
class C: public A, public B { int x;
public: int f (int a) { return x = a; }
int f () { return x = ::x; } };
int main () { A a; B b; C c;
A * pa = & a; B * pb = & b; C * pc = & c;
x = f (3); x = pa -> f (); x = pa -> f (4);
pa = pc; x = pa -> f (); x = pa -> f (5); x = pb -> f ();
x = pb -> f (6);
pb = pc; x = pb -> f (); x = pb -> f (7); x = pc -> f ();
x = pc -> f (8);
return -1;
}
Ответ: x = f (3); // ::f (3)
// x = pa -> f ();
x = pa -> f (4); // A::f (4)
pa = pc; // x = pa -> f ();
x = pa -> f (5); // A::f (5)
x = pb -> f (); // B::f ()
// x = pb -> f (6);
pb = pc; x = pb -> f (); // C::f ()
// x = pb -> f (7);
x = pc -> f (); // C::f ()
x = pc -> f (8); // C::f (8)
Комментариями закрыты неправильные вызовы.
Критерии: За каждое неправильное или неуказанное уточнение области видимости (из 7) -2, за ненайденную ошибку (из 4) -3.
4. Написать функцию g() с тремя параметрами: непустой и неизменяемый контейнер-список типа list<long int>, непустой контейнер-вектор типа vector<long int>, целое число – шаг по второму контейнеру. Функция должна копировать отрицательные элементы списка с шагом, равным 1, в уже имеющийся контейнер-вектор, от его начала к концу с шагом, равным третьему параметру, а затем распечатывать элементы вектора в прямом порядке. Функция возвращает количество измененных элементов вектора.
Решение: typedef vector<long int> VL; typedef list<long int> LL;
int g (VL & vect, const LL & lst, int step)
{ VL:: iterator vp = vect.begin (); int t = 0;
LL:: const_iterator lp = lst.begin ();
do { if (* lp < 0) * vp = * lp, ++ t;
if (vect.end() - vp <= step) break;
++lp; vp += step;
} while (lp != lst.end ());
VL:: const_iterator rp = vect.begin ();
while (rp != vect.end ()) { cout << * rp << ' '; ++ rp; }
cout << endl;
return t;
}
Критерий: За каждую существенную ошибку: -3. Если проверка на выход за границу вектора проводится в другом месте (например, в постусловии цикла) – не наказывать.
5. Описать особенности процесса отождествления типов параметров перегружаемых функций с несколькими параметрами. Приведите по одному примеру перегрузки функции с несколькими параметрами, в которых
-
не удается найти ни одной подходящей функции,
-
находится одна подходящая функция,
-
находится несколько подходящих функций.
Ответ: 1. Отбор функций по количеству формальных параметров (с учетом параметров, имеющих значения по умолчанию, и многоточий)
2. Создание множеств пригодных функций при анализе каждого из параметров в отдельности
3. Параметры функций, соответствующие многоточию в списке формальных параметров, считаются подходящими во всех случаях.
4. Вычисление пересечения построенных множеств
5. Если в полученное пересечение входит ровно одна функция – она и есть искомый результат, в противном случае выдается сообщение об ошибке
Пример: class X { public: X (long); X (char *); ...};
void f (X, long); void f (X, double);
void g () {... f (0, 0); // нет пригодной функции
f (1L, 1L); // f(X, long)
f ("a", 1); // неоднозначность при вызове
...}
Критерий: За пропуск любого шага или непонимание его сущности: -2. Отсутствие примера: -2.
6. Для объектов из задания 3 определить, тела каких конструкторов и деструкторов (возможно пустые, если они не определены явно) и в каком порядке будут исполнены при работе следующего фрагмента программы:
int main () { struct D { A a; C c; }; D d; }
Ответ: A (), A (), B (), C (), D (), ~D (), ~C (), ~B (), ~A (), ~A ().
Критерии: За каждую ошибку –3.
7. Есть ли ошибки в приведенном фрагменте программы на С++? Если есть, то объясните, в чем они заключаются. Ошибочные конструкции вычеркнуть из текста программы. Что будет выдано в стандартный поток вывода при работе программы?
class C {
public: virtual void f (int x) { h (x); cout << "C::f," << x << endl; }
virtual void g () { h (0); cout << "C::g" << endl; }
virtual void h () { cout << "C::h" << endl; }
virtual void h (int k) { h (); cout << "C::h," << k << endl; }
};
class D: public C {
public: virtual void f (int y) { h (y); cout << "D::f," << y << endl; }
virtual void g () { h (1); cout << "D::g" << endl; }
virtual void h () { cout << "D::h" << endl; }
virtual void h (int k) { h (); cout << "D::h," << k << endl; }
};
int main( ){ C c; D d; C * p = & d;
p -> f (2); p -> g (); p -> h (); p -> h (3); }
Ответ: Ошибок нет.
Будет выдано в поток: D::h D::h,2 D::f,2 D::h D::h,1
D::g D::h D::h D::h,3
Критерии: За каждую лишнюю ошибку или неправильно вызванную функцию -2.
8. Дать определение полиморфизма. Описать различные виды полиморфизма в Си++. Привести необходимые примеры фрагментов программ.
Ответ: 1. Полиморфизм – использование одинакового интерфейса (имени) для различных действий (объектов).
2. Статический полиморфизм действует на этапе компиляции. Примеры – перегрузка функций и операций:
void f (double); void f (int);
void f (float); void f (long); void g () { ... f('a'); ... }
3. Динамический полиморфизм реализуется с помощью виртуальных функций и доступа к функциям по указателям или ссылкам, когда на этапе компиляции не удаётся однозначно определить вызываемую функцию, так как значение указателя (ссылки) в это время не известно.
class X {public: virtual void f (int x) { cout << "X" << endl; } };
class Y: public X { public: void f (int y) { cout << "Y" << endl; } };
int main () { X * p = new Y b; ... p -> f (1); }
4. Параметрический (типовый) полиморфизм – использование шаблонов функций и классов.
template <class T> T max (T x, T y) { ... }
void f () { ... max (1, 2); ... }
template <class T> class Vector { T * p; int size;
public: explicit Vector (int);
};
Vector<int> X (20);
Критерий: За отсутствие каждого из определений: -3. За отсутствие соответствующего примера: -1 за каждый пропуск.
9. Что будет выдано в стандартный канал вывода при работе следующей программы?
struct X; void f(X & x, int n);
int const P = 1; int const Q = 1; int const R = 1;
struct X { X() { try { f(*this, 0); cout << 1 << endl; }
catch (X) { cout << 2 << endl; }
catch (int) { cout << 3 << endl; }
}
X (X &) { cout << 4 << endl; }
~X () { cout << 5 << endl; }
};
struct Y: X { Y () { f(*this, -1);
cout << 6 << endl; }
Y (Y &) { cout << 7 << endl; }
~Y () { cout << 8 << endl; }
};
void f(X & x, int n) { try { if (n < 0) throw x;
if (n > 0) throw 1;
cout << 9 << endl;
}
catch (int) { cout << 10 << endl; }
catch (X& a) { cout << 11 << endl;
f(a, 1);
cout << 12 << endl;
throw;
}
}
int main() { try { Y a; }
catch (...) { cout << 13 << endl;
return 0;
}
cout << 14 << endl;
return 0;
}
Ответ: 9 1 4 11 10 12 5 13 5
Критерии: За каждую неверную (лишнюю или пропущенную) печать -2.
10. Есть ли синтаксические ошибки в тексте приведенной программы? Можно ли исправить описание класса, не вводя дополнительных членов, чтобы программа стала верной? Если да, то как?
class A { static int i;
void f () { if (i >= 0) i = -1, g ();
cout << "f ()" << endl; }
void g () { f (); cout << "g ()" << endl; }
};
int A::i = 1;
int main () {
A::i = 1;
const A a;
a.f();
a.i = 0;
}
Ответ: 1. Заменить слово “class” словом “struct”, либо вставить после открывающей фигурной скобки определения класса слово “public:”.
2. В определениях методов “f()” и “g()” вставить после пустого списка формальных параметров слово “const”.
Критерий: За пропуск ошибок доступа к закрытым членам класса: -5. За пропуск одной ошибки вызова неконстантного метода “f()”: -6. За пропуск одной ошибки вызова неконстантного метода “g()”: -5. За пропуск обеих таких ошибок в методах “f()” и “g()” -8. За указание ошибки там, где ее нет: -5.
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.