Учреждение образования «БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ» Н. В. Пацей Объектно‐ориентированное программированиена С++/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 { }; 27. Каким будет результат выполнения следующего кода: class Counter { public: void Count() { printf("%d", 1); } }; int main() { Counter obj; obj.Count(); return 0; } void Counter::Count() { printf("%d", 2); } Задачи для самостоятельного решения Общее задание. Определить пользовательский класс в соответ- ствии с вариантом задания (см. варианты). Добавить в класс следую- щие конструкторы: без параметров, с параметрами, копирования. Определить в классе деструктор, компоненты-функции для просмотра и установки полей данных. Написать демонстрационную программу, в которой создаются и разрушаются объекты пользовательского клас- са и каждый вызов конструктора и деструктора сопровождается выда- чей соответствующего сообщения (какой объект какой конструктор или деструктор вызвал). При работе с классами пользоваться 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].Ответьте на вопросы. Вы- полните самостоятельно задание в соответствии с вариантом. Вопросы 1. Что такое производный и базовый классы? 2. В чем заключена основная задача наследования? 3. Пусть базовый класс содержит метод basefunc(), а производ- ный класс не имеет метода с таким именем. Может ли объект произ- водного класса иметь доступ к методу basefunc()? Если да, то при каких условиях? 4. Напишите первую строку описания класса B, который является public-производным класса A. 5. Допустим, что базовый и производный классы включают в себя методы с одинаковыми именами. Какой из методов будет вызван объ- ектом производного класса, если не использована операция разреше- ния имени? 6. Напишите объявление конструктора без аргументов для произ- водного класса B, который будет вызывать конструктор без аргумен- тов класса A. 7. Предположим, что существует класс D, производный от базово- го класса B. Напишите объявление конструктора производного класса, принимающего один аргумент и передающего его в конструктор базо- вого класса. 8. Истинно ли следующее утверждение: класс D может быть про- изводным класса С, который, в свою очередь, является производным класса В, производногоот класса А? 9. Напишите первую строку описания класса Petrov, который яв- ляется public-производным классов Homo и Worker. 10. Дополните фразу «C++ обеспечивает …, которое позволяет производному классу наследовать несколько базовых классов, даже если эти базовые классы неродственные». 11. Истинно ли утверждение о том, что указатель на базовый класс может ссылаться на объекты порожденного класса. 12. Можно ли использовать объект базового класса в производном классе в явном виде? 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); } 20. Что будет выведено в консоль при попытке выполнить следу- ющую программу: class A { int j; public: 10