You are on page 1of 25

Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

Лабораторна робота №1 (2023-2024).


Тема: Введення – виведення в С++. Файлові потоки С++. Масиви.
Інтегровані середовища розробки програм мовою С++. Робота з репозиторіями на
github.com. Засоби інтелектуального налагодження та тестування виконавчого коду.
(6 години, 5 бали).

Виконання лабораторної роботи

Для виконання даної роботи базується на підготовчі лабораторні роботі №0( lab0.
Встановлення інтегрованого середовища для розробки програм мовою С++ : Visual Studio 2022,
Visual Studio Code, тощо. Встановлення розподіленої системи контролю версій Git, створення
обліковий запис на github.com та встановлення github classroom. Додаткова інформація у lab0 та
файлах : Lab_Begin_Cpp.docx, msysy2_win.docx )
1. Зайти в свій обліковий запис на github.com. Зайти в github classroom.
2. Клонувати репозиторій: https://classroom.github.com/a/J30DweNb на робочий
комп’ютер. В репозиторії знаходиться в функції main() викликається демонстраційний
приклад виконання подібної лабораторної роботи, який змінюєте на власний код.
Функції прикладу можна використовувати (модифікувати та використовувати) для
розв’язання задачі.
3. Лабораторна робота складається задач. Для задач згідно варіанту. Написати:
a. Функції введення масивів з консолі та запис масивів в текстовий файл(текстові
файли);
b. Функції введення розміру масиву(масивів) з консолі, створення масиву(масивів) з
використанням датчика випадкових чисел та запис масиву(масивів) в бінарний
файл(бінарний файли);
c. Функції розв’язання задач згідно варіанту з використанням динамічних масивів.
Вхідні дані зчитаються з файлів, результати записуються в нові файли та
виводиться в консоль.
d. Функцію читає дані з файлів в контейнер (vector, valarray або array) та з
контейнера дані виводиться в консоль.
4. В процесі написання функцій розв’язання задач лабораторної роботи періодично
здійснювати синхронізацію з репозиторієм на github.com, з поясненням виконаної
роботи (git add ., git commit -m”коментар”, git push).
5. У функції main() створити меню яке б викликало створені функції.
6. Оформити звіт про виконання лабораторної роботи, здійснити порівняння методів
роботи з масивами.
7. Звіт відправити в для оцінювання в https://moodle.chnu.edu.ua
Завдання до лабораторної роботи

Завдання 1.
1. Із одновимірного масиву А розміру N побудувати масив В із всіх додатних елементів.
2. Задано одновимірний масив А розміру N. Знайти серед всіх від’ємних максимальний
елемент масиву та його індекс.
3. Задано одновимірний масив А розміру N. Знайти серед всіх додатних мінімальний
елемент масиву та його індекс.
4. Із одновимірного масиву А розміру N побудувати масив В із всіх від’ємних елементів.
5. Із одновимірного масиву А розміру N побудувати масив В без нульових елементів.
6. Задано одновимірний масив А розміру N. Знайти кількість нульових елементів.
7. Із одновимірного масиву А розміру N побудувати масив В із елементів, які більші числа
10.
8. Задано одновимірні масиви А і В розміру N. Побудувати масив С, де ci  ai  bi i  1..N .
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

9. Задано одновимірні масиви А і В розміру N. Всі додатні елементи масиву А замінити


елементами з відповідними індексами масиву В.
10. Із одновимірного масиву А розміру N побудувати масив C із елементів,
ci  2 i ai i  1..N .
11. Задано одновимірний масив А розміру N. Першу половину елементів масиву
помножити на 2, а другу - на 3.
12. Задано одновимірний масив А розміру N. Знайти середнє арифметичне елементів
масиву.
13. Задано одновимірні масиви А і В відповідних розмірів N і М. Побудувати масив С
розміру N+М, розмістивши : додатні елементи масиву А, додатні елементи масиву В,
від’ємні елементи масиву А та від’ємні елементи масиву В.
14. Задано одновимірний масив А розміру N. Вилучити всі від’ємні елементи масиву.
15. Задано одновимірний масив А розміру N. Вилучити всі додатні елементи масиву.
16. Задано одновимірний масив А розміру 2N.
Побудувати масив В розміру 2N, розмістивши у першій половині масиву В другу
половину масиву А, а у другій половині масиву В, першу - А.
17. Задано одновимірний масив А розміру N. Обчислити різницю суми додатних та суми
від’ємних елементів масиву.
18. Задано одновимірний масив А розміру N. Обчислити суму елементів масиву на парних
позиціях та добуток - на непарних позиціях.
19. Задано одновимірний масив А розміру N. Вилучити перший додатній елемент масиву.
У випадку коли немає додатних елементів масив залишити без змін.
20. Задано одновимірний масив А розміру N та число b. Добавити новий елемент b перед
першим додатнім елементом масиву. У випадку, коли немає додатних елементів масив
залишити без змін.
21. Задано одновимірні масиви А і В розміру 2N. Побудувати масив С розміру 2N,
розмістивши у першій половині суму відповідних компонент перших половин А і В, а у
другій різницю відповідних компонент других половин А і В.
22. Задано одновимірний масив А розміру N. Обчислити добуток суму додатних та
від’ємних елементів масиву.
23. Задано одновимірний масив А розміру N. Обчислити відношення суми елементів
масиву на парних позиціях до суми елементів масиву на непарних позиціях. У випадку,
коли сума елементів масиву на непарних позиціях дорівнює нулю, відношення не
обчислювати і видати повідомлення.
24. Задано одновимірний масив А розміру N. Першу половину елементів масиву
помножити на 5, а другу - поділити на 4.
25. Задано одновимірний масив А розміру 2N. Поміняти місцями першу та другу
половину елементів масиву.
26. Задано одновимірний масив А розміру N. Поміняти місцями максимальний та
мінімальний елемент масиву.
27. Задано одновимірний масив А розміру N. Обчислити добуток максимального та
мінімального елементу масиву.
28. Задано одновимірний масив А розміру N. Знайти індекс найближчого елемента масиву
до середнього арифметичного значення елементів масиву.
29. Задано одновимірний масив А розміру 2N. Побудувати два масиви В і С розміру N,
включивши у масив В елементи масиву А з парними індексами, а у С - з непарними.
30. Задано одновимірний масив А розміру N. Перевірити чи є у масиві А хоча б одна пара
сусідніх елементів з різними знаками.
Завдання 2.
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

Зауваження. При розв’язуванні використати змінну(або декілька змінних) типу


вказівник, яка би вказувала поточний елемент масиву(або на деякий елемент масиву), що
розглядається (у приклад 5 змінна – вказівник pC вказує на поточний елемент масиву C).
Заданий одномірний масив цілих чисел А розміру N.
1. Знайти номер останнього максимального елемента серед додатних елементів,
починаючи з першого елемента, більшого заданого числа Т.
2. Знайти мінімальне значення серед елементів, менших заданого числа В, і
розташованих до першого елемента, більшого заданого числа А1.
3. Знайти номер першого максимального елемента серед від’ємних елементів,
розташованих до першого елемента, більшого заданого числа Т.
4. Знайти максимальне значення серед від’ємних елементів, розташованих до
першого елемента, рівного Т.
5. Знайти максимальне значення серед від’ємних елементів, розташованих до
першого елемента, меншого заданого числа Х.
6. Знайти номер останнього максимального значення серед від’ємних елементів,
розташованих правіше елемента, рівного Т.
7. Знайти номер останнього мінімального елемента серед елементів, менших Т1 і
розташованих до першого елемента, більшого Т2.
8. Знайти значення максимального елемента серед парних ( за значенням)
елементів, розташованих до першого непарного елемента.
9. Знайти номер першого мінімального елемента серед елементів, більших Т1 і
розташованих правіше першого елемента, рівного Т2.
10. Знайти номер останнього максимального елемента серед елементів, що лежать
у діапазоні [c,d] і розташованих до першого парного елемента.
11. Знайти номер останнього мінімального елемента серед парних додатних
елементів, що лежать правіше першого від’ємного елемента.
12. Знайти номер останнього мінімального елемента серед елементів, менших Т1 і
лежачих правіше першого елемента, рівного Т2.
13. Знайти номер першого максимального елемента серед елементів, що лежать у
діапазоні від ak до bk і розташованих правіше першого позитивного елемента.
14. Знайти номер першого максимального значення серед від’ємних елементів,
розташованих до першого елемента, рівного Т.
15. Знайти мінімальне значення додатних елементів, розташованих правіше
першого елемента, кратного двом.
16. Знайти номер першого мінімального значення серед додатних елементів,
розташованих правіше першого елемента, рівного нулю.
17. Знайти значення максимального елемента серед елементів, кратних k1 і
розташованих до першого від’ємного елемента.
18. Знайти номер першого мінімального елемента серед додатних елементів,
розташованих до першого елемента, кратного п'яти.
19. Знайти мінімальне значення додатних елементів, розташованих правіше
першого елемента, рівного нулю.
20. Знайти мінімальне значення додатних елементів, розташованих до першого
елемента, рівного нулю.
21. Знайти номер першого максимального значення серед від’ємних елементів,
розташованих правіше першого елемента, рівного Т.
22. Знайти номер першого максимального значення серед елементів, менших a1 і
розташованих правіше першого елемента, кратного трьом.
23. Знайти максимальне значення серед від’ємних елементів, розташованих до
першого елемента, рівного Т.
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

24. Знайти номер останнього максимального елемента серед елементів, що лежать


у діапазоні [t1,t2] і розташованих до першого елемента з парним значенням.
25. Знайти номер останнього максимального значення серед непарних ( за
значенням) елементів, розташованих до першого парного елемента.
26. Знайти номер першого максимального елемента серед додатних елементів,
розташованих до першого від’ємного елемента.
27. Знайти максимальне значення додатних елементів, розташованих правіше
першого елемента, кратного п'яти.

Завдання 3( додаткове).
1. Задано дійсні величини a, b a  b і масив чисел X n  , n  200. Розробити програму,
яка обчислює суму всіх X (i )  a , добуток всіх X (i )  b і знаходить max X i  та min X i 
серед X (i)  a, b , i  1, 2 , ... , n.
2. Задано дійсні число r і масив An  , n  200. Розробити програму, яка підраховує
скільки точок з координатами a1, , a2  , a3, , a4  , …, a 2 n 1 a 2 n  належать кругові радіуса r з
центром на початку координат.
3. Задано масив дійсних чисел An  m , n  100, m  10 . Розробити програму, яка
обчислює
Z  max (min A1, ... , Am, min Am  1, ... , A2m,... , min Amn  1  1, ... , An  m ) .
4. Задано масив цілих чисел An  , n  200. Розробити програму, яка переписує всі числа,
що повторюються, з масиву An  в масив Bn  по одному разу. Друкує масив B(n ) по
п’ять чисел у рядку.
5. Задано масив дійсних чисел A2n , n  200. Розробити програму, яка обчислює суму
тих чисел із An  1,... , A2n , які перевищують середнє арифметичне значення чисел
A1, ... , An .
6. Задано масив дійсних чисел An  , n  200. Розробити програму, яка будує масив Bn 
за правилом: bi є середнім арифметичним значенням чисел a1 , a2 ,... , an , крім a i ,
i  1,2,..., n .
7. Задано два масиви цілих чисел X n  і Y n  , n  300. Розробити програму, яка обчислює
добуток елементів об’єднання цих масивів. Об’єднання двох масивів  це всі елементи
масиву X n  і всі елементи масиву Y n , взяті по одному разу. Надрукувати елементи
об’єднання та їх суму.
8. Задано масив цілих чисел An  , n  200. Розробити програму, яка будує масив B(n) ,
елементами якого є такі числа A(i ) , що корені рівняння x 2  3 A( i )x  5 =0 дійсні і додатні.
Друкує масив B(n ) по п’ять чисел у рядку.
9. Задано масив цілих чисел An  , n  400. Розробити програму, яка знаходить
максимальне серед тих чисел, які не повторюються.
10. Задано масив дійсних чисел An  , n  500. Розробити програму, яка обчислює суму
всіх чисел, які повторюються, і добуток всіх чисел, які не повторюються.
11. На площині задано множину точок з координатами x1 , y1 , x2 , y 2 , ... , x n , y n  , n  200
і координати вершин трикутника A x a , y a  , B xb , y b  , C  xc , y c  . Розробити програму, яка
обчислює кількість точок заданої множини, що належать  ABC .
12. Задано масив дійсних чисел An  m , n  100 і m  15 . Розробити програму, яка
обчислює
V  min (max A1, ... , Am, max Am  1, ... , A2m,... ,
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

max Am  n  1  1, ... , An  m ) .


13. Задано цілі число k і масив An  , n  200. Розробити програму, яка здійснює
циклічний зсув масиву An  на k позицій вправо.
14. Задано a, b   координати школи та  x1 , y1 ,  x2 , y 2 ,...,  x n , y n , n  100  координати
будинків. Розробити програму, яка обчислює середню віддаль від будинків до школи.
15. Задано масив чисел A2n , n  200. Розробити програму, яка обчислює значення:
max min A1, A2n, min  A2, A2n  1,... , min  An, An  1 16. Задано масив чисел An  ,
n  500 . Розробити програму, яка обчислює суму всіх чисел, які знаходяться між першим і
останнім від’ємними елементами цього масиву і вказує цей діапазон. Якщо від’ємних
чисел немає або є тільки одно, то виводить повідомлення про це.
17. Задано масив цілих чисел An  , n  400, які можуть повторюватися. Розробити
програму, яка відбирає з кожної групи рівних чисел по одному, і утворює новий масив
Bn  та друкує його по сім чисел у рядку.
18. Задано послідовність цілих чисел B2n , n  200. Розробити програму, яка перетворює
цю послідовність за правилом: якщо B1  B2n, B2  B2n  1, ... , то послідовність
залишається без зміни, інакше виконується перестановка B1, B3,..., B2n  1,
B2, B4,..., B2n . Результат друкує по п’ять чисел у рядку.
19. Задано масиви цілих чисел An  , n  400 і Bm , m  200. Розробити програму, яка
будує симетричну різницю A \ B  B \ A і розміщує її елементи в масиві Cn  m .
Симетрична різниця A \ B  B \ A – це елементи масиву A , що не належать масиву B , і
елементи масиву B , що не належать масиву A , взяті по одному разу. Результат друкує по
п’ять чисел у рядку.
20. Задано масиви цілих чисел An  , n  500 і Bm , m  200. Обчислити суму
об’єднання A  B . Об’єднання A  B – це множина елементів масиву A і B , взятих по
одному разу. Надрукувати елементи об’єднання та їх суму.
21. Задано масив цілих чисел An  , n  400. Розробити програму, яка перетворює цей
масив так, щоб на початку розміщувалися всі від’ємні елементи, а потім додатні у порядку
їх наступності у початковому масиві. (Додатковий масив не використовується).
Перетворений масив надрукувати по десять чисел у рядку.
22. Задано масив цілих чисел An  , n  500. Розробити програму, яка вилучає із A всі
числа, які повторюються більше трьох разів, а масив ущільнює. Друкує масив A по п’ять
елементів у рядку.
23. Задано масив цілих чисел An  , n  300. Знайти максимальне серед чисел, які
повторюються більше ніж три рази.
24. Задано два масиви цілих чисел An  , n  400 і Bm , m  200. Розробити програму,
яка знаходить найменший елемент серед тих елементів масиву A , які не містяться у
масиві B .
25. Задано масив цілих чисел An  , n  300. Розробити програму, яка вилучає із A всі
числа, які повторюються, а масив ущільнює і друкує по п’ять елементів у рядку.
26. Задано масив цілих чисел X n  , n  300. Розробити програму, яка знаходить у цьому
масиві й друкує найдовший ланцюжок чисел, упорядкованих за зростанням.
27. Задано масив цілих чисел An  , n  400 Розробити програму, яка знаходить у цьому
масиві й друкує найдовший ланцюжок чисел, що задовольняють умову ai  ai 1  ai  2 ... .
28. Задано два вектори An  , n  400 і Bm , m  200. Розробити програму, яка знаходить
і друкує найменшу компоненту вектора A , що міститься у векторі B .
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

29. Задано два масиви цілих чисел An  , n  300, Bm , m  200. Розробити програму, яка
будує переріз цих масивів, обчислює його суму і визначає максимальний елемент
перерізу. (Переріз масивів A і B  це елементи масиву A , які є в масиві B і взяті по
одному разу).
30. Задано масив цілих чисел An  , n  300 (числа в масиві можуть бути однаковими).
Розробити програму, яка знаходить і друкує найдовший ланцюжок однакових чисел.

Теоретичні матеріали.
1. Введення – виведення в С++.
Мова програмування С++ підтримує дві повноцінні системи введення – виведення :
одна з них була успадкована від мови С, а інша базується на об’єктно-орієнтованому
принципі і притаманна лише мові С++.
У сучасних мовах програмування основним поняттям введення та виведення даних
є потік — послідовність символів або інших даних. У програмі потік зображує фізичний
файл на зовнішньому носії даних (диску, клавіатурі або екрані монітора), тобто фізичний
файл «видно в програмі» як потік даних. Операції обміну даних з файлом представлено в
програмі як операції добування даних з потоку або дописування їх до нього.
Найчастіше застосовують потокове введення-виведення даних, операції якого
включені до складу класів istream або iostream. Доступ до бібліотеки цих класів
здійснюється за допомогою використання у програмі директиви компілятора #include
<iostream>.
Дана бібліотека містить простір імен std який містить об’єкти cout(console out) та
cin (console in).
Для потокового введення даних вказується операція «>>« («читати з»). Це
перевантажена операція, визначена для всіх простих типів і покажчика на char.
Стандартним потоком введення є об’єкт std::cin.
Формат запису операції введення має вигляд:
std::сin [>> values];
де values — змінна.
Наприклад, для введення значень змінних х і у можна записати:
std::сin >> х >> у;
Кожна операція «>>« передбачає введення одного значення. При такому введенні
даних необхідно дотримуватись конкретних вимог:
 для послідовного введення декількох чисел їх слід розділяти символом пропуску («
«) або Enter (дані типу char роздiляти пропуском необов’язково);
 якщо послідовно вводиться символ і число (або навпаки), пропуск треба
записувати тільки в тому випадку, коли символ (типу char) є цифрою;
 потік введення ігнорує пропуски;
 для введення великої кількості даних одним оператором їх можна розташовувати в
декількох рядках (використовуючи Enter);
 операція введення з потоку припиняє свою роботу тоді, коли всі включені до нього
змінні одержують значення.
Оскільки в цьому прикладі пропуск є роздільником між значеннями, що вводяться, то
при введенні рядків, котрі мiстять пропуски у своєму складі, цей оператор не
використовується. У такому випадку треба застосовувати функції getline(), get() тощо.
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

Для потокового виведення даних необхідна операція «<<« («записати в»), що


використовується разом з ім’ям об’єкта вихідного потоку std::cout. Наприклад, вираз
std::cout << х;
означає виведення значення змінної х(або запис у потік). Ця операція вибирає необхідну
функцію перетворення даних у потік байтів.
Формат запису операції виведення представляється як:
std::cout << data [<< data1];,
де data, data1— це змінні, константи, вирази тощо.
Потокова операція виведення може мати вигляд:
std::cout << “у =” << x + а – sin(x) << “\n“;.
Застосовуючи логічні операції, вирази треба брати в дужки:
std::cout <<“р =” << (а && b || с) << “\n“;.
Для форматування потокового введення виведення використовуються
маніпулятори потоків із бібліотеки iomanip. (Підключивши файл #include < iomanip> ).

2. Файлові потоки С++.


Для введення (зчитування) з файлу та виведення (запис) даних у файл можна
використовувати бібліотеку fstream, яка містить просторі імен std. (Підключивши файл
#include <fstream> ).
Робота з файлами в мові С++ як і у мові С передбачає 3 етапи:
 відкривання файлу (файлового потоку)
 обмін даними з файловим потоком
 закривання файлового потоку.
Для виконання операцій з файлами в мові С++ передбачено три класи: іfstream,
ofstream і fstream. Ці класи є похідними від класів іstream, ostream і іostream. Всі
функціональні можливості (перевантажені операції << та >> для вбудованих типів,
функції і прапорці форматування, маніпулятори й ін.), що застосовуються до стандартного
вводу та виводу, можуть застосовуватися і до файлів. Існує деяка відмінність між
використанням стандартних та файлових потоків. Стандартні потоки можуть
використовуватися відразу після запуску програми, тоді як файловий потік спочатку слід
зв'язати з файлом.
Відкрити файл для виведення можна наступним чином:
ofstream outfile; outfile.open(«File.txt»);
або
ofstream outfile(«File.txt»);
або
fstream outfile(«File.txt «,ios::out);
Відкрити файл для введення можна наступним чином:
ifstream infile; infile.open(«File.txt»);
або
ifstream infile(«File.txt»);
або
fstream infile(«File.txt «,ios::in);
Режими відкриття файлу являють собою бітові маски, тому можна задавати два або
більш режими, поєднуючи їх побітовою операцією - | (АБО).
Режим відкриття файлів:
іos::іn - для читання
іos::out - для запису
іos::ate - встановити покажчик на кінець файлу
іos::app - для додавання в кінець
іos::trunc - усікти файл, тобто видалити його вміст тобто якщо файл існує, знищити
іos::bіnary - відкрити файл у двійковому режимі
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

Таблиця 1. Зв’язок між бітовими масками класу ios та режимами


відкриття файла засобами stdio.h
<stdio.h> binary in out trunc app
“w” +
“a” + +
“w” + +
“r” +
“r+” + +
“w+” + + +
“wb” + +
“ab” + + +
“wb” + + +
“rb” + +
“r+b” + + +
“w+b” + + + +

Слід звернути увагу, що по замовчуванню режим відкриття файлу відповідає


типові файлового потоку. У потоці введення або виведення прапорець режиму завжди
встановлений неявно. Між режимами відкриття файлу іos::ate та іos::app існує певна
відмінність. Якщо файл відкривається в режимі додавання (іos::app), весь вивід у файл
буде здійснюватися в позицію, що починається з поточного кінця файлу, безвідносно до
операцій позиціонування у файлі. У режимі відкриття іos::ate (від англійського «at end»)
можна змінити позицію виводу у файл і здійснювати запис, починаючи з неї.
Файли, які відкриваються для виведення, створюються, якщо вони ще не існують.
Якщо при відкритті файлу не зазначений режим іos::bіnary, файл відкривається в
текстовому режимі. Якщо відкриття файлу завершилося невдачею, об'єкт, що відповідає
потокові, буде повертати нуль. Перевірити успішність відкриття файлу можна також за
допомогою функції-члена іs_open(). Дана функція повертає 1, якщо потік вдалося зв'язати
з відкритим файлом.
Для перевірки, чи досягнутий кінець файлу, можна використовувати функцію eof().
Завершивши операції введення – виведення, необхідно закрити файл, викликавши
функцію-член close(). Далі наведений приклад, що демонструє файловий ввід-вивід з
використанням потоків.
Неформатоване двійкове введення-виведення
Текстові файли зручні для сприйняття, однак більш гнучку структуру мають двійкові
(бінарні) файли. Такі файли призначені для неформатованого введення-виведення, що
здійснюється за допомогою функцій: put(), get(), getline(), а також write() і read().
Побайтове введення-виведення. Функція get() зчитує один байт із потоку й передає
його значення аргументу s, а функція put()записує символ s у потік і повертає посилання на
потік:
istream &get (char &s);
ostream &put (char s);
Блокове введення-виведення. Функція read() зчитує з потоку стільки байтів, скільки
задано в аргументі num, і передає їх у буфер, який визначений покажчиком buf. Функція
write() вилучає num байтів з буфера buf і записує їх у потік.
istream &read (char *buf, num);
ostream &write (const char *buf, num);
Рядкове введення. Функція getline() зчитує з потоку символи й передає їх у буфер buf
до тих пір, поки не буде зчитано (num-1) символів, або не зустрінеться символ нового рядка:
istream &getline (char *buf, num);
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

3. Масиви в С++.
a. Локальні (статичні) масиви.
Термін масив (мовою програмування С++) - це сукупність компонент одного і того
ж типу, розташованих в одній і тій ж неперервній області пам’яті. Розрізняють динамічні,
локальні та статичні масиви. Локальні та статичні масиви це такі в який максимально
допустимий розмір визначається в процесі розробки програми, а розмір динамічний
визначається в процесі роботи програми за допомогою спеціальних засобів роботи з
динамічною пам’яттю. Характерними особливостями локального та статичного масиву
мови програмування С++ є :
- максимальне число компонент масиву визначають при описі масиву і в
подальшому воно не міняється;
- кожна компонента у масиву явно визначена і має індекс;
- індекс вказує порядок розташування елемента в масиві;
- індекс першого елемента 0, а останнього розмір масиву мінус 1;
- звернення до елемента виконується за допомогою операції індексації( [] ), та за
допомогою операцій роботи з вказівниками.
За своєю структурою масиви можуть бути: одновимірні, двовимірні, тривимірні і
так далі. Прикладом одновимірного масиву може служити вектор, а двовимірного масиву
матриця.
При створенні програм із використанням масивів, всі масиви необхідно описувати
відповідним чином. Описувати масив можна, в залежності від його застосування,
безпосередньо у за межах та межах визначення функцій, в блоках, структурах та класах.
Примітка. Локальні дані визначаються у межах функцій(в блоках, структурах та класах) без
специфікатора static, статичні дані визначаються у за межами функцій(структур та класів), або функціях(в
блоках, структурах та класах) з специфікатора static.
2. Визначення масивів у мові С++
Загальна структура опису :
type mname[const_size]<, mname1[const_size1] … > ;
де type – тип елементів масиву, mnameN – ім’я масиву, const_sizeN – сталий вираз
яка визначає розмір масиву.
Наприклад, масив цілих чисел розміру – 10 буде визначатися так
int mas[10];

mas
mas[0] mas[1] mas[2] mas[3] mas[4] mas[5] mas[6] mas[7] mas[8] mas[9]

Виділяється компілятором

Для звернення до елемента масиву використовується операція індексації [ ],


наприклад, щоб записати в 5 елемент масиву mas число 10 , нагадаємо, що перший
елемент має індекс 0, необхідно
massive[4]=10;
Аналогічно, використовується операція індексації для звернення до інших
елементів.
3. Ініціалізація масивів
Елементам масиву при визначенні(описі) масиву можна задавати початкові
значення, за допомогою списку ініціалізацій. Список ініціалізацій має структуру:
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

{const_1, const_2, …, const_N}


де const_i – сталий вираз.
Кількість елементів у списку ініціалізацій має не повинно перевищувати розміру
масиву. Кількість елементів у списку ініціалізацій може бути менше розміру масиву, і –
тий елемент списку ініціалізації присвоюється і– тому елементу масиву.
Наприклад,
int massive[10] = {1,5,4,12,7,4,75,5};

mas
mas[0] mas[1] mas[2] mas[3] mas[4] mas[5] mas[6] mas[7] mas[8] mas[9]
1 5 4 12 7 4 75 5 ? ?
Якщо кількість елементів у списку ініціалізації менша розміру масиву, тоді комірки
масиву що розташовані у кінці масиву не ініціалізуються.
У описі масиву можна не писати його розмір, якщо присутній список ініціалізацій.
Розмір масиву буде рівний кількості елементів у списку ініціалізацій
Наприклад,
int mas[] = {1,5,4,12,7,4,75,5};

mas
mas[0] mas[1] mas[2] mas[3] mas[4] mas[5] mas[6] mas[7]
1 5 4 12 7 4 75 5

Виділяється компілятором

Приклад 1. Задано масив А дійсних чисел розміру N, та m (0<=m<=N-1) елемент


із масиву. Побудувати масив B та C елементів більших та менших від m – елемента,
відповідно.
#include <iostream>
const int MAX=100;
using namespace std;
void main()
{
double A[MAX],B[MAX],C[MAX];
int nA,nB,nC,i,m;
do{
cout<<” Введіть кількість елементів масиву N <”<<MAX<<endl;
cin>>nA;
}
while(nA<0 || nA>MAX);
nB=nC=0;
for(i=0;i<nA;i++)
{
cout<<”A[“<<i<<”]=”;
cin>>A[i];
}
do {
cout<<” Введіть індекс елемента m 0<=m<=”<<nA-1<<endl;
cin>>m;
}
while(m<0 || m>=nA);
for(i=0;i<nA;i++)
if(A[i]>A[m]) B[nB++]=A[i];
else C[nC++]=A[i];
cout<<” Результат ”<<endl;
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

cout<<” B : “<<endl;
for(i=0;i<nB;i++)
cout<<B[i]<<”\t”;
cout<<”C “<<endl;
for(i=0;i<nC;i++)
cout<<C[i]<<”\t”;
return;
}

b. Динамічні масиви.

Вказівник (покажчик) – це похідний тип, який містить адресу пам'яті, за якою


може знаходиться скалярна величина відповідного типу. Вказівник не є самостійним
типом даних, він завжди пов'язаний з яким-небудь іншим конкретним типом. Вказівники
призначені для зберігання адрес областей пам'яті. Вказівник можна визначити на будь-
який тип, у тому числі на функцію або метод класу.
Необхідність використання засобів роботи з динамічною пам'яттю при обробці
масивів виникає у випадках, коли локальна(статична) реалізація неефективна (наприклад,
розміри масиву суттєво різняться залежно від використання програми та резервування
пам'яті максимально можливого обсягу “ на всі випадки життя ” нераціонально). При
цьому суть поняття “ масив “ зберігається: це сукупність однотипних елементів, що має
єдине ім'я; елементи розташовані в певному порядку та різняться індексами; над цією
сукупністю можливі будь-які операції, що допускаються типом елементів.
Перераховані властивості досить просто моделюються засобами динамічної
пам'яті; тому немає необхідності розглядати три рівні переходу (абстрактний, логічний,
фізичний) від даних проблемного завдання до їхнього кодування. Таким чином, інтерес
представляють аспекти програмної реалізації, які й розглядаються нижче.
У мові С++ ім'я локального(статичного) масиву є вказівником-сталою на перший
байт першого елемента масиву. Так, опис int mas[5] може бути проілюстроване в такий
спосіб:
int* const mas

mas[0]==*(mas+0) mas[1]==*(mas+1) mas[2]==*(mas+2) mas[3]==*(mas+3)

Виділяється компілятором

Таким чином, звернутися до елемента масиву можна двома способами, через


вказівник та індексуючи елемент:

*(mas+i) ==mas[i]

Вірно й зворотне: адреса першого байта якогось поля пам'яті в операціях обробки
поля може розглядатися як ім'я масиву. Так, якщо описаний деякий вказівник int* p та
виділити динамічну пам’ять, то картина в пам'яті комп'ютера при виконанні програми
може мати вигляд: int* p
*(p+0) ==p [0] *(p+1) ==p [1]
Виділяється
компілятором
*(p+4) ==p [4]

Виділяється
динамічно
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

І в цьому випадку звернутися до елемента поля можна також двома способами,


через вказівник та індексуючи елемент:
*(p+i) == p[i]
Резюме. Пам'ять виділяється принципово по-різному, а обробляється однаково.
У мови програмування С та С++ для розподілу динамічної пам’яті
використовуються функції бібліотеки stdlib або бібліотеки alloc(malloc), а в мові
С++ впроваджено операції динамічного розподілу пам’яті new та delete. Функції
розподілу пам’яті
void* malloc(size_t size_byte);
void* calloc(size_t num_obj, size_t size_obj);
void* realloc ( void * ptr, size_t size );
void free ( void * ptr );

Функція malloc()виділяє size_byte байтів динамічної пам’яті. Якщо пам’ять


виділено (в разі успіху) повертається вказівник на блок пам'яті. Тип цього вказівника
завжди void *, який може бути приведений до потрібного типу даних. Якщо функція не
вдалося виділити необхідний блок пам'яті, повертається порожній вказівник - NULL.
Приклад 2. Надрукувати рядок латинських букв. Букви згенерувати за допомогою
датчика випадкових чисел.
/* malloc example: string generator*/
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int i,n;
char * buffer;
printf («How long do you want the string? «);
scanf («%d», &i);
buffer = (char*) malloc (i+1);
if (buffer==NULL) exit (1);
for (n=0; n<i; n++)
buffer[n]=rand()%26+'a';
buffer[i]='\0';
printf («Random string: %s\n»,buffer);
free (buffer);
return 0;
}
Функція calloc() виділяє блок пам'яті для масиву розміром num_obj
елементів, кожен з яких розміром size_obj байта та ініціалізує всі біти в нуль.
Ефективний результат виділення нуль-ініціалізації блоку пам'яті num_obj*size_obj
байт. Якщо пам’ять виділено (в разі успіху) повертається вказівник на блок пам'яті. Тип
цього вказівника завжди void *, який може бути приведений до потрібного типу даних.
Якщо функція не вдалося виділити необхідний блок пам'яті, повертається порожній
вказівник - NULL.
Приклад 3. Задано масив цілих, розмір масиву задається в процесі виконання
програми. Роздрукувати масив поділивши значення кожного елемента на 3.
/* calloc example */
#include <stdio.h>
#include <stdlib.h>

int main ()
{
int i,n;
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

int * pData;
printf («Amount of numbers to be entered: «);
scanf («%d»,&i);
pData = (int*) calloc (i,sizeof(int));
if (pData==NULL) exit (1);
for (n=0;n<i;n++)
{
printf («Enter number #%d: «,n);
scanf («%d»,&pData[n]);
}
printf («You have entered: «);
for (n=0;n<i;n++) printf («%d «,pData[n]/3);
free (pData);
return 0;
}
Функція realloc () пере визначає розмір блоку пам'яті, на яку вказує
параметр ptr змінюється на size байт, розширення або скорочення обсягу пам'яті,
доступного в блоці. Ця функція може перемістити блок пам'яті на нове місце, в цьому
випадку нове місце повертається. Вміст блоку пам'яті зберігається до найменшого з
нового і старого розмірів, навіть якщо блок переміщається. Якщо новий розмір більший,
ніж попередній, значення нової розподіленої частина є невизначеним. Якщо пам’ять
виділено (в разі успіху) повертається вказівник на блок пам'яті. Тип цього вказівника
завжди void *, який може бути приведений до потрібного типу даних. Якщо функція не
вдалося виділити необхідний блок пам'яті, повертається порожній вказівник - NULL.
Приклад 4. Задано послідовність(масив) цілих чисел, яка закінчується числом – 0.
Роздрукувати масив поділивши значення кожного елемента на 4.
/* realloc example: rememb-o-matic */
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int input,n;
int count=0;
int * numbers = NULL;
int * more_numbers;
do {
printf («Enter an integer value (0 to end): «);
scanf («%d», &input);
count++;
more_numbers = (int*) realloc (numbers, count * sizeof(int));
if (more_numbers!=NULL) {
numbers=more_numbers;
numbers[count-1]=input;
}
else {
free (numbers);
puts («Error (re)allocating memory»);
exit (1);
}
} while (input!=0);
printf («Numbers entered: «);
for (n=0;n<count;n++) printf («%d «,numbers[n]/4);
free (numbers);
return 0;
}
Функція free () – звільняє місце в пам'яті. Блок пам'яті, раніше виділений за
допомогою виклику malloc(), calloc() або realloc() звільняється, роблячи її
доступною для подальших застосування. Функція залишає значення ptr незмінним,
отже, він як і раніше вказує на то же саме (в даний час недійсне) місце, а не порожній
вказівник( тобто не NULL).
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

/* free example */
#include <stdio.h>
#include <stdlib.h>

int main ()
{
int * buffer1, * buffer2, * buffer3;
buffer1 = (int*) malloc (100*sizeof(int));
buffer2 = (int*) calloc (100,sizeof(int));
buffer3 = (int*) realloc (buffer2,500*sizeof(int));
free (buffer1);
free (buffer3);
return 0;
}
Динамічну модель правомірно називати “ динамічним масивом ”: не будучи
масивом як структурою даних мови, вона проте адекватно відображає дані проблемного
завдання.
Питання вибору моделі (статичної або динамічної) пов'язані з ефективністю
реалізації програми й не повинні впливати на інтерфейс. Тому слід вибрати спосіб опису
інтерфейсу, що дозволяє відкласти розв'язок цих питань принаймні до етапу розробки
методу розв'язку.

Замість цих стандартних функцій malloc(), calloc() і free() в мові C++


застосовуватися більш безпечний і зручний спосіб виділення та звільнення пам'яті.
Виділити пам'ять можна за допомогою операторів new та new[], а звільнити її за
допомогою операторів delete та delete[]. Нижче представлена основні форми цих
операторів:
p_var = new type;
p_var = new type(initializer);
delete p_var;
p_var = new type[size];
delete[] p_var;
де type – це специфікатор типу об'єкта, для якого ви хочете виділити пам'ять, a p_var -
вказівник на цей тип. Оператор new який повертає вказівник на динамічну пам'ять, що
виділяється, достатню для зберігання об'єкта типу type. У другій формі initializer
– початкове значення, що присвоюється новій змінні, а якщо тип - тип класу, то
initializer - аргумент (и) конструктора. Оператор new[] – виділяє пам’ять під
масив об’єктів, size – кількість елементів. Оператори delete та delete[]
звільняють цю пам'ять, коли в ній відпадає необхідність. Виклик оператора delete з
неправильним вказівником може призвести до руйнування системи динамічного
виділення пам'яті і можливого краху програми.
Приклад 5. Задано масив дійсних чисел, розмір масиву задається в процесі
виконання програми, та дійсна змінна m. Побудувати масив B та C елементів більших та
менших від m – елемента, відповідно.
#include <iostream.h>
const int MAX=100;
void main()
{
double *A,*B,*C,*pC,m;
int nA,nB,nC,i,j,l;
cout<<” Введіть кількість елементів масиву” <endl;
cin>>nA;
A = new double[nA];
if (A==NULL) exit (1);
cout<<” Введіть число m”<<endl;
cin>>m;
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

nB=nC=0;
for(i=0;i<nA;i++)
{
cout<<”A[“<<i<<”]=”; cin>>A[i];
if(A[i]>=m) ++nC; else ++nB;
}
if(nB < 0) nB=1;
B = new double[nB];
if (B==NULL) exit (1);

if(nC < 0) nC=1;


C = new double[nC];
if (C==NULL) exit (1);

j=0; l=0;
for(i=0;i<nA;i++)
if(A[i]>m) B[j++]=A[i];
else C[l++]=A[i];
cout<<” Результат ”<<endl;
cout<<” B : “<<endl;
for(i=0;i<nB;i++)
cout<<B[i]<<”\t”;
cout<<”C “<<endl;
for(pC=C;i<nC;pC++)
cout << *pC << «\t»;
delete[] C;
delete[] B;
delete[] A;
return;
}
c. Контейнери для роботи з масивами.

У професійних прикладних програмах для роботи з масивами в мові С++


рекомендовано використовувати контейнери стандартної бібліотеки STL такі як vector,
valarray та array.
Вектор (vector) представляє контейнер, який містить колекцію об'єктів одного
типу. Вектор - це структура даних, яка вже є моделлю динамічного масиву. Для створення
динамічного масиву (вручну) нам потрібно користуватися динамічним розподілом та
вказівниками. У випадку з векторами всього цього робити не потрібно.
Для роботи з векторами необхідно включити заголовок:
#include <vector>
Визначимо найпростіший вектор:
std :: vector <int> numbers;
У кутових дужках вказується тип, об'єкти якого будуть зберігатися у векторі. Тобто
вектор numbers зберігає об'єкти типу int. Однак такий вектор порожній. Він не містить
ніяких елементів.
Але ми можемо ініціювати вектор одним із таких способів:
std :: vector <int> v1; // порожній вектор
std :: vector <int> v2 (v1); // вектор v2 - копія вектора v1
std :: vector <int> v3 = v1; // вектор v3 - копія вектора
std :: vector <int> v4 (5); // вектор v4 складається з 5 чисел
std :: vector <int> v5 (5, 2);
// вектор v5 складається з 5 чисел, кожне число дорівнює 2
std :: vector <int> v6 {1, 2, 4, 5};
// вектор v6 складається з чисел 1, 2, 4, 5
std :: vector <int> v7 = {1, 2, 3, 5};
// вектор v7 складається з чисел 1, 2, 4, 5

Для звернення до елементів вектора можна використовувати різні способи:


Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

[index]: отримання елемента за індексом (також як і в масивах), індексація


починається з нуля
at(index): функція повертає елемент за індексом, на відміну від індексу генерує
виняткову ситуацію при не правильному індексі
front(): повертає перший елемент
back(): повертає останній елемент

Зауваження. Обробка винятків у даному курсі буде розглядатися пізніше.

#include <iostream>
#include <vector>
int main()
{
std::vector<int> numbers= {1, 2, 3, 4, 5};

int n1 = numbers.front(); // n1 = 1
int n2 = numbers.back(); // n2 = 5
int x = numbers[1]; // x = 2
numbers[0] = 6;

for(int n : numbers)
cout << n << "\t"; // 6 2 3 4 5

std::cout << std::endl;


return 0;
}

Ітератори забезпечують доступ до елементів контейнера. За допомогою ітераторів


дуже зручно перебирати елементи. Ітератор описується типом iterator . Але для кожного
контейнера конкретний тип ітератора буде відрізнятися.

Для отримання ітераторів контейнери в C++ володіють такими функціями, як begin() і


end() та сталі ітератори cbegin() і cend().
З ітераторами можна проводити наступні операції:
* iter : отримання елемента, на який вказує ітератор
++ iter : переміщення ітератора вперед для звернення до наступного елементу
--iter : переміщення ітератора назад для звернення до попереднього елемента.
Ітератори контейнера forward_list не підтримують операцію декремента.
iter1 == iter2 : два ітератора рівні, якщо вони вказують на один і той же
елемент
iter1! = iter2 : два ітератора не рівні, якщо вони вказують на різні елементи

Ряд функцій дозволяє додавати елементи на певну позицію.


emplace (pos, value) : вставляє елемент value на позицію, на яку вказує
ітератор pos
insert (pos, value) : вставляє елемент value на позицію, на яку вказує
ітератор pos, аналогічно функції emplace
insert (pos, n, value) : вставляє n елементів value починаючи з позиції, на
яку вказує ітератор pos
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

insert (pos, begin, end) : вставляє починаючи з позиції, на яку вказує


ітератор pos, елементи з іншого контейнера з діапазону між ітераторами begin і
end
insert (pos, values) : вставляє список значень починаючи з позиції, на яку
вказує ітератор pos

Якщо потрібно видалити елемент з середини або початку контейнера, застосовується


функція erase () , яка має такі форми:
erase (p) : видаляє елемент, на який вказує ітератор p. Повертає ітератор на
елемент, наступний після віддаленого, або на кінець контейнера, якщо видалений
останній елемент
erase (begin, end) : видаляє елементи з діапазону, на початок і кінець якого
вказують ітератори begin і end. Повертає ітератор на елемент, наступний після
останнього віддаленого, або на кінець контейнера, якщо видалений останній
елемент
За допомогою функції size () можна дізнатися розмір вектора, а за допомогою функції
empty() перперевірити, чи вектор пустий.

За допомогою функції resize () можна змінити розмір вектора. Ця функція має дві
форми:
resize (n) : залишає в векторі n перших елементів. Якщо вектор містить більше
елементів, то його розмір усікається до n елементів. Якщо розмір вектора менше n,
то додаються відсутні елементи і не започатковано значенням за замовчуванням
resize (n, value) : також залишає в векторі n перших елементів. Якщо розмір
вектора менше n, то додаються відсутні елементи зі значенням value

#include <iostream>
#include <vector>

int main()
{
std::vector<int> numbers; // пустий вектор
numbers.push_back(5);
numbers.push_back(3);
numbers.push_back(10);
for(int n : numbers)
cout << n << "\t"; // 5 3 10

std::cout << std::endl;


return 0;
}
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;

int main()
{
vector<int> numbers = {1, 2, 3};
if(numbers.empty())
cout << "Vector is empty" << endl;
else
cout << "Vector has size " << numbers.size() << endl;

std::vector<int> numbers1 = { 1, 2, 3, 4, 5, 6 };
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

numbers1.resize(4); // залишаємо перші чотири елементи


// numbers1 = {1, 2, 3, 4}
numbers1.resize(6, 8); // numbers1 = {1, 2, 3, 4, 8, 8}
numbers1.pop_back(); // numbers1 = {1, 2, 3, 4, 8}
numbers1.clear(); // numbers1 = {}
numbers1 = numbers; // numbers1 = {1, 2, 3}
std::vector<int> values = { 10, 20, 30, 40, 50 };
auto iter1 = numbers1.cbegin();
numbers1.insert(iter3 + 1, values.begin(), values.begin() + 3);
//numbers1 = { 1, 10, 20, 30, 2, 3};
auto iter2 = numbers1.cend();
numbers4.insert(iter2, { 21, 22, 23 });
//numbers1 = { 1, 10, 20, 30, 2, 3, 21, 22, 23};

return 0;
}

4. Сучасні компілятори мови С++. Стандарт ANSI/ISO C++.

Широке розповсюдження мови програмування С на різних типах комп’ютерів,


створення компіляторів різними фірмами, на жаль, зумовило до різних появи варіацій
мови програмування. Стандарти мови для кожного компілятора були подібні, але не
завжди сумісні. Це стало серйозною проблемою, для розробників програм. Тому
необхідний був стандарт мови С. В 1989 році при Американському Національному
Комітеті Стандартів(ANSI) в технічному комітеті X3J11 в області обчислювальної техніки
був затверджений стандарт мови С (ANSI C). Вказаний стандарт скооперований з
Міжнародною Організацію Стандартів (ISO) в 1990, щоб стандартизувати мову
програмування на міжнародному рівні і названий ANSI/ISO 9899. Для UNIX подібних
операційних систем також застосовується POSIX(Portable Operating System Interface –
мобільний інтерфейс операційної системи) – стандарт мови. Такі ж стандарти прийняті
вище вказаними організаціями для мови С++, тобто прийнятий стандарт мови ANSI/ISO
С++.
Розробка програм мовою С++ представляє собою послідовність етапів, які
взаємозв’язані між собою . Для створення програми мовою С++(С) необхідно пройти такі
етапи: створення та редагування вихідного тексту програми, попередню ( препроцесорну )
обробку, компіляцію, компонування, завантаження та виконання, а також етапи
налагодження та виправлення помилок. Для створення програм мовою С++ розроблені
пакети, які дозволяють виконувати всі етапи, як комплексно так і поетапно. Пакети крім
основних елементів компілятора мови та стандартної бібліотеки можуть мати своє
інтегроване середовище створення та налагодження програм, а також ряд інших утиліт.
Програмні пакети реалізуються для певних(визначених) операційної системи та
архітектури комп’ютера. Сьогодні найбільш потужними пакетами розробки програм
мовою С++(С) для архітектури комп’ютерів, на базі процесорів типу Intel (IA-32, IA-64),
під керуванням операційних систем Windows XР, Windows 2000, Windows2003, Windows
Vista, Windows 7, Windows 10 вважаються Visual Studio та Visual Studio .Net від фірми
Microsoft, C++ Builder – Borland(CodeGear), Intel C++ Compiler – Intel, Open Watcom
C/C++ – Watcom та MinGW з компілятором G++ (компілятор C++ для Збірка
Компіляторів GNU - GNU Compiler Collection, GCC) реалізований для багатьох Unix та
Linux операційних систем). Також є ряд інтегрованих середових, таких як Eclipse, які
підтримують компілятори мови С++.

5. Характеристика найбільш розповсюджених інтегрованих середовищ та


компіляторів мови С++.
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

Microsoft Visual Studio. Потужна комерційна система розробки програмного


забезпечення, включає компілятор мови C++ для операційних систем родини Windows
розроблена фiрмою Microsoft. Пiсля версiї 6.0 Microsoft провела своєрідну революцію з
допомогою власною технологiю .NET. З цього моменту Microsoft намітився відійти від
вже морально застарілої бiблiотеки MFC до використання WinForms. Працює тільки на
платформі Windows.
Borland C++ Builder. Комерційне інтегроване середовище CodeGear (дочірний підрозділ
компанії Embarcadero Technologies, раніше належав Borland Software Corporation, Inprise
Corporation ) для розробки програм на C++. Працює на платформi Windows.
Eclipse. Система розробки з відкритим кодом спонсорова на фірмою IBM. Створювалася
як середовище розробника на Java але завдяки гнучкiй архiтектурi з підтримкою плагiнiв
дозволяє розробляти проекти на рiзних мовах, у тому числi на C++. Для компiляцiї
використовує зовнiшнiй компiлятор, наприклад GCC.
Пiдтримує різні платформи : Linux, Windows, MacOS X, Solaris, AIX, QNX.
KDevelop. Базове iнтегроване середовище для KDE, що використовується на UNIX та
Linux - подібних платформах з вiдкритим кодом. Використовує компілятори GCC.

6. Створення консольного проекту в Visual Studio .NET.

Pозглянемо процес створення консольних проектів в інтегрованому середовищі


розробки (англ. Integrated Development Environment) Visual Studio .NET.
Для створення консольного проекту потрібно виконати наступні кроки:
 завантажуємо Visual Studio.NET;

 створення проекту (создание проекта)


o Мова: С++ ( з комбобокса «Все язики»
o Платформа : Windows
o Проект : Консоль
o «Консольное приложение»
o Кнопка «Далее»
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

 налаштування проекту ( можна по-замовченню)

 кнопка створити («Создать»)

7. Середовище розробки Visual Studio .NET.


Інтегроване середовище розробки (англ. Integrated Development Environment,
скорочено – IDE) Visual Studio .NET (далі VS .NET) дозволяє створювати, редагувати,
компілювати, зв’язувати та наладжувати програми, динамічні бібліотеки, тощо.
Розглянемо коротко функції пунктів головного меню VS .NET:
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

1. Елементи пункту меню File дозволяють:


 створювати нові (меню New) або відкривати створені раніше (Open) проекти,
файли з вихідним кодом, ресурсами, тощо;
 зберігати зроблені у процесі роботи зміни (Save selected items, Save selected
items as... , Save All);
 змінювати параметри друку сторінки (Page setup...) та друкувати дані (Print...);
 швидко (без вказування повного шляху до файлу „вручну”) відкривати файли, з
якими користувач працював останнім часом;
 покинути середу розробки (Exit).

2. За допомогою пунктів меню Edit користувач може:


 відмінити/повторити (Undo/Redo) виконані у процесі редагування операції;
 працювати з буфером обміну (Clipboard): вирізати, копіювати, вставити,
видалити (Cut/Copy/Paste/Delete) виділення;
 відшукати певний текст, а також замінити певний фрагмент тексту іншим
фрагментом (Find and Replace); функцією автоматичної заміни одного
фрагменту іншим зручно користуватися у разі потреби заміни тексту, що часто
зустрічається у певному файлі (файлах);
 здійснювати автоматичне форматування тексту (Advanced), працювати з
закладками (Bookmarks), тощо.

3. Пункти меню View дозволяють відкривати різного роду робочі вікна середовища
(Solution Explorer, Class View, Resource View, etc.), відображати список задач до
виконання (Show Tasks), включати/відключати блоки кнопок у панелі інструментів
(Toolbars), переключатися між повноекранним та звичайним режимом редактора (Full
Screen), а також виконувати деякі інші операції.

4. Встановлення та зміна параметрів проекту, компіляція, зборка та налагодження


здійснюється за допомогою пунктів Project, Build та Debug. Зокрема, за допомогою меню
Project можна:
 добавити клас/ресурс до проекту (Add Class…, Add Resource...);
 додати новий/існуючий об’єкт до проекту (Add New Item…, Add Existing
Item…);
 створити нову папку у дереві проекту (New Folder);
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

Пункти меню Build призначені для зборки проекту (Build…, Rebuild…, Clean…),
пакетної зборки (Batch Build…), встановлення поточної конфігурації (Configuration
Manager…) та компіляції поточної частини проекту (Compile).

Налагодження проекту здійснюється за допомогою пунктів меню Debug.


Користувач має такі можливості:
 включати/виключати вікна різного роду налагодження (Windows), наприклад,
вікна відображення/редагування поточних значень змінних (Immediate), точок
зупинки (Breakpoints), вікна відображення стеку (Call Stack), тощо;
 запускати проект на виконання у звичайному режимі (Start Without Debugging)
або у режимі налагодження (Start);
 покроково виконувати – трасувати – програму (Step Into, Step Over, Step Out);
 виконувати деякі інші операції, пов’язані із налагодженням проекту.

5. Пункт Tools головного меню дозволяє запускати допоміжні засоби (невеликі


програми), що входять до складу пакету VS .NET (ActiveX Control Test Container, Error
Lookup, Spy ++, т.п.), працювати з макросами (пункт Macros), встановлювати параметри
середи розробки та редактора (Customize…, Options…), тощо.

6. За допомогою меню Window користувач може:


 створювати нові вікна редагування поточного файлу (New Window);
 розділяти поточне вікно навпіл (Split);
 впорядковувати (Cascade, Tile Horizontally, Tile Vertically) та закривати вікна;
 швидко переключатися між вікнами (Windows…).

7. Пункт Help головного меню служить для виклику допомоги за змістом (Contents…)
або темою (Index…), пошуку теми за ключовими словами (Search…),
відображення/відключення панелі динамічної домоги (Dynamic Help), відображення
інформації про поточну версію середи (About Microsoft Visual C++…), відображення
стартової сторінки VS .NET (Show Start Page), перевірки поновлень версії (Check for
Updates) та отримання технічної підримки (Technical Support).

8. Створення вихідного коду консольного проекту, його компіляція та


виконання.

Pозглянемо процес створення та компіляції консольних проектів у IDE


VS .NET. Нижче наведено вихідний код програми, яку ми візьмемо за основу, для
вивчення процесу налагодження:
// Приклад програми мовою С++.
#include<iostream>
using namespace std;
int main()
{
const int MAX=100;
double A[MAX],B[MAX],C[MAX];
int nA,nB,nC,i,m;
do{
cout<<« Input number N <«<<MAX<<endl;
cin>>nA;
}
while(nA<0 || nA>MAX);
nB=nC=0;
for(i=0;i<nA;i++)
{
cout<<«A[«<<i<<«]=«; cin>>A[i];
}
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

do {
cout<<« Input index m ( 0<=m<=«<<nA-1<<«) «<<endl;
cin>>m;
}
while(m<0 || m>=nA);
for(i=0;i<nA;i++)
if(A[i]>A[m]) B[nB++]=A[i];
else C[nC++]=A[i];
cout<<« Rezult «<<endl;
cout<<« B : «<<endl;
for(i=0;i<nB;i++)
cout<<B[i]<<«\t»;
cout<<«C «<<endl;
for(i=0;i<nC;i++)
cout<<C[i]<<«\t»;
cin>>i;
cout<< «Exit\n»;
return 0;
}

Створюємо консольний. Тепер нам у вікні редагування вихідного коду потрібно


набрати програму та зберегти(File – Save або Ctrl+S).
Отже, наш проект готовий до компіляції. Завантажуємо програму на компіляцію та
виконання (Debug – Start Without Debugging або Ctrl+F5). Якщо помилок не було тоді
програма почне виконуватися у консольному вікні, в противному випадку у вікні
Output/Error List буде виведена інформація про по помилки.
9. Тестування та налагодження консольної програми Створення найпростішого
консольного проекту, його компіляція та виконання.
Інтегроване середовище розробки (IDE) Visual Studio .NET та 32-разрядній
компілятор Visual C++ ввібрав в себе новітні засоби розробки для Windows та платформи
.NET.
Графічне середовище Windows сприяло тому, що розробники IDE VS .NET
створили середовище з більш дружнім інтерфейсом, що дозволяють використовувати
файли проектів, що генерують всіма стадіями побудови програми. Компілятори С++
фірми Microsoft, цілком інтегровані в середовище графічного інтерфейсу Windows.
Компілятори С/С++ дозволяють, знаходячись в цьому середовищі, написати, побудувати
(скомпілювати і скомпонувати), налагодити та виконати програму.
Ключем до успіху при роботі в інтегрованому середовищі є правильна розробка і
створення файлу проекту. Компілятор Microsoft Visual C ++ використовує файли проекту
з розширенням .sln( в передніх версіях .dsp та prj )
Налагоджувач доступний з меню Debug(налагодження). Вбудований
налагоджувач дозволить виконувати програму в покроковому режимі, зчитувати і
змінювати вміст змінних.
Перед завантаження вбудованого налагоджувача необхідно повідомити
компілятору про необхідність включити в виконуючий код додаткову інформацію,
необхідну для наладчика. Це можна зробити за допомогою комбінованого поля панелі
інструментів Стандартна (Debug – налагодження, варіант генерації коду з додатковою
інформаціє про налагодження, Relese – варіант без включення додаткової інформації).
Якщо програма містить синтаксичні помилки, при виконанні команд Build чи
Rebuild автоматично відкривається вікно повідомлень, які видаються компілятором.
Кожне повідомлення починається з імені вихідного файлу. Це ім'я – істотне, оскільки в
звичайному режимі Windows-застосуванні міститься багато вихідних файлів.
Відразу за ім'ям вихідного файлу випливає номер рядка, де виявлена помилка або
попередження. Слідом за номером рядка йде двокрапка, потім слово error (помилка) або
warning (попередження) і відповідний номер помилки.
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

Програму з одним попередженням можна запустити, але при наявності


повідомлень, що немає помилок. У кожному рядку повідомлень міститься короткий опис
виявленої синтаксичної помилки.
Попередження можуть свідчити про автоматичне виконання правил перетворення
С/С++.
Багато попереджень можна уникнути обійшовши діючі за замовчуванням
автоматичні перетворення мови. Це можна зробити вказуючи в програмі явне
перетворення типів.
Після перегляду списку повідомлень про помилки і попереджень потрібно
повернутися у вікно редагування для виконання необхідних змін у програмі.
Вибрати вікно редагування можна або клацнувши мишею всередині цього вікна,
або перейшовши в меню Windows і клацнувши на імені необхідного файлу. Найбільш
простий і доступний шлях – двічі клацнути лівою кнопкою миші на тому повідомленні
про помилку компілятора, яку необхідно правити. При цьому середовище саме знайде
помилковий рядок вихідної програми. Натискання на клавішу <Enter> на виділеному
повідомленні про помилку, попередженні приведе до аналогічного результату. При
використанні будь-якого способу вікно редагування стає самим верхнім.
Можливі три варіанти завантаження налагоджувача Start Debug (налагодження),
Step Into (крок всередину), Step Over (виконати всю команду). Також при налагодження
доступний пункт Step Out (вихід з підпрограми). При використанні цих команд вікно
редагування виглядає інакше, ніж звичайно. При налагодженні програми в режимі Step
Into наладчик висвічую рядок програми, що буде виконуватися наступної. Стрілка
покрокового виконання розташовується поруч з функцією яка буде викликана поруч з
оператором, що буде виконаний наступним. Як тільки починається налагодження
програми, основне меню змінюється, що представляє більш широкі можливості
налагодження.
Важливим засобом налагодження програм є точка зупинки (breakpoints),
дозволяють виконувати програми до визначеного, зазначеного місця, тобто всі оператори
до цього місця вважаються правильними і наладчик не повинний витрачати час на їхнє
покрокове проходження.
Точку зупинки можна встановити за допомогою команди Toggle Breakpoints – F9
меню Debug .
Дії команд меню Debug:
Команда Step Into – покрокове виконання програми, заходячи всередину всіх
функцій програми.
Команда Step Over – дозволяє також покроково виконувати програму, але не
заходячи всередину функцій.
Команда Continue – продовжує виконання програми.
Команда Stop Debugging – перериває сеанс налагодження, повертає середовище
в звичайний режим.
Команда Restart – перериває поточний сеанс налагодження, не повертаючи
середовище в звичайний режим. Ця команда необхідна, коли потрібно заново почати
налагодження програми, при цьому губляться значення всіх змінних.
Команда QuickWatch…- відкриває вікно діалогу, що дозволяє миттєво
переглядати і змінювати вміст змінних. Швидше всього можна помістити деяку перемінну
у вікно QuickWatch, якщо перемістити на неї курсор і натиснути комбінацію клавіш
<Shift>+<F9>. Вікно швидкого перегляду містить різні кнопки. Команда Add (додати)
дозволяє додати ще одну змінну у вікно. Кнопка Recalculate (перерахувати) дозволяє
занести в змінну нове її значення з поля введення Expression (вираз).
Для перегляду значень змінних під час покрокового виконання програми можна
використовувати вікно перегляду перемінних Variables. У вікно порядково виводяться
імена перегляду змінних (у лівій частині вікна) і значення цих змінних (праворуч).
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.

Перейшовши за допомогою миші в ліву частину порожнього рядка цього вікна і вказавши
там ім'я змінної, можна відслідковувати її значення під час покрокового виконання
програми. Натискання правої кнопки миші в цьому вікні приводить до появи спливаючого
меню, у якому можна вказати в якій системі числення показувати значення перемінних –
десяткової (decimal) чи шістнадцятирічної (hexadecimal).
Команда Continue(Start Debug) меню Debug (налагодження) – продовжує до
виконання програми до точки зупинки, після чого можна виконувати програму по крокам.
Команду Continue(Start Debug) можна виконати за допомогою самої лівої кнопки
панелі інструментів Debug (налагодження). Точки зупинки можуть використовуватися для
налагодження Windows-програм у такий спосіб: точка зупинки стає на першому операторі
експортованої функції програми, виконується команда Continue(Start Debug) і після
зупинки можна по крокам виконувати програму. При спробі покрокового налагодження
поза межами цієї функції наладчик видасть повідомлення про неможливість робити
налагодження поза кодом програми. Знову вибравши команду Continue, необхідно
виконати команду до наступної точки зупинки, після чого можна продовжити покрокове
налагодження програми, а потім знову потрапити на ту ж точку зупинки при повторному
входженні в експортовану функцію.
Переключатися між вікном налагодження і програмою, яка виконується можна за
допомогою комбінації клавіш <Alt>+<Tab>.

You might also like