Академический Документы
Профессиональный Документы
Культура Документы
«БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ
ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ»
Н. В. Пацей
Объектно‐ориентированное
программированиена С++/C#
Лабораторный практикумпо одноименной дисциплине
для студентов специальности 1-40 01 02-03
«Информационные системы и технологии
(издательско-полиграфический комплекс)»
В 2-х частях
Часть 1
Минск 2014
1
УДК 004.4(076.5)
ББК 22.18я7
П21
Рецензенты:
кандидат технических наук,доцент кафедрысистем
автоматизированногопроектированияБНТУ В. Т. Придухо;
кандидат технических наук,доцент кафедрыавтоматизации
производственных процессов иэлектротехники БГТУД. А. Гринюк
Пацей, Н. В.
П21 Объектно-ориентированное программирование на С++/C# :
лаб. практикум по одноименной дисциплине для студентовспеци-
альности 1-40 01 02-03 «Информационные системы и технологии
(издательско-полиграфичкеский комплекс)».В 2 ч. Ч. 1/ Н. В. Па-
цей. – Минск: БГТУ, 2014. – 70 с.
Приведены вопросы для самоконтроля, описаны задания с пояснениями по
11 темам в соответствии с рабочей программой дисциплины «Объектно-ориентиро-
ваное программирование», по темам классы, наследование, перегрузка, шаблоны и
STL предлагаются по 10 вариантов заданий для индивидуального выполнения.
Предназначен для студентов специальности 1-40 01 02 (1-40 01 02-03) «Ин-
формационные системы и технологии (издательско-полиграфический комплекс)»,
1-98 01 03 «Программное обеспечение информационной безопасности мобильных
систем», 1-40 01 01 «Программное обеспечение информационных технологий».
УДК004.4(076.5)
ББК 22.18я7
УО «Белорусский государственный
технологический университет», 2014
Пацей Н. В., 2014
2
ПРЕДИСЛОВИЕ
Дисциплина «Объектно-ориентированное программирование» яв-
ляется базовым курсом, обеспечивающим подготовку студента
к освоению современных технологий разработки программного обес-
печения.
Средствами изучения являются языки программирования C++ и
С#, представляющие наиболее полный набор инструментов, необхо-
димых для практического освоения современных методов программ-
ной реализации алгоритмов.
Цель курса –подготовка специалиста, владеющего фундаменталь-
ными знаниями и практическими навыками в области объектно-
ориентированного программирования и элементов проектирования.
Основные задачи курса – изучение принципов ООП, приобрете-
ние практических навыков в использовании объектно-
ориентированных инструментов программирования, а также знаком-
ство с классами, широко используемыми при создании прикладных
программ.
Лабораторный практикум расчитан на 28 часов аудиторных заня-
тий по десяти темам. Для самостоятельного выполенения работ необ-
ходимо предварительно ознакомиться c теоретическим материалом
[1], пройти тест в соответсвии с приведенными в темах вопросами.
Студент должен владеть алгоритмизацией инженерных задач,
уметь использовать средства отладки и тестирования программ; знать
программирование на языкеС++, основы модульного проектирования
программ,способы управления динамической памятью,структуры
данных и алгоритмы их обработки.
3
ТЕМА 1. КЛАССЫ И ОБЪЕКТЫ
Изучите теоретический материал учебно-методического пособия
[1].Ответьте на вопросы. Выполните самостоятельно задание в соот-
ветствии с вариантом.
Вопросы
1. Какие ключевые слова можно использовать при определении
класса?
2. В чем отличие между объектом и классом?
3. Что такое конструктор?
4. Что такое деструктор (destructor)?
5. Что такое дружественная функция(friendfunction)?
6. Что такое копирующий конструктор (сору constructor)?
7. Дополните фразу «…является специальной функцией-членом,
используемой для задания начальных значений данным, членам
класса».
8. Продолжите фразу «По умолчанию доступ к членам класса…».
9. Продолжите фразу «Говорят, что реализация класса скрыта от
его клиентов или …».
10. Дополните фразу «Набор открытых функций-членов класса
рассматривается как … класса».
11. Продолжите фразу «В определении класса члены класса
с ключевым словом private доступны …».
12. Напишите определение класса SS, включающего одно закры-
тое поле типа int с именем bar и одним открытым методом с прото-
типом voidPrint().
13. Истинно ли следующее утверждение: поля класса должны
быть закрытыми?
14. Продолжите фразу «операция точки (операция доступа к члену
класса) объединяет следующие два элемента (слева направо)…».
15. Конструктор вызывается автоматически в момент …объекта.
16. Верно ли следующее утверждение: класс может иметь более
одного конструктора с одним и тем же именем?
17. Найдите ошибку и объясните, как ее исправить. Допустим, что
в классе Time объявлен следующий прототип:
void ~Time( int )
4
18. Функция, не являющаяся членом, которая должна иметь до-
ступ к закрытым данным-членам класса, должна быть объявлена как
… этого класса.
19. Определите класс CBOX, объявите массив объектов CBOX.
20. Определите класс CBOX, объявите статический член класса int.
Выполните его инициализацию. Сколько экземпляров статического
данного будет существовать, если число объектов класса равно 5.
21. Пусть есть класс:
class list
{// ...
staticvoid show();
// Статическаяфункцияпросмотраспискаобъектов
}
staticvoid list::show()
{
list *p;
for (p=fst; p !=NULL; p=p‐>next)
// { ...вывод информации об объекте... }
}
Создайте объект класса и вызовите функцию show.
22. Пусть есть класс DATE. Запишите возможные способы создания
объектов класса. Когда будет вызываться конструктор копирования?
23. Что такое вложенные классы? Приведите пример.
24. В чем разница между X x; и X x();?
25. Что будет выведено на экран?
#include<iostream>
class A
{
public:
A(void){this‐>_num=0;}
int A(intnum){this‐>_num=num;}
~A(void){std::cout<<this‐>_num;}
private:
int _num;
};
int main(void)
{
A val(100);
return 0;
}
26. Скомпилируется ли следующий код:
5
classClazz
{
};
Задачи для самостоятельного решения
Общее задание. Определить пользовательский класс в соответ-
ствии с вариантом задания (см. варианты). Добавить в класс следую-
щие конструкторы: без параметров, с параметрами, копирования.
Определить в классе деструктор, компоненты-функции для просмотра
и установки полей данных. Написать демонстрационную программу,
в которой создаются и разрушаются объекты пользовательского клас-
са и каждый вызов конструктора и деструктора сопровождается выда-
чей соответствующего сообщения (какой объект какой конструктор
или деструктор вызвал). При работе с классами пользоваться
Class Wizard.
6
Индивидуальное задание(по вариантам)
Вариант Задание
Создать класс employee. Класс должен включать поле типа
intдля хранения номера сотрудника и поле типа float для
хранения величины его оклада. Методы класса должны
1 позволять пользователю вводить и отображать данные
класса. Написать функцию main(), которая запросит поль-
зователя ввести данные для трех сотрудников и выведет
полученную информацию на экран
Создать класс Int, имитирующий стандартный тип int.
Единственное поле этого класса должно иметь тип int.
Создать методы, которые будут устанавливать значение
поля равным нулю, инициализировать его целым значени-
ем, выводить значение поля на экран и складывать два
2
значения типа Int.
Написать программу, в которой будут созданы три объек-
та класса Int, два из которых – инициализированы. Сло-
жить два инициализированных объекта, присвоить ре-
зультат третьему, а затем отобразить результат на экране
Создать класс типа двухсвязный список. Поля-данные:
указатель на область памяти типа void, указатели на сле-
дующий и предыдущий. Функции-члены добавляют эле-
3
мент к списку, удаляют элемент из списка, выводят эле-
менты списка от начала и от конца, ищут заданный эле-
мент в списке
Создать класс типа дата с полями: день (1–31), месяц
(1–12), год (целое число). Класс имеет конструктор.
Функции-члены установки дня, месяца и года, функ-
ции-члены получения дня, месяца и года, а также две
4
функции-члены печати: печать по шаблону «5 января
1997 года» и«05.01.1997». Функции-члены установки
полей класса должны проверять корректность задава-
емых параметров
Создать класс типа прямоугольник. Поля – высота и ши-
рина. Функции-члены вычисляют площадь, периметр,
5 устанавливают поля и возвращают значения. Функции-
члены установки полей класса должны проверять кор-
ректность задаваемых параметров. Функцияпечати
7
Вариант Задание
Создать класс типа круг. Поля-данные: радиус, координа-
ты центра. Функции-члены вычисляют площадь, длину
окружности, устанавливают поля и возвращают значения.
6
Функции-члены установки полей класса должны прове-
рять корректность задаваемых параметров (не равны нулю
и не отрицательные). Функцияпечати
Создать класс множествоSet. Функции-члены реализуют
7 добавление и удаление элемента, пересечение и разность
множеств
Создать класс типа квадрат. Поля-данные: сторона. Функ-
ции-члены вычисляют площадь, периметр, устанавливают
8 поля и возвращают значения. Функции-члены установки
полей класса должны проверять корректность задаваемых
параметров. Функцияпечати
Создать класс типа время с полями: час (0–23), минуты
(0–59), секунды (0–59). Класс имеет конструктор. Функ-
ции-члены установки времени, получения часа, минуты и
9 секунды, а также две функции-члены печати: печать по
шаблону «16 часов 18 минут 3 секунды» и «4 p.m. 18 ми-
нут 3 секунды». Функции-члены установки полей класса
должны проверять корректность задаваемых параметров
Создать класс одномерный массив целых чисел (вектор)
с полями – количество фактических элементов, массив
(динамический). Функции-члены: обращения к отдельно-
10
му элементу массива, вывода массива на экран, поэле-
ментного сложения и вычитания со скаляром, вывода эле-
мента по заданному индексу
8
ТЕМА 2. НАСЛЕДОВАНИЕ
Изучите теоретический материал [1].Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.
Вопросы
9
13. Пусть classB : A { }. Куда перейдет public-часть класса A?
14. Пустьclass B : public A { }. Куда перейдет public-часть
класса A?
15. Что такое единичное и множественное наследование?
16. Что такое полиморфизм?
17. Определите назначение виртуальных функций.
18. Определите класс с виртуальной функцией.
19. Что будет выведено на экран в результате выполнения следу-
ющего кода:
classABase {
public:
void f(inti) const { cout<< 1;}
void f(charch) const { cout<< 2; }
};
classBBase {
public:
void f(double d) const { cout<< 3;}
};
classABBase : publicABase, publicBBase {
public:
usingABase::f;
usingBBase::f;
void f(charch) const { cout<< 4; }
};
void g(ABBase&ab) {
ab.f('c');
ab.f(2.5);
ab.f(4);
}
int main() {
ABBaseab;
g(ab);
}
10
A(inti) : j(i) { }
void print()
{
cout<<sizeof(j) <<endl;
}
};
class B : virtualpublic A {
public:
B(inti) : A(i) { }
};
class C : public B {
public:
C(inti) : B(i) { }
};
int main(intargn, char * argv[])
{
C c(1);
c.print();
return 0;
}
21. В каких из перечисленных строк произойдут ошибки компиля-
ции:
class Base {
public:
void method1();
protected:
void method2();
private:
void method3();
};
class Child : public Base {
protected:
void method1() { }
void method2() { }
void method3() { }
};
int main() {
Base* base = newChild();
base‐>method1(); // 1
base‐>method2(); // 2
11
base‐>method3(); // 3
return 0;
}
22. Что выведет следующая программа:
class A
{
public:
A() { f(); }
virtualvoid f()
{
std::cout<<"A::f";
}
};
class B : public A
{
public:
void f()
{
std::cout<<"B::f";
}
};
int main(intargc, char * argv[])
{
A * a = newB();
delete a;
return 0;
}
23. Чем можно заменить строку // 1 чтобы программа скомпили-
ровалась?
class A
{
public:
voidsomeMethod() { /* ... */ }
};
class B : public A
{
public:
voidsomeMethod(intsomeArg) { /* ... */ }// 1
};
int main(intargc, char* argv[])
12
{
B b;
b.someMethod();
return 0;
}
24. Что напечатает следующий код при создании экземпляра
класса X:
classY {
public:
Y() { cout<<"Y"; }
};
classZ {
public:
Z() { cout<<"Z"; }
};
classX : publicZ {
private:
Ym_objY;
public:
X() { cout<<"X"; }
};
25. В какой последовательности вызовутся деструкторы?
class A {
public:
A () {}
~A() { cout<<"~A";}
};
class B : public A {
public:
B () {}
~B () { cout<<"~B"; }
};
int main () {
A *b = new B ();
delete b;
return 0;
}
struct A { A() { cout<<"A"; } };
struct B : A { B() { cout<<"B"; } };
13
struct C : A { C() { cout<<"C"; } };
struct D : B, C { D() { cout<<"D"; } };
intmain() {
Dd;
}
Задачи для самостоятельного решения
14
Вариант Задание
Классы – автомобиль (марка, номер), поезд (номер, коли-
чество вагонов, количество пассажиров в вагоне), транс-
9
портное средство (средняя скорость, вид топлива, год вы-
пуска)
Классы – республика (вид, правительство), монархия (вид,
10 имя монарха), королевство (король), государство (назва-
ние, денежная единица, символика)
15
ТЕМА 3. АБСТРАКТНЫЕ КЛАССЫ
Изучите теоретический материал [1].Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.
Вопросы
16
int main ()
{
Test T;
}
11. Чтовыведетследующийкодприсозданииэкземпляракласса D:
struct A { A() { cout<<"A"; } };
struct B : virtual A { B() { cout<<"B"; } };
struct C : virtual A { C() { cout<<"C"; } };
struct D : B, C { D() { cout<<"D"; } };
12. Что произойдет при компиляции и выполнении кода:
class A {
public:
A() { f("A()"); }
~A() { f("~A()"); }
protected:
virtualvoid f(constchar* str) = 0;
};
class B : public A {
public:
B() { f("B()"); }
~B() { f("~B()"); }
protected:
void f(constchar* str) { cout<<str<<endl; }
};
intmain() {
Bb;
return 0;
}
13. Допустимо ли в С++ определение следующего чисто вирту-
ального метода:
classAbstract
{
public:
virtualvoidpureVirtual() = 0 {
// реализация
}
};
14. Корректно ли описание метода modify в составе класса Test?
class Test {
private:
17
mutableintmX;
public:
void modify( constintiNewX ) const {
mX = iNewX;
}
};
Задачи для самостоятельного решения
Пример:
//абстактный базовый класс
classPerson
{
protected:
…
static Person *head;
public:
Person *next;
…
virtual ~Person(){}
…
virtualchar* getName() const = 0;
virtualvoid setName(constchar *name_) = 0;
virtualint getAge() const = 0;
virtualvoid setAge(constint age_) = 0;
};
//наследование
class Employee : public Person
{
protected:
18
…
public:
…
virtualchar* getName() const;
virtualvoid setName(constchar *name_);
virtualint getAge() const;
virtualvoid setAge(constint age_);
…
friend ostream&operator<<(ostream& out, Employee& e);
…
staticvoidshow();
… //статический метод просмотра
void Employee::show()
{
Person *p = head;
while(p)
{
…
p = p ‐> next;
}
}
… //инициализация статической компоненты
Person * Person::head = NULL;
int _tmain(int argc, _TCHAR* argv[])
{
}
19
ТЕМА 4. ДИНАМИЧЕCКАЯ ИДЕНТИФИКАЦИЯ
ТИПОВ
Изучите теоретический материал [1].Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.
Задачи для самостоятельного решения
20
Пример:
// метод‐ итератор ‐ найти все узлы заданного номера
void Uzel::get(int data)
{
Mech* h=head;// список
while (h!=NULL) //цикл
{
if (h‐>getid()==typeid(Uzel).name())
//найти только узлы
{
if (h‐
>nomber==data) //сравнить числа
{
h‐>print();
// вывести как найденнный
}
}
h=h‐>next; // на след
};
}
21
ТЕМА 5. ПЕРЕГРУЗКА ОПЕРАЦИЙ
Изучите теоретический материал [1]. Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.
Вопросы
22
16. Можно ли перегружать операцию ()с использованием friend-
функции?
17. Можно ли перегружать операцию ‐> с использованием friend-
функции?
18. Может ли перегруженная операция delete возвращать значе-
ние void?
19. Может ли перегруженная операция delete возвращать значе-
ние int?
20. Можно ли перегружать операцию delete с использованием
friend-функции?
21. Для чего используется оператор dynamic_cast?
22. Для чего используется оператор const_cast?
23. Для чего используется оператор static_cast?
24. Для чего используется оператор reinterpret_cast?
25. Как называется вызов функции, обрабатываемый во время вы-
полнения программы?
26. Что будет выведено на экран?
class А {
public:
А(){ };
~А(){ };
еxрliсit А(int а);
ореrаtоrint(){rеturn 1;}
};
int main(intargc, char* argv[])
{
A foo;
int value = fоо + 1;
std::cout<< value <<std::endl;
return 0;
}
27. Как реализовать перегрузку инкремента и декремента
в постфиксной и префиксной формах?
Задачи для самостоятельного решения
Общее задание.Создать заданный в варианте класс. Определить в
классе конструкторы, деструктор, необходимые функции и заданные
перегруженные операции. Написать программу тестирования, в кото-
рой проверяется использование всех перегруженных операций.
23
Индивидуальноезадание(по вариантам)
Вариант Задание
Класс – одномерный массив. Дополнительно перегрузить
следующие операции: * – умножение массивов; [] – до-
1
ступ по индексу, int() – размер массива; == – проверка на
равенство; <= – сравнение
Класс – одномерный массив. Дополнительно перегрузить
следующие операции: [] – доступ по индексу; == – про-
2
верка на равенство; != – проверка на неравенство; + –
объединение массивов
Класс – множество Сset. Дополнительно перегрузить сле-
дующие операции: + – добавить элемент в множество (ти-
3 па set + item); + – объединение множеств; * – пересечение
множеств,== – проверка множеств на равенство; int () –
мощность множества
Класс – очередь Сqueue. Дополнительно перегрузить сле-
дующие операции: + – добавить элемент; ‐‐ – извлечь
4 элемент; bool () – проверка, пустая ли очередь; < – копи-
рование одной очереди в другую с сортировкой в убы-
вающем порядке; int () – мощность
Класс – множество Сset. Дополнительно перегрузить
следующие операции: () – конструктор множества (в
стиле конструктора для множественного типа); + – объ-
5
единение множеств; <= – сравнение множеств; int()–
мощность множества; [] – доступ к элементу в задан-
ной позиции
Класс – однонаправленный список list. Дополнительно
перегрузить следующие операции: + – объединить два
6
списка; ‐‐ – удалить элемент из начала (‐‐list);== – про-
верка на равенство; bool () – проверка, пустой ли список
Класс – матрица. Дополнительно перегрузить следующие
7 операции: + – сложение матриц; () – доступ по индексу
M(с, i); > – сравнение матриц; == – копирование матриц
Класс – время CVector. Дополнительно перегрузить сле-
дующие операции: + – добавление элемента; ++ – увели-
8 чение всех элементов вектора на один (типа СVector++); !=
– проверка на неравенство; [] – доступ к элементу в за-
данной позиции
24
Вариант Задание
Класс – время CVector. Дополнительно перегрузить сле-
дующие операции: ‐ – разность двух векторов; + – сложе-
9
ние элементов вектора с целым; !=– проверка на неравен-
ство; [] – доступ к элементу в заданной позиции
Класс – стек Сstack. Дополнительно перегрузить следую-
щие операции: + – добавить элемент в стек; ‐‐ – извлечь
10 элемент из стека; bool() – проверка, пустой ли стек; > –
копирование одного стека в другой с сортировкой в воз-
растающем порядке
25
ТЕМА 6. ШАБЛОНЫ КЛАССОВ И ФУНКЦИЙ
Изучите теоретический материал [1]. Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.
Вопросы
26
20. Могут ли шаблоны быть производными от классов?
21. Приведите пример передачи в шаблон класса дополнительных
параметров.
22. Может ли быть параметром шаблона тип данных int?
23. Может ли быть параметром шаблона перечисляемый тип?
24. Может ли обычный класс быть производным от шаблона клас-
са?
25. Что выведет следующий код:
class Rose {};
class A { public: typedef Rose rose; };
template<typename T>
class B: public T { public: typedeftypename T::rose
foo; };
template<typename T>
void smell(T) { std::cout<<"Жуть!"<<std::endl; }
void smell(Rose) { std::cout<<"Прелесть!"<<std::endl; }
int main()
{
smell(A::rose());
smell(B<A>::foo());
return 0;
}
27
template<class T>
T func(T, T)
{
...
}
template<typename T, typename T>
T func(T, T)
{
...
}
template<class T, intsz>
T func(const T (&arr)[sz])
{
...
}
Задачи для самостоятельного решения
Часть 1.
Общее задание. Модифицировать проект, созданный в предыду-
щем задании № 5, следующим образом. Создать шаблон заданного по
варианту класса. Проверить использование шаблона для стандартных
типов данных (int, char или double). Определить пользовательский
класс, который будет использоваться в качестве параметра шаблона.
Для пользовательского типа взять класс из проекта задания№ 1 или
один из № 2 своего варианта (например, реализация шаблона – мно-
жество квадратов). Не забудьте в пользовательском классе перегру-
зить операции, необходимые для работы шаблона.
Часть 2.
Общее задание. Добавить функцию-шаблон в соответствии
с вариантом. Проверить работу шаблон-функции с int, double и поль-
зовательским классом (если имеется несколько полей, для манипуля-
ций выбрать одно из полей класса).
Вариант Задание
Написать функцию-шаблон, вычисляющую среднее
1
значение в массиве
Написать функцию-шаблон поиска минимального зна-
2
чения
28
Вариант Задание
Написать функцию-шаблон удаления каждого второго
3
элемента в множестве
Написать функцию-шаблон поиска максимального эле-
4
мента очереди
Написать функцию-шаблон поиска наиболее близкого
элемента множества к заданно-
5
му.Аргументамифункциидолжныбытьзначение и мно-
жество
Создать шаблон функции прореживания списка. Функ-
6 ция имеет три параметра: откуда выбирать, куда выби-
рать и через сколько выбирать
Создать шаблон функции minmax, которая возвращает
7 сумму минимального и максимального
из значений матрицы
Написать функцию-шаблон, вычисляющую произведе-
8
ние максимального и минимального значения в векторе
Создать шаблон функции, которая возвращает макси-
мально близкое к заданному элементу из значений век-
9
тора. Аргументамифункциидолжныбытьзначение
и вектор
Написать функцию-шаблон, которая подсчитывает ко-
10
личество элементов, больших заданного, в стеке
29
ТЕМА 7. РАБОТА С ПОТОКАМИ, ОБРАБОТКА
ИСКЛЮЧЕНИЙ
Изучите теоретический материал [1]. Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.
Вопросы
1. Дайте определение потока.
2. Назовите три потоковых класса, предназначенных для файлово-
го ввода-вывода.
3. Истинно ли утверждение о том, что некоторые потоки являются
входными, а некоторые –выходными?
4. Напишите выражение, записывающее единичный символ
в объект класса ofstream.
5. Напишите выражение, считывающее содержимое объекта ifile
класса ifstream, в массив buff.
6. Истинно ли утверждение о том, что файловый указатель всегда
содержит адрес файла?
7. Объясните выражение fl.write((char*)&objl, sizeof(objl)).
Может ли обычный класс быть производным от шаблона класса?
8. Когда происходит исключение?
9. Как сгенерировать исключение?
10. Какого типа может быть аргумент оператора throw?
11. Истинно ли утверждение о том, что выражения, которые могут
создать исключительную ситуацию, должны быть частью блока-
ловушки?
12. Опишите последовательность передачи исключения между
блоками?
13. Можно ли при генерации исключения передать дополнитель-
ную информацию и как?
14. Для чего используется catch?
15. Для чего используется try?
16. Что будет, если заявлено исключение, для которого нет обра-
ботчика в цепочке вызовов?
17. Истинно ли утверждение о том, что программа может про-
должить свое выполнение после возникновения исключительной
ситуации?
30
18. Если в блоке try не генерируются никакие исключения, куда
передается управление после того, как блок try завершит работу?
19. Что произойдет, если исключение будет сгенерировано вне
блока try?
20. Укажите основное достоинство и основной недостаток ис-
пользования catch (...).
21. Что происходит, если несколько обработчиков соответствуют
типу сгенерированного объекта?
22. Какой тип указателя надо использовать в обработчике catch,
чтобы перехватывать любое исключение типа указатель?
23. Может ли обработчик заявить исключение?
24. Приведите пример вложенных исключений.
25. Что такое abort()?
26. Как написать свой обработчик abort?
27. Приведите пример стандартных классов исключений.
Задачи для самостоятельного решения
Пример:
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include<fstream.h>
#include<string.h>
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
‐‐‐‐‐‐‐‐
// ERRORS
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
‐‐‐‐‐‐‐‐
class error
31
{
char message[80];
public:
error(char *x) {strcpy(message, x);}
void show()
{
cout <<"Proizoshlo iskluchenie: ";
cout << message << endl;
};
};
…
try
{
ifstream mycin("file");
char buf_fio[80];
int buf_age, buf_courageousness;
if(!mycin.is_open()) throw"Невозможно открыть файл.
Объектнезагружен.";
mycin >> buf_fio >> buf_age >> buf_courageousness ;
mycin.close();
…
}
catch(constchar* e)
{
cout<<endl<<"Возникло исключение: ";
cout<<e;
cout << endl <<"Press any key..."<< endl;
getch(); do_up(); change();
};
…
32
ТЕМА 8. СТАНДАРТНАЯ БИБЛИОТЕКА
ШАБЛОНОВ (STL)
Изучите теоретический материал [1]. Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.
Вопросы
33
18. Что будет выведено на экран?
int main()
{
std::vector<bool> v = {true, false, true, false};
std::vector<int>v2(v.begin(), v.end()); // 1
v.flip(); // 2
for (std::size_ti=0; i != v.size(); ++i)
std::cout<< (v[i] &v2[i]);
}
19. Что будет выведено на экран?
#include<iostream>
#include<sstream>
#include<algorithm>
#include<iterator>
int main()
{
std::stringstr = "To be or not to be...", str2;
std::istringstreamist(str);
for (inti = 0; i< 2; i++)
{
std::copy(std::istream_iterator<char>(ist),
std::istream_iterator<char>(),
std::back_inserter(str2) );
ist.str(str);
}
std::cout<< str2;
return 0;
}
20. Что будет выведено на консоль следующим кодом?
#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
usingnamespacestd;
int main() {
intArr[] = {1,2,3,1,2,3};
vector<int>Vec(Arr, Arr+(sizeof(Arr)/sizeof(Arr[0])));
sort(Vec.begin(), Vec.end());
unique_copy(Vec.begin(), Vec.end(), os‐
tream_iterator<int>(cout, " "));
return 0;
34
}
21. Что выведет данная программа:
#include<utility>
#include<vector>
#include<algorithm>
#include<iostream>
typedefstd::pair<int, int>p_int;
int main()
{
std::vector<p_int> v;
v.push_back(std::make_pair(3, 2));
v.push_back(std::make_pair(2, 3));
v.push_back(std::make_pair(1, 4));
v.push_back(std::make_pair(1, 3));
std::sort(v.begin(), v.end());
for (auto&x : v)
std::cout<<x.first<<x.second;
}
22. Какой контейнер необходимо использовать для быстрого по-
лучения (с логарифмической сложностью) значения по ключу? Ключ
типа int, значение типа string.
23. К каким из этих контейнеров применима функция сортировки
из <algorithm>: template<class _RanIt>inlinevoidstd::sort(_RanIt
_First, _RanIt _Last)
std::deque
std::map
std::set
std::list
std::vector
24. Что будет выведено на экран?
#include<iostream>
#include<map>
usingnamespacestd;
int main()
{
multimap<char, int>
mm{{'a',1},{'b',2},{'c',3},{'a',4},{'a',5},{'c',1}};
map<char, int> m(++mm.begin(), mm.lower_bound('c'));
35
for(auto i: m)
++i.second;
for(auto i: m)
cout<<i.second<<' ';
return 0;
}
36
cout<< *rpos<<' ';
list<int>::iterator rrpos;
rrpos=rpos.base();
cout<< *rrpos<<' ';
return 0;
}
28. Какие утверждения о предикатах и функторах верны (укажите
все подходящие варианты)?
Предикат может быть только структурой, а функтор – еще
и классом.
Предикаты могут использоваться для сортировки элемен-
тов в контейнерах.
Предикат – частный случай функтора.
Метод operator() функтора может возвращать только зна-
чения типа bool.
Для функтора должен быть переопределен operator<
#include<vector>
#include<algorithm>
#include<cmath>
int main(intargc, char *argv[])
{
constintXmin = ‐6;
constintXmax = 6;
std::vector <double>xArray;
std::vector <double>yArray;
for (inti=Xmin; i<Xmax; i += 0.001)
{
xArray.push_back(i);
yArray.push_back(sin(i));
i += 0.2;
}
return 0;
}
30. Куда указывает итератор ptr после выполнения следующих
двух строк кода:
vector<int>vec(100);
vector<int>::iterator ptr=vec.end();
37
Задачи для самостоятельного решения
38
ТЕМА 9. КЛАССЫ, ИНТЕРФЕЙСЫ
И НАСЛЕДОВАНИЕ В С#
Изучите теоретический материал [1]. Ответьте на вопросы. Вы-
полните самостоятельно задание в соответствии с вариантом.
Вопросы
1. Перечислите пять разновидностей членов класса специфичных
для языка C#.
2. Приведите синтаксис описания класса С# в общем виде. Проил-
люстрируйте его фрагментом программы.
3. Какие модификаторы типа доступа Вам известны?
4. В чемзаключаютсяособенностидоступачленовклассас модифика
тором public?
5. В чем заключаются особенности ступачленовкласса
с модификатором private?
6. В чем заключаются особенности доступа членов класса
с модификатором internal?
7. Приведитесинтаксиссозданияобъектавобщем виде.
8. Какие умолчания для конструкторов приняты в языке C#?
9. Каким значением инициализируются по умолчанию значения
ссылочного типа?
10. Приведите синтаксисописаниянаследованияклассов вобщем-
виде. Проиллюстрируйте его фрагментом программы на языке C#.
11. Какие операторы языка C# являются важнейшими для обра-
ботки исключений?
12. Необходимо ли обеспечивать соответствие типов исключения
в операторе catch типу перехватываемого исключения?
13. В каком случае возможно использование оператора языка C#
catch без параметров?
14. Каким образом осуществляется возвратв программу после об-
работки исключительной ситуации?
15. Зависит ли вызов блока finally от наличия исключения?
16. Какой оператор языка C# используется для явной генерации
исключений?
17. Какой системный класс является базовым для создания ис-
ключений?
39
18. Что напечатает этот код:
usingSystem.Collections.Generic;
using System;
classTest {
delegateintF();
staticvoid Main()
{
List<F>fs = newList<F>();
int[] xs = { 1, 2, 3 };
for (inti = 0; i< 3; i++)
{
fs.Add( () =>xs[i]);
}
foreach (Ffinfs)
{
Console.WriteLine(f());
}
Console.ReadLine();
}
}
using System;
classTest
{
staticvoid Main(string[] args)
{
Aa = newB();
CallMethod1(a);
a = newC();
CallMethod1(a);
Console.ReadKey();
}
publicstaticvoid CallMethod1(A item)
{
Bb = item asB;
b.Method1();
}
}
abstractclassA
40
{
publicvirtualvoid Method1()
{
Console.WriteLine("A.Method1");
}
}
classB : A
{
publicoverridevoid Method1()
{
Console.WriteLine("B.Method1");
}
}
classC : A
{
publicoverridevoid Method1()
{
Console.WriteLine("C.Method1");
}
}
20. Что напечатает следующий код:
classA
{
publicvirtualint m(refinti)
{
i = 1;
returni;
}
}
classB : A
{
publicoverrideint m(refinti)
{
i = 2;
returni;
}
}
internalclassProgram
{
inti;
privatestaticvoid Main(string[] args)
41
{
Aa = newB();
Console.WriteLine(a.m(refi));
}
}
21. Скомпилируется ли следующий код:
interfaceInterface1
{
void F();
void G();
}
classClass1
{
publicvoid F() { }
publicvoid G() { }
}
classClass2 : Class1, Interface1
{
newpublicvoid G() { }
}
22. Чем могут быть M1, M2, M3, M4, если дан следующий код:
publicclassC1 : M1, M2 { }
publicstructS1 : M3, M4 { };
23. Какие строки вызовут ошибку компиляции:
interfaceIList
{
int Count { get; set; }
}
interfaceICounter
{
void Count(inti);
}
interfaceIListCounter : IList, ICounter { }
classC
{
void Test(IListCounter x) // 1
{
x.Count(1); // 2
x.Count = 1; // 3
}
}
42
24. Что напечатает следующий код:
classBase
{
publicStringclassName = "Base";
}
classDerived : Base
{
privatenewStringclassName = "Derived";
}
classTest
{
staticvoid Main(string[] args)
{
Console.WriteLine(newDerived().className);
}
}
25. В каких строках кода возникнет ошибка компиляции:
classOuterClass
{
privateinti;
protectedint j;
publicint k;
publicOuterClass()
{
InnerClass nested = newInnerClass(this);
nested.a = 1; // 1
nested.b = 1; // 2
nested.c = 1; // 3
}
classInnerClass
{
privateint a;
protectedint b;
publicint c;
publicInnerClass(OuterClassouterClass)
{
outerClass.i = 1; // 4
outerClass.j = 1; // 5
outerClass.k = 1;
}
}
}
43
26. Скомпилируется ли следующий код:
interfaceIControl
{
void Paint();
}
interfaceIForm
{
void Paint();
}
classPage : IControl, IForm
{
publicvoidPaint() { }
}
27. Даны следующие классы:
publicclassTest
{
inttestInt = 5;
publicintgetInt() { returntestInt; }
}
classAnother
{
// тело класса
}
Задачи для самостоятельного решения
Общее задание.Определить иерархию классов (в соответствии
с вариантом). Классы (минимум один) должны содержать конструкторы
(с параметрами и без), статический конструктор,свойства (get,
set),переопределение методов (override) в производных клас-
сах.Создайте в одном из классов статический метод вывода количества
объектов и статическое поле – номер объекта.
В проекте должны быть или интерфейс(при множественном насле-
довании), илиабстрактный класс (приединичном наследовании).
В методах класса (минимум в одном) для работы с аргументами ис-
пользуйте ref - и out-параметры.
При возникновении ошибок должны выбрасываться исключения.
Выполните обработку исключений, используя try, catch и finally.
Создайте бесплодный класс, указанный в варианте.
44
Напишите демонстрационную программу, в которой создаются объ-
екты различных классов и добавляются в коллекцию из пространства
именSystem.Collections.
Далее приведен перечень классов.
45
ТЕМА 10. ОБОБЩЕНИЯ И ПЕРЕГРУЗКА
ОПЕРАТОРОВ C#
Изучите теоретический материал [1]. Выполните самостоятельно
задание в соответствии с вариантом.
Вопросы
classTest<T>
{
public T obj;
public Test()
{
obj = default(T);
}
5. Напишите обобщенный метод поиска заданного значения
в списке.
6. Для чего используются обобщенные делегаты? Приведите пример.
7. Можно ли наследовать от обобщенного класса?
8. Можно ли определять обобщенные свойства?
9. Какие ограничения существуют в обобщенных классах?
10. Приведите обобщенную форму перегрузки операторов в С#.
11. Перечислите ограничения на перегрузку операторов отношения.
12. Могут ли быть перегружены ключевые слова true и false?
13. Какие логические операторы подлежат перегрузке?
14. Приведите две формы операторов преобразования: явную
и неявную.
15. Перечислите существующие ограничения на операторы пре-
образования.
16. Перечислите операторы, которые нельзя перегружать.
46
Задачи для самостоятельного решения
47
Вариант Задание
Класс – матрица. Дополнительно перегрузить следующие
операции: + – сложение матриц; () – доступ по индексу
7
M(с, i); >, < – сравнение матриц; == – копирование матриц,
!= – проверка соответсвия размеров матриц
Класс – время CVector. Дополнительно перегрузить следу-
ющие операции: + – добавление элемента; ++, ‐‐ – увели-
8
чение и уменьшения всех элементов вектора на один
(СVector++); !=, == – проверка на неравенство, равенство
Класс – время CVector. Дополнительно перегрузить следу-
ющие операции: ‐ – разность двух векторов; + – сложение
9
элементов вектора с целым; !=, == - проверка на неравен-
ство, равенство
Класс – стек Сstack. Дополнительно перегрузить следую-
щие операции: + – добавить элемент в стек; ‐ – извлечь
10 элемент из стека; ~ – проверка, пустой ли стек; > и < – ко-
пирование одного стека в другой с сортировкой в возрас-
тающем порядке
48
ЛИТЕРАТУРА
1. Пацей, Н. В. Объектно-ориентированное программирование:
учеб.-метод. пособие: в 2 ч./ Н. В. Пацей. – Минск: БГТУ, 2013.–
Ч. 2.– 186 с.
2. Прата, С. Язык программирования C++: лекции и упражнения /
C. Прата;пер. с англ. – 6-е изд. – М.: Издат. дом «Вильямс», 2012. –
1248 с.
3. Рихтер, Дж. CLR via С#. Программирование на платформе
Microsoft .NET Framework 4.0 на языке С#/ Дж.Рихтер.– 3-е изд. –
СПб.: Питер,2012. –928 с.
4. Шилдт, Г. С# 4.0: полное руководство/ Г. Шилдт; пер. с англ. –
М.: Издат. дом «Вильямс», 2011. –1056 с.
5. Медведев, В.И. Особенности объектно-ориентированного про-
граммирования на C++/CLI, C# и Java/ В. И. Медведев. – 2-е изд.,
испр. и доп.– Казань: РИЦ «Школа», 2010.– 444 c.
6. Хортон, А.VisualC++ 2005. Базовый курс / А.Хортон. – М.: Из-
дат. дом «Вильямс», 2007. – 1152 с.
7. Харви, Д. Как программировать на С++ / Д. Харви, П.Дейтел.–
М.: БИНОМ,2007. –1156 с.
8. Нейгел, К. C# 2005 для профессионалов/К. Нейгел;пер. с англ. –
M.: Издат. дом «Вильямс», 2007.
9. Ноутон, П. Java 2/П. Ноутон, Г. Шилдт; пер. с англ. –СПб.: БХВ-Пе-
тербург, 2007. – 1072 c.
10. Медведев, В.И. Программирование на С++, C++.NET/C# и
.NET компоненты / В.И.Медведев.– 2-е издание.– Казань: Мастер
Лайн, 2007. – 296 c.
11. Медведев, В.И. .NET компоненты, контейнеры и удаленные
объекты / В.И.Медведев.– Казань: РИЦ «Школа», 2006. – 320 c.
12. Александреску, А. Современное проектирование на C++ (серия
C++ inDepth)/А. Александреску. – М.: Издат. дом «Вильямс», 2008. –
336 с.
13. Влиссидес, Дж. Применение шаблонов проектирования.
Дополнительные штрихи/ Дж.Влиссидес.– М.: Издат. дом «Вильямс»
2003.– 144 с.
14. Приемы объектно-ориентированного проектирования. Паттер-
ны проектирования. / Э. Гамма[и др.].–СПб.: Питер, 2010.– 368с .
49
СОДЕРЖАНИЕ
ПРЕДИСЛОВИЕ ......................................................................................... 3
ТЕМА 1. КЛАССЫ И ОБЪЕКТЫ ............................................................ 4
Вопросы ........................................................................................................ 4
Задачи для самостоятельного решения ..................................................... 6
ТЕМА 2. НАСЛЕДОВАНИЕ .................................................................... 8
Вопросы ........................................................................................................ 9
Задачи для самостоятельного решения ................................................... 14
ТЕМА 3. АБСТРАКТНЫЕ КЛАССЫ .................................................... 15
Вопросы ...................................................................................................... 16
Задачи для самостоятельного решения ................................................... 18
ТЕМА 4. ДИНАМИЧЕCКАЯ ИДЕНТИФИКАЦИЯ ТИПОВ ............. 20
Задачи для самостоятельного решения ................................................... 20
ТЕМА 5. ПЕРЕГРУЗКА ОПЕРАЦИЙ ................................................... 21
Вопросы ...................................................................................................... 22
Задачи для самостоятельного решения ................................................... 23
ТЕМА 6. ШАБЛОНЫ КЛАССОВ И ФУНКЦИЙ ................................ 26
Вопросы ...................................................................................................... 26
Задачи для самостоятельного решения ................................................... 28
ТЕМА 7. РАБОТА С ПОТОКАМИ, ОБРАБОТКА ИСКЛЮЧЕНИЙ . 30
Вопросы ...................................................................................................... 30
Задачи для самостоятельного решения ................................................... 31
ТЕМА 8. СТАНДАРТНАЯ БИБЛИОТЕКА ШАБЛОНОВ (STL) ....... 32
Вопросы ...................................................................................................... 33
Задачи для самостоятельного решения ................................................... 38
ТЕМА 9. КЛАССЫ, ИНТЕРФЕЙСЫ И НАСЛЕДОВАНИЕ В С# ...... 39
Вопросы ...................................................................................................... 39
Задачи для самостоятельного решения ................................................... 44
ТЕМА 10. ОБОБЩЕНИЯ И ПЕРЕГРУЗКА ОПЕРАТОРОВ C# ......... 46
Вопросы ...................................................................................................... 46
Задачи для самостоятельного решения ................................................... 47
ЛИТЕРАТУРА ........................................................................................... 49
50
Учебное издание
ПацейНаталья Владимировна
ОБЪЕКТНО‐ОРИЕНТИРОВАННОЕ
ПРОГРАММИРОВАНИЕ НА С++/C#
Лабораторный практикум
Редактор Ю. Д. Нежикова
Компьютерная верстка Я. Ч. Болбот
Корректор Ю. Д. Нежикова
Издатель:
УО «Белорусскийгосударственныйтехнологическийуниверситет».
Свидетельство о государственнойрегистрациииздателя,
изготовителя, распространителяпечатныхизданий
№ 1/227 от 20.03.2014.
Ул. Свердлова, 13а, 220006, г. Минск.
51