Главная / Программирование /
Программирование на С/С++ / Тест 128
Программирование на С/С++ - тест 128
Упражнение 1:
Номер 1
Какую парадигму программирования поддерживают лямбда-функция в языке С/С++
Ответ:
 (1) мето-программирование 
 (2) функциональное программирование 
 (3) объектно-ориентированное программирование 
 (4) процедурное программирование 
Номер 2
В каких случаях эффективно использование лямбда-функции?
Ответ:
 (1) передача в обобщённый алгоритм STL 
 (2) передача функтора по указателю в пользовательскую функцию 
 (3) использование функциональности, унаследованной от другого класса 
 (4) при необходимости использования в функторе всех автоматические переменные из места передачи функтора в алгоритм 
 (5)  
Номер 3
Каковы преимущества использования лямбда функций?
Ответ:
 (1) краткость кода 
 (2) эффективность скомпилированного кода 
 (3) повторное использование кода 
 (4) возможность работы в функции с всеми автоматическими переменными, доступными в месте объявления лямда-функции 
Упражнение 2:
Номер 1
//====================== start of sample.h ==========================
int main(int argc, char* argv[])
{
auto lf1 = [] (int x) {return x > 0;};
auto lf2 = [] (int x) -> bool {return x+1;};
auto lf3 = [] (int& x) { x++; return;};
auto lf4 = [] (int x, int& y) -> double {return x+y;};
auto lf5 = [] (bool& z) { z = !z; return;};
return lf1(0);
}
//====================== end of sample.h ==========================
]]>Какие из приведённых выше лямбда функций возвращают тип bool?
Ответ:
 (1) lf1 
 (2) lf2 
 (3) lf3 
 (4) lf4 
 (5) lf5 
Номер 2
//====================== start of sample.cpp ==========================
#include <algorithm>
#include <vector>
int main(int argc, char* argv[])
{
std::vector<int> v1;
auto lf1 = [] (int x) {return x > 0;};
auto lf3 = [] (int& x) { x++; return;};
auto lf5 = [] (bool& z) { z = !z; return;};
int cnt1 = std::count_if(v1.begin(), v1.end(), lf1);
int cnt2 = std::count_if(v1.begin(), v1.end(), [] (int x) -> bool {return x+1;});
int cnt3 = std::count_if(v1.begin(), v1.end(), lf3);
int cnt4 = std::count_if(v1.begin(), v1.end(), [] (int x, int& y) -> double {return x+y;});
int cnt5 = std::count_if(v1.begin(), v1.end(), lf5);
return cnt1;
}
//====================== end of sample.cpp ==========================
]]>При вычислении каких переменных лямбда-функции в алгоритме count_if используются корректно?
Ответ:
 (1) cnt1 
 (2) cnt2 
 (3) cnt3 
 (4) cnt4 
 (5) cnt5 
Номер 3
Какие из объявлений лямбда функций ниже выполнены корректно?
Ответ:
 (1) auto lf1 = [] (int x) {return x+1;}; 
 (2) auto lf2 = [] -> double (int x) {return x+1;}; 
 (3) auto lf3 = [] (int x) -> double {return x+1;}; 
 (4) auto lf4 = double [] (int x) {return x+1;}; 
Упражнение 3:
Номер 1
//====================== start of sample.cpp ==========================
int main(int argc, char* argv[])
{
int a = 0;
int b = 0;
int X = 0;
auto lf1 = [a,b,X] (int x) {return x > 0;};
auto lf2 = [a,b] (int x) { x++; return x;};
auto lf3 = [=] (int x) { x++; return x;};
auto lf4 = [&] (int x) { x++; return x;};
auto lf5 = [] (bool& z) { z = !z; return;};
return 0;
}
//====================== end of sample.cpp ==========================
]]>Какие лямбда функции из примера выше имеют доступ к значению переменной X?
Ответ:
 (1) lf1 
 (2) lf2 
 (3) lf3 
 (4) lf4 
 (5) lf5 
Номер 2
//====================== start of sample.cpp ==========================
int main(int argc, char* argv[])
{
const int a = 0;
int b = 0;
const int X = 0;
int Y = 0;
int Z = 0;
auto lf1 = [&Y, Z, &a, &b, X] (double x) {return x > 0;};
return 0;
}
//====================== end of sample.cpp ==========================
]]>Значения каких переменным лямбда функция lf1 может изменить?
Ответ:
 (1) a 
 (2) b 
 (3) X 
 (4) Y 
 (5) Z 
Номер 3
//====================== start of sample.cpp ==========================
int main(int argc, char* argv[])
{
int a = 0;
int b = 0;
int X = 0;
auto lf1 = [&a,&b,&X] (int x) {return x > 0;};
auto lf2 = [a,b] (int x) { x++; return x;};
auto lf3 = [=] (int x) { x++; return x;};
auto lf4 = [&] (int x) { x++; return x;};
auto lf5 = [] (bool& z) { z = !z; return;};
return 0;
}
//====================== end of sample.cpp ==========================
]]>Какие из приведённых в примере лямбда функций могут изменить значения переменных а и b?
Ответ:
 (1) lf1 
 (2) lf2 
 (3) lf3 
 (4) lf4 
 (5) lf5 
Упражнение 4:
Номер 1
Каковы основные цели разработки boost?
Ответ:
 (1) решение задач часто встречающихся задач, выходящих за пределы возможностей STL 
 (2) тестирование новых компиляторов С++ 
 (3) тестирование новых библиотек-кандидатов на включение в принимаемые и перспективные стандарты языка С++ 
 (4) стандартизация, используемых в различных компаниях, средств разработки ПО 
Номер 2
Какие утверждения о boost верны?
Ответ:
 (1) boost имеет большое комьюнити 
 (2) использование boost у себя одобрено всеми компаниями-производителями ПО без ограничений 
 (3) boost включает в себя набор из нескольких десятков библиотек 
 (4) это передний фронт языка С++ 
 (5) использование разного функционала boost требует включения единого набора библиотек в проект 
Номер 3
Какие преимущества даёт использование boost?
Ответ:
 (1) уменьшение времени компиляции проекта 
 (2) решены наиболее часто встречающиеся при разработке ПО проблемы 
 (3) компактность полного набора библиотек boost  
 (4) использование в проекте качественный эффективный код 
 (5) возможность ознакомиться с техниками обобщённого программирования 
Упражнение 5:
Номер 1
Какие из объектов шаблонов и макросов в рассмотренных библиотеках boost предназначены для предупреждения сборки с некорректными типами?
Ответ:
 (1) BOOST_STATIC_ASSERT 
 (2) boost::variant 
 (3) boost::any 
 (4) boost::circular_buffer 
Номер 2
Какие из объектов шаблонов и макросов в рассмотренных библиотеках boost предоставляют безопасный обобщённый контейнер с возможностью хранения различных типов?
Ответ:
 (1) BOOST_STATIC_ASSERT 
 (2) boost::variant 
 (3) boost::any 
 (4) boost::circular_buffer 
Номер 3
Какие из объектов шаблонов и макросов в рассмотренных библиотеках boost предоставляют безопасный обобщённый класс хранилище единичных значений любых различных типов?
Ответ:
 (1) BOOST_STATIC_ASSERT 
 (2) boost::variant 
 (3) boost::any 
 (4) boost::circular_buffer 
Номер 4
Какие из объектов шаблонов и макросов в рассмотренных библиотеках boost предоставляют STL совместимый контейнер с перезаписью элементов при заполнении?
Ответ:
 (1) BOOST_STATIC_ASSERT 
 (2) boost::variant 
 (3) boost::any 
 (4) boost::circular_buffer 
Упражнение 6:
Номер 1
Какие утверждения о применении и реализации проверки времени компиляции в boost верны?
Ответ:
 (1) представляет собой аналог assert, но работает во время компиляции 
 (2) в реализации использованы отдельные шаблоны, для "корректного" и "некорректного" случаев и "корректный" шаблон ничего не делает 
 (3) в реализации использованы отдельные шаблоны, для "корректного" и "некорректного" случаев и оба шаблона выводят соответствующие сообщения 
 (4) в реализации использованы отдельные шаблоны, для "корректного" и "некорректного" случаев и "некорректный" шаблон ничего не делает 
 (5) не может быть применён внутри класса 
Номер 2
Какие преимущества обеспечивает тип boost::variant по сравнению с union?
Ответ:
 (1) контроль хранимого типа 
 (2) более экономное использование памяти 
 (3) поддержка стандартных функций boost 
 (4) большее разнообразие хранимых типов 
 (5) различимость хранимых типов 
Номер 3
Какие операции можно выполнять с объектом boost::any?
Ответ:
 (1) специализировать шаблон для хранения конкретных пользовательских типов 
 (2) создавать пустой объект 
 (3) пытаться преобразовать к любому типу посредством boost::any_cast 
 (4) получать тип хранимого значения 
 (5) выполнять преобразование хранимого типа в другой без извлечения из контейнера 
Номер 4
Какие утверждения о контейнере boost::circular_buffer верны?
Ответ:
 (1) может быть использован для организации программного кэша 
 (2) является STL совместимым контейнером 
 (3) обеспечивает логарифмическое время вставки в конец 
 (4) позволяет выделять память для контейнера только один раз 
 (5) гарантирует непрерывность используемого участка памяти 
Упражнение 7:
Номер 1
//====================== start of sample.cpp ==========================
#include <climits>
#include <limits>
#include <boost/static_assert.hpp>
namespace name {
BOOST_STATIC_ASSERT(std::numeric_limits<int>::digits == 32);
}
int main(int argc, char* argv[]) {
return 0;
}
//====================== end of sample.cpp ==========================
]]>Что случится c программой из файла sample.cpp если в системе размер int больше 32 разрядов?
Ответ:
 (1) программа будет работать без изменений 
 (2) будет брошен exception при выполнении программы 
 (3) при запуске программы, как в assert будет поднято окно диалога с информацией о ошибке 
 (4) компиляция программы будет прервана, в логе компиляции будет сообщение о ошибке 
 (5) при компиляции возникнет предупреждение о возможной ошибке 
Номер 2
//====================== start of sample.cpp ==========================
#include <boost/variant/variant.hpp>
struct A {};
struct B {
B(int src);
private:
B(const B& src);
};
struct C {
C(int src);
private:
C();
};
struct D {};
int main(int argc, char* argv[])
{
boost::variant<int, A, B, C> myvariant;
int x;
int* y;
A a;
B b(x);
C c(x);
D d;
myvariant = x;
myvariant = y;
myvariant = a;
myvariant = b;
myvariant = c;
myvariant = d;
return 0;
}
//====================== end of sample.cpp ==========================
]]>Какие объекты можно присвоить объекту myvariant из примера в файле sample.cpp?
Ответ:
 (1) x 
 (2) y 
 (3) a 
 (4) b 
 (5) c 
 (6) d 
Номер 3
//====================== start of sample.cpp ==========================
#include <boost/circular_buffer.hpp>
int main(int argc, char* argv[])
{
boost::circular_buffer<int> circ(3);
circ.push_back(1);
circ.push_back(2);
circ.push_back(3);
circ.push_back(4);
circ.push_back(5);
circ.pop_back();
return 0;
}
//====================== end of sample.cpp ==========================
]]>Какие значения останутся в циклическом буфере circ в примере в файле sample.cpp?
Ответ:
 (1) 1 
 (2) 2 
 (3) 3 
 (4) 4 
 (5) 5 
Упражнение 8:
Номер 1
Какие из приведённых умных указателей выполняет автоматическое удаление объекта?
Ответ:
 (1) scoped_ptr 
 (2) shared_ptr 
 (3) weak_ptr 
 (4) intrusive_ptr 
Номер 2
Какие операторы перегружаются для умных указателей (в частности для shard_ptr)?
Ответ:
 (1) operator*() 
 (2) operator->() 
 (3) operator<() 
 (4) operator=() 
 (5) operator!=() 
Номер 3
Каковы минимальные требования к объектам, указатель на которые могут быть храниться в умных указателях?
Ответ:
 (1) наличие конструктора по умолчанию 
 (2) конструктор не может кидать исключения 
 (3) деструктор не может кидать исключения 
 (4) delete не должен кидать исключений 
 (5) деструктор должен быть виртуальным 
Упражнение 9:
Номер 1
Каковы особенности умного указателя boost::scoped_ptr?
Ответ:
 (1) защищает объект от копирования 
 (2) поддерживает подсчёт ссылок на объект 
 (3) отсутствуют накладных расходов оперативной памяти 
 (4) может использоваться в контейнерах STL 
 (5) высокая скорость выполнения операций 
Номер 2
Каковы особенности умного указателя boost::shared_ptr?
Ответ:
 (1) защищает объект от копирования 
 (2) поддерживает подсчёт ссылок на объект 
 (3) может использоваться в контейнерах STL 
 (4) возможность образования циклических ссылок 
 (5) поддержка операции сравнения, необходимой для хранения в ассоциативном контейнере 
Номер 3
Каковы особенности умного указателя boost::weak_ptr?
Ответ:
 (1) поддерживает автоматическое удаление объекта 
 (2) решает проблему создания циклических ссылок 
 (3) поддерживает ограниченное множество операций 
 (4) требует имплементации пользователем функций подсчёта ссылок на пользовательский объект 
Номер 4
Каковы особенности умного указателя boost::intrusive_ptr?
Ответ:
 (1) поддерживает автоматическое удаление объекта 
 (2) решает проблему создания циклических ссылок 
 (3) требует имплементации пользователем функций подсчёта ссылок на пользовательский объект 
 (4) предназначен для работы с объектами, имеющими встроенный механизм подсчёта ссылок 
Упражнение 10:
Номер 1
//====================== start of sample.cpp ==========================
#include <boost/shared_ptr.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <vector>
struct A {
virtual ~A();
};
struct B: public A {};
struct C {};
void foo1(boost::scoped_ptr<A> a);
void foo2(boost::scoped_ptr<B>& a);
void foo3(boost::shared_ptr<C> a);
void foo4(boost::scoped_ptr<A>* a);
void foo5(std::vector< boost::scoped_ptr<C> >& c);
int main(int argc, char* argv[])
{
boost::scoped_ptr<A> b1(new A);
boost::scoped_ptr<B> b2(new B);
boost::scoped_ptr<C> b3(new C);
boost::scoped_ptr<A> b4;
std::vector< boost::scoped_ptr<C> > v1;
v1.push_back(b3);
foo1(b1);
foo2(b2);
foo3(b3.lock());
foo4(&b4);
foo5(v1);
return 0;
}
//====================== end of sample.cpp ==========================
]]>В каких из функциях умный указатель boost::scoped_ptr используется правильно?
Ответ:
 (1) foo1 
 (2) foo2 
 (3) foo3 
 (4) foo4 
 (5) foo5 
Номер 2
//====================== start of sample.cpp ==========================
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <vector>
struct A {
virtual ~A();
};
struct B: public A {};
struct C {};
void foo1(boost::shared_ptr<A>& a);
void foo2(boost::shared_ptr<A const> a);
void foo3(boost::shared_ptr<B>& a);
void foo4(boost::shared_ptr<const A> a, boost::shared_ptr<C> c);
void foo5(std::vector< boost::shared_ptr<C> >& c);
int main(int argc, char* argv[])
{
boost::shared_ptr<A> b1(new A);
boost::shared_ptr<B> b2(new B);
boost::shared_ptr<C> b3(new C);
boost::weak_ptr<A> b4(b1);
std::vector<boost::shared_ptr<C>> v1;
v1.push_back(b3);
foo1(b1);
foo2(b2);
foo3(b3);
foo4(b4.lock(), b3);
foo5(v1);
return 0;
}
//====================== end of sample.cpp ==========================
]]>Вызовы каких функций выполнены корректно и операции создания их параметров не содержат очевидных проблем?
Ответ:
 (1) foo1 
 (2) foo2 
 (3) foo3 
 (4) foo4 
 (5) foo5 
Номер 3
//====================== start of sample.cpp ==========================
#include <boost/shared_ptr.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <vector>
struct A {
virtual ~A();
};
struct B: public A {};
struct C {};
void foo1(boost::shared_ptr<A> a);
void foo2(boost::weak_ptr<B>& a);
void foo3(boost::shared_ptr<C> a);
void foo4(boost::scoped_ptr<A>& a);
void foo5(std::vector< boost::weak_ptr<C> >& c);
int main(int argc, char* argv[])
{
boost::shared_ptr<A> a(new A);
boost::shared_ptr<B> b(new B);
boost::shared_ptr<C> c(new C);
boost::weak_ptr<A> b1(a);
boost::weak_ptr<B> b2(b);
boost::weak_ptr<C> b3(c);
std::vector< boost::weak_ptr<C> > v1;
v1.push_back(b3);
foo1(b2.lock());
foo2(b2);
try
{
boost::shared_ptr<C> c1(c);
foo3(c1);
}
catch(boost::bad_weak_ptr& e)
{ }
foo4(b2.lock());
foo5(v1);
return 0;
}
//====================== end of sample.cpp ==========================
]]>Вызовы каких функций выполнены корректно и операции создания их параметров не содержат очевидных проблем?
Ответ:
 (1) foo1 
 (2) foo2 
 (3) foo3 
 (4) foo4 
 (5) foo5 
Упражнение 11:
Номер 1
Какая из библиотек Boost поддерживает работу с тернарной логикой?
Ответ:
 (1) Boost Interval Container Library 
 (2) Boost.Tribool 
 (3) Boost.Units 
 (4) Math Toolkit 
 (5) Meta State Machine 
Номер 2
Какая из библиотек Boost поддерживает анализ размерностей операндов вычислительных операций?
Ответ:
 (1) Boost Interval Container Library 
 (2) Boost.Tribool 
 (3) Boost.Units 
 (4) Math Toolkit 
 (5) Meta State Machine 
Номер 3
Какая из библиотек Boost поддерживает работу со статистическими распределениями, бесконечными рядами и специальными математическими функциями?
Ответ:
 (1) Geometry 
 (2) Ratio 
 (3) Boost.Units 
 (4) Math Toolkit 
 (5) Meta State Machine 
Упражнение 12:
Номер 1
//====================== start of sample.cpp ==========================
struct A {
A();
virtual ~A();
private:
A(A&a);
A& operator=(const A& a);
};
struct B: public A {};
struct C {};
struct D {
D();
D& operator=(const D& d);
};
//====================== end of sample.cpp ==========================
]]>Какие из типов из файла sample.cpp удовлетворяют требованию CopyConstructible?
Ответ:
 (1) A 
 (2) B 
 (3) C 
 (4) D 
Номер 2
//====================== start of sample.cpp ==========================
#include <string>
#include <type_traits>
struct my_string
{
std::string s;
my_string(const std::string& s);
};
int main(int argc, char* argv[])
{
is_copy_constructible<my_string>;
return 0;
}
//====================== end of sample.cpp ==========================
]]>Каким образом можно проверить требование CopyConstructable посредством шаблона стандартной библиотеки is_copy_constructible для типа my_string из файла sample.cpp?
Ответ:
 (1) вызов метода проверки структуры is_copy_constructible вернёт true или false 
 (2) вызов метода проверки структуры is_copy_constructible бросит исключение в случае несоответствия требованиям 
 (3) в случае несоответствия стандарту для пользовательского типа при компиляции возникнет ошибка 
 (4) результат проверки можно узнать из атрибута is_copy_constructible<my_string>::value, он будет равен true или false 
Номер 3
Какие типы и методы должен поддерживать контейнер, соответствующий требованию Container?
Ответ:
 (1) forward итераторы 
 (2) итераторы произвольного доступа 
 (3) конструкторы по умолчанию и копирования 
 (4) конструктор переноса 
 (5) операции сравнения