Professional Documents
Culture Documents
Uploads Metodichka Laboratorni 1 Semestr
Uploads Metodichka Laboratorni 1 Semestr
УКРАЇНИ
Тернопільський національний технічний університет
імені Івана Пулюя
Кафедра
комп’ютерних наук
МЕТОДИЧНІ ВКАЗІВКИ
до виконання лабораторних робіт
з дисципліни
“Об’єктно-орієнтоване програмування”
I частина
для студентів денної та заочної форм навчання
напряму підготовки
6.050101 – “Комп’ютерні науки”
Тернопіль, 2012
1
МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
Тернопільський національний технічний університет
імені Івана Пулюя
Кафедра
комп’ютерних наук
МЕТОДИЧНІ ВКАЗІВКИ
до виконання лабораторних робіт
з дисципліни
“ Об’єктно-орієнтоване програмування”
I частина
для студентів денної та заочної форм навчання
напряму підготовки
6.050101 – “Комп’ютерні науки”
Тернопіль, 2012
2
Методичні вказівки розроблені у відповідності з навчальним планом
напряму підготовки 6.050101 – “Комп’ютерні науки”
Затверджено
на засіданні кафедри комп’ютерних наук
Протокол № 2 від “ 4 ” вересня 2012 р.
3
ЗМІСТ
ВСТУП ................................................................................................................................................5
ЛАБОРАТОРНА РОБОТА 1.
КОНСТАНТИ, ЗМІННІ, ТИПИ ДАНИХ В С++....................................................................7
ЛАБОРАТОРНА РОБОТА 2.
ПРОЦЕС АНАЛІЗУ ТА ПРОЕКТУВАННЯ ПРОГРАМНИХ СИСТЕМ НА ОСНОВІ
МОВИ UML.................................................................................................................................... 19
ЛАБОРАТОРНА РОБОТА 3.
КЕРУЮЧІ СТРУКТУРИ В С++............................................................................................... 24
ЛАБОРАТОРНА РОБОТА 4.
РОБОТА З ВКАЗІВНИКАМИ. ОПРАЦЮВАННЯ МАСИВІВ ..................................... 29
ЛАБОРАТОРНА РОБОТА 5.
ФУНКЦІЇ. ШАБЛОНИ ФУНКЦІЙ ........................................................................................ 37
ЛАБОРАТОРНА РОБОТА 7.
РОБОТА З КЛАСАМИ. РЕАЛІЗАЦІЯ ПРИНЦИПУ НАСЛІДУВАННЯ. ................. 57
ЛАБОРАТОРНА РОБОТА 8.
РЕАЛІЗАЦІЯ ПРИНЦИПУ ПОЛІМОРФІЗМУ В ООП. ПЕРЕВАНТАЖЕННЯ
ОПЕРАЦІЙ..................................................................................................................................... 64
ЛАБОРАТОРНА РОБОТА 9.
ВІРТУАЛЬНІ ФУНКЦІЇ . ШАБЛОНИ КЛАСІВ ............................................................... 68
ВИКОРИСТАНА ЛІТЕРАТУРА ............................................................................................. 73
ДОДАТКОВА ЛІТЕРАТУРА ................................................................................................... 74
4
Вступ
1
Парадигма програмування – основні принципи програмування (не плутати з розробленням програм),
або, парадигмне програмування. Парадигма програмування надає (та визначає) те, як програміст розглядає
роботу програми. Наприклад, в об'єктно-орієнтованому програмуванні, програміст розглядає програму як
множину взаємодіючих між собою об'єктів, водночас як у функційному програмуванні програму можна
представити як обчислення послідовності функцій без станів.
1
Основні парадигми програмування: процедурне програмування (англ. Procedural programming);
модульне програмування (англ. Modular programming); об'єктно-орієнтоване програмування (англ. Object-
oriented programming); функційне програмування (англ. Functional programming); імперативне програмування
(англ. Imperative programming); декларативне програмування (англ. Declarative programming); прототипне
програму-вання (англ. Prototype-based programming); аспектно-орієнтоване програмування (англ. Aspect-oriented
prog-ramming); предметно-орієнтоване програмування (англ. Subject-oriented programming); функціонально-
орієнтоване програмування (англ. Feature-oriented programming).
5
застосовані і до інших об’єктно орієнтованих (OO) мов програмування,
наприклад, Java, Eiffel.
Ви не отримаєте хорошої оцінки в цьому курсі просто за написання
програм. Основні бали будуть нараховуватись за хороший OO дизайн та
відповідну реалізацію цього в коді C++. Легко писати програми C++, які не
відповідають OO принципам, але такі програми не будуть отримувати
необхідний прохідний бал.
Дані методичні вказівки призначені для виконання лабораторних робіт у
першому семестрі вивчення дисципліни “Об’єктно-орієнтоване програмування”
для студентів спеціальності 6.050101 “Комп’ютерні науки” денної та заочної
форм навчання.
Виконання лабораторних робіт повинно забезпечити закріплення
теоретичних знань, отриманих при вивченні лекційного матеріалу, та
практичної частини дисципліни.
В методичних вказівках розглянуті основні теоретичні питання, пов’язані
з виконанням лабораторних робіт.
Додаткові ресурси
Програмне забезпечення
Під час роботи з курсом ви будете розробляти, компілювати та тестувати
програми. Ось чому вам буде потрібно організувати C++ робоче середовище:
текстовий редактор, компілятор та стандартні бібліотеки.
Хоча маємо велику кількість С++ середовищ, проте для роботи з цим
курсом слід використовувати GNU g++ компілятор (ISO/IEC стандарт C++,
native C++) і пов'язані з ними бібліотеки. Це середовище ви зможете отримати
як в Linux операційній системі так і у Windows – Cygwin (реалізація Unix
середовища під Windows) та MinGW. З MinGW можна ознайомитися на
http://www.mingw.org. Додаткові відомості про використання MinGW наведені
у лабораторній роботі 1. Рекомендований текстовий редактор для Windows –
Notepad++ (http://notepad-plus-plus.org/), для Linux – Vim чи будь-який з
підсвіткою коду.
6
Лабораторна робота 1. Константи, змінні, типи даних в С++.
1.1 Ви навчитесь:
По завершенні цього розділу ви будете вміти:
використовувати термінологію мови програмування C++
описати структуру програми
порівняти мову C та С++, ознайомитесь з особливостями останньої
створювати, редагувати, компілювати та виконувати прості
програми, написані на мові C++
7
Наприклад, оператор do — це лексема Зустрічаючи цю лексему,
компілятор знає, який машинний код потрібно підставляти замість неї.
Лексеми утворяться із символів, вирази — з лексем і символів,
оператори — із символів, виразів і лексем
Вираз — це послідовність знаків операцій, операндів і круглих дужок, що
задає обчислювальний процес знаходження результату певного типу.
Найпростішим виразом є константа, змінна або виклик функції. Можна
вважати, що при виконанні програми результат виразу замінює сам вираз.
Прості вирази містять символ операції та операнди. Прикладом простого
виразу з бінарною операцією є віднімання: 3.4 – x.
Операнд є елементом-учасником операції. Операндами можуть бути
константи, змінні, виклики функцій і вирази.
Операції і вирази мови С++ дозволяють задати певну послідовність дій.
Блоки і складові оператори
Будь-яка послідовність операторів, що взяті в фігурні дужки, є складовим
оператором (блоком). Складовий оператор не повинен закінчуватися (;),
оскільки обмежувачем блоку служить сама дужка, яка закривається. Всередині
блока кожний оператор повинен обмежуватися (;). Складовий оператор може
використовуватися скрізь, де допускається застосування звичайного оператора.
1.2.1 Константи
Константи – це вирази із фіксованим значенням. Типи констант:
літерали: використовуються для того щоб представити певне
значення в коді; можуть бути цілими числами (1, 0, -17), дійсними
(3.1415926535897, 1., 6.096, -3.), символами (‘a’, ‘ ’, ‘\n’), рядком
символів (“6.096”, “a”), мати логічне значення (true, false).
символьні константи, визначені за допомогою директиви #define
1 # include < iostream >
2
3 using namespace std ;
4
5 # define PI 3.14159
6 # define NEWLINE ’\n ’
7
8 int main ()
9 {
10 double r = 5.0;
11 double circle ;
12
13 circle = 2 * PI * r; // circle = 2 * 3.14159 * r;
14 cout << circle << NEWLINE ; // cout << circle << ’\n ’;
15
16 return 0;
17 }
8
Оголошені константи (const), користувацькі константи з префіксом
(const)
1 const int pathwidth = 100;
2 // pathwidth = 2; this will cause a compiler error!
3 const char tabulator = ’\t ’;
4 cout << "tabulator =" << tabulator << ’\n ’;
9
7. < менше зліва-направо
> більше
<= менше або дорівнює
>= більше або дорівнює
8. == дорівнює зліва-направо
!== не рівне
9. & порозрядне І зліва-направо
10. ^ порозрядне виключаюче АБО зліва-направо
11. | порозрядне АБО зліва-направо
12. && логічне І зліва-направо
13. || логічне АБО зліва-направо
14. ?: умовна операція справа-наліво
15. = присвоювання (просте і складене) справа-наліво
*=, /=, %=,
+=, -=,
&=, ^=, |=
16. throw генерація виключення справа-наліво
17. , послідовність виразів зліва-направо
Приклади:
1 int var; // var - це L-value,
2 //тому що можна його поставити зліва від знаку =, наприклад
3 //var = 3;
10
Префіксні і постфіксні операції ++ та -- використовують для збільшення
(інкремент) і зменшення (декремент) на одиницю значення змінної.
Семантика зазначених операцій така:
++a (--a) збільшує (зменшує) значення змінної а на одиницю до
використання цієї змінної у виразі.
а++ (a--) збільшує (зменшує) значення змінної а на одиницю після
використання цієї змінної у виразі.
11
Керувати цими характеристиками змінних програміст може двома
шляхами:
1. зміною місця оголошення змінної у програмі;
2. використанням модифікаторів auto, register, static, extern.
Функція a( )
Оператори
Функція b( )
Оператори
13
Нижче наведено приклади двох простих програм на мові С++
Приклад 1.1 Програма виводу на екран привітання “Hello, world!”
1 #include <iostream>
2 // директива препроцесора
3 using namespace std;
4 // включає в програму визначення
5 // стандартного простору імен
6 int main()
7 // заголовок функції main()
8 {
9 // початок тіла функції main()
10 cout<<"Hello, world! \n”;
11 // \n - символ нового рядка
12 cin.get();
13 //очікується натискання будь-якої клавіші
14 return 0;
15 //оператор повернення завершує функцію main()
16 }//кінець тіла функції main()
14
1.2.6 Засоби введення/виведення
При запуску програми на мові С++ автоматично створюється декілька
стандартних потоків, зокрема: cin (стандартний потік вводу з клавіатури) та
cout (стандартний потік виводу на екран).
Існує ще 2 стандартних потоки cerr та clog, що призначені для виводу
помилок. Для того щоб використовувати ці потоки, достатньо під’єднати
заголовний файл <iostream> та вказати стандартний простір імен, як це
показано у прикладі 1.2.
Потоки є засобом вводу/виводу мови програмування С++. Крім потоків
для вводу/виводу інформації можна використовувати також функції мови С,
зокрема функцію printf() та scanf(), проте стандарт цього не рекомендує.
15
comment here*/). Такий коментар може займати декілька рядків. Коментарі
існують, для пояснення неочевидних речей в коді. Використовуйте коментарі –
добре документуйте код!
2. Рядок, що починається з # - це команда для препроцесора, що вказує який ще
код має бути скомпільований. #include вказує препроцесору залучити вміст
іншого файлу, в нашому випадку iostream файл, що визначає процедуру
вводу/виводу даних.
4. int main() {...} визначає код, що буде виконаний при запуску програми.
Фігурні дужки дозволяють згрупувати декілька команд в один блок, більше про
це в подальшому матеріалі.
5.
● cout << : дозволяє реалізувати вивід текстової інформації на екран.
Детальніше буде розглянуто пізніше.
● Namespaces: У С++ ідентифікатори можуть бути визначені з контексту
програми, завдяки використанню простору імен (каталогів імен). Коли
хочемо отримати доступ до ідентифікатора в певному просторі імен, то
використовуєм оператор :: (scope resolution operator ), щоб дати
відповідну інструкцію компілятору. В даній програмі вказуєм
компілятору шукати ідентифікатор cout в просторі імен std, в якому
оголошено багато стандартних ідентифікаторів С++.
Кращою альтернативою є додати наступну стрічку коду перед рядком 2.
using namespace std; це вкаже компілятору шукати в просторі імен std всі
неоголошені ідентифікатори. Якщо зробити це, то можна опустити префікс std::
при звертанні до cout. Це є рекомендованою реалізацією.
● Strings: Послідовність символів Hello, world називають стрічкою.
Стрічка, що явно ініцалізується в коді називається стрічковим літералом.
● Escape sequences: \n вказує на створення нового рядка. Це приклад
екранованої послідовності.
7. return 0 Вказує на те що програма після успішного виконання повинна
повернути ОС. Детальніше буде розглянуто в наступних роботах.
Зауважте, що кожен вираз закінчується ; (окрім директив препроцесора та
блоків {...}). Недотримання цього правила є досить поширеною помилкою.
А) Б) В)
1 #include <iostream> 1 #include <iostream>
2 using namespace std; 2 using namespace std; 1 #include <iostream>
3 int main() 3 int main() 2 using namespace std;
4 { 4{ 3
5 int arg1; 5 int arg1; 4 int main()
6 arg1=-1; 6 arg1=-1; 5 {
7 int x,y,z; 7{ 6 cout<<"Hello
8 char MyDouble='5'; 8 char arg1='A'; 7 World!\n";
9 char arg1='A'; 9} 8 return 0;
10 cout<<arg1<<"\n"; 10 cout<<arg1<<"\n"; 9 }
11 return 0; 11 return 0; 10
12 } 12 }
18
Лабораторна робота 2. Процес аналізу та проектування програмних
систем на основі мови UML
2.1 Ви навчитесь:
По завершенні цього розділу Ви будете вміти:
користуватись термінологією UML
будувати найпростіші діаграми класів
2
Будь-який створений і відчужений матеріал проекту (модель, програм-ний код, документація тощо).
20
Сутності – це певні абстракції, які є базовими елементами моделей. В
UML є чотири типи сутностей: структурні (актори, класи, інтерфейси,
компоненти, вузли), поведінки (преценденти, діяльності, стани і
повідомлення), групування та анотаційні.
Структурні сутності – це статичні поняття, які відповідають
концептуальним, логічним чи фізичним елементам системи. Структурні
сутності, зазвичай, позначають іменниками. Розрізняють п’ять головних
структурних сутностей: актори, класи, інтерфейси, компоненти, вузли. Кожна з
сутностей може мати свої підвиди3.
Актор (Actor) – це суб’єкт, який перебуває поза системою, що
моделюється, і безпосередньо з нею взаємодіє. Графічно акторів зображають
значком “худа людина”, під яким вказують ім’я актора (рис. 2.1).
3
Поділ на головні сутності та їхні підвиди строго не фіксується, отож у літературі трапляється й дещо
інша класифікація сутностей.
21
Анотаційна сутність – це коментар для пояснення чи зауваження до будь-
якого елемента моделі. Є тільки один тип анотаційної сутності– примітка (note).
Графічно примітку зображають прямокутником із загнутим правим верхнім
кутом [2].
Діаграма UML – це графічне зображення елементів cистеми у формі
зв’язаного графа з вершинами (сутностями) і ребрами (відношеннями).
Детальніше можна ознайомитись в матеріалах лекцій та додатковій літературі
22
Варіант 16: Клас “давач” (sensor): поточне значення, максимально і
мінімально допустимі, тип (t - температурний, p - тиску, І - освітленості, pH –
рівня кислотності), сигнал тривоги.
Варіант 17: Клас “товар на складі”: назва, кількість, розміщення .
Варіант 18: Клас “фраза”: вміст, кількість слів, кількість символів,
кількість різних символів алфавіту.
Варіант 19: Клас “число”: вміст, кількість цифр, основа системи
числення .
Варіант 20: Клас “коло”: x, y, R, ознака візуалізації (чи відображати на
екрані).
Варіант 21: Клас “книга”: код УДК, назва, автор, рік видання, кількість
сторінок.
Варіант 22: Клас “обладнання”: назва, вартість, дата виготовлення, група
(5, 15, 25 – амортизація) і клас “модернізація обладнання” (дата ремонту,
вартість ремонту).
Варіант 23: Клас “товар”: назва, виробник.
Варіант 24: Клас “банківський рахунок”: назва банку, номер рахунку,
МФО, вміст.
Варіант 25: Клас “підключення”: назва мережі, наявність пільги.
23
Лабораторна робота 3. Керуючі структури в С++.
3.1 Ви навчитесь:
По завершенні цього розділу Ви будете вміти:
користуватись операторами розгалуження
аргументувати їх вибір
в коді використовувати відповідний оператор циклу
if (логічний_вираз) оператор_1;
else оператор_2;
Цикл із параметрами:
for (ініціалізація; перевірка; нове_значення) оператор;
Цикл із параметрами, може використовуватись у більшості випадків і
заміняти собою інші види циклів. Найпоширенішим є використання циклу for
тоді, коли потрібно змінювати значення цілого параметру від початкового до
кінцевого значення з певним кроком, наприклад, при індексуванні масивів:
1 for (i=0; i<n; i++) a[i]=0;
25
3.3 Порядок виконання
Розробити програму згідно умови, детально прокоментувати код:
1. Дано N цілих значень. Серед них знайти максимальне, мінімальне,
діапазон та середнє арифметичне (для всіх).
2. Розробити програму згідно варіанту:
1. На площині знаходиться коло з радіусом R і центром в початку координат.
Ввести задані координати точки і визначити, чи лежить вона на колі.
Вивести результат на екран. Розв'язати задачу при R=2 для точок з
координатами (0;2), (-1.5;0.7), (1;1), (3;0).
2. Дано натуральне число n. Отримати шістнадцяткове представлення цього
числа у вигляді послідовності символів (‘0’..’F’).
3. Для заданого цілого числа визначити а) чи кратне воно 3; а) чи кратне воно
9. Використати наступну властивість: якщо сума цифр числа кратна 3 (9), то
і число кратне 3 (9).
4. Дано діагональ куба. Знайти площу поверхні та об’єм куба.
5. Дано два дійсних числа. Знайти середнє арифметичне цих чисел та середнє
геометричне їх модулів.
6. Задано площу круга R та квадрата S. Визначити чи поміститься квадрат в
крузі. Розв'язати задачу для 1) R=70, S=36.74; 2) R=0.86, S=0.64.
7. Дано натуральне число n. Отримати вісімкове представлення цього числа у
вигляді послідовності символів (‘0’..’7’).
8. Для заданого цілого числа визначити: а) чи кратне воно 5;
б) чи кратне воно 2.
9. В ЕОМ вводиться дата: послідовно день, місяць, рік (цілі числа). Визначити
порядковий номер дня в році.
10. Задано координати двох точок. Визначити, чи лежать вони на одному колі з
центром в початку координат. Результат вивести на екран. Розв'язати задачу
для точок з координатами (0;2), (2;0), (1;3), (2;2).
11. Дано катети прямокутного трикутника, знайти його гіпотенузу та площу.
12. В ЕОМ вводиться дата: послідовно день, місяць, рік, день тижня, на який
припадає Новий рік (цілі числа). Визначити день тижня, на який припадає
вказана дата.
13. Дано натуральне число n. Отримати двійкове представлення цього числа у
вигляді послідовності символів (нулів і одиничок).
14. Визначити час падіння каменя з висоти h на поверхню землі.
15. Дано дійсне число x. Не користуючись ніякими іншими арифметичними
операціями, крім множення, додавання і віднімання, обчислити: 2x4–
3x3+4x2–5x+6. Дозволяється використовувати не більше чотирьох множень
і чотирьох додавань і віднімань.
26
16. Дано сторону рівностороннього трикутника. Знайти площу цього
трикутника.
17. Три резистори (опори) з’єднані паралельно, знайти опір з’єднання.
18. Скласти програму знаходження першого справа входження символу в даний
символьний рядок. В разі незнаходження результатом роботи має бути –1.
19. Дано символьний рядок s, в ньому не менше двох компонентів. Виявити чи
є дві перших компоненти цифрами.
20. Дано символи S1, . . . , Sn, “*”, “/”. Залишити послідовність S1. . . Sn без
змін, якщо в неї не входив символ “*”, інакше кожен символ “/”, який
передує першому входженню символу “*”, замінити на “.”.
21. Дано натуральне число n, символи s1, …, sn. Будемо розглядати слова,
розділені пробілами, які входять в послідовність s1, …, sn . Знайти яке-
небудь слово, яке починається буквою “A” і закінчується ”Z” (якщо таких
немає, то повідомити про це).
22. Дані символи S1 , …, Sn . Відомо, що символ S1 відмінний від крапки і, що
серед S2 , …, Sn є хоча б одна крапка. Нехай S2, …, Sm — передуючі
першій крапці (m наперед невідоме). Отримати послідовність послідовність
Sm , Sm-1 , …, S1 .
23. Дані символи S1 , …, Sn . Відомо, що символ S1 відмінний від крапки і, що
серед S2 , …, Sn є хоча б одна крапка. Нехай S2, …, Sm — передуючі
першій крапці (m наперед невідоме). Отримати послідовність S1 , S3 , …,
Sm , якщо m — непарне, або послідовність S2 , S4 , …, Sm , якщо m —
парне.
24. Данi натуральне число n i символи s1, …, sn . Замiнити всi знаки оклику
крапками.
25. Дано натуральне n, символи s[1],…s[n]. Кількість символів в кожному слові
до 15. Знайти слово, яке закінчується певною буквою (якщо таких слів
немає, то повідомити про це).
26. Дано символи S1, …, S33. Якщо послідовність S1, …, S33 така, що S1=S16,
S2=S17,…, то залишити її без змін, інакше отримати послідовність
S1, S2, …, S33, S1, S2, …, S33.
27. Дано натуральне число n, символи S1, . . . , Sn . Замінити в послідовності
S1, . . . , Sn кожну групу букв “child” групою “children”.
28. Задано натуральне число n, і символи s1, ..., sn. Будемо вважати, що слова,
утворені символами послідовності s1, ..., sn, мають довжину не більше 15
символів. Видалити з s1, ..., sn всі слова з непарними порядковими
номерами і перевернути всі слова з парними порядковими номерами.
29. Задано натуральне число n, і символи s1, ..., sn та символ k. Створити
послідовність символів ss1, ..., ssn, де кожен ssi рівний результату логічної
операції “виключне або” між si та k. Створити послідовність символів
27
sss1, ..., sssn, де кожен sssi рівний результату логічної операції “виключне
або” між ssi та k. Вивести послідовності ss1, ..., ssn та sss1, ..., sssn.
30. Дано натуральні числа k, m, n, символи s1..sk, t1..tm, u1..un. Отримати по
одному разу ті символи, які входять одночасно в усі три послідовності.
28
Лабораторна робота 4. Робота з вказівниками. Опрацювання масивів
4.1 Ви навчитесь:
По завершенні цього розділу Ви будете вміти:
описати основні відмінності між вказівниками та посиланнями
працювати з динамічними та статичними масивами
29
Нехай змінна-вказівник має ім'я ptr(тобто оголошена як int* ptr), тоді в
якості значення їй можна присвоїти адресу за допомогою наступного
оператора:
ptr=&vr;
4.2.2 Посилання
Посилання(reference) — це видозмінена форма вказівника, що може
використовуватись як псевдонім (інше ім’я) змінної. Тому посилання не
потребують додаткової пам’яті. Для визначення посилання використовують
символ &(амперсант), який ставиться перед змінною-посиланням.
1 #include <iostream>
2 using namespace std;
3 int main()
4{
5 int t = 13,
6 int &r = t;// ініціалізація посилання на t
7 // тепер r синонім імені t
8 cout << "Початкове значенняt:" << t;
9 // виводить13
10 r += 10; // зміна значення t через посилання
11 cout<<"\n Остаточне значенняt:" << t;
12 // виводить 23
13 return 0;
30
14 }
4.2.3 Масив
Масив являє собою набір однотипних об’єктів, які мають спільне ім’я і
відрізняються місцезнаходженням в цьому наборі (або індексом, присвоєним
кожному елементу масиву). Елементи масиву займають одну неперервну
область пам’яті комп’ютера і розміщені послідовно один за одним.
1 double mas2[250];// масив з 250 чисел типу double
2 static char mas3[20];//статичний рядок з 20 символів
3 extern masl[];//зовнішній масив, розмір вказаний вище
4 int mas4[2][4]; // двовимірний масив з чисел типу int
31
Адреса &mas[0] &mas[1] &mas[2] &mas[3] або
або ptr або ptr+1 або ptr+2 ptr+3
Значення mas[0] або mas[1] або mas[2] або mas[3] або
*ptr *(ptr+1) *(ptr+2) *(ptr+3)
32
В результаті виконання оператору new в пам’яті виділяється об’єм пам’яті,
який необхідний для зберігання вказаного типу, і повертається базова адреса.
Якщо пам’ять недоступна, оператор new повертає значення 0, або генерує
виняткову ситуацію.
Оператор delete має наступний формат:
delete вираз;
delete[] вираз;
Зауваження!
Завжди використовуйте оператор delete після виділення пам’яті за допомогою
оператора new. Це входить в обов’язки програміста! Інакше це може
призвести до втрати пам’яті.
33
3. Створити квадратну матрицю (двовимірний масив чисел) у вигляді масиву
вказівників на одновимірні масиви — рядки матриці. Обчислити суму
головної діагоналі отриманої матриці.
4. З клавіатури послідовно вводяться n символів, серед яких обов’язково є
декілька пробілів. Символи заносяться в чергу, поки не буде введено
пропуск. Введене слово виводиться в новому рядку, після чого
продовжується ввід символів з наступного рядка. Ввід символів
припиняється, коли досягнуто кінець масиву, в якому зберігається черга.
5. Знайти у заданій послідовності символів співпадання з ключовим словом,
заданим, як вказівник на константу.
6. Заданий масив чисел з плаваючою комою та вказівник на нього.
Перемістити вказівник на перше число у масиві, що співпадає із заданою
константою.
7. Записати введені з клавіатури числа з плаваючою комою в чергу. Вилучити
іх послідовно з черги і вивести на екран, якщо відповідний елемент —
додатне число.
8. Скласти програму, що створює чергу, яка містить всі числа від 300 до 600,
що діляться на 6. Вивести ці числа на екран в порядку зростання.
9. Задано масив чисел з плаваючою комою, серед яких багато нульових
елементів. Створити масив, що містить вказівники на ненульові елементи.
10.Задано рядкову змінну, що містить послідовність символів, серед яких є
цифри. Скласти програму, що перетворює цю змінну в десяткове число,
вилучаючи символи, що не є цифрами. Число формувати, починаючи з
молодшого розряду.
11.З клавіатури послідовно вводяться слова. Якщо слово співпадає з першим
словом у черзі, то воно видаляється із черги, якщо ні — то додається до
неї. Ввід припиняється, при введенні слова “STOP”. Після цього отримана
черга виводиться на екран.
12.З клавіатури послідовно вводиться n символів, серед яких обов’язково є
декілька пробілів. Вивести введені символи в зворотньому порядку, при
цьому вилучити всі пропуски.
13.Скопіювати всі від’ємні числа з масиву A в масив B, в зворотньому
порядку використовуючи вказівники.
14.З клавіатури послідовно вводяться числа типу short. Скласти програму, яка
виводить спочатку додатні числа в порядку їх введення, а потім від’ємні в
порядку їх введення. Використати чергу. Ввід чисел припиняється, коли
введене число — 0.
15.Відсортувати за спаданням масив цілих чисел а0, …, аn-1. обмінним
сортуванням з використанням вказівників. Відсортований масив
34
формується систематичним обміном елемента з номером i та
максимального елемента послідовності аi+1, …, аn-1, i=0, 1, … n-2.
16.Замінити в масиві чисел типу long int всі додатні числа найменшим
від’ємним числом, використовуючи вказівники.
17.Задано масив чисел, серед яких багато нульових елементів. Створити
масив, що містить вказівники на ненульові елементи, та інший масив, що
містить вказівники на ті елементи масиву вказівників, які вказують на
додатні числа.
18.Задано дві рядкові змінні, що містять по декілька слів, розділених
пробілами. Використовуючи вказівники, визначити, чи є у цих змінних
спільні слова, і якщо є, то вивести їх на екран.
19.Зашифрувати з використанням вказівників задану рядкову змінну обміном
символів з непарними та парними номерами. Вивести зашифровану
послідовність.
20.Створити вказівник на масив символів довжиною n з допомогою процедур
динамічного виділення і вивести всі десяткові цифри, що знаходяться в
отриманому масиві. При виділенні пам’яті перевірити його коректність.
21.Задано дві рядкові змінні. Вивести на екран спільні послідовності не
коротші 5 символів, що зустічаються у цих змінних, використовуючи
вказівники.
22.З допомогою вказівників розшифруйте текстове повідомлення, яке
зашифроване в рядковій змінній, що містить букви і цифри. Алгоритм
розшифрування: послідовно, починаючи від першого аналізуються
символи. Якщо символ — буква, то він береться без змін, якщо — цифра
від 1 до 9, то перескакуємо на стільки символів уперед.
23.Зашифрувати задану рядкову змінну з допомогою операції “виключне або”
(^) із заданим ключем у вигляді послідовності символів. Вивести
зашифровану послідовність, та результат повторного її шифрування з тим
же ключем.
24.З клавіатури послідовно вводяться слова. Ввід слів припиняється і
видається попереджувальне повідомлення, якщо слово співпадає з одним із
раніше введених слів.
25.Нехай дано масив чисел а 1 …а n . Сформувати масив вказівників на
елементи цього масиву, в якому числа, на які вказують вказівники,
впорядковані за зростанням.
26.Задано рядкову змінну, що містить цифри і букви. Створити масив
вказівників, що вказують на початок кожної послідовності в даній рядковій
змінні, що складається виключно з цифр.
35
27.Замінити в масиві чисел типу unsigned char всі послідовності з трьох і
більше нулів елементом, що йде після цієї послідовності нулів. Для
знаходження довжини послідовності нулів використати різницю між
вказівниками на початок і кінець цієї послідовності.
28.Створити вказівник на масив цілого типу довжиною n з допомогою
процедур динамічного виділення і знайти кількість від’ємних елементів в
отриманому масиві. При виділенні пам’яті перевірити його коректність.
29.Відсортувати за зростанням масив чисел з плаваючою комою обмінним
сортуванням з використанням вказівників. Відсортований масив
формується систематичним обміном двох суміжних елементів, що не
відповідають порядку зростання, доки такі пари існують.
36
Лабораторна робота 5. Функції. Шаблони функцій
5.1 Ви навчитесь:
По завершенні цього розділу Ви будете вміти:
працювати з функціями та шаблонами функцій
використовувати рекурсивні функції
38
функцій. Вибір конкретної реалізації залежить від типу аргументів функції.
Наприклад:
1 int max(int, int);
2 double max(double, double);
39
Для від’ємного аргументу факторіала не існує, тому функція в цьому
випадку повертає нульове значення. Оскільки за означенням факторіал нуля
дорівнює 1, то в тілі функції передбачений і цей варіант. У випадку, коли
аргумент функції fact() відмінний від 0 та 1, функцію fact() викликається із
зменшеним на одиницю значенням параметра, а результат множиться на
значення поточного параметра. Таким чином, в результаті вбудованих викликів
функцій буде отримано наступний результат:
n * (n-l) * (n-2) * ... * 2 * 1 * 1
1 #include <stdio>
2 template <class T> void swap(T& x, T& y);
40
3 int main()
4 {
5 int a=5,b=10;
6 float c=7,d=14;
7 char ch='a',chh='A';
8 swap(a,b); // виклик для цілих аргументів
9 printf("a=%d, b=%d\n",a,b);
10 swap <float>(c,d); // виклик для float аргументів
11 printf("c=%f, d=%f\n",c,d);
12 swap <char>(ch,chh); // виклик для char аргументів
13 printf("ch=%c, chh=%c\n",ch,chh);
14 return 0;
15 }
16
17 // визначення параметризованої функції
18 template <class T> void swap(T& x, T& y)
19 {
20 T temp=x;
21 x=y;
22 y=temp;
23 }
41
b обчислює їхнє найменше спільне кратне НСК(a, b) та числа c і d
такі, що ac=bd=НСК(a, b).
2. Написати варіанти функції з передачею обчислених значень через
параметри-вказівники і через зовнішні змінні, коли функція за
трьома дійсними числами, що задають сторони трикутника,
обчислює його площу і периметр.
3. Написати варіанти функції з передачею обчислених значень через
параметри–вказівники і через зовнішні змінні, коли функція за
цілим n>7 розраховує цілі a, b такі що 5a+3b=n, a+b є мінімальним.
4. Дано натуральне число n. Нехай n!! означає 1*3*5*…n для
непарного n, і 2*4*6*…n — для парного n. Написати варіанти
функції, що обчислює n!! та (-1)n+1 n!!, з передачею обчислених
значень через параметри-вказівники і через зовнішні змінні.
5. Написати варіанти функції, що обчислює для заданого
натурального числа n значення n!+n та 2n!, з передачею обчислених
значень через параметри-вказівники і через зовнішні змінні.
6. Для заданого натурального числа n обчислити суму послідовності
чисел 20, 21, 22, …, 2n-1, використовуючи варіанти функції з
передачею обчислених значень через параметри-вказівники і через
зовнішні змінні.
7. Написати функцію, що для квадратного рівняння із заданими
коефіцієнтами, повертає значення детермінанта та обчислює корені
квадратного рівняння із заданими коефіцієнтами і повертає їх за
допомогою параметрів-вказівників та через зовнішні змінні.
8. Написати функцію, що обчислює мінімальне, середнє арифметичне
та максимальне значення для заданих у вигляді її арґументів трьох
чисел. Всі три обчислені значення потрібно повернути іншими
способами.
9. Написати функцію, яка повертає кількість повних років, місяців,
днів, годин, хвилин та секунд для заданого у секундах проміжку
часу.
10.Написати функцію, що для заданого натурального числа n повертає
три значення: кількість чисел у послідовності 1, 2,…, n, кратних 2, 3
та 5.
11.Дано дійсні числа c1, d1, c2, d2, що задають дійсні і уявні частини
комплексних чисел c1+id1, c2+id2. Написати функцію, що
знаходить добуток цих двох комплексних чисел і повертає значення
модуля отриманого комплексного числа, його фазу передає через
зовнішню змінну, а його дійсну і уявну частину — через параметри-
вказівники.
42
12.Дано дійсні числа c1, d1, c2, d2, що задають дійсні і уявні частини
комплексних чисел c1+id1, c2+id2. Написати функцію, що
знаходить суму цих двох комплексних чисел і повертає значення
модуля отриманого комплексного числа, його уявну частину
передає через зовнішню змінну, а його дійсну частину і фазу —
через параметри-вказівники.
13.Дано дійсні числа c1, d1, c2, d2, що задають дійсні і уявні частини
комплексних чисел c1+id1, c2+id2. Написати функцію, що
знаходить відношення цих двох комплексних чисел і повертає
значення модуля отриманого комплексного числа, його дійсну
частину передає через зовнішню змінну, а його уявну частину і
фазу — через параметри-вказівники.
14.Дано дійсні числа c1, d1, c2, d2, що задають дійсні і уявні частини
комплексних чисел c1+id1, c2+id2. Написати функцію, що
знаходить різницю цих двох комплексних чисел і повертає
значення модуля отриманого комплексного числа, його дійсну і
уявну частину передає через зовнішні змінні, а його фазу — через
параметр-вказівник.
15.Дано вісім чисел x1, y1, x2, y2,…, x4, y4, що задають координати
вершин чотирикутника. Написати функцію, що повертає його
периметр і площу через зовнішні змінні.
16.Дано вісім чисел x1, y1, x2, y2,…, x4, y4, що задають координати
вершин чотирикутника. Написати функцію, що повертає довжини
його діагоналей через параметри-вказівники.
17.Дано шість чисел x1, y1, x2, y2,…, x3, y3, що задають координати
вершин трикутника. Написати функцію, що повертає довжини його
медіан через параметри-вказівники.
18.Дано два числа r, h, що задають радіус основи і висоту прямого
кругового циліндра. Написати функцію, що повертає значення його
об’єму та площу його бокової поверхні через зовнішні змінні.
19.Дано два числа l, h, що задають твірну і висоту прямого кругового
конуса. Написати функцію, що повертає значення його об’єму та
площу його бокової поверхні через параметри-вказівники.
20.Дано три числа w, l, h, що задають сторони прямокутного
паралелепіпеда. Написати функцію, що повертає значення його
об’єму та площу його бокової поверхні через зовнішні змінні.
21.Дано два число r, що задає радіус кулі. Написати функцію, що
повертає значення її об’єму та площі через параметр-вказівник і
зовнішню змінну.
43
22.Написати функцію, що переводить значення декартових координат,
заданих через параметри-вказівники, у полярні.
23.Написати функцію, що переводить значення полярних координат,
заданих через зовнішні змінні, у декартові.
24.Написати варіанти функції, що переводить значення кута в
радіанах, заданого через параметр-вказівник і через зовнішню
змінну, у значення кута в градусах.
44
Лабораторна робота 6. Робота з класами. Реалізація принципу
інкапсуляції. Конструктори та деструктори
6.1 Ви навчитесь:
По завершенні цього розділу Ви будете вміти:
створювати класи, об’єкти
реалізовувати основні принципи ООП
пояснити реалізацію конструкторів та деструкторів
Як було сказано вище, клас – це абстрактний тип даних. Для того щоб
використати розроблений клас у програмі необхідно оголосити змінну даного
типу. Така змінна буде називатись об’єктом даного класу. Таким чином об’єкт
класу – це конкретна змінна (екземпляр) класу (даного типу інформаційної
структури).
Оголосити об’єкт даного класу можна таким же чином, як і змінну будь-
якого іншого стандартного або заданого користувачем типу. Наприклад,
оголосити об’єкт наведеного вище класу MyClass при умові, що даний клас
описаний у файлі MyClass.h, який знаходиться у одному каталозі з проектом,
можна наступним чином:
1 #include "MyClass.h"
2 int MyClass::get_i() { return i; }
3 void MyClass::set_i(int x) { i=x; return; }
4 int main() {
5 MyClass MyObj; //Оголосили об’єкт даного класу
6 return 0;
7 }
48
7 protected: // оголошення захищеної секції
8 int i4; // захищений член даних
9 public: // оголошення ще однієї відкритої секції
10 int i5; // ще один відкритий член даних
11 };
6.2.2Конструктори і деструктори
Конструктори і деструктори - це спецiальнi методи класу, якi
автоматично викликаються при створеннi або знищеннi об'єктiв.
Кожний клас повинен мати хоч би один конструктор, але, як правило, їх
задають декiлька. Цільове призначення конструкторів класу є двояким. З
одного боку (основного) - це створення "порожнього" об'єкта, тобто розподiл
пам'ятi для змiнних класу цього об'єкта. З іншого – це додаткова iнiцiалiзацiя
стану об'єкта, тобто заповненя "порожнього" об'єкта, оскільки саме в
конструкторi визначається, якими значеннями потрібно проiнiцiалiзувати
змiннi об'єкта.
Конструктори існують трьох типів: по замовчуванні, з параметрами і
конструктор копіювання (або конструктор копії). Кожен клас може містити
лише один конструктор по замовчуванні, один копіювання і довільну кількість
конструкторів з параметрами. Це визначає можливість перевантаження
конструкторів як звичайних функцій.
Наведемо приклади оголошення конструкторів всiх типiв для деякого
класу Patient:
1 class Patient {
2 char* m_s_Name; // закриті по замовчуванні
3 int m_n_Age; // члени даних
4 public:
5 // Конструктор по замовчуванню
6 Patient();
7 // Конструктори з параметрами для iнiцiалiзацiї
8 Patient(char* name, int Age);
9 Patient(char* name);
10 // Конструктор копiї
11 Patient(const Patient &source);
12 // iншi оголошення - можливi
13 };
14 //Тепер можна написати реалізацію цих конструкторiв:
15 // Конструктор по замовчуванню
16 Patient::Patient() {
17 m_s_Name = "";
18 m_n_Age = 0;
19 }
20 // Конструктори з параметрами
21 Patient::Patient(char* name, int Age) {
22 m_s_Name = name;
23 m_n_Age = Age;
49
24 }
25 // Конструктор перетворення типу
26 Patient::Patient(char* name) {
27 m_s_Name = name;
28 }
29 // Констуктор копiї
30 Patient::Patient(const Patient &source) {
31 m_s_Name = source.m_s_Name;
32 m_n_Age = source.m_n_Age;
33 }
34
35 //Тепер стають можливими оголошення
36 //об'єктiв, якi приводять до виклику
37 //вiдповiдних конструкторiв:
38 // Виклик конструктора по замовчуванню
39 Patient NN;
40 // Виклики конструкторів з iнiцiалiзацiєю
41 Patient Ivanov ("Ivanov",35), Petrov ("Petrov");
42 // Виклик конструктора копiї
43 Patient theSameIvanov ("Ivanov")=Ivanov;
50
6 double f = 60, Om = 2.*pi*f;
7 Ccomplex i(12,0), Z, V, OM(Om, 0);
8 Ccomplex Temp,Temp2;
9 Temp = Add(R, Mult(Mult(OM,j), L)); //R + j * OM * L
10 Temp2=Div(1,Mult(Mult(Om,j),c));
11 Z=Add(Temp,Temp2);
12 V = Mult(Z, i);
13 V.print();
14 }
1 class line {
2 public:
3 int x1, y1, x2, y2;
4 line(int _x1, int _y1, int _x2, int _y2);
5 void show();
6 void move(int x,int y);
7 ~line();
8 };
9 //… … … … … … … … …
10 void main()
11 {
12 // створюється об'єкт s класу line
13 line s(12,43,33,43);
14 int localx, localy;
15 localx=s.x1; //доступ до елементу-даних x1
16 localy=s.y1; //доступ до елементу-даних y1
17 s.show(); //доступ до елемента-функції show();
18 }
52
6.3 Порядок виконання
Розробити програму згідно варіанту, детально прокоментувати код:
1. Побудувати систему класів для опису плоских геометричних фігур:
коло, квадрат, прямокутник. Передбачити методи для створення
об'єктів, переміщення на площини, зміни розмірів і обертання на
заданий кут.
2. Побудувати опис класу, що містить інформацію про поштову
адресу організації. Передбачити можливість роздільної зміни
складових частин адреси, створення і знищення об'єктів цього
класу.
3. Скласти опис класу для представлення комплексних чисел з
можливістю задання дійсної і уявної частин як числами типів
double, так і цілими числами. Забезпечити виконання операцій
додавання, віднімання і множення комплексних чисел.
4. Скласти опис класу для об'єктів - векторів, що задаються
координатами кінців у тривимірному просторі. Забезпечити
операції додавання і віднімання векторів з одержанням нового
вектора ( чи суми/різниці), обчислення скалярного добутку двох
векторів, довжини вектора, cos кута між векторами.
5. Скласти опис класу прямокутників зі сторонами, паралельними
осям координат. Передбачити можливість переміщення
прямокутників на площині, зміну розмірів, побудова найменшого
прямокутника, що містить два заданих прямокутники, і
прямокутника, що є загальною частиною (перетинанням) двох
прямокутників.
6. Скласти опис класу для визначення одномірних масивів цілих
чисел (векторів). Передбачити можливість звертання до окремого
елементу масиву з контролем виходу за межі індексів, можливість
задання довільних границь індексів при створенні об'єкта і
виконання операцій поелементного додавання і віднімання масивів
з однаковими межами індексів, множення і ділення всіх елементів
масиву на скаляр, друку (виводу на екран) елементів масиву по
індексах і всього масиву.
7. Скласти опис класу для визначення одномірних масивів рядків
фіксованої довжини. Передбачити можливість звертання до
окремих рядків масиву по індексах, контроль виходу за межі
індексів, виконання операцій поелементного зчеплення двох
масивів з утворенням нового масиву, злиття двох масивів з
53
виключенням повторюваних елементів, друк (вивід на екран)
елементів масиву і всього масиву.
8. Скласти опис класу многочленів від однієї змінної, що задаються
ступенем многочлена і масивом коефіцієнтів. Передбачити методи
для обчислення значення многочлена для заданого аргументу,
операції додавання, віднімання і множення многочленів з
одержанням нового об'єкта - многочлена, друк (вивід на екран)
опису многочлена.
9. Скласти опис класу одномірних масивів рядків, кожен рядок
задається довжиною і покажчиком на виділену для неї пам'ять.
Передбачити можливість звертання до окремих рядків масиву по
індексах, контроль виходу за межі індексів, виконання операцій
поелементного зчеплення двох масивів з утворенням нового
масиву, злиття двох масивів з виключенням повторюваних
елементів, друк (вивід на екран) елементів масиву і всього масиву.
10.Скласти опис об'єктного типу TMatr, що забезпечує розміщення
матриці довільного розміру з можливістю зміни числа рядків і
стовпців, вивід на екран підматриці будь-якого розміру і всієї
матриці.
11.Створіть клас для харчових продуктів, який включає назву, вагу
порції, енергетичну цінність (в калоріях), вміст білків, жирів та
вуглеводів. Напишіть функцію, яка згідно заданого переліку
продуктів обчислює сумарну енергетичну цінність обіду.
12.Реалізуйте клас person, який містить дані для зберігання ПІБ, віку,
професії, домашньої адреси та телефону людини. Напишіть
функцію person::print(), яка виводить на екран дані про особу у
вигляді візитної картки (відцентрувати ПІБ і т.п.)
13.Спроектуйте та реалізуйте клас quadratic для зберігання
квадратного многочлена. Напишіть методи для знаходження
дискримінанту, коренів многочлена та виводу многочлена на екран
у звичному математичному вигляді.
14.Створіть клас для зберігання цілих чисел довжиною 10 байт.
Забезпечте виконання основних арифметичних операцій над
об'єктами класу та стандартними цілими типами даних.
15.Для класу з варіанту 4 напишіть оператори вставки в потік (<<) та
виділення з потоку (>>). Створіть методи для перетворення
числового значення, що міститься в об'єкті, в стрічку та навпаки, із
стрічки в число.
54
16.Реалізуйте клас matrix для зберігання цілочисельних матриць
розміром до 10х10. Забезпечте індексацію елементів матриці, друк
заданого стовпця, заданої стрічки та матриці загалом.
17.Для класу з варіанту 6 створіть методи для знаходження
максимального та мінімального елементів матриці, а також метод
для множення матриць (перевантажений оператор *).
18.Створіть клас vector для зберігання цілочисельного одномірного
масиву розмірністю від 10 до 10 000 елементів. Пам'ять під
елементи масиву виділяйте динамічно. Забезпечте індексацію
елементів масиву.
19.Для класу з варіанту 8 реалізуйте методи для знаходження
мінімального та максимального елементу масиву, сортування
елементів у зростаючому порядку.
20.Розробіть клас myString для роботи із стрічковими даними. Клас
повинен містити методи для роботи з потоками (<< та >>).
Потрібно забезпечити можливість конкатенації стрічок (оператор
+), операції присвоєння (=) та знаходження довжини стрічки.
21.Створити клас «точка з її координатами та кольором» . На його базі
створити клас «лінія» (задавати двома точками) з функціями:
відображення на екрані та переміщення по екрану. Також функції,
які б повертали координати середини відрізка та довжину відрізка.
22.Створити клас книга в якому містилась би інформація про автора,
рік видання, видавництво, тему, об’єм (к-ті сторінок). Створити
методи як і б виводили список книжок одної тематики.
23.Створити клас книга в якому містилась би інформація про автора,
рік видання, видавництво, тему, об’єм (к-ть сторінок). Створити
методи як і б виводили всі книжки одного автора.
24.Створити клас книга в якому містилась би інформація про автора,
рік видання, видавництво, тему, обсяг (к-ть сторінок). Створити
методи як і б сортували бібліотеку за роками видання.
25.Створити базовий клас персона з даними про неї. Надбудовою має
бути клас студент з доповненими даними про місце навчання та
групу та клас група зі списком студентів. Передбачити функцію
сортування записів про студентів в об’єкті група.
26.Використовуючи класи задачі 26 (доповнити клас студент полем
хобі), створити функцію яка б з масиву студентів створювала їх
групу, відбір робити за вподобаннями.
27.Створити клас регіон з наступними даними: назва обл., к-ть
мешканців, площа, к-ть навчальних закладів, к-ть промислових
55
підприємств. Створити метод для виконання наступної дії: вивести
назви областей з найбільшою і найменшою густотою населення.
28.Створити клас регіон з наступними даними: назва обл., к-ть
мешканців, площа, к-ть навчальних закладів, к-ть промислових
підприємств. Створити метод для виконання наступної дії: вивести
назви областей з найбільшою і найменшою зайнятістю населення.
29.Створити клас регіон з наступними даними: назва обл., к-ть
мешканців, площа, к-ть навчальних закладів, к-ть промислових
підприємств. Створити метод для виконання наступної дії:
побудувати стовпчикову діаграму зайнятості населення всіх
областей.
30.Створити клас регіон з наступними даними: назва обл., к-ть
мешканців, площа, к-ть навчальних закладів, к-ть промислових
підприємств. Створити метод, який би малював на екрані коло
(співрозмірне з площею) поділене на 3 сектора кожен з яких іншим
кольором та має означати зайнятість населення, к-ть населення на
один навчальний заклад, густота населення.
56
Лабораторна робота 7. Робота з класами. Реалізація принципу
наслідування.
7.1 Ви навчитесь:
По завершенні цього розділу Ви будете вміти:
створювати ієрархію класів
коректно описувати конструктори та деструктори в класах
нащадках
Клас employee
Клас manager
58
4 employee e1, e2;
5 employee* elist;
6 elist = &m1; // розмістити m1, e1, m2 та e2 в elist
7 m1.next = &e1;
8 e1.next = &m2;
9 m2.next = &e2;
10 }
60
class S: X, Y, Z {...};
клас S породжений класами X, Y, Z, звідки він успадковує компоненти.
1. Клас точок
Базовий клас (точки у двовимірній площині з цілочисельними
координатами):
Конструктори: за замовчуванням, з параметрами та копіювання.
Деструктор.
Функції: обчислення відстані між точками; додавання координат двох
точок; введення - виведення на екран; перевірка збіжності двох точок.
Похідний клас: пікселів на екрані (точки, які мають колір).
62
8. Динамічний список (2 класи: елемент списку, список перебувають у
відношенні агрегації)
Конструктори: за замовчуванням, з параметрами та копіювання.
Деструктор.
Функції (дві-три на вибір): вставлення елемента з голови (хвоста) у
заданому місці; видалення елемента з голови (хвоста) із заданого місця;
виведення списку на екран; пошук елемента списку; інформація про кількість
елементів списку; очищення списку; одержання голови (хвоста) списку;
одержання наступного (попереднього) елемента.
8.1 Ви навчитесь:
По завершенні цього розділу Ви будете вміти:
користуватися перевантаженням функцій,
реалізовувати перевантаження операцій
реалізовувати механізм віртуальних функцій в С++.
64
На відміну від інших мов програмування С++ допускає перевантаження
операцій =, +, -, *, ==, && та інших для будь-яких типів даних. У результаті
компілятор визначає типи операндів, і запускається відповідний варіант
операції. Перевантажувати можна навіть операцію виклику функції.
В С++ допустимі перевантаження таких операцій та операторів:
+, -, /,*, %, ^, &, !, ~, =, <, >, +=, - =, * =, / =, % =, ^ =, & =, / =, <<, >>, ==, !
=, < =, > =, &&, //, ++, --, -> *, [], (), new, new[], delete, delete[]. Не можуть бути
переввантажені оператори: ::, ., .*, :, sizeof() та непередбачені в синтаксисі
мови. У перевантажених операторах зберігається пріоритет і порядок
виконання у виразах, закріплені за даними операторами.
Перевантажувати оператори можна двома способами:
1. Звичайний опис функції з назвою operator знак. Наприклад:
1 Point operator +(Point A, Point B)
2{
3 // тіло функції }
Якщо усі функції-члени одного класу (Х) є дружніми для другого класу
(Y), говорять, що клас Х – дружній класу Y. Тоді цей факт оголошують так:
1 class Y{. . . friend class X;. . . };
65
8.3 Порядок виконання
8.3.1 Перевантажити операції.
Використати спроектовані класи згідно з варіантом та спроектовані
об’єкти цих класів у лабораторній роботі 7.
1. Операції: = (присвоювання),+, – (поелементні математичні операції).
2. Операції: = (присвоювання),+, – (поелементні математичні операції).
3. Операції: = (присвоювання),== (перевірка на рівність масивів
оцінок).
4. Операції: [ ] (одержання елемента масиву), = (присвоювання
масивів),+, –, * (поелементні математичні операції).
5. Операції: = (присвоювання масивів),+, –, * (поелементні
математичні операції).
6. Операції: = (присвоювання).
7. Операції: = (присвоювання).
8. Операції: = (присвоювання).
9. Операції: = (присвоювання).
10. Операції: = (присвоювання).
11. Операції: = (присвоювання),+ (об’єднання множин), (перетин
множин), (різниця множин).
12. Операції: = (присвоювання)
+ (додавання одного тексту до іншого).
67
Лабораторна робота 9. Віртуальні функції . Шаблони класів
9.1 Ви навчитесь:
По завершенні цього розділу Ви будете вміти:
Описувати та використовувати віртуальні функції;
Працювати із шаблонами класів.
68
3 class Dog: public Animal{ char* breed;
4 public: . . . void Ask(); };
5 class Cat: public Animal{ char* color;
6 public: . . . void Ask(); };
7 void Animal:: Ask(){cout<<«I’m animal ! «;};
8 void Dog:: Ask(){cout<<«I’m “<<breed <<’!’;};
9 void Cat:: Ask(){cout<<«I’m “<<color<<« cat! «;};
10
void main()
11
{Animal *a[3];
12
Animal a; Cat c(“white»); Dog d(“Doberman»);
13
a[0] = &a; a[1] = &c; a[2] = &d;
14
for (int i; i=0; i<3) a[i]->Ask(); };
15
//Результат: I’m animal! I’m white cat! I’m Doberman!
69
При більш широкому розгляді шаблон класу – узагальнене визначення
сімейства класів, яке може використовувати не лише довільні типи, а й
константи. Синтаксис його узагальненого опису наступний:
template <список_аргументів_шаблону> class ім’я_класу
{
// визначення класу
}
70
Можна створювати шаблони класів, що походять як від класу, що не є
шаблоном, так і від шаблону класу. Класи чи шаблони класів можуть мати
члени-шаблони. Члени-шаблони не можуть бути віртуальними.
71
9.4 Порядок захисту
Студент, який виконав завдання лабораторної роботи, подає письмовий
звіт про виконання лабораторної роботи (згідно інструкцій та вимог на сторінці
дистанційного курсу) і доповідає про результати та дає відповіді на запитання.
Виконане завдання оцінюється згідно системи контролю знань, умінь, навичок,
наведеної на відповідній сторінці дистанційного курсу.
72
Використана література
1. Страуструп Б. Язык программирования С++ [Текст] / Бьерн Страуструп. 3-е
изд. — М. : БИНОМ, 2004. — 1104 с.
2. Х. Дейтел, П. Дейтел. Как программировать на С++. М.:Бином. 1998Р.
Лафоре. Обьектно–ориентированное программирование в С++. – СПб:
Питер, 2003 – 928 с.
3. Навч.-методичний посібник / В.В.Войтенко, А.В.Морозов. – Житомир:
ЖДТУ, 2004. – 324 стор.
4. Грейди Буч. Язык UML. Руководство пользователя, The UnifiedModeling
Language user guide / Буч Грейди, Рамбо Джеймс, Айвар Джекобсон. – Изд.
2-ое. – М.-СПб. : Изд-во "ДМК Пресс", Питер, 2004. – 432 с.
5. Дудзяний І. М. Об’єктно-орієнтоване моделювання програмних систем:
Навчальний посібник. – Львів: Видавничий центр ЛНУ імені Івана Франка,
2007. – 108 с.
6. Навч.-методичний посібник / В.В.Войтенко, А.В.Морозов. – Житомир:
ЖДТУ, 2004. – 324 стор.
7. Страуструп Б. Язык программирования С++. Специальное издание. —
Бином, 2008. — 1104 с.
8. Об’єктно-орієнтоване програмування: Методичні вказівки до
комп’ютерного практикуму для студентів напрямів підготовки 6.040303
«Системний аналіз», 6.040302 «Інформатика», 6.050101 «Комп’ютерні
науки» / Уклад.: І.В. Назарчук. – К. НТУУ “КПІ”, 2011. – 72 с.
73
Додаткова література
1. Ковалюк Т.В. Основи програмування. - К.: Видавнича група BHV, 2005.
2. Львов М.С., Співаковський О.В. Основи алгоритмізації та програмування.
Навч. посібник. - Херсон: Айлант. 2000. -214 с.
3. Применение UML 2.0 и шаблонов проектирования / Ларман Крэг — [3-е
изд.] ; пер. с англ. – М. : ООО «Издательский дом Вильямс», 2007. — 736 с.
4. Подбельский В.В. Язык Си++; Учеб.пособие.- М: Финансы и статистика,
2005.-500 с.
5. Климов А.М. С++. Практическое программирование . Решение типових
задач. – СПб:ВHV,2000.- 593с.
6. Павловская Т.А., Щупак Ю.А. С++. Объектно-ориентированное
программирование: Практикум. – СПб.: Питер,2004 -288 с.
7. Либерти Д. Освой самостоятельно C++ за 21 день. –М.:Вильямс, 2000. –
806с.
8. Седжвик Р. Фундаментальне алгоритмы на С++. Анализ/Структуры
данных/Сортировка/Поиск. – СПб:ВHV,2000.-608с.
74