Professional Documents
Culture Documents
Lab 1 OOP 23 24
Lab 1 OOP 23 24
Для виконання даної роботи базується на підготовчі лабораторні роботі №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 .
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.
Завдання 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 і масив An , n 200. Розробити програму, яка підраховує
скільки точок з координатами a1, , a2 , a3, , a4 , …, a 2 n 1 a 2 n належать кругові радіуса r з
центром на початку координат.
3. Задано масив дійсних чисел An m , n 100, m 10 . Розробити програму, яка
обчислює
Z max (min A1, ... , Am, min Am 1, ... , A2m,... , min Amn 1 1, ... , An m ) .
4. Задано масив цілих чисел An , n 200. Розробити програму, яка переписує всі числа,
що повторюються, з масиву An в масив Bn по одному разу. Друкує масив B(n ) по
п’ять чисел у рядку.
5. Задано масив дійсних чисел A2n , n 200. Розробити програму, яка обчислює суму
тих чисел із An 1,... , A2n , які перевищують середнє арифметичне значення чисел
A1, ... , An .
6. Задано масив дійсних чисел An , n 200. Розробити програму, яка будує масив Bn
за правилом: bi є середнім арифметичним значенням чисел a1 , a2 ,... , an , крім a i ,
i 1,2,..., n .
7. Задано два масиви цілих чисел X n і Y n , n 300. Розробити програму, яка обчислює
добуток елементів об’єднання цих масивів. Об’єднання двох масивів це всі елементи
масиву X n і всі елементи масиву Y n , взяті по одному разу. Надрукувати елементи
об’єднання та їх суму.
8. Задано масив цілих чисел An , n 200. Розробити програму, яка будує масив B(n) ,
елементами якого є такі числа A(i ) , що корені рівняння x 2 3 A( i )x 5 =0 дійсні і додатні.
Друкує масив B(n ) по п’ять чисел у рядку.
9. Задано масив цілих чисел An , n 400. Розробити програму, яка знаходить
максимальне серед тих чисел, які не повторюються.
10. Задано масив дійсних чисел An , 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. Задано масив дійсних чисел An m , n 100 і m 15 . Розробити програму, яка
обчислює
V min (max A1, ... , Am, max Am 1, ... , A2m,... ,
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.
29. Задано два масиви цілих чисел An , n 300, Bm , m 200. Розробити програму, яка
будує переріз цих масивів, обчислює його суму і визначає максимальний елемент
перерізу. (Переріз масивів A і B це елементи масиву A , які є в масиві B і взяті по
одному разу).
30. Задано масив цілих чисел An , 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() тощо.
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.
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]
Виділяється компілятором
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
Виділяється компілятором
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. Динамічні масиви.
Виділяється компілятором
*(mas+i) ==mas[i]
Вірно й зворотне: адреса першого байта якогось поля пам'яті в операціях обробки
поля може розглядатися як ім'я масиву. Так, якщо описаний деякий вказівник int* p та
виділити динамічну пам’ять, то картина в пам'яті комп'ютера при виконанні програми
може мати вигляд: int* p
*(p+0) ==p [0] *(p+1) ==p [1]
Виділяється
компілятором
*(p+4) ==p [4]
Виділяється
динамічно
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.
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;
}
Динамічну модель правомірно називати “ динамічним масивом ”: не будучи
масивом як структурою даних мови, вона проте адекватно відображає дані проблемного
завдання.
Питання вибору моделі (статичної або динамічної) пов'язані з ефективністю
реалізації програми й не повинні впливати на інтерфейс. Тому слід вибрати спосіб опису
інтерфейсу, що дозволяє відкласти розв'язок цих питань принаймні до етапу розробки
методу розв'язку.
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);
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. Контейнери для роботи з масивами.
#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
За допомогою функції 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
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 };
Об’єктно-орієнтоване програмування мовою С++ ©Лазорик В.В.
return 0;
}
3. Пункти меню View дозволяють відкривати різного роду робочі вікна середовища
(Solution Explorer, Class View, Resource View, etc.), відображати список задач до
виконання (Show Tasks), включати/відключати блоки кнопок у панелі інструментів
(Toolbars), переключатися між повноекранним та звичайним режимом редактора (Full
Screen), а також виконувати деякі інші операції.
Пункти меню Build призначені для зборки проекту (Build…, Rebuild…, Clean…),
пакетної зборки (Batch Build…), встановлення поточної конфігурації (Configuration
Manager…) та компіляції поточної частини проекту (Compile).
7. Пункт Help головного меню служить для виклику допомоги за змістом (Contents…)
або темою (Index…), пошуку теми за ключовими словами (Search…),
відображення/відключення панелі динамічної домоги (Dynamic Help), відображення
інформації про поточну версію середи (About Microsoft Visual C++…), відображення
стартової сторінки VS .NET (Show Start Page), перевірки поновлень версії (Check for
Updates) та отримання технічної підримки (Technical Support).
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;
}
Перейшовши за допомогою миші в ліву частину порожнього рядка цього вікна і вказавши
там ім'я змінної, можна відслідковувати її значення під час покрокового виконання
програми. Натискання правої кнопки миші в цьому вікні приводить до появи спливаючого
меню, у якому можна вказати в якій системі числення показувати значення перемінних –
десяткової (decimal) чи шістнадцятирічної (hexadecimal).
Команда Continue(Start Debug) меню Debug (налагодження) – продовжує до
виконання програми до точки зупинки, після чого можна виконувати програму по крокам.
Команду Continue(Start Debug) можна виконати за допомогою самої лівої кнопки
панелі інструментів Debug (налагодження). Точки зупинки можуть використовуватися для
налагодження Windows-програм у такий спосіб: точка зупинки стає на першому операторі
експортованої функції програми, виконується команда Continue(Start Debug) і після
зупинки можна по крокам виконувати програму. При спробі покрокового налагодження
поза межами цієї функції наладчик видасть повідомлення про неможливість робити
налагодження поза кодом програми. Знову вибравши команду Continue, необхідно
виконати команду до наступної точки зупинки, після чого можна продовжити покрокове
налагодження програми, а потім знову потрапити на ту ж точку зупинки при повторному
входженні в експортовану функцію.
Переключатися між вікном налагодження і програмою, яка виконується можна за
допомогою комбінації клавіш <Alt>+<Tab>.