You are on page 1of 162

Хмельницький політехнічний коледж

Національного університету «Львівська політехніка»

Циклова комісія програмного забезпечення

Методичні вказівки
до лабораторних робіт та самостійної роботи студентів
спеціальності «Інженерія програмного забезпечення »
з дисципліни
«Основи програмування»
Мова С++

Розробили:
викладачі-методисти
Гуменна В.В, Соломко Л.А

Розглянуто та схвалено на засіданні циклової комісії програмного забезпечення


Протокол від “ 22”вересня 2017 року № 2
Голова циклової комісії
програмного забезпечення ___________________ Л.А.Соломко

1
Зміст
Лабораторна робота № 1. Тема: Створення простої програми в консольному режимі у
VISUAL STUDIO C++........................................................................................................................3
Лабораторна робота №2. Тема: Обчислення функцій..................................................................14
Лабораторна робота №3. Тема: Створення програм з операторами розгалуження..................20
Лабораторна робота №4. Тема: Створення програм з оператором вибору................................23
Лабораторна робота №5. Тема: Створення програм з операторами циклів..............................36
Лабораторна робота № 6. Тема: Обробка масивів в програмах на С++......................................43
Лабораторна робота № 7.Тема: Створення програм для обробки текстових даних................54
Лабораторна робота № 8. Тема: Створення програм для опрацювання структур.....................58
Лабораторна робота №9.Тема: Створення програм з використанням власних функцій...........64
Лабораторнеа робота № 10. Тема: Створення програм для роботи з файлами.........................72
Лабораторна робота №11. Тема: Створення багатофайлових програм на С++........................88
Лабораторна робота №12. Тема: Розробка алгоритмів і програм обробки динамічних
масивів................................................................................................................................................94
Лабораторна робота 13. Тема: Лінійний однозв’язний список................................................117
Лабораторна робота №14. Тема: Програмування задач з використанням стека, черги.........131
Лабораторна робота №15. Тема: Програмування задач з використанням дерев.....................147
Лабораторна робота №16. Тема: Алгоритми програмування задач з графами.........................156
Лабораторна робота № 17. Тема: Створення програм для конвертування даних....................165
П ИТАННЯ З КУРСУ « О СНОВИ ПРОГРАМУВАННЯ » ( МОВА С++), 2- Й КУРС , ЕКЗАМЕН
.......................................................................................................................................................169
Ш ПАРГАЛКА ПО С++...............................................................................................................170
З АПИТАННЯ .................................................................................................................................179

2
Лабораторна робота № 1. Тема: Створення простої програми в
консольному режимі у VISUAL STUDIO C++
Мета: Набути навиків роботи в середовищі програмування VISUAL STUDIO
C++.Навчитись створювати, редагувати, налагоджувати, тестувати та зберігати
проекти в консольному режимі.
Хід роботи

Початок роботи в додатку Microsoft Visual Studio


Microsoft Visual Studio - це набір інструментів розробки, грунтованих на
використанні компонентів і інших технологій для створення потужних,
продуктивних застосувань.
Крім того, середовище Visual Studio оптимізоване для спільного
проектування, розробки і розгортання корпоративних рішень.
Також Visual Studio дозволяє створювати проекти, що мають призначений
для користувача інтерфейс (GUI), працюючи з різними компонентами, такими
як форми, кнопки, списки, меню і так далі.
Розглянемо версію Visual Studio 2010.
При завантаженні додатка з меню Пуск/Программы/Microsoft Visual
Studio 2010 з'являється головне вікно c початковою сторінкою програми, яке
представлене на рис.3.1.

Рис.1.1. Початкова сторінка Visual Studio 2010


Ми створюватимемо програми, які працюють в консолі, тобто взаємодія з
користувачем відбувається за допомогою чорного екрану. Для створення
програми необхідно натиснути Файл/Создать/Проект або натиснути на
стартовій сторінці Visual Studio2010 швидке посилання Створити проект,
виділену синім кольором. Після вибору створення нового проекту з'явиться
інше діалогове вікно Створити проект, де необхідно вибрати необхідні опції, а
саме: в лівому стовпці необхідно вибрати Visual C++/Win32, справа вгорі -

3
Консольний додаток Win32, справа внизу вписати ім'я проекту (наприклад,
proga1), в графі розташування вибрати вашу теку, де зберігатимуться усі
програми, залишити галочку створити каталог для вирішення. Діалогове вікно
Створити проект представлено на рис.1.2.

увеличить изображение
Рис.1.2. Діалогове вікно Створити проект
Після цього треба натиснути ОК. Відкриється майстер налаштування
нашого майбутнього консольного застосування, який представлений нарис. 3.3.

увеличить изображение
Рис. 1.3. Окно Мастер приложений Win32

4
увеличить изображение
Рис. 1.4. Заготовка нового проекта в Visual Studio 2010

Вимагається натиснути кнопку Готово. Тоді в головному вікні Visual


Studio 2010 закриється початкова сторінка, і відкриється файлproga1.cpp (праве
верхнє поле), вікно виведення помилок і попереджень Виведення (праве нижнє
поле), Командний оглядач (ліве вертикальне поле). Цей вид представлений на
рис.3.4.
Файл proga1.cpp призначений для тексту програми (чи кода програми),
тут ми вписуватимемо наші оператори, змінні і функції.
Вікно виведення доки порожнє, оскільки програма ще жодного разу не
була запущена. Після першого запуску в цьому вікні з'являтиметься службова
інформація, який проект запускається, що перевіряється, чи є в коді програми
помилки і якщо є, то які. Завдяки цьому списку помилок можна легко знайти
помилку в коді програми і виправити. Після виправлення помилок слід
перезапустити програму на перевірку ще раз. Коли помилок не буде виявлено,
програма запуститися на виконання завдання і з'явиться консоль.

5
увеличить изображение
Рис. 1.5. Просмотр Обозревателя решений
Замість командного оглядача можна включити Оглядач рішень, в якому
видно усі файли і теки, створені для нашого нового проекту. Для цього
необхідно під Командним оглядачем натиснути кнопку Оглядач рішень. Далі в
списку, що з'явився, розкрити теки Файли початкового коду і Заголовні файли.
Вікно Visual Studio з Оглядачем рішень представлене на рис.3.5.
Коли ми складаємо програму в Visual Studio, виходить цілий проект, який
автоматично створюється середовищем Visual Studio. Завдання початкуючого
програміста полягає в тому, щоб надрукувати код своєї програми у файлі *.cpp і
запустити програму на виконання.
Розглянемо заготівлю кода, яку нам пропонує Visual Studio.
Перші два рядки починаються двома символами "//". Ці символи
означають, що далі на цьому рядку слідує коментар, він не сприймається
компілятором як код програми і не видаватиме помилку. Видаляти ці два рядки
не рекомендується.
Далі слідує рядок #include "stdafx.h". Цей рядок потрібний для складання
нашого проекту. Файл stdafx.h - це один з файлів, що автоматично створюються
6
для нашої програми, і його можна побачити в лівому стовпці Оглядача рішень.
Цей рядок також не можна видаляти.

увеличить изображение
Рис.1.6. Успішна побудова проекту
Далі починається функція int main (). Автоматично Visual Studio називає її
_ tmain і вписує аргументи int argc, _ TCHAR* argv[]. У нас будуть найпростіші
програми для початкуючих програмістів, тому ми змінюємо цей рядок і
приводимо його до виду: int main () і залишаємо return 0, або void main () і
стираємо return 0. Після проведеної нами підготовки необхідно зібрати проект,
натиснувши в меню Побудову/Побудувати рішення. Тоді в полі Виведення
починається перевірка нашого коду. Зараз перевірка пройшла успішно і проект
вишикувався. Вікно Visual Studio після складання проекту представлене на рис.
3.6.
Спробуємо тепер запустити нашу порожню програму. Для цього на
клавіатурі необхідно натиснути Ctrl+F5. Тоді з'явиться консоль із стандартним
написом після виконання програми "Для продовження натисніть будь-яку
клавішу". Консоль представлена на рис.3.7.

7
Рис.1.7. Консоль виконання програми
Після перегляду консолі закрийте її, натиснувши на хрестик.
Тепер можна скласти просту програму, яка напише на екрані фразу
"PRIVET, STUDENT!!"!. У код нашої заготівлі треба додати декілька рядків:
#include <iostream> // оскільки треба буде використати оператор
виведення на екран cout
using namespace std; // підключення простору імен
cout<<"PRIVET, STUDENT!!"!<<endl; // висновок фразу на екран і
переклад курсора на новий рядок,
// щоб стандартна фраза "Для продовження натисніть будь-яку клавішу".
не " налипнула" на нашу фразу.
Отже, підсумковий код програми представлений на рис.3.8.

Рис.1.8. Файл з кодом програми


Після цього знову будуємо рішення, оскільки код програми був змінений.
Якщо побудова виконалася успішно, то можна запускати програму, натиснувши
Ctrl+F5. Якщо ж побудова видала помилки, то треба ще раз все перевірити,
виправити код, після цього побудувати проект ще раз. Консоль представлена на
на рис. 3.9.

8
Рис. 1.9. Консоль виконання програми
Звичайно, в процесі роботи з додатком Visual Studio може виникнути
безліч питань. У меню програми передбачена довідка і стандартні приклади, які
можна подивитися. Щоб включити довідку, необхідно нажатьСправка/Перегляд
довідки або скористатися гарячими клавішами Ctrl+F1. Щоб подивитися
приклади кодів, в меню треба вибрати Довідка/Приклади (Справка/Примеры.)
Виконання роботи
Постановка задачі: Виконайте реалізацію програм на ПК
Зайняття 1. Програмна реалізація лінійного алгоритму
Приклад 1. Дані числа . Вичислити суму і різницю чисел .
Приведемо блок-схему на на рис. 4.1.

Рис. 1.10. Блок-схема для примера 1


Код программы (Visual Studio):
// proga10.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
double a, b, S, R;
a=2;
9
b=7;
S=a+b;
R=a-b;
cout<<"S="<<S<<endl;
cout<<"R="<<R<<endl;
return 0;
}
Результат выполнения программы(Visual Studio):

Пример 2. Составить блок-схему и программу для вычисления значений


функций   и   при  , который считывается с экрана
(клавиатуры).
Приведем блок-схему на рис. 4.2.

Рис. 1.11. Блок-схема для примера 2


Код программы (Visual Studio):
// proga11.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
int main(){
double x, y, z;
cout<<"vvedi x=";
10
cin>>x;
y=sin(x); z=log(x);
cout<<"pri x="<<x<<" y="<<y<<" z="<<z<<endl;
return 0;
}
Результат выполнения программы (Visual Studio):

Ручной счет:
x=1.5
y=sin(1.5)=0.997495
z=ln(1.5)=0.405465
Результат выполнения программы (Visual Studio):

Ручной счет:
x=0.2
y=sin(0.2)=0.198669
z=ln(0.2)=-1.609438
Результат выполнения программы(Visual Studio):

Ручной счет:
x=-2
y=sin(-2)=-0.909297
z=ln(-2)=не существует, что соответствует результату на экране.
Пример 3. Составить блок-схему и программу для вычисления значений
функций   и   при различных значениях
аргументов  . Переменные   считать с клавиатуры.
Блок-схема представлена на рис. 4.3.

11
Рис. 1.13. Блок-схема для примера 3
Код программы (Visual Studio):
// proga12.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
int main(){
double x, y, U, V;
cout<<"vvedi x=";
cin>>x;
cout<<"vvedi y=";
cin>>y;
U=pow(x, 2.0)+(y+3.0)/(x-1.0);
V=1.0/pow(y, exp(1.0))*pow(sin(sqrt(x)+1.5), 2.0);
cout<<"pri x="<<x<<" y="<<y<<endl;
cout<<"U="<<U<<" V="<<V<<endl;
return 0;
}
Результат выполнения программы (Visual Studio):

Результат выполнения программы (Visual Studio):

12
Пример 4. Найти длину окружности и площадь круга, если известен
радиус.
Решение. Введем обозначения:   – радиус, который будет считываться с
клавиатуры (т.к. он не задан конкретным числом);   – длина окружности,
вычисляемая по формуле   – площадь круга, вычисляемая по
формуле  .
Приведем блок-схему на рис. 4.4.

Рис. 1.14. Блок-схема для примера 4

Код программы (Visual Studio):


// proga13.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
int main(){
double r, C, S;
cout<<"vvedi r=";
cin>>r;
C=2.0*3.141593*r;
S=3.141593*pow(r, 2.0);
cout<<"r="<<r<<" C="<<C<<" S="<<S<<endl;
return 0;
}
Результат выполнения программы (Visual Studio):

Зміст звіту:
- Тема роботи
- Мета роботи
- Постановка задачі
- Програма
- Результати роботи
13
- Відповіді на контрольні запитання
- Висновки.

Лабораторна робота №2. Тема: Обчислення функцій


МЕТА РОБОТИ: отримати практичні навики по використовуванню стандартних
функцій C++ і   операторів уведення-виведення

Хід роботи
1. Скласти програму для обчислення значення складних арифметичних
функцій.

2. З нового рядка вивести заголовок "Перша функція";


3. Скласти програму для обчислення значення функції вигляду:

4. Результати розрахунків вивести з точністю до 4 знаків після коми (при b=5


a=-0.2361 x=4.5035, p=1.6645);
5. З нового рядка вивести заголовок "Друга функція";
6. Скласти програму для знаходження значення функції вигляду:

7. Вивести результати з пояснюючим текстом з точністю до 3 знаків після


коми (при a=8, b=3, c=1, x=2  функция=1.3);
8. Всі дії в програмі прокоментувати
9. Скласти програму для обчислення функцій відповідно варіанту.
10 Оформити звіт до ЛР1.

Зміст звіту:
- Тема роботи
- Мета роботи
- Постановка задачі згідно варіанту
- Програма
- Результати роботи
- Відповіді на контрольні запитання
- Висновки.

 
14
Зразок виконання роботи
Програма 1.
//підключаємо файл для організації уведення-виведення
#include <iostream >
//підключаємо файл для використовування функцій
алгебри
#include <math.h>
// підключаємо файл для виклику функції очищення екрану
#include <conio.h>

//заголовок головної програми


int main()
{

//рахуємо першу функцію


//описуємо змінні
float а,b,x,p;
cout<<"Перша функція\n";

//виводимо текст-підказку для користувача


cout<<"Введіть значення змінної b: ";
//чекаємо введення значення з клавіатури
cin>>b;

//рахуємо значення функції а


a=(роw(b,1/5.0)-4)/(роw(b,2)+1)-еxp(-2);
//рахуємо значення функції х
x=(abs(а-b)+4)/(cos(роw(а,2))+1);
//рахуємо значення функції p
p=(abs(4*pow(sin(роw(x,3)),5)-pow(x,2))-4)/
(роw(tan(роw(x,3)),2)+pow(x,3/2.0));

//встановлюємо точність висновку результату 4 знаки після коми


cout.precision(4);
//виводимо результат на екран
cout<<"При b="<<b<< функції" рівні: a="<<a<<" x="<<x<<" p="<<p<<"\n\n";

//рахуємо другу функцію


//описуємо бракуючу змінну
float с, у;
cout<<"Друга функція\n";

15
//виводимо текст-підказку для користувача
cout<<"Введіть значення змінних а, b, с, x: ";
//чекаємо введення значень з клавіатури
cin>>a>>b>>c>>x;

//рахуємо значення функції у


y=pow(x,1/5.0)-pow(с,3)/2+(abs(a)-b)/(роw(log(а-b),2)+4)-
(cos(роw(а,2))+pow(sin(b),2))/(роw(а,1/2.0)+1);

//встановлюємо точність висновку результату 3 знаки після коми


cout.precision(3);
//виводимо результат на екран
cout<<"При a="<<a<<" b="<<b<<" c="<<c<<" x="<<x<< функція" y="<<y<<"\n";
cout<<"Для продовження натискуйте будь-яку клавішу...";

//робимо паузу для проглядання результату


getch();
//завершуємо роботу головної програми
return 0;
    }
Варіанти завдань:
1. Обчислити висоти h a , h b , hс трикутника ABC, якщо значення
сторін a, b і с обрано довільно.
Довідка:

Відповідно знаходяться висоти h b  та h c .


2. Обчислити об'єм кульового сегмента та об'єм кульового сектора за
формулами:

Значення радіуса кулі R та висоти Н кульового сегмента або сегментної


частини сектора задати довільно.
3. Обчислити

16
якщо х = 1,45, у = -1,22; z=3,5.
4. Обчислити

якщо x=1,2; y=-0,8.
Довідка: n!=1*2*3….*n.
 
5. Обчислити площу поверхні та об’єм зрізаного конуса за формулами

Значення радіусів основ зрізаного конуса  R і r, його висоту Н та


довжину твірної l обрати довільно.
6. Обчислити

якщо а=-0,5; b=1,7; t=0,44.
7. Обчислити

якщо a = 1,5; b = 15,5; x = -2,9.


8. Обчислити

якщо a = 16,5; b = 3,4; x = 0,61.


9. Обчислити

якщо x = l,82; у =18,5; z = -3,4.
10. Обчислити

17
якщо a = 0,7; b = 0,05; x = 0,43.
11. Обчислити

якщо значення x, у, z обрані довільно.


12. Обчислити

якщо х=1,25; у = 0,93.


13. Обчислити

якщо x = 0,25; у = 1,31; a = 3,5; b = 0,9.


14. Обчислити

якщо x = 0,25; у = 0,79; z = 0,81.


15. Обчислити

якщо a = 3,2; b=l7,5; x = -4,8


16. Обчислити

якщо a = 10,2; b = 9,3; x = 2,4; с = 0,5.


17. Обчислити

якщо a = 0,3; b = 0,9; x = 0,53.


18
18. Обчислити

якщо a = 0,5; b = 2,9; x = 0,3.


19. Обчислити

якщо a = 0,5; b = 3,l; x = l,4.


20. Обчислити

якщо а = 0,5; b = 2,9; х = 0,3.


21. Обчислити

якщо х = 1,23; у = 0,79.


22. Обчислити

якщо х= 10,3; у = 4,93; z = 0,4.


23. Обчислити

якщо х = 1,2; z = 3,5.


24. Обчислити

якщо с = 0,5; b = -0,5; x = 0,61; у =1,2.


25. Обчислити

якщо x = 0,92; у =5,3; a = 0,25.


19
Зміст звіту:
- Тема роботи
- Мета роботи
- Постановка задачі згідно варіанту
- Програма
- Результати роботи
- Відповіді на контрольні запитання
- Висновки.

Лабораторна робота №3. Тема: Створення програм з операторами


розгалуження
МЕТА РОБОТИ: отримати практичні навики по застосуванню умовних
операторів і запису логічних виразів

Хід роботи
1. Скласти програму для розв’язання задачі 1.

 
 
Варіанти завдань:

№п/п ФУНКЦІЯ УМОВА ДАНІ


1 at 2 ln t 1<=t<=2 a=-0.5
b=2

y  1 t<1
 at
 cos bt t>2

20
2 x 2  7 / x 2 x<1.3 a=1.5
 3 x=1.3
y  ax  7 x

lg(x  7 x x>1.3

3 ax 2  bx  c a=2.8
x<1.2 b=-0.3
 c=4
  a / x  x 2 1 x=1.2
 2
( a  bx )/ x 1 x>1.2
4 x 2  7 / x 2 x<1.4 a=1.65
 3 x=1.4
Z  ax  7 x
 x>1.4
ln(x  7 x  a
5 15 x<1 a=2.3
. cos2 x

18 . ax x=1
y
2
( x  2)  6 1<x<2
3tgx
 x>2
6 x 3 x  a x>a a=2.5

  x sin ax x=a
  ax
 cos ax x<a
7 bx  lg bx bx<1 b=1.5

Z  1 bx=1
bx  lg bx
 bx>1
8 sin x lg x x>3.5
y 2 ——
cos x x<=3.5
9 lg( x 1) x>1 a=20.3
f  2
sin ax X<=1
21
10 (ln 3 x  x 3 )/ x  t x>0.5 t=2.2
 x=0.5
Z   x  t 1/ x
 2
cos x  t sin x
x<0.5

11  a b x<2.8 a=2.6
b=-0.39
 x  cos x
 2.8<=x<=6
S  (a  b) /( x 1)
x  sin x x>=6


12 a lg x  3 x x>1 a=0.9
y
x<=1
2a cos x  3x 2
13 a i<4 a=2.1
2
 i  bi  c b=1.8
c=-20.5

  i 4<=i<=6
 3
 ai  bi i>6

14  i 2 1 a=0.3
i 2 1
a sin( ) sin 0 n=10
Z n n
cos(i  1 ) i 2 1
sin 0
 n n
15  at 2  b sin t 1 t<0.1 a=2.5
b=0.4
 t=0.1
  at  b

 at 2  b cos t 1 t>0.1
Зміст звіту:
- Тема роботи
- Мета роботи
- Постановка задачі згідно варіанту
- Програма
22
- Результати роботи
- Відповіді на контрольні запитання
- Висновки.

Лабораторна робота №4. Тема: Створення програм з оператором вибору


Мета: навчитися складати й реалізовувати умовні алгоритми та
програми з використанням оператору вибору мовою С++.
Обладнання: ПК.
Програмне забезпечення: Середовище С++. 
Виконання роботи
1.Завантажити Середовище С++ 
2. Створіть новий проект.
3. У вікні редагування введіть текст програми, і перевірте її
роботу.
 Приклад простої програми з оператором вибору
Задача. У старояпонскому календарі був прийнятий
дванадцятирічний цикл. Роки всередині циклу носили назви тварин:
пацюка, корови, тигра, зайця, дракона, змії, коня, вівці, мавпи, півня,
собаки і свині. Написати програму, яка за номером року визначає його
назву в старояпонському календарі, якщо відомо, що 1996 р. був роком
щури - початком чергового циклу. Оскільки цикл є дванадцятирічним,
поставимо у відповідність назву року залишку від ділення номера цього
року на 12. При цьому врахуємо, що залишок від
ділення1996 на 12 дорівнює 4.
#include <iostrearn>

int main()
{
int year;
cout<<" Write year";
сіn >> year;
switch year % 12
{
case 0;
cout<< "Year monkey"; break;
case 1: cout<< "Year chicken"; break;
case 2: cout<<"Year dog"; break;
case 3: cout<<"Year pig"; break;
case 4: cout<<"Year rat"; break;

default: cout << "Zapys ne virnyy"; break;
}
getch();
23
return 0;
}
Задача 2
Постановка задачі
1. Видати на екран меню користувача з наступними пунктами:
 
1 - розрахунок функції
2 - знаходження максимального з трьох чисел
3 - рішення задачі
 
2. При виборі певного пункту меню користувач повинен ввести з клавіатури
потрібні початкові дані і отримати відповідь. Якщо вибраний неприпустимий
режим роботи програми, то видати повідомлення про помилку
 
3. Як функція для першого пункту меню пропонується наступна:
 

 
На екран з вивести значення x, з і у з точністю до 3 знаків після коми. 
Перевірити працездатність програми при всіх можливих значеннях а (при а=10
x=11.389, c=13.71, y=-0,466; при a=5 x=0.006, c=12.506, y=2.
 
4. Знаходження мінімального з трьох  чисел виконати за допомогою
оператора IF...ELSE і оператора ? : Видати на екран обидва результат для
порівняння
 
5. Як задача для третього пункту меню пропонується наступна. До фіналу
конкурсу кращого по професії «Фахівець електронного офісу» були допущені
двоє: Іванов і Петров. Змагання проходили в три тури. Іванов в першому турі
набрав M1 балів, в другому – N1, в третьому – P1. Петров – відповідно M2, N2,
P2. Складіть програму, яка визначає прізвище і загальну суму балів переможця.
 
Виконання роботи
//підключаємо заголовні файли
#include <iostream >
#include <math.h>
#include <conio.h>
24
 
void main()
{
//описуємо змінну для запам'ятовування вибору з меню
int k;
//видаємо меню на екран і чекаємо вибору від користувача
cout<<"1 - розрахунок функции\n";
cout<<"2 - знаходження мінімального з трьох чисел\n";
cout<<"3 - рішення задачі 3\n";
cout<<"Зробіть вибір: ";
cin>>k;
 
//починаємо аналізувати вибір користувача
switch (k)
{
//якщо вибраний перший пункт меню
case 1: {
    //описуємо змінні
          float а,x,c,y;
    //вводимо початкові дані
          cout<<"Введите значення змінної а: ";
          cin>>a;
  //рахуємо функцію Х
          if (a>=8)x=4+exp(2);
          else x=pow(cos(a),4);
    //рахуємо функцію с 
        c=pow(5*sin(4*x),1/3.0)+12;
 
   //рахуємо функцію У
          if (c>0) y=4*cos(x)-2;
          else if (c==0) y=sqrt(x)+4;
                else y=pow(x,3)/2;
  //виводимо результат
          cout.precision(3);
          cout<<"При a="<<a<<" x="<<x<<", c="<<c<<", y="<<y<<"\n";
   //виходимо з оператора switch
          break;
      }
 
 
//якщо вибраний другий пункт меню
case 2: {
          //описуємо змінні
25
          float а,b,c,d;
          //вводимо початкові дані
          cout<<"Введите три числа: ";
          cin>>a>>b>>c;
            //знаходимо максимальне з 3 чисел
          //с допомогою оператора IF...ELSE
          if (a>b)d=a;
          else d=b;
           if (с>d) d=c;
                     //виводимо результат
          cout<<"Максимальное число рівно (1 спосіб): "<<d<<"\n";
            //знаходимо максимальне з 3 чисел
          //с допомогою оператора ?:
          d=(a>b && a>c ? а : (b>a && b>c ? b : c));
          //вивiд результату
          cout<<"Максимальное число рівно (2 спосіб): "<<d<<"\n";
          //виходимо з оператора switch
          break;
      }
//якщо вибраний третій пункт меню
case 3: {
          //описуємо змінні
          float m1,n1,p1,m2,n2,p2;
          //вводимо початкові дані
          cout<<"Введите бали, набрані Івановим в трьох турах: ";
          cin>>m1>>n1>>p1;
          cout<<"Введите бали, набрані Петровим в трьох турах: ";
          cin>>m2>>n2>>p2;
            //визначаємо переможця і виводимо результат
          if (m1+n1+p1 > m2+n2+p2)
                      cout<<"Победил Іванов, набравши "<<m1+n1+p1<<" баллов\n";
          else if (m1+n1+p1 < m2+n2+p2)                          cout<<"Победил Петров,
набравши "<<m2+n2+p2<<" баллов\n";
   else cout<<"В змаганнях зафіксована ничья\n";
          //виходимо з оператора switch
          break;
      }
//якщо вибраний неприпустимий пункт меню
default :
          //видаємо повідомлення про помилку
          cout<<"Выбран неприпустимий режим роботи программы\n";
}
//робимо паузу для проглядання результату
26
cout<<"Для продовження натискуйте будь-яку клавішу...";
getch();
}
4. Скласти програму згідно варіанту, записати  код у звіт і
побудувати блок-схему для наступної задачі.
5.Оформити звіт з виконання роботи. Зміст звіту:
- Тема роботи
- Мета роботи
- Постановка задачі згідно варіанту
- Програма
- Результати роботи
- Висновки.

6. Зробити висновок по роботі.

Варіанти завдань
№ по
Функция 1 Функция 2
списку

1, 13

2, 14

3, 15

27
4, 16

5, 17

6, 18, 25

7, 19

8, 20

28
9, 21

10, 22

11, 23

12, 24

Задача 2
Варіанти завдань:
1.а) площа трикутника S= p( p  a)( p  b)( p  c) ,
де p=1/2(a+b+c), a,b,c - довжина сторін трикутника;
б) площа круга
S  r 2 r-радіус, довжина кола L=2πr, площа сфери Scf=4πr2 , об’єм сфери
V=4/3 πr3
г) площа трапеції
1
S (a  b)h , де a,b- основи трапеції, h- висота трапеції; периметр трапеції.
2
д) площа паралелограма S  ah , де а- основа паралелограма, h - висота
д)площа прямокутника S  ab де a,b- сторони прямокутника, периметр
прямокутника Р
29
2.а) Об’єм паралелепіпеда V  abc , де a,b,c – довжини сторін;
б) Об’єм циліндра V  r 2 h , де r - радіус основи циліндра, h-висота;
в) Об’єм прямого кругового конуса
1 2
V  r h , де r– радіус основи конуса, h-висота;
3
4
г) Об’єм кулі V  r 3 , де r-радіус кулі.
3

3.а) момент інерції однорідного диска (відносно осі симетрії)


1
J mR 2 , де R- радіус диска;
2
б) момент інерції однорідного прямого кругового конуса (відносно осі

симетрії):

3
J mR 2 , де R- радіус основи конуса;
10

в) момент інерції однорідного стержня (відносно осі, що проходить через

1
центр стержня перпендикулярно до нього); J  ml 2 , де l– довжина стержня;
12

г) момент інтеграції однорідної кулі (відносно діаметра):

2
J mR 2 , де R- радіус кулі.
5
Примітка: m- всюди є масою відповідного тіла.

4.а) Сила струму


I=U*R-1
б) Напруга
U=IR
в) Опір
R=U*I-1
г) Провідність
G=I*U-1
д) Потужність
W=I*U.
30
5.а)площа поверхні параллелепіпеда
S=2(ab+bc+ac), де a,b,c - довжини ребер паралелепіпеда
б) площа сфери
S= 4r 2, де r - радіус сфери
в) площа поверхні прямого кругового циліндра
S=2  r2+2  rh, де r- радіус основи, h-висота
г) площа поверхні прямого кругового конуса
S=  r2 +  rl , де r- радіус основи, l-довжина твірної;
6.а) сума векторів
zi=xi+yi (i=1,2,3);
б) різниця векторів
zi=xi-yi (i=1,2,3);
в) добуток векторів
zi=  *xi, (i=1,2,3);
г) скалярний добуток
s=x1y1+x2y2+x3y3;
д) векторний добуток
z1=x2y3-x3y2
z2=x3y1-x1y3,
z3=x1y2-x2y1
Тут x1,y1,z1 i x2,y2,z2 є координати заданих векторів.
7.а) площа трикутника
S= p( p  a)( p  b)( p  c) ,
де p=1/2(a+b+c), a,b,c - довжина сторін трикутника;
б) периметр трикутника P=a+b+c;
в) висота трикутника (опущена на сторону a ) ha=2S/a;
1
г) медіана сторони a ma= 2 2(b 2  c 2 )  a 2

д) бісектриса кута  l  = b  c
2
bcp( p  a )

8.а) декартові координати точки:


x=r cos 
y=r sin 
б) полярні координати точки:
полярний радіус r= x  y 2 2

Полярний кут  (0<=  <2  ) обчислюється за різними аналітичними


виразами, в залежності від знаків декартових координат:
y
-якщо x,y>0, то   arctg x
;
1
-якщо x=0, y>0, то   2 
y
-якщо x<0, то   arctg x


31
3
-якщо x=0, y<0 то   2 
y
-якщо x>0, y<0, то arctg  2
x
-якщо x=0, y=0, то полярний кут невизначений. У цьому випадку
програма повинна виводити відповідне повідомлення.

9.а) відстань між точками на площині


d  ( x1  x 2 ) 2  ( y1  y 2 ) 2
б) відстань між точками у просторі
d  ( x1  x 2 ) 2  ( y1  y 2 ) 2 ( z1  z 2 ) 2
б) відстань від точки до прямої на площині
/ Ax1  By1  C /
d 
A2  B 2
г) відстань між двома паралельними прямими на площині
/ C1  C 2  / A B
d  , де   A або   B .
1 1

A  B
2 2
2 2

Тут A1,B1,C1 i A2,B2,C2 є коефіцієнти рівнянь прямих A1 x  B1 y  C1  0 ,


A2 x  B2 y  C 2  0 , a x1 , y1 , z1 i x2,y2,z2 -координати заданих точок.

10.а) площа трикутника


1
S
2
ab sin  , де  –кут між сторонами a і b;
б)довжина сторони с: с a 2  b 2  2ab cos 
a
в) кут    arcsin( c sin  )
В останніх двох формулах довжину сторони с потрібно попередньо знайти
за формулою пункту б).

2
11.a) висота підйому тіла, кинутого вертикально вгору: h
2g
б) початкова швидкість тіла, кинутого вертикально вгору, висота підйому
якого дорівнює h:   2 gh
2g
в) час підйому тіла: 
h
1
г) висота підйому тіла: h  g 2
2
Примітка: Прискорення вільного падіння g=9,8 м/сек2.

12.а) довжини сторін b і c i кут  трикутника


sin  sin 
ba , ca     (   )
sin(    ) sin(    ) ,
б) довжина сторони c і кути  i  тркутника

32
a b
с a 2  b 2  2ab cos  ,   arcsin( c sin  ) ,   arcsin( sin  )
c
в) кути трикутника, заданого трьома сторонами
b2  c2  a2 a2  c2  b2
  arccos( 2bc ) ,   arccos( ) ,.
2ac
a2  b2  c2
  arccos( )
2ab

a2  b2
13.а) ексцентриситет еліпса e
a
б) відстань між фокусами еліпса f  2 a 2
 b2
в) фокальний параметр еліпса p  b 2 / a
г) велика піввісь еліпса a  p /(1  e 2 )
p
д) мала піввісь еліпса b .
1 e

14.а) сумарний опір при послідовному з’єднанні двох резисторів


R  R1  R 2
б) сумарнийопір при паралельному з’єднанні двох резисторів
R1 R 2
R
R1  R 2
в) сумарний опір з’єднання трьох резисторів (R3 під’єднаний послідовно
до паралельно з’єднаних R1 i R2)
R1 R 2  R2 R3   R3 R1
R
R1  R 2
г) сумарний опір з’єднання трьох резисторів (R 3 під’єднаний паралельно
до послідовно з’єднаних R1 i R2)
R1 R3  R2 R3
R .
R1  R2  R3
15.а) ексцентриситет гіперболи f  2 a2  b2 ;
2
b
б) фокальний параметр гіперболи p
a
p
в) дійсна піввісь гіперболи a 
e 12

p
г) уявна піввісь гіперболи b .
e 12

16.а) Тіло вільно падає. Визначити пройдений тілом шлях після першої та
другої секунди падіння.
б) Паралалельно з’єднано три задані опори. Який опір з’єднання і струми
у кожній гілці, якщо прикладено напругу U вольт.
в) вввести п’ятизначне ціле числоо. Обчислити суму його чисел.
г) Виконати облік трьох наіменувань товарів, які є на складі. Запитати
про кількість і ціни товарів. Виести інформацію про товари на складі.
33
17. Бригада із шести робітників може виконати завдання за одну зміну (8
год).
а) Скільки потрібно робітників щоб щоб це завдання виконати за к годин.
б) Ввести тризначне ціле число. Визначити суму і добуток крайніх цифр.
в) Обчислити довжину гіпотенузи та площу прямокутного трикутника за
двома катетами.
г) Обчислити усі висоти прямокутного трикутника за двома катетами.

18.а) обчислити периметр і площу рівнобедреної трапеції за заданими


сторонами.
б) обчислити площу поверхні циліндра, за заданими висотою та радіусом
основи.
в) обчислити об’єм циліндра.
г) обчислити площу круга.

19 Задано координати вершин чотирикутника у площині.


.а) Обчислити довжини його сторін.
б) Обчислити довжини його діагоналей.
в) обчислити його периметр.
г) обчислити його площу.

20. Задано координати вершин трикутника.


а) Обчислити висоти.
б) обчислити бісектриси.
в) обчислити медіани.
г) обчислити радіуси вписаного та описаного кола.
Зміст звіту:
- Тема роботи
- Мета роботи
- Постановка задачі згідно варіанту
- Програма
- Результати роботи
- Відповіді на контрольні запитання
- Висновки.

34
Лабораторна робота №5. Тема: Створення програм з операторами циклів
МЕТА РОБОТИ: отримати практичні навики по використовуванню операторів
циклу в програмах на C++
 
Хід роботи
1. Скласти програму для знаходження значення функції вигляду:

2. Результат вивести з точністю до 3 знаків;


3. Провести табуляцію функції Y=SIN X на відрізку [а,b] з кроком 0,75. Почало і
кінець відрізка задати з клавіатури. При цьому програму оформити з
наступними параметрами:
3.1. На екран видати заголовок у вигляді:
Аргумент (Х) Функція (Y);
3.2. Нижче в два стовпці видати значення аргументу і функції з точністю
до 3 знаків;
3.3 Задачу(згідно варіанту) вирішити за допомогою всіх можливих видів
циклу
 
Виконання роботи
1.Програма
#include <iostream.h>
#include <conio.h>
#include <math.h>
void main()
{
//описуємо змінні
float x,M,L;
int а,b,i;
 
//завдання 1
cout<<"Задача 1\n";
//вводимо початкові дані
35
cout<<"Введите значення х: ";
cin>>x;
//рахуємо значення функції L
if (x<=4)
          L=1-pow(x,2)/3;
else
          for (L=0, b=1; b<=10; b++)
                      L+=pow(sin(роw(x,b)),2);
//рахуємо значення функції М 
for (M=1, i=1; i<=8; i++)
          M*=(роw(x,i)-sqrt(i));
//задаємо кількість знащущих знаків (цифр)
cout.precision(3);
//видаємо результат
cout<<"При х="<<x<< функція" L="<<L<<", функція М="<<M+L<<"\n";
//робимо паузу для перегляду 
cout<<"Для продовження натискуйте будь-яку клавішу...\n\n";
getch();
 
//задача 2
cout<<"Задача 2\n";
//вводимо початкові дані
cout<<"Введите кінці відрізка (а і b): ";
cin>>a>>b;
 
//видаємо таблицю значень функції за допомогою циклу for
cout<<"Решение за допомогою циклу for...\n";
cout<<"x\ty\n";
for (x=a; x<=b; x+=0.75)
          cout<<x<<"\t"<<sin(x)<<"\n";
//робимо паузу для перегляду 
cout<<"Для продовження натискуйте будь-яку клавішу...\n\n";
getch();
 
//видаємо таблицю значень функції за допомогою циклу while
clrscr();
cout<<"Решение за допомогою циклу while...\n";
cout<<"x\ty\n";
x=a;
while (x<=b)
{
cout<<x<<"\t"<<sin(x)<<"\n";
x+=0.75;
36
}
//робимо паузу для перегляду 
cout<<"Для продовження натискуйте будь-яку клавішу...\n\n";
getch();
 
//задача 3
//видаємо таблицю значень функції за допомогою циклу do while
cout<<"Решение за допомогою циклу do while...\n";
cout<<"x\ty\n";
x=a;
do
{
cout<<x<<"\t"<<sin(x)<<"\n";
x+=0.75;
}
while (x<=b);
//робимо паузу для перегляду 
cout<<"Для продовження натискуйте будь-яку клавішу...\n\n";
getch();
return;
}
Варіанти завдань:
Задача1. Виконати обчислення згідно заданого варіанту різними операторами
циклу:

№ Функція Y(X) A B H ОБЧИСЛИТИ:


1. y=ln(2+sin2x) 0 3 0.6 суму y>1 і кількість
y<1
2. y=x3ln(1+x) 1 6 1.0 кількість і добуток
y<100
3. y=xearctgx 0 6 1.2 середнє арифметичне
1<y<7,9
4. y=arctgx/(1+x2) 0 1.5 0.8 суму y<0,4 і добуток
y>0,4
5. y=sin2x/(1+x2) 0 6 0.8 суму y<0 ікількість y>0
6. y=xe-x -2 3 1.0 суму і добуток y>0
7. y=x 2lnx 1 10 2.0 середнє геометричне
y>5
8. y=lnx+cos2x 1 1.5 0.1 середнє арифметичне
y<=0,3
9. y=(ex+e-x)/2 -1 2 0.4 суму і кількість y>2
10.y=arccosx 0.1 0.6 0.1 суму і кількість y<=1,3

37
11.y=4-x-4/x2 1 4 0.5 кількості y<-0,5 i y>-
0,5
12.y=el+x 0 1 0.2 кількість і добуток
y>4,12
13.y=ln(2+cos2x) 0 3 0.3 суму і добуток
y<=0,95
14.y=3-x-4/(x+2)2 -1 2 0.4 кількості y<0 i y>0
15.y=(lnx)/x 3 1 2 0.2 кількість і суму
0,2<y<0,5
16.y=x/sin 2x 0.5 1 0.1 суму y=>-0 i y<-0,1
17.y=(sinx+x2)/ln 2 4 0.4 кількості y>8,3 i y<3
18.y=xexsin2x 0 1 0.2 середнє геометричне
0<y<0,3
19.y=ln3x+arctgx 1 2 0.2 суму і добуток
0,5<y<1,5
20.y=xe-x 1 2 0.2 добуток і кількість
0<y<0,3
21.y=ln(1+x) 1 4 0.5 суму і кількість y>2.5
22.y=x2+16/x-16 1 4 0.5 середнє арифметичне
всiх y
23.y=arctg4x 0 2 0.5 суму i кiлькiсть
0,71<y<2
24.y=lnx+arctgx 0.5 2 0.5 середнє геометричне
y>0,3
25.y=(ex-e-x)/2 0.3 2 0.3 добуток y>1 і суму y<1

Задача2.

1.    Знайти суму всіх значень функції у = х/і, якщо і є [1; 10], h i = l та
хє [0; 1], h x  = 0,l.
2.    Обчислити функцію у та знайти добуток їхніх додатних значень,
якщо:

де а = 0,75;  b= 1,19; с = -2,5; х є [0; 2], h x  = 0,1.


3.    Обчислити функцію z та підрахувати кількість її від'ємних значень:

38
 де а = 1;  b= 2; х є [1; 2], h x  = 0,1; у є [1; 2], h y  = 0,2.
4.    Обчислити функцію у та підрахувати суму її перших трьох значень:

де а = 9; b= 2; х є [2; 8], h x  = l.


5.    Обчислити функцію у та знайти її найбільше значення:

якщо b=1,2; а є [1;2], h a =0,5; х є [0;1], h x  = 0,2.


6.    Обчислити функцію у та знайти середнє арифметичне її значень:

7.    Обчислити функцію z і підрахувати кількість її значень, що


перевищують число задане користувачем:

де а=5,3; у=1,1; х є [-3;3], h x  =0,5.
8.    Обчислити функцію у та для кожного значення парамет -
ра b знайти суму її від'ємних значень:

якщо b=2; 4; 6; 8; xє[1,2; 2], h x =0,2.


9.  Обчислити добуток у за умови:

якщо х є [0; 0,5], h x  = 0,1. Довідкa: k! = 1•2• 3... • k.


10. Обчислити функцію у та знайти середнє геометричне отриманих
значень:

де х є [-2; 4], b x  = 0,5.

39
11. Обчислити функцію у та знайти кількість її від'ємних значень для
кожного значення параметра с:

де а=2; b=3 ; с =1;3; 5; 7; х є [0,1;5], h x  =0,l.


12. Обчислити площі S геометричних фігур:

де параметри a, b, h, R задані довільно.
13. Обчислити функцію z та знайти для кожного парного значення
параметра у кількість додатних значень цієї функції:

де х є [1;10], h x  = 2; у є [-4; 3], h y = 1.


14. Обчислити значення функції z при зміні кожного з парамерів х, у, b:

де а=1,7; b=2;4;6;8; х є [-1;1], h x =0,9; у є [-2; 2], h y =l.


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

де h x =0,5; а=1;2;3;4;5.
16. Підрахувати, скільки разів функція у = acosx + be -x  набуває
додатних значень, якщо х є[0,3;5], b х  = 0,1; а є [2; 8], h x = 2; b є [-
0,1;2,2], h b = 0,1.
17. Обчислити значення функції у за умови:
40
де х є [0,5; 3,1], b x  = 0,2; а = 0,1, h a  = 0,2; параметри х і а змінюються
одночасно.
18. Обчислити функцію у та підрахувати добуток П перших шести
значень:

де х є [5;25], h x =0,5.
19. Обчислити значення функції у за умови:

де nє [0; 20], h n = 2.


20. Обчислити значення у за умови:

де h z  = 2; h x  = 1.


21. Обчислити значення функції у за умови:

де х є [0; 8], h x  = 2; параметри а та b обрати довільно.


22.  Ввести координати десяти точок на площині і визначити, яка
чверть координатної площини містить найбільшу кількість заданих
точок.

41
23.  Ввести п'ять наборів значень сторін трикутника а, в,  с і визначити,
для яких сторін висота (h a ,  h b , h c ) буде найменшою.
Довідка:

24.  Ввести координати п'яти точок і визначити, яка з них потрапить у


коло з радіусом R і координатами центра (а,b).
Довідка: рівняння кола має вигляд (х - а) 2  + (у - b) 2  = R 2 .
25.  Ввести шість шестирозрядних цілих чисел і знайти, для яких з них
сума «лівих» трьох цифр більше суми «правих» трьох.
Зміст звіту:
- Тема роботи
- Мета роботи
- Постановка задачі згідно варіанту
- Програма
- Результати роботи
- Відповіді на контрольні запитання
- Висновки.

Лабораторна робота № 6. Тема: Обробка масивів в програмах на С++


МЕТА РОБОТИ: отримати практичні навики по опису і обробці одновимірних і
двовимірних масивів на мові C++
Хід роботи
1. Одновимірні масиви:       
Скласти програму, що виконує наступні функції
1.1. Даний масив з 10 цілих чисел . Заповнити масив випадковими
значеннями, видати масив на екран
1. 2 Знайти середнє значення позитивних елементів і кількість негативних 
елементів
1.2.    Всі елементи менше 5 зменшити мінімальний елемент масиву
2. Скласти програму, що виконує наступні функції:
2.1.    Даний двовимірний масив дійсних чисел розміром 4х5. Заповнити
масив випадковими числами видати на екран у вигляді матриці
2.2.    В масиві знайти мінімальний елемент і додасть його до елементів
першого стовпця
2.3. В масиві знайти кількість негативних елементів в непарних стовпцях і
середнє значення елементів в парних стовпцях
 
Виконання роботи

42
 
Одновимірні масиви
//підключаємо заголовні файли
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
void main()
{
      //описуємо змінні і масив     
      float а,b,sum,kol1,kol2;
      int mas[10],i,min;
      //вводимо кінці відрізка     
      cout<<"Введите кінці відрізка: ";
      cin>>a>>b;
 
      //формуємо масив і виводимо на екран     
      cout<<"Исходный масив:\n";
      randomize();
      for (i=0; i<=9; i++)
    {
              mas[i]=(b-a)*rand()/32767+a;
              cout<<"mas["<<i+1<<"]= "<<mas[i]<<"\n";
    }
    
      //знаходимо середнє позитивних елементів масиву
      //и кількість негативних елементів масиву     
      for (sum=0, kol1=0, kol2=0, i=0; i<=9; i++)
              if (mas[i]>=0)
        {
                      sum+=mas[i];
                      kol1++;
        }
              else
                      kol2++;
      //виводимо знайдені значення на екран
      cout<<"Среднее позитивних елементів = "<<sum/kol1<<"\n";
      cout<<"Количество негативних елементів = "<<kol2<<"\n";
 
      //знаходимо мінімальне значення масиву
      for (min=mas[0], i=0; i<=9; i++)
              if (mas[i]<min)
                    min=mas[i];
      //виводимо знайдене значення на екран     
43
      cout<<"Минимальный елемент = "<<min<<"\n";
 
      //елементи, менші 5, зменшуємо на min     
      for (i=0; i<=9; i++)
              if (mas[i]<5)
                      mas[i]=mas[i]-min;
 
      //виводимо отриманий після зменшення масив     
      cout<<"Массив після зменшення на min:\n";
      for (i=0; i<=9; i++)
              cout<<"mas["<<i+1<<"]= "<<mas[i]<<"\n";
      //робимо паузу для перегляду    
      getch();
return;
}
 
Двовимірні масиви
//підключаємо заголовні файли
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
void main()
{
      //описуємо масив і змінні
      float mas[4][5],a,b,min,sum,kol1,kol2;
      int i,j;
   
      //вводимо кінці відрізків
      cout<<"Введите кінці відрізка: ";
      cin>>a>>b;
   
      //формуємо масив і виводимо на екран
      cout<<"Исходный масив:\n";
      cout.precision(2);
      randomize();
      for (i=0; i<=3; i++)
    {
              for (j=0; j<=4; j++)
        {
                      mas[i][j]=(b-a)*rand()/32767+a;
                      cout.width(6);
                      cout<<mas[i][j]<<" ";
        }
44
              cout<<"\n";
    }
   
      //знаходимо мінімальний елемент в масиві 
      for (min=mas[0][0], i=0; i<=3; i++)
              for (j=0; j<=4; j++)
                      if (mas[i][j]<min)
                              min=mas[i][j];
      cout<<"Минимальный елемент рівний: "<<min<<"\n";
    
      //додаємо min до першого стовпця масиву
      for (i=0; i<=3; i++)
              mas[i][0]+=min;
    
      //виводимо отриманий масив на екран
      cout<<"Массив після надбавки min до першого стовпця:\n";
      cout.precision(2);
      randomize();
      for (i=0; i<=3; i++)
    {
              for (j=0; j<=4; j++)
        {
                      cout.width(6);
                      cout<<mas[i][j]<<" ";
        }
              cout<<"\n";
        }
      //знаходимо середнє в парних стовпцях і
      //кількість негативних елементів в непарних стовпцях
      for (sum=0, kol1=0, kol2=0, i=0; i<=3; i++)
              for (j=0; j<=4; j++)
                      if (j%2!=0)
            {
                              sum+=mas[i][j];
                              kol1++;
            }
                      else
                              if (mas[i][j]<0)
                                      kol2++;
      //виводимо знайдені значення на екран 
      cout<<"Количество негативних елементів в непарних стовпцях =
"<<kol2<<"\n";
      cout<<"Среднее значення елементів в парних стовпцях = "<<sum/kol1;
45
      //робимо паузу для перегляду
      getch();
      return;
}
Варіанти завдання:

Постановка задачі:
Заданий одновимірний цілочисельний масив з n елементів (n<=20 ).
Виконати опрацювання масиву у відповідності з заданим варіантом
завдання:

Варіант1
Знайти:
1. кількість додатніх елементів масиву;
2. номер елемента, який найменше віддалений від середнього арифметичного
всіх елементів масиву;
3. суму елементів масиву із парним номером;

Варіант 2
Знайти:
1. суму від’ємних елементів масиву;
2. елемент, який найменше віддалений від середнього арифметичного всіх
елементів масиву;
3. кількість непарних елементів масиву;

Варіант 3
Знайти:
1. добуток від’ємних елементів масиву;
2. кількість елементів, менших від середнього арифметичного всіх елементів
масиву;
3. номер найбільшого із елементів масиву із непарним номером;

Варіант 4
Знайти:
1. кількість від’ємних елементів масиву;
2. суму елементів, більших від середнього арифметичного всіх елементів
масиву;
3. номер найменшого із елементів з непарним номером;

Варіант 5
Знайти:
1. суму додатніх елементів масиву;

46
2. елемент, найбільш віддалений від середнього арифметичного всіх елементів
масиву;
3. найбільший із елементів з непарним номером;

Варіант 6
Знайти:
1. добуток додатніх елементів масиву;
2. елемент, найбільш віддаленого від середнього арифметичного всіх елементів
масиву;
3. найменший з елементів із парним номером;

Варіант 7
Знайти:
1. кількість додатніх елементів масиву;
2. добуток елементів, менших від середнього арифметичного всіх елементів
масиву;
3. номер найбільшого із елементів з непарним номером;

Варіант 8
Знайти:
1. суму додатніх елементів масиву;
2. кількість елементів, більших від середнього арифметичного всіх елементів
масиву;
3. кількість парних елементів масиву;

Варіант 9
Знайти:
1. суму елементів масиву з непарним номером;
2. елемент, який найменше віддалений від середнього арифметичного всіх
елементів масиву;
3. кількість парних елементів масиву;

Варіант 10
Знайти:
1. добуток від’ємних елементів масиву з непарним номером;
2. номери елементів, менших від середнього арифметичного всіх елементів
масиву;
3. найбільший елемент масиву з непарнима номером;

Варіант 11
Знайти:
1. суму від’ємних елементів масиву;
47
2. кількість елементів, менших від середнього арифметичного всіх елементів
масиву;
3. номер найменшого із елементів з парним номером;

Варіант 12
Знайти:
1. добуток додатніх елементів масиву;
2. кількість елементів, більших від середнього арифметичного всіх елементів
масиву;
3. найбільший із елементів з парним номером;

Варіант 13
Знайти:
1. суму елементів масиву з парним номером;
2. номери елемента, більших від середнього арифметичного всіх елементів
масиву;
3. найменший з непарних елементів масиву;

Варіант 14
Знайти:
1. добуток від’ємних елементів масиву;
2. кількість елементів з парним номером, менших віддалений від середнього
арифметичного всіх елементів масиву;
3. номер найбільшого із елементів масиву;

Варіант 15
Знайти:
1. суму парних елементів масиву;
2. добуток елементів, більших за модулем від середнього арифметичного всіх
елементів масиву;
3. кількість додатніх з елементів з непарним номером;

Варіант 16

Знайти:
1. кількість від’ємних елементів масиву;
2. суму елементів, більших від середнього арифметичного всіх елементів
масиву;
3. номер найменшого із елементів з непарним номером;

Варіант 17
Знайти:
1. суму додатніх елементів масиву;
48
2. елемент, найбільш віддалений від середнього арифметичного всіх елементів
масиву;
3. найбільший із елементів з непарним номером;

Варіант 18
Знайти:
1. добуток додатніх елементів масиву;
2. елемент, найбільш віддаленого від середнього арифметичного всіх елементів
масиву;
3. найменший з елементів із парним номером;

Варіант 19
Знайти:
1. кількість додатніх елементів масиву;
2. добуток елементів, менших від середнього арифметичного всіх елементів
масиву;
3. номер найбільшого із елементів з непарним номером;

Варіант 20
Знайти:
1. суму додатніх елементів масиву;
2. кількість елементів, більших від середнього арифметичного всіх елементів
масиву;
3. кількість парних елементів масиву;

Завдання4
Сформувати двовимірний масив та виконати обчислення згідно
варіанту
Масив і результат записати в текстовий файл. Прочитати файл на екран.
№ Ім’я Розмір Зміст завдання Тип
мас. Ряд., даних
стовп.
1 Х 2,6 Обчислити суму і кількість цілі
додатніх елементів
кожного рядка масиву.
2 А 5,4 Обчислити середнє
арифметичне значення дійсні
елементів кожного стовпця
масиву.
3 Y 3,4 Записати у масив Х цілі
від’ємні елементи масивуY
49
4 B 5,4 Знайти максимальний цілі
елемент масиву В та
порядкові номери рядка
,стовпця.
5 C 2,3 Знайти мінімальний дійсні
елемент масиву С та його
порядкові номери рядка
,стовпця .
6 D 5,2 Записати в масив Т
спочатку додатні, потім цілі
від’ємні елементи масиву
D.
7 Х 6,6 Обчислити суму і кількість цілі
додатніх елементів
масиву ,що лежать на
головній діагоналі.
8 А 7,7 Обчислити середнє
арифметичне значення дійсні
елементів масиву вище
головної діагоналі.
9 Y 5,4 Записати у масив Х парні цілі
елементи масивуY
10 B 5,3 Знайти максимальний цілі
елемент третього рядка
масиву В та порядковий
номер стовпця.
11 C 5,3 Знайти мінімальний дійсні
елементдругого стовпця
масиву C та порядковий
номер його рядка.
12 Y 5,4 Знайти кількість елементів цілі
масиву Y б більших 8.
13 R 4,4 Знайти добуток елементів дійсні
матриці, які знаходяться
нижче головної діагоналі.
14 D 8,8 Знайти суму квадратів
діагональних елементів цілі
матриці.
15 А 6,6 Обчислити середнє
арифметичне значення дійсні
елементів масиву нище
головної діагоналі.
16 D 6,2 Записати в масив С
50
спочатку парні, потім цілі
непарні елементи масиву
D.
17 Х 6,6 Обчислити суму і кількість цілі
непарних елементів масиву
, що лежать на побічній
діагоналі.
18 А 5,7 Обчислити середнє
арифметичне значення дійсні
елементів другого стовпця
масиву.
19 Y 5,7 Записати у масив Х парні цілі
елементи масивуY
20 B 5,3 Знайти максимальний цілі
елемент пятого рядка
масиву В та порядковий
номер стовпця.
21 C 5,6 Знайти мінімальний дійсні
елементдругого стовпця
масиву C та порядковий
номер його рядка.
22 Y 6,4 Знайти суму елементів цілі
масиву Y більших 18.
23 R 5,5 Знайти добуток елементів дійсні
матриці ,які знаходяться
нижче головної діагоналі.
24 D 5,5 Знайти суму квадратів
діагональних елементів цілі
матриці.
25 А 6,6 Обчислити середнє
арифметичне значення дійсні
відємних елементів
масиву,які лежать нище
головної діагоналі.

Варіанти додаткових завдань:

1. За вказівкою користувача обчислити кількість та суму додатних


елементів або добуток від'ємних непарних елементів масиву  m(15).
2. За вказівкою користувача з додатних або від'ємних еле ментів
матриці mt(4,5)утворити одновимірний масив, елементи якого
розмістити в зворотній послідовності
.
51
3. За вказівкою користувача обчислити або добуток та суму
елементів розташованих на парних місцях масиву х(15), або не парні
елементи масиву відсортувати за спаданням.
4. За вказівкою користувача відсортувати або заданий ря док матриці
хm (3,5) за зростанням, або Підрахувати стовпці, в яких максимальний
елемент перевищує чило 9.
5. За вказівкою користувача відсортувати або всі стовпці матриці
хm(3,5), або заданий рядок за спаданням додатних елементів.
6. За вказівкою користувача з елементів масиву а(15) сфор мувати
масив або від'ємних, або додатних елементів.
7. За вказівкою користувача знайти або мінімальний еле мент і його
індекс серед від'ємних елементів масиву х(15), або мінімальний
елемент і його індекс серед парних елементів цьо го масиву.
8. За вказівкою користувача розділити всі елементи матриці а(3,5)
або на суму її додатних елементів, або на кількість непарних
елементів.

9. За вказівкою користувача або здійснити додавання та від німання


матриць а(2,3) іb(2,3), або знайти добуток парних елементів матриць.
10. За вказівкою користувача або поміняти місцями задані рядки
матриці mt(4,5), або здійснити сортування заданих стовпців цієї
матриці за зростанням.
11. За вказівкою користувача або обчислити суму елемен тів
матриці m(4,4), що знаходяться вище і нижче головної діа гоналі, або
знайти додаток елементів кожного стовпця матриці.
12. За вказівкою користувача або обчислити суму та добу ток
від'ємних елементів одновимірного масиву х(20), або знай ти
максимальний елемент серед парних елементів цього масиву.

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


кожному рядку матриці а(3,5), або мінімальний елемент серед
додатних елементів у кожному стовпці матриці.
14. За вказівкою користувача визначити або кількість від'єм них
елементів головної діагоналі матриці m(5,5), або суму елементів, що
знаходяться вище головної діагоналі.
15. Вставити у одновимірний масив m(10) новий елемент у місце, що
зазначене користувачем, не порушуючи розташу вання інших
елементів.
16. За вказівкою користувача розділити всі елементи маси ву х(4,3)
або на кількість додатних, або на суму максимального та
мінімального елементів масиву.

52
17. Знайти за вказівкою користувача індекс або максималь ного, або
мінімального елемента масиву m(15) та записати всі елементи, що
розташовані після цього елемента, в масив mр.
18. Усі непарні та від'ємні елементи матриці  m(4,5) розділити на її
перший або на деякий інший елемент за вказівкою користувача.
19. Обчислити суму елементів кожного рядка матриці  v(4,5) або
кількість додатних елементів стовпців цієї матриці за вказів кою
користувача.
20. За вказівкою користувача або всі непарні елементи мат риці с(4,4)
переписати у масив с1, або додатні елементи трьох рядків — у масив
с2.
21. У відсортований за зростанням масив b(10) вставити у зазначене
користувачем місце новий елемент, не порушуючи сортування.
22. За вказівкою користувача визначити кількість парних елементів
матриці а(5,5), що знаходяться вище головної або нижче побічної
діагоналі.
23. За вказівкою користувача обчислити або суму від'єм них елементів
і добуток додатних, або кількість елементів, що дорівнюють заданому
числу в масиві х(20).
24. За вказівкою користувача всі елементи масиву с(15) роз ділити або
на його максимальний елемент, або мінімальний додатній елемент.
25. За вказівкою користувача відсортувати або всі стовпці матриці
р(4,5) за зростанням значень елементів, або задані ряд ки матриці за
спаданням значень їх елементів.

Лабораторна робота № 7.Тема: Створення програм для обробки текстових


даних
МЕТА РОБОТИ: отримати практичні навики по опису і обробці текстової
інформації в програмах на С++
 
Хід роботи
1. Організовуйте введення довільного тексту з клавіатури;
2. Виведіть початковий текст в зворотному порядку;
3. Визначити, скільки слів в тексті починається на задану букву (букву ввести
з клавіатури);
4. Вивести на екран задану кількість перших і останніх символів тексту
(кількість символів вводиться з клавіатури);
5. Із слів "добрий" і  "ранок" отримати фразу "добрий ранок"
Виконання роботи
53
//підключаємо заголовні файли
#include <iostream.h>
#include <conio.h>
#include <string.h>
void main()
{
          //описуємо рядок str
          //и буферний рядок buf
          char str[80], buf[80], ch;
          int i,j,kol;

          //вводимо початковий текст


          cout<<"Введите текст:";
          cin.getline(str,80);
 
          //записуємо текст в зворотному порядку
          //копіюємо початковий текст в змінну buf
          strcpy(buf,str);
          //видаємо змінну buf в зворотному порядку
          cout<<"Текст в зворотному порядку: "<<strrev(buf)<<"\n";
 
          //визначаємо число слів на задану букву
          //записуємо в buf пропуск
          strcpy(buf," ");
          //к рядку buf додаємо рядок str
          strcat(buf,str);
          //вводимо букву для пошуку
          cout<<"Введите букву для пошуку в тексті: ";
          cin>>ch;
          //організовуємо цикл для пошуку слів
          for (kol=0,i=0;i<=strlen(buf)-2;i++)
                //якщо перший символ пропуск, а другий задана буква
                if(buf[i]==' ' && buf[i+1]==ch)
                        //кількість слів збільшується на 1
                          kol++;
          //видаємо знайдену кількість на екран
          cout<<"Количество слів на букву "<<ch<<" рівно "<<kol<<"\n";
 
          //виводимо на екран задане число символів
          //вводимо потрібне число символів
          cout<<"Введите потрібне число символів: ";
          cin>>kol;
          //виводимо перші симолы тексту
54
          //організовуємо цикл від першого символу
          //до заданого числа
          for (i=0;i<=kol-1;i++)
                  //видаємо поточний символ і курсор залишаємо в рядку
                  cout<<str[i];
          //переходимо на новий рядок
          cout<<"\n";
 
            //виводимо останні симолы тексту
          //організовуємо цикл від заданої кількості
          //и до останнього символу
            for (i=strlen(str)-kol;i<=strlen(str)-1;i++)
                  //видаємо поточний символ і курсор залишаємо в рядку
                  cout<<str[i];
          //переходимо на новий рядок
          cout<<"\n";
 
          //будуємо першу фразу
          //задаємо перше слово в змінній str
          strcpy(str,"Доброе");
          //додаємо до тексту пропуск
          strcat(str," ");
          //додаємо до тексту друге слово
          strcat(str,"утро");
          //видаємо отриманий текст
          cout<<str<<"\n";
 
          //робимо паузу для перегляду
          getch();
          return;
}

Варіанти завдань:

1. Bвести речення та підрахувати і вивести слова, що почи наються на


сполучення літер «св»:
«И тот, в ком светоч разума горит,
Дурных деяний в мире не свершит».
2. У наведеному тексті вивести слова, що починаються та
закінчуються на однакові літери:
«Такт — зто разум сердца и тот,
кто его имеет, — хорошо воспитан».
3. Ввести речення та визначити і вивести найкоротше слово:
55
«Наука есть не что иное, как
отображение действительности ».
4. Приведеного списку прізвищ вивести прізвища, що починаються
на літеру «с» та закінчуються на літеру «в».
5. Визначити, скільки разів у введеному реченні повторю ється літера
«о»:
«Непреодолимого на свете нет ничего».
6. У введеному тексті програмними засобами видалити між словами
всі символи, що не є літерами.
7. Увести текст: «Мёд в лесу медведь нашёл — мало мёда много
пчёл».  Вивести слова,що починаються на літеру «М» або «м».
8. Увести деяку кількість слів та визначити три найдовших слова.
9. Увести список прізвищ, що розташовані у довільному порядку, та
відсортувати його за алфавітом.
10. Увести будь-яке речення і визначити, скільки разів по вторюється
в ньому задане слово.
11. Даний текст розбити на слова і вивести їх за алфавітом:
«Слово — поступок, а понимание — начало согласия».
12. З введеного списку прізвищ вивести ті, що мають дві голосні
літери.
13. Увести вірш та вивести слова, що починаються на літери «с» або
«п»:
«Во всём мне хочется дойти
До самой сути:
В работе, в поисках пути,
   В сердечной смуте».
14. Ввести задане речення та вивести слова, у яких немає сполучення
літер «про» та літери «р»:
«Профессионализм — это стабильность результатов».
15. Увести текст та підрахувати слова, що збігаються з за даним
словом.
16. У наведеному тексті замінити слово «урок» на «опыт»:
«Ошибка одного — урок другому».
17. З уведеного тексту вивести слова із закінченням «ть»:
«Существует только один способ стать
хорошим собеседником — уметь слушать.»
18. Підрахувати, скільки разів у наведеному тексті повто рюється
слово «сессия»:
«Студент бывает весел от сессии до сессии, а сессия
всего два раза в год!»
19. З уведеного списку вивести прізвища із заданою кількістю літер.
20. Вивести слово, що складене з перших літер слів введеного
речення.
56
21. Вивести частину наведеного тексту, що розташована між
словами «заключено» та «єсть»:
«В каждой естественной науке заключено
столько истины, сколько в ней есть математики».
22. Увести речення та підрахувати, скільки разів у ньому
повторюється задане користувачем сполучення літер.
23. Увести невелику програму, написану мовою  С++. Визначити,
скільки в ній операторів і скільки разів повторюється оператор for.
24. Увести нижче поданий тект і вивести слова, які міс тять літеру
«о»:
   «Не позволяй душе лениться, Чтоб воду в ступе не толочь.
Душа обязана трудиться И день и ночь, и день и ночь!»
25. Підрахувати, скільки слів у наведеному реченні містять більше
ніж п'ять символів та вивести ці слова:
«Истина, выраженная словами, есть могущественная сила в жизни
людей».

Задача 2. Задача13.Обробка символьних даних.Глинський Я.Ю.

Лабораторна робота № 8. Тема: Створення програм для опрацювання


структур
МЕТА РОБОТИ: отримати практичні навики по опису і обробці структур в
програмах на С++
 
Хід роботи
1. Об'єкт книга описується наступними властивостями: шифр, автор, назва,
видавництво, рік видання. Описати масив з N книг (кількість книг в масиві
ввести з клавіатури);
2. Скласти програму, яка виконує наступні функції: 
              2.1. Організувати введення інформації про книги; 
              2.2. Підрахувати, скільки книг видано в заданому році; 
              2.3. Вивести на екран автора і назви книг із заданим видавництвом
(вводити можна довільна кількість перших символів видавництва); 
              2.4. Вивести на екран назви новітніх книг (максимальний рік видання).
Якщо таких книг дещо, то вивести все;
Виконання роботи
//підключаємо заголовні файли
#include <iostream.h>
#include <conio.h>
#include <string.h>
57
 
//описуємо структуру "книга"
struct book
{
      //поля шифр і рік видання
      int shifr,god;
      //поля автор, назва, видавництво
      char autor[20], nazv[50], izdat[15];
};
 
//початок головної програми
void main()
{
      //описуємо масив з 30 книг
      book mas[30];
      //описуємо допоміжні змінні
      int i,n,kol,max,god;
      char izdat[15];
 
      //очищаємо екран
      clrscr();
      //вводимо кількість книг
      cout<<"Введите кількість книг: ";
      cin>>n;
      //вводимо дані про n книги
      cout<<"Введите дані про книгах\n";
      for (i=0;i<=n-1;i++)
    {
              cout<<i+1<<"-я книга:\n";
              cout<<"-шифр:"; cin>>mas[i].shifr; cin.get();
              cout<<"-автор: "; cin.getline(mas[i].autor,20);
              cout<<"-название: "; cin.getline(mas[i].nazv,50);
              cout<<"-издательство: "; cin.getline(mas[i].izdat,15);
              cout<<"-год видання: "; cin>>mas[i].god; cin.get();
    }
 
      //вводимо рік видання для пошуку
      cout<<"\nВведите рік видання для пошуку: ";
      cin>>god; cin.get();
      //запускаємо цикл по всьому масиву книг
      for (kol=0,i=0;i<=n-1;i++)
              //якщо рік видання книги рівний введеному року
              if (mas[i].god==god)
58
                      //ту кількість збільшуємо на 1
                      kol++;
      //видаємо знайдену кількість на екран
      cout<<"Книг, виданих в "<<god<< році", є "<<kol<< шт".\n";
 
      //вводимо видавництво для пошуку книг
      cout<<"\nВведите видавництво для пошуку: ";
      cin.getline(izdat,15);
      cout<<"Список книг, виданих в заданому видавництві:\n";
      //запускаємо цикл по всьому масиву книг
      for (i=0;i<=n-1;i++)
              //якщо видавництво книги рівно введеному видавництву
              if (strnicmp(mas[i].izdat,izdat,strlen(izdat))==0)
                      //виводимо на екран автора і назву книги
                      cout<<mas[i].autor<< "<<mas[i].nazv<<"\n";"
 
      //знаходимо максимальний рік видання книг
      //запускаємо цикл по всьому масиву книг
      for (max=mas[0].god,i=0;i<=n-1;i++)
              //якщо черговий елемент більше максимального
              if (max<mas[i].god)
                      //запам'ятовуємо знайдене значення як максимальне
                      max=mas[i].god;
 
      //виводимо знайдене максимальне значення
      cout<<"\nМаксимальный рік видання рівний: "<<max<<"\n";
      cout<<"Список книг, виданих цього року:\n";
 
      //запускаємо цикл по всьому масиву книг
      for (i=0;i<=n-1;i++)
              //якщо рік видання книги рівний максимальному значенню
              if (mas[i].god==max)
                      //виводимо на екран назву цієї книги
                      cout<<mas[i].nazv<<"\n";
 
      //робимо паузу для перегляду 
      getch();
      return;
}

Постановка задачі:

59
Дані назви 15 ЕОМ. Для кожної ЕОМ відомо тип процесора,об’єм ОП
пам’яті,об’єм НDD пам’яті, вартість, частота і рік випуску. Скласти програму
яка вводить дані про всі ЕОМ в масив стуктур . Інформацію про кожну ЕОМ
оформити у вигляді стуктури . Введену інформацію вивести у вигляді таблиці а
також виконати обчислення згідно варіанту.
Варіанти завдань:
1. Вивести параметри ЕОМ з найбільшим об’ємом пам’яті.
1. Вивести параметри ЕОМ з найбільшою вартістю.
1. Вивести параметри ЕОМ з найбільшою частотою.
1. Вивести параметри ЕОМ з найменьшим об’ємом ОП пам’яті.
1. Вивести параметри ЕОМ з найменьшою вартістю.
1. Вивести параметри ЕОМ з найнижчою частотою.
1. Вивести параметри ЕОМ з найбільшим роком випуску.
1. Вивести параметри ЕОМ з найменьшим роком випуску.
1. Обчислити сумарну вартість ЕОМ.
1. Для кожної ЕОМ обчислити відношення вартість/частота.
1. Вивести перелік ЕОМ вартість яких більша 2000.
1. Вивести перелік ЕОМ вартість яких меньша 1500.
1. Вивести перелік ЕОМ з об’ємом пам’яті меньше 128Mб.
1. Вивести перелік ЕОМ з об’ємом пам’яті більше 64 Mб.
2. Вивести параметри ЕОМ з найменьшою вартістю.
3. Вивести параметри ЕОМ з найнижчою частотою.
4. Вивести параметри ЕОМ з найбільшим роком випуску.
5. Вивести параметри ЕОМ з найменьшим роком випуску.
6. Вивести параметри ЕОМ по типу процесора
7. Для кожної ЕОМ обчислити відношення вартість/частота.
8. Вивести перелік ЕОМ вартість яких більша 3000.
9. Вивести перелік ЕОМ вартість яких меньша 1800.
10. Обчислити сумарну вартість ЕОМ.,з 2000р.випуску
11. Вивести перелік ЕОМ з об’ємом HDD пам’яті меньше 10Гб.
12. Вивести перелік ЕОМ з об’ємом HDD пам’яті більше 4 Гб.

Задача 2.
60
Варіанти завдань:

1. Враховуючи відомості про заборгованості групи сту дентів,


вивести за вказівкою користувача або повідомлення про студентів-
харків'ян, які мають заборгованості та їхню кількість, або
повідомлення про іногородніх студентів-боржників.
2. Враховуючи відомості про студентів вашої групи: прізви ще,
ініціали, місце і дату народження, вивести за вказівкою користувача
або повідомлення про студентів, які народилися у заданому місяці,
або список студентів за зростанням року народження.
3. Враховуючи відомості про студентів вашої групи: пріз вище,
ініціали, місце проживання батьків, навчання  — денна, заочна фор-
ма навчання, вивести за вказівкою користувача або повідомлення про
студентів, які закінчили коледж заданої форми навчан ня, або список
студентів, які взагалі не навчались у коледжі.
4. Ввести інформацію про працівників виробничого підроз ділу
такого змісту: прізвище, ініціали, стать, рік народження та
спеціальність. Вивести за вказівкою користувача повідомлен ня або
про працівників жіночої статі заданої спеціальності, або про
працівників чоловічої статі заданого року народження.
5. Ввести інформацію про студентів, що проживають у гуртожитку,
такого змісту: прізвище, стать та номер кімнати. Ви вести за
вказівкою користувача або номера кімнат, у яких про живають юнаки,
або прізвища дівчат, котрі мешкають в одній кімнаті.
6. Ввести відомість успішності студентів з трьох предметів. Вивести
за вказівкою користувача або список студентів з їх се реднім балом,
або дані про студента за заданим прізвищем та ініціалами.
7. Ввести інформацію про працівників виробничого підроз ділу
такого змісту: прізвище, ініціали, вік та спеціальність. Вивести за
вказівкою користувача або середній вік працівників заданої
спеціальності, або список працівників, прізвища яких починаються
на задану літеру.
8. Ввести інформацію про результати складання іспиту з дис ципліни
програмування студентами деякої групи. Вивести за вказівкою
користувача список студентів, що одержали добрі оцінки, або список
студентів за алфавітом, що не склали іспит взагалі.
9. Ввести список студентів з інформацією про їхні оцінки з трьох
предметів. За вказівкою користувача вивести список або за
зростанням середнього бала успішності, або за спаданням середнього
бала.

61
10. Ввести список викладачів кафедри з такою інформацією: прізвище
та ініціали, стать, посада, назва дисципліни, яку викладає. Вивести за
вказівкою користувача або список викладачів-жінок заданої посади,
або повідомлення про викладачів- чоловіків.
11. Ввести список літератури з програмування з такою ін формацією:
прізвища авторів, назва книги та видавнитцва, рік і місце видання.
Вивести за вказівкою користувача або повідомлення про літературу,
що вийшла у заданому році, або назву видань заданих авторів.
12. Ввести список студентів, які проживають у гуртожит ку,
враховуючи прізвище, ініціали, рік народження, номер гуртожитку і
кімнати. Вивести за вказівкою користувача або повідомлення про
студентів, які проживають у заданому гурто житку і народились у
заданому році, або прізвища студентів, які проживають у кімнатах із
заданим номером у двох заданих гуртожитках.
13. Ввести інформацію про групу студентів: прізвище та ініціали,
місце народження, захоплення, стать. Вивести за вказівкою
користувача повідомлення про студенток, які захоплю ються спортом,
або список юнаків, які люблять програмувати та народились у
Харкові.
14. Ввести список, у якому зазначені прізвища, ініціали, адреса та
номери телефонів абонентів. Вивести за вказівкою користувача або
прізвище абонента за заданою адресою і номе ром телефону, або
повідомлення про абонентів, що мають задане прізвище та ініціали.
15. Ввести список, який містить прізвище, ініціали і рік на родження
працівників окремого підрозділу. Вивести за вказівкою користувача
повідомлення про працівників заданого року народження, або список
прізвищ за зростанням року народження.
16. Ввести розклад занять із зазначенням дня тижня, назви предмета,
виду заняття (лекції, практичні, лабораторні) і часу проведення.
Вивести за вказівкою користувача дні тижня, коли із заданого
предмета проводяться лекції, або повідомлення про заняття в заданий
день тижня.
17. Ввести список літературних джерел з курсів, що чита ються у
поточному семестрі. За вказівкою користувача вивести повідомлення
або про літературу з заданої дисципліни, або про назви книг заданого
року видання.
18. Ввести в комп'ютер інформацію про захворювання співробітників:
прізвище та ініціали, рік народження, захворюван ня, тривалість
хвороби. Вивести за вказівкою користувача або прізвище працівника,
який хворів найдовше, або список працівників за зростанням
тривалості хвороби.

62
19. Ввести список спортсменів, що складається з прізвища, статі,
року народження і виду спорту. Вивести за вказівкою користувача
список легкоатлетів або список жінок-гімнасток.
20. Ввести в комп'ютер інформацію про асортимент продо вольчих
товарів в магазині такого змісту: назва магазину, код товару,
кількість цього товару, ціна за кілограм. За вказівкою користувача
або відсортувати магазини за спаданням оптової ціни заданого
товару, або вивести повідомлення, в яких мага зинах є потрібний
товар.
21. Ввести в комп'ютер таку інформацію про потяги: номер потяга,
назву напрямку руху, час прибуття. Вивести за вказів кою
користувача або повідомлення про потяги, що прибувають у заданий
час, або про кількість потягів заданого користувачем напрямку руху.
22. Ввести в комп'ютер інформацію про книги з програму вання
мовою С++. На екран за вказівкою користувача вивести або
повідомлення про книги вітчизняних авторів, або список книг
закордонних авторів, розташованих за спаданням кіль кості сторінок.
23. Ввести в комп'ютер таку інформацію про автомобілі: прізвище та
ініціали власника, модель автомобіля, рік його випуску та
потужність. Вивести за вказівкою користувача марки автомобілів, рік
випуску та потужність яких співпадають з вве деними в рядку запиту,
або прізвища власників автомобілів за алфавітом з відповідними
повідомленнями про їхні автомобілі.
24. Ввести в комп'ютер інформацію про користувачів бібліотеки:
прізвище та ініціали читача, назву кафедри, кількість книг на
абонементі. Вивести за вказівкою користувача або повідомлення про
читача, що має найбільшою кількість книг, або спи сок працівників
заданої кафедри за зростанням кількості книг.
25. Ввести інформацію про студентів групи: прізвище та ініціали,
середні бали за два семестри. Вивести за вказівкою користувача або
повідомлення про студентів, що мають однако вий середній бал за
обидва семестри, або список студентів за спаданням їх середнього
бала в другому семестрі.
 

Лабораторна робота №9.Тема: Створення програм з використанням


власних функцій
МЕТА РОБОТИ: отримати практичні навики по написанню призначених для
користувача функцій і їх застосуванню в головній програмі на С++
 
Хід роботи

63
1. Скласти програму для знаходження значення функції:

Для обчислення оформите у вигляді функції вираз:

2. Хай є три масиви. Сформувати масиви і вивести їх на екран. Визначити в


якому масиві найбільша сума елементів, знайти суму максимальних елементів
масиву і твір мінімальних елементів. Написати функції для роботи з масивом:
- формування масиву на відрізку;
- висновок масиву на екран;
- знаходження суми елементів масиву
- знаходження мінімального елемента
- знаходження максимального елемента

Використовуючи функції вирішити задачу. Хай є три масиви. Сформувати


масиви і вивести їх на екран. Визначити в якому масиві найбільша сума
елементів, знайти суму максимальних елементів масиву і твір мінімальних
елементів.

Виконання роботи
1. Для вирішення першої задачі програма може мати вигляд:

//підключаємо заголовні файли


#include <iostream.h>
#include <conio.h>
#include <math.h>

//описуємо прототип функції f1


//с двома аргументами (n,m)
float f1(float n, float m);

//початок головної програми


void main()
{
//описуємо допоміжні змінні
64
float x,y;
//вводимо значення початкових даних для розрахунку (х)
cout<<"Введите значення змінної x: ";
cin>>x;
//обчислюємо значення виразу з використовуванням
//функції користувача f1
y=f1(роw(x,3),2*x)+f1(4*pow(x,2),-sin(x));
//задаємо точність висновку результату
cout.precision(2);
//виводимо на екран отриманий результат
cout<<"Функция рівна: "<<y;
//робимо паузу для перегляду
getch();
return;
}

//реалізація функції користувача


float f1(float n, float m)
{
//виходимо з функції і передаємо
//в головну програму знайдене значення
return (n+m)/2;
}

2. Для вирішення другої задачі програма може мати вигляд:

//підключаємо заголовні файли


#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

//прототип функції введення масиву


void vvodmas (float m[], int n);
//прототип функції висновку масиву
void vivodmas (float m[], int n);
//прототип функції знаходження
//суми елементів в масиві
float summas (float m[], int n);
//прототип функції знаходження
//максимального в масиві
float maxmas (float m[], int n);
//прототип функції знаходження
//мінімального в масиві
65
float minmas (float m[], int n);

//головна програма
void main()
{
//описуємо три масиви
float mas1[20],mas2[20], mas3[20];
//описуємо змінні для зберігання
//сум по трьох масивах
float s1,s2,s3;
//описуємо змінні для зберігання
//кількості елементів по трьох масивах
int kol1,kol2,kol3;

//очищаємо екран
clrscr();

//формуємо перший масив


//вводимо кількість елементів в масиві
cout<<"Введите кількість елементів 1 масиву: ";
cin>>kol1;
//викликаємо функцію введення масиву
vvodmas(mas1,kol1);
//виводимо отриманий масив на екран
cout<<"1 масив має вигляд:\n";
vivodmas(mas1,kol1);

//формуємо другий масив


//вводимо кількість елементів в масиві
cout<<"Введите кількість елементів 2 масиви: ";
cin>>kol2;
//викликаємо функцію введення масиву
vvodmas(mas2,kol2);
cout<<"2 масив має вигляд:\n";
//виводимо отриманий масив на екран
vivodmas(mas2,kol2);

//формуємо третій масив


//вводимо кількість елементів в масиві
cout<<"Введите кількість елементів 3 масиви: ";
cin>>kol3;
//викликаємо функцію введення масиву
vvodmas(mas3,kol3);
66
cout<<"3 масив має вигляд:\n";
//виводимо отриманий масив на екран
vivodmas(mas3,kol3);

//в змінні s1,s2,s3 записуємо суми елементів масиву


s1=summas(mas1,kol1);
cout<<"\nСумма елементів 1 масиву: "<<s1<<"\n";
s2=summas(mas2,kol2);
cout<<"Сумма елементів 2 масиви: "<<s2<<"\n";
s3=summas(mas3,kol3);
cout<<"Сумма елементів 3 масиви: "<<s3<<"\n";

//визначаємо, в якому масиві знайдена сума максимальна


if (s1>=s2 && s1>=s3)
cout<<"\nМаксимальная сума в 1 массиве\n";
else if (s2>=s1 && s2>=s3)
cout<<"Максимальная сума в 2 массиве\n";
else
cout<<"Максимальная сума в 3 массиве\n";

//виводимо на екран максимальне значення в кожному масиві


cout<<"\nМаксимальный елемент в 1 масиві: "<<maxmas(mas1,kol1)<<"\n";
cout<<"Максимальный елемент в 2 масиві: "<<maxmas(mas2,kol2)<<"\n";
cout<<"Максимальный елемент в 3 масиві: "<<maxmas(mas3,kol3)<<"\n";
//виводимо суму максимальних значень по трьох масивах
cout<<"Сумма="<<maxmas(mas1,kol1)+maxmas(mas2,kol2)+maxmas(mas3,
kol3)<<"\n";

//виводимо на екран мінімальні значення в кожному масиві


cout<<"\nМинимальный елемент в 1 масиві: "<<minmas(mas1,kol1)<<"\n";
cout<<"Минимальный елемент в 2 масиві: "<<minmas(mas2,kol2)<<"\n";
cout<<"Минимальный елемент в 3 масиві: "<<minmas(mas3,kol3)<<"\n";
//виводимо твір мінімальних значень по трьох масивах
cout<<"Произведение="<<minmas(mas1,kol1)*minmas(mas2,kol2)*minmas(
mas3,kol3);

//робимо паузу для перегляду


getch();
return;
}

//реалізація функції введення масиву


67
void vvodmas (float m[], int n)
{
//описуємо змінні для введення кінців відрізка
float а,b;
int i;
//вводимо кінці відрізка
cout<<"Для формування масиву вкажіть кінці відрізка: ";
cin>>a>>b;
//в циклі заповнюємо масив випадковими числами
for (i=0; i<=n-1; i++)
m[i]=(b-a)*rand()/32767+a;
//виходимо з функції в головну програму
return;
}

//реалізація функції висновку масиву


void vivodmas (float m[], int n)
{
int i;
//задаємо точність висновку
cout.precision(3);
//в циклі виводимо масив в один рядок через пропуск
for (i=0; i<=n-1; i++)
cout<<m[i]<<" ";
//після закінчення висновку перекладаємо курсор на новий рядок
cout<<"\n";
//виходимо з функції в головну програму
return;
}

//реалізація функції знаходження суми елементів


float summas(float m[], int n)
{
//спочатку сума обнуляється
float sum=0;
int i;
//в циклі рахуємо суму елементів
for (i=0; i<=n-1;i++)
sum+=m[i];
//виходимо з функції і передаємо
//в головну програму знайдену суму
return sum;
}
68
//реалізація знаходження максимального значення
float maxmas(float m[], int n)
{
//спочатку максимальний елемент перший
float max=m[0];
int i;
//в циклі шукаємо максимальний елемент масиву
for (i=0; i<=n-1;i++)
if (max<m[i])
max=m[i];
//виходимо з функції і передаємо
//в головну програму знайдений максимум
return max;
}

//реалізація знаходження мінімального значення


float minmas(float m[], int n)
{
//спочатку мінімальний елемент перший
float min=m[0];
int i;
//в циклі шукаємо мінімальний елемент масиву
for (i=0; i<=n-1;i++)
if (min>m[i])
min=m[i];
//виходимо з функції і передаємо
//в головну програму знайдений мінімум
return min;
}
Варіанти завдань:
Задача 1. Скласти проект, що містить 5-10 власних математичних
функцій( n!, НСД, Х k , mysin(x), mycos(x), mytg(x) і т.д.). Порівняти
одержані результати з результатами стандартних функцій.
Задача2.
1.функцію, що знаходить середнє геометричне всіх від'ємних
елементів масивів А(12), В(10), С(8).
2. Розробити функцію видалення підрядка в n символів з k-ої позиції
введеного рядка та використати її для обробки декількох рядків
тексту.
3. Скласти функцію, що обчислює середнє арифметичне та середнє
геометричне додатних елементів матриці. Застосувати розроблену
функцію для обробки трьох двовимірних масивів.
69
4. Обчислити площу багатокутника за допомогою функції, що
визначає площу за координатами його вершин.
5. Розробити функцію визначення середнього значення пар них
елементів матриці та мінімального серед непарних елементів та з її
допомогою обробити три двовимірних масиви.
6. Скласти функцію знаходження середнього арифметичного
значення елементів масиву, розташованих на непарних місцях, та
застосувати її для обробки декількох одновимірних масивів.
7. Розробити функцію, яка здійснює перестановку макси мального
від'ємного та мінімального додатного елементів одновимірного
масиву, і застосувати її для обробки чотирьох маси вів різної
довжини.
8. Розробити функцію сортування стовпців двовимірних ма сивів за
зростанням і застосувати її для обробки декількох матриць
довільного розміру.
9. Розробити функцію, яка записує від'ємні непарні еле менти
довільної матриці в одновимірний масив, та застосувати її для
обробки матриць А(5,4), В(3,2), С(4,4).
10. Розробити функцію, що обчислює суму діагональних елементів
квадратної матриці, і за її допомогою знайти суми діагональних
елементів трьох матриць.
11. Скласти функцію визначення суми та кількості елемен тів, що
розташовані між мінімальним і максимальним елементами матриці,
та застосувати її для обробки трьох довільних двовимірних масивів.
12. Розробити функцію, що здійснює підрахунок кількості непарних
та добутку додатних елементів одновимірного масиву, і за її
допомогою обробити п'ять масивів різної довжини.
13. Три групи студентів складали іспит з трьох предметів. Розробити
функцію сортування списку студентів за спаданням оцінок за
предметом і за її допомогою вивести відповідні повідомлення про
студентів кожної групи.
14. Розробити функцію визначення найдовшого слова в ряд ку та з її
допомогою одержати фразу із найдовших слів п'яти речень.
15. Розробити функції обчислення площ трикутника за формулою
Герона та за формулою, що використовує основу трикутника і його
висоту. Роботу функцій перевірити при визначенні площ декількох
довільних трикутників.
16. Скласти функцію підрахунку кількості слів у реченні та
використати її для обробки кількох речень.
17. Розробити функцію, що здійснює виділення в тексті слів-
паліндромів (тобто слів, які читаються однаково зліва-направо і
справа-наліво), та за її допомогою обробити введений текст.

70
18. Скласти функцію, що визначає в кожному стовпці мат риці
кількість від'ємних елементів та максимальний елемент. Використати
цю функцію для обробки декількох матриць довільного розміру.
19. Розробити функцію, що визначає корені квадратного рівняння і
перевіряє їх за теоремою Вієта, та розв'язати за її допомогою
декілька рівнянь.
20. Розробити функцію визначення частоти появи голосних літер у
тексті та використати її для обробки декількох речень.
21. Розробити функцію визначення суми членів арифметич ної
прогресії і реалізувати її для трьох арифметичних прогресій з різною
кількістю членів.
22. Розробити функцію визначення кількості появи заданої
приголосної в тексті та застосувати цю функцію для обробки
декількох речень.
23. Скласти функцію перестановки максимального елемен та заданого
стовпця матриці з мінімальним елементом заданого рядка матриці.
Застосувати цю функцію для обробки трьох двовимірних масивів.
24. Розробити функцію, що здійснює сортування всіх еле ментів
масиву за спаданням і знаходить добуток парних елементів, та за
допомогою цієї функції обробити три одновимірних масиви довільної
довжини.
25. Скласти функцію обчислення найбільшого спільного дільника
двох чисел та продемонструвати її роботу для наборів пар чисел.

Лабораторнеа робота № 10. Тема: Створення програм для роботи з


файлами
МЕТА РОБОТИ: отримати практичні навики по використовуванню файлів
в програмах на С++
 
Хід роботи
Теоретичні відомості
Програма С ++ може взаємодіяти не тільки з екраном DOS, але і з
файлами. Ми будемо розглядати роботу з текстовими файлами (* .txt) і
таблицями MS Excel (* .xls).
Щоб програма могла взаємодіяти з файлом, неоходімо використовувати
змінну типу файловий потік. Така змінна задається ключовим словом fstream.
Для роботи з файловим потоком необхідно:
1. підключити бібліотеку fstream:
#include <fstream>
2. оголосити змінну типу файловий потік:
fstream f;
3. відкрити файл:
71
- для запису в файл:
f.open ( “1.txt”, ios :: out);
- для читання з файлу:
f.open ( "1.txt", ios :: in);
4. зробити запис в файл або читання з файлу:
- для запису в файл:
f << "x =" << x;
- для читання з файлу:
f >> x;
5. закрити файл: f.close ();
Примітка. При відкритті файлу на запис файл створюється в папці з
проектом. Якщо файл вже існує, то весь вміст стирається.
Якщо потрібно дозаписати в кінець вже існуючого файлу, то при відкритті
файлу треба використовувати рядок:
f.open ( "1.txt", ios :: app);
Приклади задач:
// 8.1.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
double x;
fstream f;
f.open("1.txt", ios::in);
f>>x;
f.close();
cout<<"x="<<x<<endl;
return 0;
}

// 8.2.cpp: определяет точку входа для консольного приложения.


//
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
double a, b;
fstream ftxt, fxls;
a=7.2;

72
b=-10.89;
cout<<"a="<<a<<" b="<<b<<endl;
ftxt.open("1.txt", ios::out);
fxls.open("2.xls", ios::out);
ftxt<<"a="<<a<<" b="<<b;
fxls<<"a=\t"<<a<<"\tb=\t"<<b;
ftxt.close();
fxls.close();
return 0;
}

// 8.3.cpp: определяет точку входа для консольного приложения.


#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <iomanip>
#include <fstream>
using namespace std;
int main()
{
double x, y;
fstream f;
f.open("1.xls", ios::out);
cout<<setw(10)<<"x"<<setw(10)<<"y"<<endl;
f<<"x"<<"\t"<<"y"<<endl;
for(x=0; x<=2; x=x+0.1){
y=sin(x);
cout<<setw(10)<<x<<setw(10)<<y<<endl;
f<<x<<"\t"<<y<<endl;
}
f.close();
return 0;
}

Результат выполнения программы:

экран DOS:

73
табличный файл 1.xls:

Файл 1.xls с построенным графиком:

74
Код программы:

// 8.4.cpp: определяет точку входа для консольного приложения.


//
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <iomanip>
#include <fstream>
using namespace std;
int main()
{
double a[5][5], s, p;
int i, j, k;
fstream f;
f.open("1.xls", ios::out);
cout<<"matrix:"<<endl;
f<<"матрица:"<<endl;
for(i=0; i<5; i=i+1){
for(j=0; j<5; j=j+1){
a[i][j]=7.0*sin(2.3*i*j);
cout<<setw(10)<<a[i][j];
f<<'\t'<<a[i][j];
}
cout<<endl;
f<<endl;
}
s=0;
for(i=0; i<5; i=i+1){
for(j=0; j<5; j=j+1){
75
if(a[i][j]>0){
s=s+a[i][j];
}
}
}
cout<<"s="<<s<<endl;
f<<"Сумма положительных=\t"<<s<<endl;
p=1;
for(i=0; i<5; i=i+1){
for(j=0; j<5; j=j+1){
if(i==j){
p=p*a[i][j];
}
}
}
cout<<"p="<<p<<endl;
f<<"Произв. на гл. диаг.=\t"<<p<<endl;
k=0;
for(i=0; i<5; i=i+1){
for(j=0; j<5; j=j+1){
if(a[i][j]>2){
k=k+1;
}
}
}
cout<<"k="<<k<<endl;
f<<"Количество элем.>2 =\t"<<k<<endl;
f.close();
return 0;
}
Варіанти задач:
Скласти проект для табуляції функції, та значень відповідно до
варіанту завдань. Результати табуляції та обчислень записати у текстовий
файл ( f1.txt та f1.xls). Прочитати файл на екран. Побудувати графік
функції( в Excel)

Задача1.
№ Функція Y(X) A B H ОБЧИСЛИТИ:
1. y=x2+16/x-16 1 4 0.5 середнє арифметичне всiх y
2. y=arctg4x 0 2 0.5 суму i кiлькiсть 0,71<y<2
3. y=ln(2+sin2x) 0 3 0.6 суму y>1 і кількість y<1
4. y=x3ln(1+x) 1 6 1.0 кількість і добуток y<100
5. y=xearctgx 0 6 1.2 середнє арифметичне 1<y<7,9
6. y=arctgx/(1+x2) 0 1.5 0.8 суму y<0,4 і добуток y>0,4
7. y=sin2x/(1+x2) 0 6 0.8 суму y<0 ікількість y>0
76
8. y=xe-x -2 3 1.0 суму і добуток y>0
9. y=lnx+arctgx 0.5 2 0.5 середнє геометричне y>0,3
10. y=(ex-e-x)/2 0.3 2 0.3 добуток y>1 і суму y<1
11. y=x 2lnx 1 10 2.0 середнє геометричне y>5
12. y=lnx+cos2x 1 1.5 0.1 середнє арифметичне y<=0,3
13. y=(ex+e-x)/2 -1 2 0.4 суму і кількість y>2
14. y=arccosx 0.1 0.6 0.1 суму і кількість y<=1,3
15. y=4-x-4/x2 1 4 0.5 кількості y<-0,5 i y>-0,5
16 y=el+x 0 1 0.2 кількість і добуток y>4,12
17 y=ln(2+cos2x) 0 3 0.3 суму і добуток y<=0,95
18 y=3-x-4/(x+2)2 -1 2 0.4 кількості y<0 i y>0
19 y=(lnx)/x 3 1 2 0.2 кількість і суму 0,2<y<0,5
20 y=x/sin 2x 0.5 1 0.1 суму y=>-0 i y<-0,1
21 y=(sinx+x2)/ln 2 4 0.4 кількості y>8,3 i y<8,3
22 y=xexsin2x 0 1 0.2 середнє геометричне 0<y<0,3
23 y=ln3x+arctgx 1 2 0.2 суму і добуток 0,5<y<1,5
24 y=xe-x 1 2 0.2 добуток і кількість 0<y<0,3
25 y=ln(1+x) 1 4 0.5 суму і кількість y>2.5

Задача2
1. Скласти програму для обчислення суми ряду по заданому вигляду загального члена з
заданною точністю 0.001 . Елементи ряду, їх порядкові номера та загальну суму вивести
у текстовий файл rezult.txt . Варіанти задач згідно таблиці № 10_2
№ аn x № аn k x
варіанта k варіанта
1 (xln3)n 0, 16 Cos(2nx) 0 0,28
n! 0 25 2
4n -1
2 (-1)n-1 sin(nx) 0,83 17 X4n+1 0 0,38
n 1 4n+1
2
3. n 0,37 18 N2+1 0 0,47
----------------- xn 1 ____ (x/2)n
(2n+1)! n!
4 cos(nx/2) 0 19 sin(2n-1)x 1 1,04
n! 0,54 2n-1
2n
5 x 0 20 (2x)n 1 0,46
n
(-1) --------- 0,41 n!
(2n)!
6 cos(nx) 1 21 2n2+1 0 0,91
n 2n
n
(-1) ----------- 1,25 (-1) -----x
n 2 (2n)!
7 n 2n-1 0 0,75 22 (1-x)n 0 0,43
2n n
(-1)--------x (-1) ------
(2n)! n!
8 x2n+1 1 0,58 23 cos(2n-1)x 1 1,32
n+1
(-1) ----------- (2n-1) 2

77
4n2-1
9 (1+x)2n 1 - 24 n 2 -0,44
n n
(-1) ----------- 1,34 (-1) ---sin(nx)
n n2-1
10 x2n 1 0,45 25 (2x)n 1 -0,25
n+1 n+1
(-1) ----------- (-1) -------
2n(2n-1) n3
11 cos(nx) 0 0,77 26 n+1 0 1,55
n! ---------- xn
n!
12 (2x)2n 1 0,34 27 n+1 0 0,88
n
(-1) ----------- (-1)n------- xn
(2n)! n2+2
13 x2n-1 1 0,65 28 n2 1 0,51
(-1)n-1---------- ------- xn
2n-1 (n+1)!
n
14 x 1 1,12 29 xn 1 1,04
n
n! (-1) -------
2n+3
15 2n+1 0 0,52 30 xn 1 0,72
-------- x2n (-1)т-------
n! (n!)2

Приклад Задача5.
Записати у файл (...txt, …. xls ) два дійсних числа.
Дописати ці файли двома цілими числами. Прочитати файли на екран.
Код программы для примера1:

// 8.2.cpp: определяет точку входа для консольного приложения.


//
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
double a, b;
fstream ftxt, fxls;
a=7.2;
b=-10.89;
cout<<"a="<<a<<" b="<<b<<endl;
ftxt.open("1.txt", ios::out);
fxls.open("2.xls", ios::out);
ftxt<<"a="<<a<<" b="<<b;

78
fxls<<"a=\t"<<a<<"\tb=\t"<<b;
ftxt.close();
fxls.close();//
return 0;
}

Результат выполнения программы:

экран DOS:

текстовый файл 1.txt:

табличный файл 2.xls:

// 8.2.cpp: определяет точку входа для консольного приложения.


//
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
double a, b;
fstream ftxt, fxls;
a=100.2;
b=20.12;
cout<<"a="<<a<<" b="<<b<<endl;
ftxt.open("1.txt", ios::app);

79
fxls.open("2.xls", ios::app);
ftxt<<"a="<<a<<" b="<<b;
fxls<<"a=\t"<<a<<"\tb=\t"<<b;
ftxt.close();
fxls.close();//
return 0;
}
Виконати програму, Переглянути результати!

Бінарні файли:
У попередніх програмах запис даних у файл та їх читання з файла
здійснювалось послідовно поелементно. Але записати або прочитати декілька
даних (наприклад, масив чисел) можна однією операцією.

Для цього використовують функції-члени відповідних класів, які мають


вигляд:
in.write((char*)&p,sizeof(p)); — для запису даних у файл,
in.read((char*)&p,sizeof(p)); — для читання даних з файла,
де іn — ім'я потоку введення або виведення;
р — змінна будь-якого типу, якщо змінна  р має тип char[ ], то операція її
приведення не потрібна.
Функції wtrite() і read() зручно використовувати для орга нізації прямого
доступу до даних у файлі. Але для цього потріб ні також функції-члени, які
дозволяють переміщати покажчик потоку в будь-яке місце файла. Ці функції
застосовуються при запису даних у файл та при їх читанні з файла і мають відпо -
відно вигляд:
in.seekp(n, dir);
in.seekg(n, dir);,
де in — ім'я відповідного потоку (введення або виведення);
n — параметр, що вказує кількість байт, на яку треба пе ремістити покажчик
потоку;
dir — необов'язковий параметр, що вказує на спосіб перемі щення покажчика і
приймає одне зі значень:
ios::beg — переміщення від початку файла;
ios::cur — переміщення від поточної позиції;
ios::end — переміщення від кінця файла.
Якщо параметр dir відсутній, то переміщення покажчика здійснюється з
початку файла.

80
Розглянемо програму, в якій використовуються методи пря мого доступу до
даних у файлі.
Приклад  10.7. Записати у файл числову матрицю розміром  3x5, потім,
користуючись засобами прямого доступу, прочитати з файла спо чатку другий
рядок, а потім перший.
// Р10 7.СРР  — запись  в файл  числовой матрицы // чтение из файла второй
и первой строк матрицы
#include <iostream.h>
#include<fstream.h>
#include <iomanip.h>
#include <conio.h>
const int n=3, m=5;
main()
{ int i, j, mas[m];
char fname[ ]="matr.dat";
ofstream fout(fhame);
if (!fout) cout << "Cannot open file\n";
//---------- ввод и запись в файл строк матрицы
for( i= 0; і < n; i++)
{ cout << "Enter "<< і << "stroku\n";
for (j = 0; j<m; j++) 
cin >> mas[j];
fout.write((char*) &mas, sizeof(mas));
}
        fout.close();
        ifstream fin(fname);
if (!fin)
cout << "Cannot open file for reading\n";
         cout << "\nVivod 2 і 1 strok matrix\n\n";
//--------- чтение из файла и вывод 2-ой строки:
fin.seekg(i*sizeof(mas));
fin.read((char") &mas, sizeof(mas));
for (j = 0; j<m;j++)
cout << setw(3) << mas[j];
cout << endl;
         //--------чтение из  файла  и вывод 1-ой строки:
fin.seekg(O);
fin.read((char*)&mas, sizeof(mas>);

81
for (j = 0; j < m; j++)
cout << setw(3) << mas[j];
cout << endl;
fin.close();
getch();
}
Результат роботи програми:
Enter Ostroku
 12 3 4 15 0
Enter lstroku
5 6 17 8 10
Enter 2stroku
           11 45 9 46 3
Vivod 2 і 1 strok matrix
5 6 17 8 10
12 3 4 15 0

Задача 3. 
1. Об'єкт книга описується властивостями: шифр, автор, назва, ціна.
Скласти програму, що виконує наступні функції:
              1.1. Видати меню з режимами роботи:
                                      1 - створення файлу
                                      2 - додавання у файл
                                      3 - книги з максимальною ціною
                                      4 - кількість книг вказаного автора
                                      5 – читання файлу
6 -вихід;
              1.2. При виборі першого пункту створюється файл BIBLIO.DAT і
записується в нього інформація про N книг;
              1.3. При виборі другого пункту можна додати в  файл ще M книг;
              1.4. При виборі пункту 3  на екран з файлу виводяться назви книг
з максимальною ціною;
              1.5. При виборі пункту 4 програма підраховує кількість книг
вказаного автора (автора ввести з клавіатури);

 
Виконання роботи
//підключаємо заголовні файли
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string.h>
82
#include <stdio.h>
using namespace std;
//описуємо структуру "книга"
struct book
{
int shifr;
char autor[15], nazv[30];
float cena;
};
void main()
{
//описуємо змінну для роботи із структурою
book bk;
//описуємо допоміжні змінні
int i, n, k, b, kol;
float maxcena;
char autor[15];
setlocale(LC_ALL, "rus");
//обнуляємо ознаку завершення програми
b = 0;
//поки b=0 повторюватимемо цикл видачі меню
while (b == 0)
{
//очищаємо екран

//видаємо меню програми


cout << "1 - створення файлов\n";
cout << "2 - додавання у файл\n";
cout << "3 - книги з максимальною ценой\n";
cout << "4 - книги вказаного автора\n";
cout << "5 - читання файлу\n";
cout << "6 - выход\n";
//запрошуємо вибір користувача з меню
cout << "Сделайте вибiр:"; cin >> k;

//обробляємо вибраний пункт меню


switch (k)
{

//якщо вибраний перший пункт меню


case 1:
{
//описуємо змінну для читання з файлу
ofstream file1;
//пов'язуємо змінну з файлом на диску і створюємо файл
file1.open("biblio.dat", ios::binary);
//вводимо кількість книг
cout << "Введите кількість книг: ";
cin >> n;
//організовуємо цикл для введення даних
for (i = 0; i <= n - 1; i++)
{ //вводимо дані про i книгу
cout << i + 1 << "-я книга:\n";
cout << "-шифр: "; cin >> bk.shifr; cin.get();
cout << "-автор: "; cin.getline(bk.autor, 15);
cout << "-название: "; cin.getline(bk.nazv, 30);
cout << "-цена: "; cin >> bk.cena; cin.get();
//записуємо i книгу у файл
file1.write((char*)&bk, sizeof bk);
}
//закриваємо файл
file1.close();

83
file1.clear();
break;
}

//якщо вибраний другий пункт меню


case 2:
{
//змінна file1 для додавання у файл
ofstream file1;
//змінна file1 зв'язується з файлом biblio.dat в режимі додавання
file1.open("biblio.dat", ios::app);
//вводимо кількість книг для додавання
cout << "Введите кількість книг: ";
cin >> n;
//в циклі вводимо дані про i книгу
for (i = 0; i <= n - 1; i++)
{
cout << i + 1 << "-я книга:\n";
cout << "-шифр: "; cin >> bk.shifr; cin.get();
cout << "-автор: "; cin.getline(bk.autor, 15);
cout << "-название: "; cin.getline(bk.nazv, 30);
cout << "-цена: "; cin >> bk.cena; cin.get();
//записуємо дані про i книгу в file1
file1.write((char*)&bk, sizeof bk);
}
//закриваємо файл
file1.close();
file1.clear();
break;
}

//якщо вибраний третій пункт меню


case 3:
{
//припускаємо, що максимальна ціна рівна 0
maxcena = 0;
//описуємо змінну для читання з файлу
ifstream file1;
//зв'язуємо змінну file1 з файлом biblio.dat
file1.open("biblio.dat", ios::out);
//в циклі читаємо дані з фала file1
//и знаходимо максимальну ціну
while (file1.read((char*)&bk, sizeof bk))
if (bk.cena>maxcena)
maxcena = bk.cena;
//виводимо максимальну ціну на екран
cout << "Максимальная цена=" << maxcena << "\n";
cout << "Список книг з максимальною ціною:\n";
//розблокуємо файл file1
file1.clear();
//переходь на початок файлу
file1.seekg(0);
//в циклі читаємо дані з фала file1
while (file1.read((char*)&bk, sizeof bk))
//якщо ціна рівна максимальному значенню
if (bk.cena == maxcena)
//виводимо на екран назву цієї книги
cout << bk.nazv << "\n";
//закриваємо файл file1
file1.close();
file1.clear();
//робимо паузу для перегляду

84
cout << "Для продовження натискуйте будь-яку клавішу...";

break;
}

//якщо вибраний четвертий пункт меню


case 4:
{
cin.get();
//вводимо автора для пошуку
cout << "Введите автора для пошуку: "; cin.getline(autor, 15);
cout << autor << "\n";
//описуємо змінну для читання з файлу
ifstream file1;
//пов'язуємо змінну з файлом biblio.dat
file1.open("biblio.dat");
//припускаємо, що кількість рівно 0
kol = 0;
//в циклі читаємо дані з файлу
while (file1.read((char*)&bk, sizeof bk))
//якщо автор книги рівний введеному автору
if (strncmp(bk.autor, autor, strlen(autor)) == 0)
//кількість збільшується на 1
kol++;
//виводимо кількість книг на екран
cout << "Количество книг вказаного автора рівно " << kol << "\n";
//закриваємо файл file1
file1.close();
//робимо паузу для перегляду
cout << "Для продовження натискуйте будь-яку клавішу...";

break;
}
case 5:
{
//описуємо змінну для читання з файлу
ifstream file1;
//пов'язуємо змінну з файлом biblio.dat
file1.open("biblio.dat");

//якщо вибраний п'ятий пункт менюcout << "Список книг \n";


//розблокуємо файл file1
file1.clear();
//переходимо на початок файлу
file1.seekg(0);
//в циклі читаємо дані з фала file1
cout << "шифр" << "\t" << "назва" << "\t" << "автор" << "\t" << "цiна" << "\n";
while (file1.read((char*)&bk, sizeof bk))
{
//виводимо на екран книги
cout << bk.shifr << "\t" << bk.nazv << "\t" << bk.autor << "\t" << bk.cena << "\n";
}
//закриваємо файл file1
file1.close();
file1.clear(); break;
}
//робимо паузу для перегляду
case 6:
{
//ознака виходу з циклу програми рівна 1
b = 1;
break;

85
}
} //кінець switch
} system("Pause");
return;

}
Варіанти завдань:
1. Створити файл і записати в нього список групи із зазна ченням
прізвища студента, статі і віку. Прочитати файл і вивести
інформацію про студентів за заданими віком та статтю.
2. Створити файл, у який записати список студентів із за значенням
прізвища, ініціалів, назви групи, середнього бала, отриманого на
сесії, і місця проживання. Вивести всі дані про студентів, середній
бал яких не менше чотирьох.
3. Створити файл, у який записати бібліографічну інформа цію про
прочитані книги: автор, назва книги, рік видання. Прочитати цей
файл і вивести назву книг, що видані у заданому користувачем році
видання.
4. Створити файл, у який записати інформацію про студен тів групи:
прізвище, ініціали, рік народження, стать. Вивести інформацію про
студентів, що народились у зазначеному користувачем році.
5. Створити файл з повідомленнями про прізвища влас ників
автомобілів, марки автомобілів, їх колір та рік випуску. Вивести
прізвища власників, що мають автомобіль зазначеного користувачем
року випуску, марки та кольору.
6. Створити файл з такими повідомленнями про виклада чів:
прізвище, ініціали, назва кафедри, назва дисципліни, що викладає.
Вивести повідомлення про викладачів з розташуван ням їх прізвищ у
алфавітному порядку.
7. Записати у файл матрицю М(4,5), прочитати цей файл та вивести
максимальні елементи другого рядка та четвертого стовпця матриці.
8. Створити файл, який містить номери потягів, їх марш рут та час
відправлення. При читанні цього файла вивести повідомлення про
маршрут проходження і час відправлення потяга із заданим
користувачем номером.
9. Створити файл, який містить інформацію про студентів-харків'ян:
прізвище, ініціали, середній бал за сесію, номер телефону і адресу.
Вивести повідомлення про студентів за зростанням їх бала за сесію.
10. Створити файл, який містить повідомлення про студентів групи,
що мають заборгованість по окремих предметах. При читанні файла
вивести прізвища студентів за спаданням кількості заборгованостей.
11. Записати у файл довільну матрицю, прочитати отрима ний файл та
вивести матрицю, відсортовану за зростанням елементів рядків.
12. Записати у файл довільну квадратну матрицю, прочита ти цей файл
та вивести елементи матриці, розташовані вище побічної діагоналі.
86
13. Записати у файл таку інформацію: прізвище друга, да ту та рік
його народження і номер телефону. Вивести повідомлення про друзів
за спаданням їх дати народження.
14. Записати у файл інформацію про друзів-однокурсників: прізвище,
ім'я та номер телефону. Вивести повідомлення згідно з заданим
номером телефону.
15. Записати у файл 20 дійсних чисел. Вивести число, записане під
заданим порядковим номером та повідомлення про кількість таких
чисел.
16. Створити файл, який містить список студентів і їх оцін ки за
результатами екзаменаційної сесії (не менше трьох предметів).
Прочитати цей файл і вивести результати сесії заданого студента.
17. Створити файл, який містить повідомлення про студен тів
(прізвища, ініціали) і результати атестації з програмування. Вивести
список не атестованих студентів.
18. Записати у файл список працівників із зазначенням прі звища,
статі, року народження і спеціальності. Вивести список чоловіків-
пенсіонерів.
19. Записати у файл довільну матрицю, вивести задані ко ристувачем
стовпці матриці, відсортовані за спаданням додатніх елементів.
20. Записати у файл список спортсменів із зазначенням прі звища,
статі та виду спорту. Вивести список чоловіків-волейболістів.
21. Створити файл з такою інформацією: прізвища студен тів потоку,
які проживають у гуртожитку," із зазначенням номерів кімнат та
назви групи. Вивести інформацію про студентів, що проживають у
кімнаті з заданим номером.
22. Створити файл, в який записати матрицю заданого роз міру. При
його читанні підрахувати і вивести суму кожного рядка.
23. Записати у файл таку інформацію виробничого підроз ділу:
прізвище, стать та освіта працівника. Вивести прізвища жінок, які
мають вищу освіту.
24. Записати у файл таку інформацію: прізвище та ініціали
працівника підприємства, його посаду та зарплату. Вивести
повідомлення про працівників, які мають зарплату меншу, ніж задана
користувачем.
25. Записати у файл одновимірний масив, прочитати цей файл,
вивести елементи, розташовані на парних місцях, та суму непарних
елементів.

87
Лабораторна робота №11.(6 годин)

Тема: Створення багатофайлових програм на С++


Мета заняття: отримати практичні навики по створенню програмних модулів у
великих програмах.
Теоретичні відомості

Багатофайлові проекти

Система програмування працює з програмними проектами . В проекті розміщують


файли вхідної програми. Розглянемо, наприклад, проект sgrt. До файлу root.cpp ми запишемо
текст функції root. Програмний код для випробування цієї функції ми помістимо у файл
main.cpp

Проект, заповнений вхідними файлами, зображено на малюнку

Пам'ятаємо, що компіляція цих двох файлів виконуватиметься нарізно. Виникає


питання, звідки компілятор зрозуміє зміст ідентифікатора root ?

В принципі можливі два рішення.

Перше — це помістити сам файл root.cpp до файлу main.cpp, де він


використовується. Це було б не дуже вдале рішення, бо незрозуміло, як поступати у випадку
одночасного використання у багатьох файлах.

Друге рішення, саме воно прийняте в системах програмування, полягає у створенні


допоміжного заголовного файлу root.h, який міститиме не всю інформацію про функцію root ,
а лише ту, яка необхідна для обробки її виклику компілятором, так звану сигнатуру функції:
//root.h

double root (double x, double eps);

88
Вказівки препроцесору записуються за допомогою спеціальних директив, запис яких
починається символом #. Зокрема файл main.cpp міститиме директиву #include "root.h" ,
виконання якої препроцесором полягає у включенні тексту з файлу заголовку root.h до
початкового файлу main.cpp .
Наведемо його текст
//main.cpp
//Спочатку системні заголовки
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include "root.h"
using namespace std;
int main()
{
cout << "The square root of 2 calculated with"<<endl
<<" a standart fuction is "<<sqrt(2.0)<<endl;
cout <<" your function is "<< root(2.0,0.000001)<<endl;
return 0;
}
Як бачимо, початковий файл містить ще декілька файлів, що приєднаються
препроцесором. Це службові файли (вони не зображені на малюнку).
Файл stdafx.h генерується системою програмування Visual C ++ ( ми не будемо
більше наводити цю директиву в наступних прикладах).
Два інші описують стандартні бібліотеки: бібліотеку вводу і виводу iostream (вона
потрібна для обслуговування вихідного потоку cout) та бібліотеку математичних функцій
cmath, звідки береться, наприклад, функція обчислення квадратного кореня sqrt .
Директива using namespace std є вказівкою компілятору вживати стандартні імена
для системних об'єктів, наприклад, через cout позначено стандартний вихідний потік.
Відповідного доповнення вимагатиме також файл root.cpp, в якому вжито стандартну
функцію fabs обчислення абсолютної величини дійсного числа

//root.cpp
#include <math.h>
double root (double x, double eps)
{
double s=0.5*x;
double t;
do
{
t=s;
s=(s+x/s)*0.5;
}
while ((fabs(s-t)/s)>eps);
return s;
};

Тепер коротко про призначення інших компонент системи програмування. Після


того, що будуть проінтепретовані команди препроцесора, файли повних текстів потраплять
на вхід компілятора, який збере з них так звані об'єктні коди.

89
Компілятор — центральна компонента системи програмування, мета якого полягає
у створенні цільового (англійською мовою object ) коду. Об'єктний код ще не призначено
для безпосереднього виконання.
В проекті їх багато, взагалі кажучи, по одному на кожен початковий файл. Об'єктні
коди містять взаємні посилання один на одного, а також посилання на бібліотеки. Об'єктні
коди поступають на вхід компонувальника. Його завдання зібрати їх разом, доповнити
необхідними компонентами бібліотек та перетворити на виконавчу програму (
executable program , exe - file ).
На замовлення компілятор може доповнити об'єктні коди спеціальними командами
спостереження за ходом виконання програми. Тоді виконанням програми займеться
налагоджувач, який дозволить прослідкувати за перебігом виконання: призупинитивиконання
програми, проконтролювати значення змінних, тощо.
Метод умовної компіляції полягає у використанні директив #ifdef і
#ifndef, що відповідно означає «якщо визначено» і «якщо не визначено».
Стандартний вид #ifdef наступний:

#ifdef імя_макроса
послідовність операторів
#endif

Якщо ім'я макросу визначено раніше в операторі #define, то послідовність


операторів, що стоять між #ifdef і #endif, компілюватиметься.
Стандартний вид #ifndef наступний:

#ifndef імя_макроса
послідовність операторів
#endif

Якщо ім'я макросу не визначене раніше в операторі #define, то


послідовність операторів, що стоять між #ifdef і #endif, компілюватиметься.

#define визначити

Постановка задачі:
1. Нехайай є деякий об'єкт «товар». Даний об'єкт має ряд властивостей:
 шифр;
 назва;
 ціна.
Над об'єктом можна виконати ряд дій:
 введення даних про n товарів і запис їх у файл;
 додавання даних про m товарів у файл;
 пошук даних по назві товару (назва вводиться з клавіатури).
Для вибору потрібної дії на екран видати меню користувача.
Кожну дію з даними оформити у вигляді окремого програмного модуля.
90
Хід виконання роботи

1. Для реалізації першої функції програми створимо модуль для введення n


записів у файл. Файл модуля може мати вигляд:
#ifndef MODUL1_H
#define MODUL1_H

//підключаємо модулі для вода/вывода і роботи з файлами


#include <iostream>
#include <conio.h>
#include <fstream>
using namespace std;
//описуємо структуру для роботи з об'єктом «товар»
struct tovar
{
char shifr[10], nazv[10];
float сеna;
};
//прототип функції для введення товарів у файл
void vvodtovar();

//реалізація функції введення товарів у файл


void vvodtovar()
{
//описуємо лічильник циклу і кількість товарів
int i, n;
//змінна tov для роботи із структурою
tovar tov;
//вводимо кількість товарів
cout << "Введите кількість товарів: ";
cin >> n; cin.get();
//відкриваємо файл для запису
ofstream f1("tovary.dat", ios::binary);
cout << "Введите дані про товари:\n";
//в циклі вводимо дані про товар
//і записуємо у файл
for (i = 0; i <= n - 1; i++)
{
cout << i + 1 << "-й товар:\n";
cout << "-шифр: "; cin.getline(tov.shifr, 10);
cout << "-название: "; cin.getline(tov.nazv, 20);
cout << "-цена: "; cin >> tov.сеna;
cin.get();
f1.write((char*)&tov, sizeof tov);
}
//закриваємо файл
f1.close();
//видаємо повідомлення про завершення операції
cout << "Файл створений. Натискуйте будь-яку клавішу...\n";
//робимо паузу для перегляду
_getch();
//завершуємо функцію
return;
}

#endif
Збережіть файл під ім'ям modul1.h.
91
2. Для реалізації другої функції створимо модуль для додавання m записів у
файл. Файл модуля може мати вигляд:
#ifndef MODUL2_H
#define MODUL2_H

//підключаємо з поточної теки створений модуль з описаною структурою


#include "modul1.h"
//підключаємо модуль для перейменування і видалення файлів
#include <stdio.h>

//зверніть увагу, що підключати модулі iostreamh, conio.h, fstream.h не обов'язково


//оскільки вони вже підключені усередині модуля modul1.h

//прототип функції для додавання товарів у файл


void addtovar();

//реалізація функції для додавання товарів у файл


void addtovar()
{
//описуємо лічильник циклу і
//кількість товарів, що додаються
int i, m;
//змінна tov для роботи із структурою
tovar tov;

//переписуємо файл tovary.dat у файл buffer.dat


//відкриваємо tovary.dat для читання
ifstream f1("tovary.dat", ios::binary);
//відкриваємо buffer.dat для запису
ofstream f2("bufer.dat", ios::binary);
//в циклі читаємо дані і tovary.dat
//и записуємо в buffer.dat
while (f1.read((char*)&tov, sizeof tov))
f2.write((char*)&tov, sizeof tov);

//вводимо кількість товарів, що додаються


cout << "Введите кількість товарів: ";
cin >> m; cin.get();
//в циклі вводимо товари і дописуємо їх в bufer.dat
cout << "Введите дані про товари:\n";
for (i = 0; i <= m - 1; i++)
{
cout << i + 1 << "-й товар:\n";
cout << "-шифр: "; cin.getline(tov.shifr, 10);
cout << "-название: "; cin.getline(tov.nazv, 20);
cout << "-цена: "; cin >> tov.сеna; cin.get();
f2.write((char*)&tov, sizeof tov);
}
//закриваємо обидва файли
f1.close();
f2.close();

//видаляємо файл tovary.dat


remove("tovary.dat");
//перейменовуємо файл buffer.dat в tovary.dat
rename("bufer.dat", "tovary.dat");
//виводимо повідомлення про завершення операції
cout << "Дані додані. Натискуйте будь-яку клавішу...\n";
//робимо паузу для перегляду
92
_getch();
//кінець роботи функції
return;
}

#endif

Збережіть файл під ім'ям modul2.h.


 
3. Створимо модуль для пошуку товарів по назві. Файл модуля може мати
вигляд:
#ifndef MODUL3_H
#define MODUL3_H

//підключаємо з поточної теки створений модуль з описаною структурою


#include "modul1.h"
//підключаємо модуль для роботи з текстовими даними
#include <string.h>

//зверніть увагу, що підключати модулі iostream, conio.h, fstream не обов'язково


//оскільки вони вже підключені усередині модуля modul1.h

//прототип функції пошуку товарів


//по введеній назві
void poisktovar();

//реалізація функції пошуку товарів


//по введеній назві

void poisktovar()
{
//змінна tov для роботи із структурою
tovar tov;
//змінна nazv для введення назви шуканого товару
char nazv[20];
//очищаємо буфер клавіатури
//cin.get();
//вводимо назву шуканого товару
cout << "Введите назва товару для пошуку: ";
cin.getline(nazv, 20);
//відкриваємо файл для читання
ifstream f1("tovary.dat", ios::binary);
cout << "Список знайдених товарів:\n";
cout << " Шифр Назва Ціна\n";
//в циклі читаємо дані з файлу
while (f1.read((char*)&tov, sizeof tov))
//якщо назва товару співпадає з введеним значенням
if (_strnicmp(tov.nazv, nazv, strlen(nazv)) == 0)
{
//виводимо дані про товар на екран
cout.width(10);
cout << tov.shifr;
cout.width(20);
cout << tov.nazv;
cout.width(10);
cout << tov.сеna<< "\n";
}
//закриваємо файл
93
f1.close();
//виводимо повідомлення
cout << "Нажмите будь-яку клавішу...\n";
//робимо паузу для перегляду
_getch();
//завершуємо функцію
return;
}

#endif

Збережіть файл під ім'ям modul3.h.

4. Для використовування створених модулів створимо головну програму.


Текст головної програми може мати вигляд:
#include <iostream>
#include <conio.h>
//підключаємо створені модулі з поточного каталога
#include "modul1.h"
#include "modul2.h"
#include "modul3.h"
using namespace std;
//головна програма
int main()
{ setlocale(LC_ALL, "rus");
//змінна для вибору з меню
//змінна і для організації циклу видачі меню
int k, b = 0;

//поки b=0 працює цикл


while (b == 0)
{ //виводимо меню користувача
cout << "1-створення файла\n";
cout << "2-дозапис у файл\n";
cout << "3-пошук у файлі\n";
cout << "4-вихід\n";
//запрошуємо вибір з меню
cout << "ЗАДАЙТЕ РЕЖИМ РОБОТИ: "; cin >> k;

//обробляємо вибір
switch (k)
{
//якщо вибраний перший пункт
case 1:
{
//викликаємо функцію введення товарів у файл
vvodtovar();
//виходимо з оператора switch
break;
}
//якщо вибраний другий пункт
case 2:
{
//додає товари у файл
addtovar();
//виходимо з оператора switch
break;
}
//якщо вибраний третій пункт
case 3:

94
{
//очищаємо буфер клавіатури для введення назви шуканого товару
cin.get();
//викликаємо функцію пошуку товарів у файлі
poisktovar();
//виходимо з оператора switch
break;
}
//якщо вибраний четвертий пункт
case 4:
{
//змінна b=1 (завершення роботи циклу)
b = 1;
//виходимо з оператора switch
break;
}
}
}
system("Pause"); //кінець головної програми
return 0;
}

Індивідуальні завдання
ЗАДАЧА1.(2год)Розробити багатофайловий проект (3-5модулів)до задачі з
ЛР8(задача2), а саме створити файл структур та модулі для опрацювання
файлу та читання усього файлу на екран.

ЗАДАЧА2. (2год)Розробити багатофайловий проект (3-5модулів)до задачі3 з


ЛР9(модулі власних математичних функцій).

ЗАЛІКОВЕ ЗАНЯТТЯ. Робота в командах.(2год). Вибір лідерів. Створення


команд. Розробити командою багатофайловий проект (3-4модулів) до
задачі, згідно вибраного варіанту. Демонстрація командою роботи
проекту.
Зміст звіту:
- Тема роботи
- Мета роботи
- Постановка задачі
- Програма
- Результати роботи
- Відповіді на контрольні запитання
Висновки.
Контрольні запитання:
1. Для чого створюється файл даних?
2. Які операції треба виконати при створенні та читанні файла
даних?

95
3.Які методи доступу використовуються для роботи з файлами
даних?
4. Які компоненти і функції можна використовувати для роботи з
файлами даних?
5. Які оператори мови С++ застосовуються при відкритті потоків
для роботи з файлами даних?
6. Які функції існують для ініціювання прямого доступу до даних?

96
Лабораторна робота №12. Тема: Розробка алгоритмів і програм обробки
динамічних масивів.

Мета:Засвоїти прийоми обробки одновимірних і двовимірних динамічних


масивів і набути навиків розробки на С++ програм для обробки динамічних
масивів за допомогою методів структурного програмування.

Порядок виконання роботи


1. Ознайомитися з теоретичними відомостями.
2. Розробити набір функцій для роботи з одновимірними динамічними
масивами, який обов’язково повинен включати наступні функції:

 створення динамічного масиву;


 заповнення динамічного масиву;
 виведення масиву;
 очищення масиву;
 визначення мінімального значення масиву;
 визначення максимального значення масиву;
 визначення середнього арифметичного значення масиву;
 створення нового масиву, який містить всі від’ємні його елементи;

та функцію, відповідно до завдання 1 і головну програму, яка використовує


(викликає) всі розроблені функції для обробки одновимірних динамічних
масивів. Для кожної розробленої функції визначити та обґрунтувати список
вхідних і вихідних параметрів та їх типів.

3. Розробити набір функцій для роботи з двовимірними динамічними


масивами, який обов’язково повинен включати наступні функції:

 створення динамічного масиву;


 заповнення динамічного масиву;
 виведення масиву;
 очищення масиву;
 визначення мінімального значення масиву;
 визначення максимального значення масиву;
 визначення середнього арифметичного значення масиву;
 створення нового масиву, який містить всі від’ємні його елементи;

та функцію, відповідно до завдання 2 і головну програму, яка використовує


(викликає) всі розроблені функції для обробки двовимірних динамічних
масивів. Для кожної розробленої функції визначити та обґрунтувати список
вхідних і вихідних параметрів та їх типів.

97
4. Розробити алгоритм, схему алгоритму та функцію обробки динамічного
масиву, відповідно до завдання 3 та використати її в пакеті функцій
завдання 1.
5. Основна частина головної програми роботи з динамічними масивами (не
враховуючи меню, а лише виклики функцій обробки масивів) не повинна
перевищувати 5-6 стрічок.
6. Розробити 2-3 теста для перевірки правильності роботи всього
розробленого комплексу програм.
7. Скласти звіт за результатами лабораторної роботи.
8. Зробити висновки.

Завдання 1

1. Розробити функцію, яка формує новий масив з усіх додатних елементів


масиву та визначає їх суму і кількість.
2. Розробити функцію, яка формує новий масив з усіх від’ємних елементів
масиву та визначає їх суму і кількість.
3. Розробити функцію, яка визначає кількість нульових елементів
одновимірного динамічного масиву та їх порядкові номери.
4. Розробити функцію, яка визначає суми першої і другої половини
динамічного масиву та кількість додатних елементів у кожній.
5. Розробити функцію, яка визначає середнє значення і значення дисперсії
даного одновимірного динамічного масиву.
6. Розробити функцію, яка впорядковує заданий масив по зростанню
методом бульбашки.
7. Розробити функцію, яка впорядковує заданий масив за спаданням
методом бульбашки.
8. Розробити функцію, яка визначає мінімальне і максимальне значення
елементів динамічного масиву та їх порядкі номери.
9. Розробити функцію, яка перетворює заданий масив таким чином, що
максимальний елемент стає першим елементом, а мінімальний – останнім.
10.Розробити функцію, яка перетворює заданий масив таким чином, що
максимальний елемент стає останнім елементом, а мінімальний – першим.
11.Розробити функцію, яка перетворює заданий масив таким чином, що
спочатку масиву розташовуються упорядковані за зростанням додатні
елементи, а потім впорядковані від’ємні.

Завдання 2

1. Розробити функцію, яка формує новий двовимірний масив з усіх додатних


елементів кожного рядка двовимірного динамічного масиву та їх
порядкових номерів.

98
2. Розробити функцію, яка формує новий двовимірний масив з усіх
від’ємних елементів кожного рядка двовимірного динамічного масиву та
їх порядкових номерів.
3. Розробити функцію, яка формує новий двовимірний масив з усіх додатних
елементів кожного стовпця даного двовимірного динамічного масиву та їх
порядкових номерів.
4. Розробити функцію, яка формує новий двовимірний масив з усіх
від’ємних елементів кожного стовпця даного двовимірного динамічного
масиву та їх порядкових номерів.
5. Розробити функцію, яка створює новий масив з суми і кількості всіх
додатних елементів кожного рядка даного двовимірного динамічного
масиву.
6. Розробити функцію, яка створює новий масив з суми усіх від’ємних
елементів кожного рядка даного двовимірного динамічного масиву і їх
кількості в кожному рядку.
7. Розробити функцію, яка створює новий масив з середніх арифметичних
значень всіх додатних елементів кожного стовпця з даного динамічного
масиву.
8. Розробити функцію, яка створює новий масив з середніх арифметичних
значень всіх від’ємних елементів кожного стовпця з даного динамічного
масиву.
9. Розробити функцію, яка створює новий масив з суми усіх додатних
елементів верхньої і нижньої трикутних матриць даного двовимірного
динамічного масиву та їхньої кількості в кожній.
10.Розробити функцію, яка створює новий масив з суми усіх від’ємних
елементів верхньої і нижньої трикутних матриць даного двовимірного
динамічного масиву і їх кількості в кожній.
11.Розробити функцію, яка створює новий масив з вихідного двовимірного
динамічного масиву, перетвореного таким чином, що кожен стовпець
матриці упорядкований за зростанням методом бульбашки.

Завдання 3

1. Розробити функцію для визначення числа кратного п’яти і функцію, що її


використовує для визначення кількості і суми елементів даного
одновимірного динамічного масиву, кратних п’яти.
2. Розробити функцію для визначення числа кратного cеми і функцію, що її
використовує для визначення кількості і суми елементів даного
одновимірного динамічного масиву, кратнихcеми.
3. Розробити функцію для визначення числа кратного дев’яти і функцію, що
її використовує для визначення кількості і суми елементів даного
одновимірного динамічного масиву, кратних дев’яти.

99
4. Розробити функцію для визначення числа кратного одинадцяти і функцію,
що її використовує для визначення кількості і суми елементів даного
одновимірного динамічного масиву, кратних одинадцяти.
5. Розробити функцію для визначення числа кратного дванадцяти і функцію,
що її використовує для визначення кількості і суми елементів даного
одновимірного динамічного масиву, кратних дванадцяти.
6. Розробити функцію для визначення кубічного кореня з заданого числа і
функцію, що її використовує для перетворення кожного елемента даного
одновимірного динамічного масиву.
7. Розробити функцію для визначення квадратного кореня з заданого числ і
функцію, що її використовує для перетворення кожного парного елемента
одновимірного динамічного масиву.
8. Розробити функцію для визначення а3для заданого числа а, і функцію, що
її використовує для перетворення кожного елемента заданого
одновимірного динамічного масиву.
9. Розробити функцію для визначення а2для заданого числа а, і функцію, що
її використовує для перетворення кожного елемента заданого
одновимірного динамічного масиву.
10.Розробити функцію для визначення парного числа і функцію, що її
використовує для визначення суми, кількості і середнього арифметичного
значення всіх парних елементів динамічного масиву.
11.Розробити функцію для визначення непарного числа і функцію, що її
використовує для формування нового динамічного масиву, що містить
тільки парні елементи вихідного одновимірного динамічного масиву.

Теоретичні відомості

Масиви динамічної пам'яті

При традиційному визначенні масиву:

Тип ім'я_масиву [кількість елементів] ;

Загальна кількість елементів масиву і розміри пам'яті, виділеної для нього,


цілком і однозначно задано визначенням. Це не завжди зручно. Іноді в
професійних програмах необхідно, щоб пам'ять для масиву виділялася в таких
розмірах, які потрібні для рішення конкеретної задачі, причому потреби в
пам'яті заздалегідь не відомі і не можуть бути фіксовані.

Формування масивів з змінними розмірами можна організувати за допомогою


покажчиків і засобів для динамічного виділення пам'яті. Для цього
використовують бібліотечні функції, описані в заголовочних файлах
alloc.hіstdlib.hстандартної бібліотеки(таблиця 1.1).

100
Таблиця 1.1 – Бібліотечні функції стандартної бібліотеки

Функція Прототип і короткий опис


malloc() void*malloc(unsigned s);
Повертає покажчик на початок області (блоку)
динамічної пам'яті довжиною в sбайт. При невдалому
завершенні повертає значенняNULL
calloc() void*calloc(unsigned n,unsigned m);
Повертає покажчик на початок області (блока) пам'яті
обнуленої динамічної пам'яті, виділеної для розміщення
nелементів по m байт кожний. При невдалому завершенні
повертає значенняNULL
realloc() void*realloc(void*bl,unsigned ns);
Змінює розмір блоку раніше виділеної динамічної пам'яті
до розміру ns байт.bl – адреса початку змінюваного
блоку. Якщо bl дорівнює NULL(пам'ять не виділялася),
то функція виконується як malloc()
free() void*free(void*bl);
Звільняє раніше виділену ділянка динамічної пам'яті,
адреса першого байта якого дорівнює bl
new() void*new()
Створює масив( під час виконання програми також).
Повертає адрес першого елемента виділеного блока.
delete() void*delete()
Звільняє пам’ять, відведену для масиву.

Існує кілька способів резервування пам'яті в купі для динамічних змінних.


Найпоширеніший спосіб використовує бібліотечну функцію malloc( ) –memory
allocation чи memory allocator (виділення пам'яті чи розподільник пам'яті)

Наприклад:

Sp=malloc(128); /*резервування 128 байт

Sp=(char*)malloc(128);/*ті ж дії, тільки виконане приведення типів, тому що


функція повертає тип void*/.

В обох цих випадках покажчик sp адресує блок купи з 128 байт, зарезервованих
винятково для його особистого виконання.
101
Якщо купа вже заповнена, то функція malloc() повертає нуль, тому необхідно
перевіряти після виклику функції, чи нерівний нулю покажчик:

sp=malloc(128);

if(sp==NULL)

error();

чи if((sp=malloc(128)!=NULL)оператор;

чи v=malloc(sizeof(double));

long*1;

p=calloc(1,sizeof(long));

У функціях malloc(),calloc(),realloc() динамічно виділяють пам'ять у


відповідності зі значеннями параметрів і повертають адресу початку виділеної
ділянки пам'яті. Для універсальності тип значення, що повертається, кожної з
цих функцій єvoid*. Покажчик такого типу можна перетворити до покажчика
будь-якого типу за допомогою операції явного приведення типу.

У функції free() аргументом являється вказівник на блок пам’яті, яка вже


виділена функцією malloc(). Після виконанняfree() ця частина пам’яті може
бути виділена знову, але її зміст втрачається .
У випадку виходу за межі блока, виділеного функцією malloc(), також при
виклику функціїfree()з аргументом, яки не є результатомmalloc(),ефект буде
непередбаченим.

Приклад використання :

malloc(),calloc(),realloc(),free():

Приклад 1

d_array=malloc((number_of_elements)*sizeof(float));

if(!d_array)

/* обробка помилки виділення пам’яті*/

}
102
/*…робота з елементами масиву…*/

free(d_array);

d_array=NULL;

Приклад 2

dynamic_array=calloc(number_of_elements,sizeof(float))

if(!dynamic_array)

/* обробка помилки виділення пам’яті */

/* … робота з елементами масиву… */

free(dynamic_array);

dynamic_array = NULL;

Приклад 3

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

main()

char *ptr;

ptr = realloc(NULL, 20*sizeof(char));

strcpy(ptr, "Це перша частина, ");

ptr = realloc(ptr, 100*sizeof(char));

strcat(ptr, "Це друга частина);

103
printf("%s\n", ptr);

realloc(ptr, 0);

Приклад 4

pointer = malloc(sizeof(data) * 1000);

/* … перевіркауспішностівиділенняпам’яті,використанняблока пам’яті…*/

free(pointer);

pointer = NULL;

Приклад використання функцій:

new() і delete():

Наприклад, наступна програма USE_NEW.CPP використовує оператор new для


одержання вказівника на 100-байтний масив:

#include <iostream.h>

void main(void)

сhar *pointer = new char[100]; 


if (pointer != NULL) cout << "Пам’ять успішно виділена" <<endl; 
else cout << "Помилка виділення пам’яти" << endl; 
}

Приклад виконання завдання 1

Варіант 6. Розробити програму для виводу на екран вихідного динамічного


масиву, упорядкованого за зростанням методом бульбашки.

Дана програма буде складатися з основної функції int main(), та п’яти функцій
для виконання поставленої задачі:

float()*Create_1D_Mas(float*m,int n)- функція призначена для створення масиву;

void Vvod_1D_Mas(float*m,int n) - функція призначена для заповнення масиву;

104
void Sortirovka_1D_Mas(float*m,int n) - функція призначена для сортування
масиву методом бульбашки;

void Print_1D_Mas(float*m,int n)- функція призначена для виведення масиву;

void Clear_1D_Mas(float*m) - функція призначена для очистки масиву.

Програма буде мати наступний вигляд:

Лістинг програми

#include<stdio.h>
#include<conio.h>
#include<math.h>
float*()Create_1D_Mas(float*m,int n);
void Vvod_1D_Mas(float*m,int n);
void Sortirovka_1D_Mas(float *m,int n);
void Print_1D_Mas(float*m,int n);
void Clear_1D_Mas(float*m);
float()*Create_1D_Mas(float*m,int n)
{
m=new float[n];
}
void Vvod_1D_Mas(float*m,int n)
{
for(int i=0;i<n;i++)
scanf("%f",&m[i]);
}
void Sortirovka_1D_Mas(float*m,int n)
{
int b;
float*t;
do
{
b=0;
for(int i=0;i<n-1;i++)
{
if(m[i]>m[i+1])
{
float t=m[i];
m[i]=m[i+1];
m[i+1]=t;
b=1;
}
105
}
}while(b);
}
void Print_1D_Mas(float*m,int n)
{
for(int j=0;j<n;j++)
printf("%6.2f ",m[j]);
printf("\n");
}
void Clear_1D_Mas(float*m)
{
if(m==NULL)
{
printf("масив не створений");
}
if(m)
{
delete[]m;
m=NULL;
}
}
int main()
{
clrscr();
float*arr;
int n=5;
Create_1D_Mas(arr,n);
Printf(“Введіть елементи масиву\n”);
Vvod_1D_Mas(arr,n);
Printf(“Вихідний масив:\n”);
Sortirovka_1D_Mas(arr,n);
Print_1D_Mas(arr,n);
Clear_1D_Mas(arr);
getch();
return 0;
}

Тестування:

Для перевірки правильності роботи програми введемо в неї дані, при введені
яких результат заздалегідь відомий.

Наприклад сформуємо масив з 5 елементів такого виду:

106
42512

З введених даних наочно видно, що впорядкованим за зростанням масивом з


даних елементів буде масив:

12345

Тепер введемо ці ж дані в програму і перевіримо результат.

Введіть елементи масиву

Вихідний масив:

12345

Приклад виконання завдання 2

Варіант 6. Розробити програму для виводу на екран суми усіх відємних


елементів кожного рядка даного двовимірного динамічного масиву і їх кількості
в кожному рядку.

Дана програма буде складатися з основної функції int main(), та п’яти функцій
для виконання поставленої задачі.

F2D Create_2D_Mas(F2D m,int str,int stp)- функція призначена для створення


масиву;

void Vvod_2D_Mas(F2D m,int str,int stp)- функція призначена для введення


масиву;

void Obrobka_2D_Mas(F2D m,int str,int stp)- функція призначена для обчислення


суми усіх негативних елементів кожного рядка даного двовимірного
динамічного масиву і їх кількості в кожнім рядку;

107
void Print_2D_Mas(F2D m,int str,int stp)- функція призначена для виведення
масиву;

void Clear_2D_Mas(F2D m,int str,int stp)- функція призначена для очистки


масиву

Програма буде мати наступний вигляд:

Лістинг програми

#include <stdio.h>
#include <conio.h>
typedef float** F2D;
F2D Create_2D_Mas(F2D m,int str,int stp);
void Vvod_2D_Mas(F2D m,int str,int stp);
void Obrobka_2D_Mas(F2D m,int str,int stp);
void Print_2D_Mas(F2D m,int str,int stp);
void Clear_2D_Mas(F2D m,int str,int stp);
F2D Create_2D_Mas(F2D m,int str,int stp)
{
float *m1;
m1=new float[str*stp];
m=new float*[str];
for(int i=0; i<str;i++)
m[i]=&m1[stp*i];
return m;
}
void Vvod_2D_Mas(F2D m,int str,int stp)
{
for(int i=0;i<str;i++)
for(int j=0;j<stp;j++)
{
scanf("%f",&m[i][j]);
}
}
void Obrobka_2D_Mas(F2D m,int str,int stp)
{
float sum;
int i, j, kol;
printf("Masiv\n");
Print_2D_Mas( m, str, stp);
for(j=0; j<stp; j++)
{
sum=0.0;
108
kol=0;
for(i=0;i<str;i++)
if(m[j][i]<0)
{
sum+=m[j][i];
kol++;
}
printf("Negatuvnuh V %d stroke=%d ih suma=%.2f\n",j+1, kol,sum); //
виведення результатів
}
}
void Print_2D_Mas(F2D m,int str,int stp)
{
for(int i=0;i<str;i++)
for(int j=0;j<stp;j++)
{
printf("%6.2f ",m[i][j]);
if(j==stp-1) printf("\n");
}
}
intmain()
{
clrscr();
F2D arr = NULL; // масив не створено
int str=2, stp=2;
Create_2D_Mas(arr,str,stp);
Vvod_2D_Mas(arr,str,stp);
Obrobka_2D_Mas(arr,str,stp);
Print_2D_Mas(arr,str,stp);
getch();
return 0;}

Тестування:

Для перевірки правильності роботи програми введемо в неї дані, при введені
яких результат заздалегідь відомий.

Наприклад сформуємо масив 3х3 з 9 елементів такого виду:

123

-1 -2 -3

1 -2 3
109
З введених даних наочно видно, що негативних елементів в 1 стрічці 0,їх сума 0,
негативних елементів в другій стрічці 3, їх сума -6, негативних елементів в 3
стрічці 1, їх сума -2

Тепер введемо ці ж дані в програму і перевіримо результат.

-1

-2

-3

-2

Masiv

123

-1 -2 -3

1 -2 3

Negatuvnuh V 1 stroke = 0 ih suma=0

Negatuvnuh V 2 stroke = 3 ih suma=-6

Negatuvnuh V 3 stroke = 1 ih suma=-2

Приклад виконання завдання 3

Варіант 6. Розробити функцію визначення кубічного кореня з заданого члена і


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

Дана програма буде складатися з основної функції int main(), та п’яти функцій
для виконання поставленої задачі:
110
float()*Create_1D_Mas(float*m,int n)- функція призначена для створення масиву;

void Vvod_1D_Mas(float*m,int n)- функція призначена для введення масиву

float KorKub(float val)- функція призначена для знаходження кубічного кореня з


числа;

void Kor_Kub_1D_Mas(float*m,int n)- функція призначена для перетворення


кожного елемента даного одновимірного динамічного масиву в його кубічний
корінь;

void Print_1D_Mas(float*m,int n)- функція призначена для виведення масиву;

void Clear_1D_Mas(float*m)- функція призначена для очистки масиву;

Програма буде мати наступний вигляд:

Лістинг програми
#include<stdio.h>
#include<conio.h>
#include<math.h>
float KorKub(float val);
float()*Create_1D_Mas(float*m,int n);
void Vvod_1D_Mas(float*m,int n);
void Kor_Kub_1D_Mas(float*m,int n);
void Print_1D_Mas(float*m,int n);
void Clear_1D_Mas(float*m);
float()*Create_1D_Mas(float*m,int n)
{
m=new float[n];
return m;
}
void Vvod_1D_Mas(float*m,int n)
{
for(int i=0;i<n;i++)
scanf("%f",&m[i]);
}
float KorKub(float val)
{
float m=1.0/3.0;
return pow(val,m);
}
void Kor_Kub_1D_Mas(float*m,int n)
{
111
for(int j=0;j<n;j++)
m[j]=KorKub(m[j]);
}
void Print_1D_Mas(float*m,int n)
{
for(int j=0;j<n;j++)
printf("%6.2f ",m[j]);
printf("\n");
}
void Clear_1D_Mas(float*m)
{
if(m==NULL)
{
printf("masiv ne stvoreno");
}
if(m)
{
delete[m];
m=NULL;
}
}
int main()
{
clrscr();
float*arr;
int n=5;
Create_1D_Mas(arr,n);
printf("Введіть елементи масиву\n");
Vvod_1D_Mas(arr,n);
Kor_Kub_1D_Mas(arr,n);
printf("Вихідний масив::\n");
Print_1D_Mas(arr,n);
Clear_1D_Mas(arr);
getch();
return 0;
}

Тестування:

Для перевірки правильності роботи програми введемо в неї дані, при введені
яких результат заздалегідь відомий.

Наприклад сформуємо масив з 5 елементів такого виду:

112
8 225 27 64 1

З введених даних наочно видно, що після перетворення даних елементів на їх


кубічні корені масив буде мати вигляд:

2 15 3 4 1

Тепер введемо ці ж дані в програму і перевіримо результат.

Введіть елементи масиву

225

27

64

Вихідний масив:

2 15 3 4 1

Контрольні запитання

1. Що таке динамічний масив?


2. Що таке динамічна пам’ять?
3. Що таке покажчик?
4. Принцип розподілу одновимірних динамічних масивів у пам’яті.
5. Принцип розподілу двовимірних динамічних масивів у пам’яті.
6. Особливості використання бібліотеки alloc.h.
7. Особливості описання одновимірних і двовимірних динамічних масивів.
8. Особливості обробки динамічних масивів з використанням покажчика.
9. Організація вводу/виводу динамічного масиву.
10.Передача динамічного масиву як вхідного параметру функції.
11.Динамічні масиви як вихідні параметри функції.
12.Особливості розробки функцій, параметрами яких є динамічні масиви.
13.Розробити функцію, яка повертає в головну програму суму елементів
заданого масиву.
14.Розробити функцію, яка повертає в головну програму середнє
арифметичне значення елементів заданого масиву.
15.Розробити функцію, яка повертає в головну програму значення дисперсії
елементів заданого масиву.
113
16.Розробити функцію, яка повертає в головну програму суму
від’ємнихелементів заданого масиву.
17.Розробити функцію, яка повертає в головну програму суму додатних
елементів заданого масиву.

Лабораторна робота 13. Тема: Лінійний однозв’язний список


Мета роботи: Набути практичних навиків програмування, тестування програм з
використанням лінійних однозвв’язних списків.

Теоретичні відомості
Лінійний список це динамічна структура даних, кожний елемент якої за
допомогою вказівника зв’язується з наступним елементом.
З визначення випливає, що кожен елемент списку містить поле даних
(Data) (воно може мати складну структуру) і поле посилання на наступний
елемент (next). Поле посилання останнього елемента повинно містити порожній
покажчик (NULL).
Так як посилання лише одне (тільки на наступний елемент), то такий
список є однозв’язним.
Коли говорять про лінійний список, то, як правило, мають на увазі саме
однозв’язний список.
Приклад. Сформувати список, що містить цілі числа 3, 5, 1, 9.
Рішення. При роботі з динамічними структурами даних можна
рекомендувати наступний порядок дій.
а) Перш за все необхідно визначити дві структури:
структура, яка містить характеристики даних, тобто всі ті поля з даними,
які необхідні для вирішення поставленого завдання (у нашому випадку є всього
одне поле цілого типу). Назвемо цю структуру Data;
друга структура, яка містить поле типу Data і поле адресу наступного
елемента next. Другу структуру назвемо List.
Тексти цих структур необхідно розташувати на початку програми (до
main () та інших функцій). Ось можлива реалізація структур:
struct Data {   int a; }; struct List {   Data d; List *next; };
Такий підхід дозволить надалі змінювати в широких межах структуру з
власними даними, при цьому не зачіпаючи  основну структуру List.
Отже, ми описали структурний тип, за допомогою якого можна створити
наш однозв’язний список. Графічно створюваний список можна зобразити так,
як це показано на малюнку нижче:

114
б) У програмі (зазвичай у функції main ()) визначаємо покажчик на
початок майбутнього списку:
List *u = NULL;
 
Поки список порожній, і покажчик  заданий  константі NULL.
в) Виконуємо початкове заповнення списку.
Створимо перший елемент:
u = new List;  // Виділяєм пам’ять під елемент списку
u->d.a = 3;    // Заповнюємо поля з даними
               // (у нашому випадку це лише одне поле)
u->next = NULL;// Вказівник на наступний елемент пустий
 
Після включення першого елемента список можна зобразити так:

Продовжимо формування списку, додаючи нові елементи в


його кінець. Для зручності заведемо допоміжну змінну-покажчик, яка буде
зберігати адресу останнього елемента списку:
 
List *x;
x = u; // Сейчас последний элемент списка совпадает с его началом.
Таким чином, до області пам’яті можна звернутися через два покажчика.
Виділяємо місце в пам’яті для наступного елемента списку і
перенаправляємо покажчик x на виділену область пам’яті:
x->next = new List;
x = x->next;
 
Потім визначаємо значення цього елементу списку:
x->d.a = 5;
x->next = NULL;
Получилась такая схема: Цей процес продовжуємо доти, поки не буде
сформований весь список.
Дії з сформованим списком
Сформувавши початковий список, можна виконувати з ним різні дії.
Настійно рекомендується кожну операцію із списком оформляти у вигляді

115
окремої функції. Такий підхід помітно спрощує розробку програми і можливу її
подальшу модифікацію. Зрозуміло, що і лише що розглянуте формування
початкового списку також краще записати у вигляді функції.
1. Перегляд списка— здійснюється послідовно, починаючи з його
початку. Покажчик послідовно посилається на перший, другий, і так далі
елементи списку до тих пір, поки весь список не буде пройден. Наведемо
приклад реалізації перегляду, наприклад, длявивода списку на екран монітора:
void Print(List *u)
{
   List *p = u;
   cout << “Spisok:” << endl;
   while(p)
   {
      cout << p->d.a << endl;
      p = p->next;
   }
}
Звернутися до функції можна так: Print(u);
Тут і далі в прикладах u — це покажчик на початок списку.

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


вимогам:

List * Find(List *u, Data &x)


{
   List *p = u;
   while(p)
   {
      if(p->d.a == x.a) // условие для поиска
         return p;
      p = p->next;
   }
   return 0;
}
Можливий виклик функції:
List * v = Find(u, x); де x — об'єкт типа Data.

2. Додавання нового елементу в початок списку:

void Add_Beg(List **u, Data &x)


{
   List *t = new List;
   t->d.a = x.a;
116
   t->next = *u;
   *u = t;
}
Можливий виклик функції:
Add_beg(&u, x); де x — об'єкт типа Data.

3. Вставка нового елементу в довільне місце списку за яким-небудь


принципом, наприклад, вставка у відсортований за збільшенням список:

void Insert(List **u, Data &x)


{
   // вставка в список одного элемента перед элементом,
   // меньшим или равным данному x
   List *p = new List;
   p->d.a = x.a;
 
   if(*u == 0) // исходный список пуст вставка в начало
   {
      p->next = 0;
      *u = p;
      return;
   }
 
   List *t = *u;
   if(t->d.a >= p->d.a) // исходный список не пуст
                        // вставка в начало
   {
      p->next = t;
      *u = p;
      return;
   }
 
   List *t1 = t->next;
   while(t1)
   {
      if(t->d.a < p->d.a && p->d.a <= t1->d.a)
         {  // вставка в середину
         t->next = p;
         p->next = t1;
         return;
      }
      t = t1;
      t1 = t1->next;
117
   }
 
   t->next = p; // добавляем в конец списка
   p->next = 0;
}
Можливий виклик функції:
Insert(&u, x) де x — об'єкт типа Data. Ця функція дозволяє відразу
формувати впорядкований список.
4. Видалення елементу з лінійного списку:

void Delete(List **u, Data &x)


{
   if(*u == 0) // исходный список пуст удалять нечего!
   {
      return;
   }
   List *t = *u;
   if(t->d.a == x.a) // исходный список не пуст
                     // удаляется начало
   {
      *u = t->next;
      delete t;
      return;
   }
   List *t1 = t->next;
   while(t1)
   {
      if(t1->d.a == x.a)
      // исходный список не пуст
      //удаляется не первый элемент
      {
         t->next = t1->next;
         delete t1;
         return;
      }
      t = t1;
      t1 = t1->next;
   }
}
Можливий виклик функції:
Delete(&u, x); де x — об'єкт типа Data.
5. Видалення (очищення) всього списку

118
Коли дані, що зберігаються в списку, стають непотрібними, можна
очистити весь список, тобто звільнити пам'ять, яку займали всі елементи
списку. Виконувати цю операцію бажано відразу після того, як список
став не потрібний.
Реалізація цієї операції може бути такою:

void Clear(List **u)


{
   // удаление (очистка) всего списка
   if(*u == 0) return;
   List *p = *u;
   List *t;
   while(p)
   {
      t = p;
      p = p->next;
      delete t;
   }
   *u = 0;
}
Можливий виклик функції: Clear(&u);

Ми розглянули найбільш важливі дії із списками. По аналогії з ними можна


реалізувати і інші дії, які можуть потрібно для вирішення практичних завдань.

2. Приклад реалізації списку

Опис простого елементу такого списку виглядає таким чином: struct імя_тіпа
{ інформаційне поле; адресне поле; }; де інформаційне поле – це поле будь-яке,
раніше оголошеного або стандартного типа; адресне поле – це покажчик на
об'єкт того ж типа, що і визначувана структура, в нього записується адреса
наступного елементу списку. Наприклад:

struct Node {
int key;//информационное поле
Node*next;//адресное поле
};

Інформаційних полів може бути декілька. Наприклад:

struct point {
char*name;//информационное поле
119
int age;//информационное поле
point*next;//адресное поле
};
Кожен елемент списку містить ключ, який ідентифікує цей елемент. Ключ
зазвичай буває або цілим числом, або рядком.
Основними операціями, здійснюваними з однонаправленими списками, є:
• створення списку;
• друк (перегляд) списку;
• вставка елементу в список;
• видалення елементу із списку;
• пошук елементу в списку ;
• перевірка порожнечі списку;
• видалення списку.
Особливу увагу слід звернути на те, що при виконанні будь-яких операцій з
лінійним однонаправленим списком необхідно забезпечувати позиціювання
якого-небудь покажчика на перший елемент. Інакше частина або весь список
буде недоступна.
Розглянемо детальніше кожну з приведених операцій.
Для опису алгоритмів цих основних операцій використовується наступне
оголошення:

struct Single_List {//структура данных


int Data; //информационное поле
Single_List *Next; //адресное поле
};
..........
Single_List *Head; //указатель на первый элемент списка
..........
Single_List *Current;
//указатель на текущий элемент списка (при необходимости)

Створення однонаправленого списку


Для того, щоб створити список, потрібно створити спочатку перший елемент
списку, а потім за допомогою функції додати до нього останні елементи. При
відносно невеликих розмірах списку найвитонченіше і красиве використання
рекурсивної функції. Додавання може виконуватися як в початок, так і в кінець
списку.
//создание однонаправленного списка (добавления в конец)
void Make_Single_List(int n,Single_List** Head){
if (n > 0) {
(*Head) = new Single_List();
//выделяем память под новый элемент
cout << "Введите значение ";
120
cin >> (*Head)->Data;
//вводим значение информационного поля
(*Head)->Next=NULL;//обнуление адресного поля
Make_Single_List(n-1,&((*Head)->Next));
}
}

Друк (перегляд) однонаправленого списку

Операція друку списку полягає в послідовному перегляді всіх елементів списку


і виведенні їх значень на екран. Для обробки списку організовується функція, в
якій потрібно переставляти покажчик на наступний елемент списку доти, пока
показчик не стане рівний NULL, тобто буде досягнутий кінець списку.
Реалізуємо дану функцію рекурсивно.

//печать однонаправленного списка


void Print_Single_List(Single_List* Head) {
if (Head != NULL) {
cout << Head->Data << "\t";
Print_Single_List(Head->Next);
//переход к следующему элементу
}
else cout << "\n";
}
Вставка елементу в однонаправлений список
В динамічні структури легко додавати елементи, оскільки для цього досить
змінити значення адресних полів. Вставка першого і подальших елементів
списку відрізняються один від одного. Тому у функції, що реалізовує дану
операцію, спочатку здійснюється перевірка, на яке місце вставляється елемент.
Далі реалізується відповідний алгоритм додавання ( мал. 29.2).

121
Рис. 29.2. Вставка элемента в однонаправленный список
/*вставка элемента с заданным номером в однонаправленный список*/
Single_List* Insert_Item_Single_List(Single_List* Head,
int Number, int DataItem){
Number--;
Single_List *NewItem=new(Single_List);
NewItem->Data=DataItem;
NewItem->Next = NULL;
if (Head == NULL) {//список пуст
Head = NewItem;//создаем первый элемент списка
}
else {//список не пуст
Single_List *Current=Head;
for(int i=1; i < Number && Current->Next!=NULL; i++)
Current=Current->Next;
if (Number == 0){
//вставляем новый элемент на первое место
NewItem->Next = Head;
Head = NewItem;
}
else {//вставляем новый элемент на непервое место
if (Current->Next != NULL)
NewItem->Next = Current->Next;
Current->Next = NewItem;
}
}
return Head;
}

Видалення елементу з однонаправленого списку

122
З динамічних структур можна видаляти елементи, оскільки для цього досить
змінити значення адресних полів. Операція видалення елементу
однонаправленого списку здійснює видалення елементу, на який встановлений
покажчик поточного елементу. Після видалення покажчик поточного елементу
встановлюється на попередній елемент списку або на новий початок списку,
якщо віддаляється перший.
Алгоритми видалення першого і подальших елементів списку відрізняються
один від одного. Тому у функції, що реалізовує дану операцію, здійснюється
перевірка, який елемент віддаляється. Далі реалізується відповідний алгоритм
видалення ( мал. 29.3).

Рис. 29.3. Удаление элемента из однонаправленного списка

/*удаление элемента с заданным номером из однонаправленного списка*/


Single_List* Delete_Item_Single_List(Single_List* Head,
int Number){
Single_List *ptr;//вспомогательный указатель
Single_List *Current = Head;
for (int i = 1; i < Number && Current != NULL; i++)
Current = Current->Next;
if (Current != NULL){//проверка на корректность
if (Current == Head){//удаляем первый элемент
Head = Head->Next;
delete(Current);
Current = Head;
}
else {//удаляем непервый элемент
ptr = Head;
while (ptr->Next != Current)
ptr = ptr->Next;
ptr->Next = Current->Next;
delete(Current);
Current=ptr;
}
123
}
return Head;
}
Пошук елементу в однонаправленому списку
Операція пошуку елементу в списку полягає в послідовному перегляді всіх
елементів списку до тих пір, поки поточний елемент не міститиме задане
значення або доки не буде досягнутий кінець списку. У останньому випадку
фіксується відсутність шуканого елементу в списку (функція набуває значення
false ).

//поиск элемента в однонаправленном списке


bool Find_Item_Single_List(Single_List* Head, int DataItem){
Single_List *ptr; //вспомогательным указатель
ptr = Head;
while (ptr != NULL){//пока не конец списка
if (DataItem == ptr->Data) return true;
else ptr = ptr->Next;
}
return false;
}
Видалення однонаправленого списку

Операція видалення списку полягає в звільненні динамічної пам'яті. Для даної


операції організовується функція, в якій потрібно переставляти покажчик на
наступний елемент списку до тих пір, поки покажчик не стане рівний NULL,
тобто не буде досягнутий кінець списку. Реалізуємо рекурсивну функцію.
/*освобождение памяти, выделенной под однонаправленный список*/
void Delete_Single_List(Single_List* Head){
if (Head != NULL){
Delete_Single_List(Head->Next);
delete Head;
}
}
Таким чином, однонаправлений список має лише один покажчик в кожному
елементі. Це дозволяє мінімізувати витрату пам'яті на організацію такого
списку. Одночасно це дозволяє здійснювати переходи між елементами лише в
одному напрямі, що частенько збільшує час, що витрачається на обробку
списку. Наприклад, для переходу до попереднього елементу необхідно
здійснити перегляд списку з початку до елементу, покажчик якого встановлений
на поточний елемент.

Постановка задачі. Створити лінійний однозв’язний список.


124
Кожна компонента списку є структура згідно варіанту.
Розорбити всі функції для роботи з компонентами списку :
 створення списку;
 друк (перегляд) списку;
 вставка елементу в список;
 видалення елементу із списку;
 пошук елементу в списку ;
 перевірка наявності елементів списку;
 видалення списку.

Варіанти завдань

Скласти програму для вводу, виводу й обробки лінійного списку структури


даних.
№1
В магазині формується список осіб, які записалися на купівлю товару
підвищеного попиту. Кожна структура цього списку містить: порядковий номер,
П.І.Б., домашню адресу покупця і дату постановки на облік. Вивести список
осіб в порядку черги за датою постановки на облік.
№2
Список товарів, наявних на складі, включає в себе найменування товару,
кількість одиниць товару, ціну одиниці і дату надходження товару на склад.
Вивести список товарів, що зберігаються більше місяця, вартість яких
перевищує 1000грн.
№3
Для отримання місця в гуртожитку формується список студентів, який включає
П.І.Б. студента, групу, середній бал, дохід на члена сім'ї. Гуртожиток в першу
чергу надається тим, у кого дохід на члена сім'ї менше двох мінімальних
зарплат, потім іншим в порядку зменшення середнього балу. Вивести список
черговості надання місць у гуртожитку.
№4
У довідковій автовокзалу зберігається розклад руху автобусів. Для кожного
рейсу зазначено його номер, тип автобуса, пункт призначення, час відправлення
та прибуття. Вивести інформацію про рейси, якими можна скористатися для
прибуття в пункт призначення раніше заданого часу.
№5
На міжміської АТС інформація про розмовах містить дату розмови, код та назва
міста, час розмови, тариф, номер телефону у цьому місті та номер телефону
абонента. Вивести по кожному місту загальний час розмов з ним і суму.

№6
Інформація про співробітників фірми включає: П.І.Б., табельний номер,
кількість відпрацьованих годин за місяць, погодинний тариф. Робочий час
125
понад 144 годин вважається надурочною і оплачується в подвійному розмірі.
Вивести розмір заробітної плати кожного працівника фірми за мінусом
прибуткового податку, що становить 12% від суми заробітку.
№7
Інформація про учасників спортивних змагань містить: назву країни, назву
команди, П.І.Б. гравця, ігровий номер, вік, зріст, вага. Вивести інформацію про
наймолодшою, рослої і легкої команді.
№8
Для книг, що зберігаються в бібліотеці, задаються: реєстраційний номер
книжки, автор, назва, рік видання, видавництво, кількість сторінок. Вивести
список книг з прізвищами авторів в алфавітному порядку, виданих після
заданого року.
№9
Різні цехи заводу випускають продукцію декількох найменувань. Відомості про
випущеної продукції включають: найменування, кількість, номер цеху. Для
заданого цеху необхідно вивести кількість випущених виробів по кожному
найменуванню в порядку убування кількості.
№10
Інформація про працівників підприємства містить: П.І.Б., номер відділу, посаду,
дату початку роботи. Вивести списки співробітників по відділах в порядку
убування стажу.
№11
Відомість абітурієнтів, які склали вступні іспити в коледж, містить: П.І.Б.,
адреса, оцінки. Визначити кількість абітурієнтів, які проживають. в місті і
склали іспити з середнім балом не нижче 4.5, вивести їх прізвища в алфавітному
порядку.
№12
У довідковій аеропорту зберігається розклад вильоту літаків на наступну добу.
Для кожного рейсу вказані: номер рейсу, тип літака, пункт призначення, час
вильоту. Вивести всі номери рейсів, типи літаків і часи вильоту для заданого
пункту призначення у порядку зростання часу вильоту.
№13
У адміністратора залізничних кас зберігається інформація про вільні місця в
поїздах далекого прямування на найближчий тиждень в наступному вигляді:
дата виїзду, пункт призначення, час відправлення, кількість вільних місць.
Оргкомітет міжнародної конференції звертається до адміністратора з проханням
зарезервувати т місць до міста N на k-й день тижня з часом відправлення поїзда
не пізніше t годин вечора. Вивести час відправлення або повідомлення про
неможливість виконати замовлення в повному обсязі.
№14
Відомість абітурієнтів, які склали вступні іспити в університет, містить: П.І.Б.
абітурієнта, оцінки. Визначити середній бал по університету і вивести список

126
абітурієнтів, середній бал яких вище середнього бала по університету. Першими
в списку повинні йти студенти, які склали всі іспити на 5.

№15
У радиоателье зберігаються квитанції про зданої в ремонт радіоапаратурі.
Кожна квитанція містить наступну інформацію: найменування групи виробів
(телевізор, радіо тощо), марку виробу, дату приймання в ремонт, стан
готовності замовлення (виконано, не виконано). Вивести інформацію про стан
замовлень на поточні добу за групами виробів.
№16
Розробити програму формування відомості про успішність студентів. Кожна
структура цієї відомості повинна містити: номер групи, П.І.Б. студента, оцінки
за останню сесію. Вивести списки студентів по групах. У кожній групі П.І.Б.
студентів повинні бути розташовані у порядку зменшення середнього балу.
№17
У виконкомі формується список обліку потребуючих поліпшення житлових
умов. Кожна структура цього списку містить: порядковий номер, П.І.Б., розмір
житлової площі на одного члена сім'ї та дату постановки на облік. За заданою
кількістю квартир, що виділяються з даного списку протягом року, вивести весь
список із зазначенням очікуваного року отримання квартири.
№18
Є список женихів і список наречених. Кожна структура списку містить стать,
ім'я, вік, зріст, вага, а також вимоги до партнера: найменший і найбільший вік,
найменший і найбільший вагу, найменший і найбільший зростання. Об'єднати
ці списки в список пар з урахуванням вимог партнерам без повторень женихів і
наречених.
№19
В бібліотеці є список книг. Кожна структура цією списку містить: прізвища
авторів, назву книги, рік видання. Вивести інформацію про книгах, в назві яких
зустрічається якийсь ключове слово (ввести з клавіатури).
№20
В магазині є список надійшли в продаж автомобілів. Кожна структура цього
списку містить: марку автомобіля, вартість, витрата палива на 100 км,
надійність (число років безвідмовної роботи), комфортність (відмінна, добра,
задовільна). Вивести перелік автомобілів, що задовольняють вимогам покупця,
які вводяться з клавіатури у вигляді деякого інтервалу допустимих значень.
№21
Кожна структура списку вакантних робочих місць містить: найменування
організації, посада, кваліфікацію (розряд або утворення), стаж роботи за
спеціальністю, заробітну плату, наявність соціального страхування (так/ні),
тривалість щорічної оплачуваної відпустки. Вивести список робочих місць у
відповідності з вимогами клієнта.
№22
127
В технічній службі аеропорту є довідник, який містить записи наступної
структури: тип літака, рік випуску, витрата пального 1000 км. Для визначення
потреби в пальному технічна служба запитує розклад польотів. Кожна
структура розкладу містить наступну інформацію: номер рейсу, пункт
призначення, дальність польоту. Вивести сумарну кількість пального, необхідне
для забезпечення польоту на наступну добу.
№23
Для участі в конкурсі на заміщення вакантної посади співробітника фірми
бажаючі подають наступну інформацію: П.І.Б., рік народження, освіта(середня,
спеціальна, вища), знання іноземних мов (англійська, німецька, французька,
вільно володію, читаю і перекладаю зі словником), володіння комп'ютером
(MSDOS,Windows), стаж роботи, наявність рекомендацій. Вивести список
претендентів відповідно до вимог керівництва фірми.
№24
При постановці на облік в ДАІ автолюбителі вказують наступні дані: марка
автомобіля, рік випуску, номер двигуна, номер кузова, колір, номерний знак,
П.І.Б і адресу власника. Вивести список автомобілів, що проходять техогляд в
поточному році, згрупованих за марками автомобілів. Врахувати, що якщо
поточний рік парний, техогляд проходять автомобілі з парними номерами
двигунів, інакше - з непарними номерами.
№25
Для участі в конкурсі виконавців необхідно заповнити наступну анкету: П.І.Б.,
рік народження, назву країни, клас музичного інструменту (гітара, фортепіано,
скрипка, віолончель). Вивести список наймолодших лауреатів конкурсу по
класах інструментів у порядку зайнятих місць.
№26
Список студентів групи містить наступну інформацію: П.І.Б., ріст і вага.
Вивести П.І.Б. студентів, ріст і вага яких найчастіше зустрічаються в списку.
№27
Список студентів групи містить наступну інформацію: П.І.Б., ріст і вага.
Вивести П.І.Б. студентів, ріст і вага яких є в списку унікальними.

Оформити звіт з виконання роботи.

Лабораторна робота №14. Тема: Програмування задач з використанням


стека, черги.
МЕТА:1.Ознайомлення з динамічною структурою даних -. стек, черга.
2.Отримання навиків роботи з змінними вказівного типу.

128
3.Ознайомлення з можливістю виконання операції включення елементів
в стек, чергу та їх виключення зі вказаного списку.
Теоретичні відомості
До динамічних структур даних належать такі структури, розміри яких
визначаються і можуть змінюватися протягом виконання програми.
Основними видами динамічних структур є лінійні списки та дерева
(нелінійні списки).
Зв’язний лінійний список це набір однотипних компонентів, які зв’язані
між собою за допомогою вказівників.
Зв’язані лінійні списки бувають таких типів:
• однозв’язний лінійний список;
• двозв’язний лінійний список;
• стек;
• черга:
• дек.
Однозв’язний лінійний список це список, в якому попередній
компонент посилається на наступний.
У випадку. коли в однозв’язному лінійному списку останній елемент
посилається на перший, утворюється однозв’язний циклічний список.
Двозв’язний лінійний список це список, в якому попередній компонент
посилається на наступний, а наступний на попередній.
У випадку. коли в двозв’язному лінійному списку останній елемент
посилається на перший, а перший на останній, утворюється двозв’язний
циклічний список.
Стек це однозв’язний лінійний список, в якому компоненти додаються та
видаляються лише з його вершини, тобто з початку списку.
Черга це однозв’язний лінійний список, в якому компоненти додаються
в кінець списку, а видаляються з вершини, тобто з початку списку.
Дек (англ. Double ended queue двобічна черга) це черга, в якій елементи
можуть додаватися і видалятися з обох кінців.
Кожен компонент цього списку містить інформаційне поле data та поле-
вказівник next на наступний компонент.
Стек (англ. stack) це однозв’язний лінійний список, в якому доступ
(вставка/видалення) до його компонент здійснюється через початок (вершину
head) списку.
Стек працює за принципом LIFO (від англ. Last In First Out останній
прийшов перший пішов).
Черга (англ. queue) це однозв’язний лінійний список, в якому вставка
елементів здійснюється у її кінець (rear), а видалення через початок (front).
Черга працює за принципом FIFO (від англ. First In First Out перший прийшов
перший пішов). Для роботи зі стеком достатньо мати покажчик head на його
вершину та допоміжний покажчик (наприклад current) на елемент стеку.

129
Наведемо алгоритми основних операцій зі стеком - вставка та видалення його
елемента.
Алгоритм вставки елемента до стеку
1. Виділити пам'ять для нового елемента стеку.
2. Ввести дані до нового елемента.
3. Зв'язати допоміжний елемент із вершиною.
4. Встановити вершину стеку на новостворений елемент.

Зауважимо, що значення покажчика head на вершину порожнього стеку є


NULL. Тому для створення стеку слід виконати оператор Head=NULL та
повторити щойно наведений алгоритм потрібну кількість раз.
Алгоритм видалення елемента із непорожнього стеку
1. Створити копію покажчика на вершину стеку
2. Перемістити покажчик на вершину стеку на наступний елемент
3. Звільнити пам'ять із-під колишньої вершини стеку.
Зрозуміло, що для очищення всього стеку слід повторювати кроки 1-3
доти, доки покажчик head не дорівнюватиме NULL.
Графічне представлення алгоритму видалення елемента із непорожнього
стеку

Для наглядної ілюстрації роботи із стеком напишемо програму , основні


функції, використовувані при роботі зі стеками -- push і pop. Функція push
створює новий вузол і поміщає його на вершину стека. Функція pop видаляє
верхній вузол стека, звільняє пам'ять, що була виділена вилученому вузлу, і
повертає вилучене значення.
Програма працює із простим стеком цілих чисел.
Програма виконує три дії на вибір:
1) поміщає значення в стек (функція push);
2) вилучає значення зі стека (функція pop);
3) завершує роботу.

Prog_1.cpp
/*Програма створення простого стеку*/
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
struct stackNode
{/*структура, що посилається на себе*/
int data;
struct stackNode *nextPtr;
};
typedef struct stackNode STACK NODE;
130
typedef STACK NODE *STACK NODEPTR;
void push(STACKNODEPTR *, int);
int pop(STACKNODEPTR *);
int isEmpty(STACKNODEPTR);
void printStack(STACKNODEPTR);
void instructions(void);
using std::cout;
using std::endl;
main() {
STACKNODEPTR stackPtr = NULL; /*Вказівник на вершину*/
int choice, value;
instructions();
printf ("? ");
scanf("%d", &choice) ;
while (choice !=3) {
switch (choice) {
case 1: /*Занесення значення в стек*/
printf("Enter an integer: ");
scanf("%d", &value);
push (&stackPtr, value);
printStack (stackPtr);
break;
case 2: /*Видалення значення із стеку*/
if (!isEmpty(stackPtr))
printf("The popped value is %d.\n", pop(&stackPtr)) ;
printStack(stackPtr);
break;
default:
printf("Invalid choice.\n\n");
instructions();
break;
}
printf ("? ");
scanf("%d", &choice); }
printf("End of run.%n"); return 0;
}
/*Вивід інструкції на екран*/
void instructions(void) {
printf("Enter choice:\n"
"1 to push a value on the stack\n"
"2 to pop a value off the stack\n"
"3 to end program\n"); }
/*Занесення нового значення у вершинку стеку*/
131
void push (STACKNODEPTR *topPtr, int info)
{ STACKNODEPTR newPtr;
newPtr =new STACKNODE;
if (newPtr != NULL) {
newPtr->data = info;
newPtr->nextPtr = *topPtr;
*topPtr = newPtr; } else
printf("%d not inserted. No memory available.\n", info);
}
/*Видалення вузла на вершині стеку*/
int pop(STACKNODEPTR *topPtr)
{ STACKNODEPTR tempPtr;
int popValue;
tempPtr = *topPtr;
popValue = (*topPtr)->data;
*topPtr = (*topPtr)->nextPtr;
free(tempPtr); return popValue;
}
/*Друк стеку*/
void printStack(STACKNODEPTR currentPtr)
{ if (currentPtr == NULL)
printf ("The stack is empty.\n\n");
else { printf("The stack is:\n");
while (currentPtr != NULL) {
cout<<currentPtr->data<<"-->";
currentPtr = currentPtr->nextPtr;}
printf("NULL\n\n"); }
}
/*Перевірка чи пустий стек*/
int isEmpty(STACKNODEPTR topPtr)
{ return topPtr == NULL;}
При виконанні програми можливі результати:
Enter choice:
1 to push a value on the stack
2 to pop a value off the stack
3 to end program? 1
Enter an integer: 5 The stack is:
5 --> NULL
?1
Enter an integer : 6
The stack is:
6-->5-->NULL
?1
132
Enter an integer: 4 The stack is:
4--> 6 --> 5 --> NULL
?2
The popped value is 4.
The Stack is:
6 --> 5 --> NULL
?2
The popped value is 6. The Stack is:
5 --> NULL
?2
The popped value is 5.
The stack is empty.
?2
The stack is empty.
?4
Invalid choice.
Enter choice.:
1 to push a value on the stack
2 to pop a value off the stack
3 to end program ? 3
End of run.
Функція push поміщає новий вузол на вершину стека. За попередньо
наведеним алгоритмом маємо: створення нового вузла відбувається за
допомогою виклику операції new, при цьому вказівник newPtr має адресу блоку
виділеної пам'яті, змінній newPtr->data привласнюється значення, яке необхідно
помістити в стек, і покажчику newPtr->nextPtr вказує NULL, далі вказівнику
newPtr->nextPtr привласнюється *topPtr (вказвник на вершину стека); єднальний
елемент newPtr тепер вказує на вузол, що був верхнім до цього. *topPtr
привласнюється значення newPtr, *topPtr тепер вказує на нову вершину стека.
Функція pop видаляє верхній вузол стека. Відзначимо, що перед тим як
викликати pop, main визначає, чи не порожній стек. Функція pop працює
наступним чином:
1) Покажчику tempPtr привласнюється *topPtr (tempPtr буде використаний
для звільнення вільної пам'яті).
2) Змінній popValue привласнюється значення (*topPtr)->data (зберігається
значення, що перебувало у верхньому вузлі).
3) *topPtr привласнюється (*topPtr)->nextPtr (*topPtr привласнюється
адреса нового верхнього вузла).
Звільнення пам'яті, на яку вказує tempPtr.
Відбувається повертається значення popValue функції main.
2 Черги
Для роботи з чергою потрібні: покажчик head на початок черги, покажчик
last на кінець черги (можлива реалізація і без покажчика на останній елемент
133
черги) та допоміжний покажчик (наприклад current). Зауважимо, що елементи з
черги видаляються за тим самим алгоритмом, що і зі стеку, наведемо алгоритм
вставки до черги нового елемента.
Алгоритм вставки елемента до черги
1. Виділити пам'ять для нового елемента черги.
2. Ввести дані до нового елемента.
3. Вважати новий елемент останнім у черзі.
4. Якщо черга порожня, то ініціалізувати її вершину.
5. Якщо черга не порожня, то зв'язати останній елемент черги із
новоутворенним.
6. Вважати новий елемент черги останнім.
Нижче наведено приклад роботи із чергою. Програма пропонує виконати
наступні дії на вибір: поставити вузол у чергу (функція enqueue), видалити
вузол із черги (функція dequeue), і вийти із програми.
Prog_2.cpp
/*Програма створення простої черги*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct queueNode {
char data;
struct queueNode *nextPtr; };
typedef struct queueNode QUEUENODE;
typedef queueNode *QUEUENODEPTR;
/* function prototypes */
void printQueue(QUEUENODEPTR);
int isEmpty(QUEUENODEPTR);
char dequeue(QUEUENODEPTR *, QUEUENODEPTR *);
void enqueue (QUEUENODEPTR *, QUEUENODEPTR *, char);
void instructions (void);
using std::cout;
using std::endl;
main () {
QUEUENODEPTR headPtr = NULL, tailPtr = NULL;
int choice;
char item;
instructions ();
printf ("? ");
scanf("%d", &choice);
while (choice !=3) { switch(choice) {
case 1 :
printf("Enter a character: ");
134
scanf("\n%c", &item);
enqueue(&headPtr, &tailPtr, item);
printQueue(headPtr);
break;
case 2 :
if (! isEmpty(headPtr)) {
item = dequeue(&headPtr, &tailPtr);
printf("%c has been dequeued.\n" , item);
}
printQueue(headPtr);
break;
default:
printf ("Invalid choice.\n\n"); instructions(); break; }
printf ("?"); scanf("%d", &choice); }
printf("End of run.\n");
return 0;
}
void instructions(void)
{printf ("Enter your choice:\n"
" 1 to add an item to the queue\n"
" 2 to remove an item from the queue\n" " 3 to end\n"); }
void enqueue(QUEUENODEPTR *headPtr, QUEUENODEPTR *tailPtr,char
value) {
QUEUENODEPTR newPtr;
newPtr =new QUEUENODE;
if (newPtr != NULL) { newPtr->data = value; newPtr->nextPtr = NULL;
if (isEmpty(*headPtr))
*headPtr = newPtr; else
(*tailPtr)->nextPtr = newPtr;
*tailPtr = newPtr; } else
printf("%c not inserted. No memory available.\n", value);
}
char dequeue(QUEUENODEPTR *headPtr, QUEUENODEPTR *tailPtr) {
char value;
QUEUENODEPTR tempPtr;
value = (*headPtr)->data;
tempPtr = *headPtr;
*headPtr = (*headPtr)->nextPtr;
if (*headPtr == NULL) *tailPtr = NULL;
free(tempPtr); return value; }
int isEmpty(QUEUENODEPTR headPtr) {
return headPtr == NULL; }
void printQueue(QUEUENODEPTR currentPtr) {
135
if (currentPtr == NULL)
printf("Queue is empty.\n\n"); else {
printf("The queue is :\n");
while (currentPtr != NULL) {
cout<< currentPtr->data<<"-->";
currentPtr = currentPtr->nextPtr; }
printf("NULL\n\n"); }
}
При виконанні програми можливі результати:
Enter your choice:
1 to add an item to the queue
2 to remove an item from the queue
3 to end ? 1
Enter a character: A
The queue is:
A --> NULL
?1
Enter a character: В
The queue is:
A --> В --> NULL
?1
Enter a character: Z
The queue is:
A --> В --> Z -->NULL
?2
A has been dequeued.
The queue is:
B --> Z --> NULL
?2
В has been dequeued.
The queue is:
Z --> NULL
?2
Z has been dequeued.
Queue is empty.
?2
Queue is empty.
?4
Invalid choice.
Enter your choice:
1 to add an item to the queue
2 to remove an item from the queue
3 to end ? 3
136
End of run.
Функція enqueue одержує від main три аргументи: адресe вказівника на
голову черги, адресу вказівника на хвіст черги й значення, яке необхідно
поставити в чергу. Виконання функції складається із трьох кроків:
Створення нового вузла: викликати new, присвоїти адреса виділеного
блоку пам'яті newPtr, присвоїти newPtr->data значення, що необхідно поставити
в чергу, a newPtr->nextPtr присвоїти NULL.
Якщо черга порожня, присвоїти *headPtr покажчик newPtr; в іншому
випадку присвоїти цей покажчик (*tailPtr)->nextPtr.
3) І нарешті, присвоїти *tailPtr покажчик newPtr.
Функція dequeue отримує в якості аргументів адрес вказівника на голову
черги і адрес вказівника хвоста і видаляє перший вузол черги. Виконання
dequeue відбувається наступним чином:
1. Змінній value привласнюється значення (*headPtr)->data (зберегти дані);
2. Присвоїти вказівнику tempPtr значення *headPtr (tempPtr
використовується для звільнення вільної пам'яті).
3. Присвоїти вказівнику *headPtr значення (*headPtr)->nextPtr. (*headPtr
зараз вказує на новий перший вузол черги).
4. Якщо *headPtr вказує на NULL, встановити *tailPtr також вказуючим на
NULL.
5. Вивільнити блок пам'яті, на який вказує tempPtr.
6. Передати значення value викликавшій функції (функція dequeue
викликається із main).
ПОСТАНОВКА ЗАДАЧІ.
1. Виконати реалізацію програми згідно варіанту: Задача 1.
2. Виконати реалізацію програми згідно варіанту: Задача 2.
3адача1:Варіанти завдань
1. Створити чергу із символів. Прочитати чергу на екран. Скласти
процедуру включення елементу в чергу.
2. Створити стек із символів Прочитати стек на екран. Скласти процедуру
виключення елементу зі стеку.
3. Створити чергу із чисел. Прочитати чергу на екран. Скласти підпрограму
перевірки наявності елементів в черзі.
4. Створити стек із чисел. Прочитати стек на екран. Скласти підпрограму
перевірки наявності елементів в стеку.
5. Створити чергу із символів. Прочитати чергу на екран. Скласти
процедуру включення елементу в чергу.
6. Створити стек із символів. Прочитати стек на екран. Скласти процедуру
включення елементу зі стеку.
Задачі з використанням різних видів списків (на „добре)”
7. Створити однозв’язний лінійний список з довільних цілих чисел. Додатні
числа записати у стек не змінюючи їх послідовність. Аналогічно, від’ємні
числа записати у чергу. Прочитати список, чергу і стек на екран.
137
8. Створити однозв’язний лінійний список зі слів деякого рядка,
розташувавши їх в списку в алфавітному порядку. Прочитати список на
екран. Записати слова в стек , вилучивши ті що дублюються, вивести стек
на екран.
Задачі підвищеної трудності на „відмінно”
9. Реалізувати операцію додавання двох великих чисел зображених у формі
стеків. Значенням елемента стеку буде значення певної цифри числа.
Підчас обчислення суми її розряди також слід записувати у стек, а потім –
виводити значення елементів цього стеку.
10.Реалізувати операцію віднімання двох великих чисел зображених у формі
стеків. Значенням елемента стеку буде значення певної цифри числа. Під
час обчислення різниці її розряди також слід записувати у стек, а потім –
виводити значення елементів цього стеку.
11.Створити двозвязний лінійний список, елементами якого є слова
тексту.Вивести слова в прямому та в оберненому порядку відповідно у
стек і чергу. Прочитати двозвязний список, стек і чергу на екран.

Задача 2.
Приклади програм

3.1. Черга

#include <iostream.h>
#include <conio.h>

// Структура елементу черги.


struct Tqueue {
int Info;// інформаційне поле.
Tqueue* Next;// покажчик на наступний елемент в черзі.
};

// Покажчик на голову черги. Спочатку рівний NULL, оскільки черга порожня.


Tqueue* Head = NULL;
// Покажчик на хвіст черги. Спочатку рівний NULL, оскільки черга порожня.
Tqueue* Tail = NULL;

// Фунция додавання елементу в чергу.


void Add(int Value){// Value - значення, яке потрібно помістити в чергу.
Tqueue* Newrecord = new Tqueue;// Створюється новий елемент черги.
Newrecord->info = Value;// Заповнюється інформаційне поле.
Newrecord->next = NULL;// Після Newrecord елементів немає.
138
if (Tail) // Якщо черга не порожня, то
Tail->next = Newrecord;// наступним елементом після хвоста черги
// стає Newrecord
else Head = Newrecord;// інакше Newrecord стає головою черги.

Tail = Newrecord;// Newrecord стає хвостом черги.


}

// Функція читання елементу з черги з видаленням.


// Повертає 1, якщо черга не порожня, і 0 - якщо порожня.
char Del(int &Value){// в Value поміщається прочитане значення.
if (Head) {// Перевірка, чи не порожня черга.
Value = Head->info;// Читаємо інформаційне поле з голови черги.
Tqueue* Temp = Head;// Запам'ятовуємо покажчик на голову черги.
Head = Head->next;// Встановлюємо як голову черги елемент
// який був наступним після голови.
delete Temp;// Видаляємо елемент, який був головою черги.
if (!Head) Tail = NULL; // Якщо був лічений останній елемент черги
// то обнуляємо хвіст.
return 1;// Читання успішне.

else return 0;// Повертаємо значення, що повідомляє про спробу читання з


порожньої черги.
}

int main() {
Add(1);// Вносимо до черги значення 1,2,3
Add(2);
Add(3);

// Намагаємося прочитати з черги 4 значення.


// Набуваємо значень 3,2,1 і повідомлення про порожню чергу.
int а = 0;
for (int i=0; i<4; i++) {
if (Del(a))
cout << а << endl;
else cout << "Queue is empty";

return 0;
}

139
3.2. Стек

#include <iostream.h>
#include <conio.h>

// Структура елементу стека.


struct Tstack {
int Info;// інформаційне поле.
Tstack* Next;// покажчик на наступний елемент в списку.
};

// Покажчик на вершину стека. Спочатку рівний NULL, оскільки стек порожній.


Tstack* First = NULL;

// Фунция додавання елементу в стек


void Push(int Value){// Value - значення, яке потрібно помістити в стек.
Tstack* Newrecord = new Tstack;// Створюється новий елемент стека.
Newrecord->info = Value;// Заповнюється інформаційне поле.
Newrecord->next = First;// Наступним елементом після знов створеного
// стає елемент, який раніше був у вершині стека.

First = Newrecord;// Як вершина стека встановлюється Newrecord.


}

// Функція читання елементу із стека з видаленням.


// Повертає 1, якщо стік не порожній, і 0 - якщо порожній.
char Pop(int &Value){// в Value поміщається прочитане значення.
if (First) {// Перевірка, чи не порожній стек.
Value = First->info;// Читаємо інформаційне поле з елементу у вершині
стека.
Tstack* Temp = First;// Запам'ятовуємо покажчик на перший елемент в
стеку.
First = First->next;// Встановлюємо як вершину стека елемент
// який був наступним після вершини.
delete Temp;// Видаляємо елемент, який був вершиною стека.
return 1;// Читання успішне.

else return 0;// Повертаємо значення, що повідомляє про спробу читання з


порожнього стека.
}

int main() {
Push(1);// Вносимо до стека значення 1,2,3
140
Push(2);
Push(3);

// Намагаємося прочитати із стека 4 значення.


// Набуваємо значень 3,2,1 і повідомлення про порожній стек.
int а = 0;
for (int i=0; i<4; i++) {
if (Pop(a))
cout << а << endl;
else cout << "Stack is empty";

return 0;
}
Варіанти задачі 2
Варіант №1.
Реалізувати стек для зберігання і операцій з даними виду:
Ім'я процедури Кількість параметрів Параметри (по 2 байти)
Забезпечити виконання операцій:
 додавання процедури в стек;
 видалення процедури зі стека;
 видалення стека (висвободження місця у пам'яті);
 роздрукування вмісту стека;
 підрахунок розміру пам'яті, зайнятої стеком;
 підрахунок кількості процедур, що знаходиться у стеку.

Варіант №2.
Реалізувати стек для зберігання і операцій з даними виду:
Ім'я Значення, що повертається Кількість Параметри (по 6
функції (6 байтів) параметрів байтів)
Забезпечити виконання операцій:
 виділення місця в пам'яті під стек;
 додавання функції в стек;
 видалення функції із стека;
 попередження про можливе переповнювання;
 повідомлення про переповнювання;
 роздрук вмісту стека;
 звільнення пам'яті, виділеної під стек.

Варіант №3.
Реалізувати чергу для зберігання і операцій з даними виду:
Прізвище Спеціальність Дата подання заяви Дата реєстрації на біржі праці
141
Забезпечити виконання операцій:
 додавання елементу в чергу;
 видалення елементу з черги;
 визначення розміру черги;
 роздрук черги;
 знаходження в черзі елементу по прізвищу з вказівкою черговості;
 формування списку по заданій спеціальності.

Варіант №4.
Реалізувати чергу для зберігання і операцій з даними виду:
Ім'я Мова Розмір пам'яті, що Час
програми програмування потребується виконання
Забезпечити виконання операцій:
 виділення місця в пам'яті під чергу;
 додавання елементу в очередеь;
 видалення елементу з черги;
 попередження про можливе переповнювання;
 повідомлення про переповнювання;
 визначення часу виконання всіх програм;
 звільнення пам'яті, виділеної під чергу.

Варіант №5.
Реалізувати чергу для зберігання і операцій з даними виду:
Найменування пристрою Рік випуску Вартість
Забезпечити виконання операцій:
 додавання елементу в чергу;
 видалення елементу з черги в порядку запису;
 визначення позиції елементу у черзі;
 видалення всіх елементів із заданим полем;
 роздрукування черги.

Варіант №6.
Реалізувати чергу для зберігання і операцій з даними виду:
Ім'я програми Час виконання
Забезпечити виконання операцій:
 формування черги;
 автоматична прокрутка черги з виділенням "кванта часу центрального
процесора";
 додавання елементів в чергу;
 автоматичне виведення елементів з черги по використанню часу процесора
(видати повідомлення);

142
 видача довідки про кількість елементів в черзі;
 роздрукування черги.

Задачі з використанням різних видів списків (на „добре” та «відмінно»

Варіант №7.
Реалізувати список для зберігання і операцій з даними виду:
Найменування моделі Дата виготовлення Кількість
У список входять усі записи. В стек - лише ті записи, де поле "Кількість"
< К. В чергу - лише ті записи, де поле Дата виготовлення менше заданого Р.
Забезпечити виконання операцій:
 додавання нового елементу в список;
 пошук елементу за полем кількість;
 роздрукування підсписків;
 корегування значення поля "Кількість" вибраного елементу.

Варіант №8
Реалізувати список для зберігання і операцій з даними виду:
Прізвище Країна Рік вступу Вартість навчання
У список входять усі записи. В чергу - лише ті записи, де поле "Країна" не
дорівнює "Україна".У стек - лише ті записи, де поле Рік вступу більше заданого
Р.
Забезпечити виконання операцій:
 додавання нового елементу в невпорядкований список;
 впорядкування списку за полем "Прізвище";
 додавання елемента в впорядкований список;
 корегування поля "Країна" обраного елементу;
 роздрукування підсписків;
 роздрукування переліку країн.

Варіант №9
Реалізувати список для зберігання і операцій з даними виду:
Товар Вартість Кількість Дата постачання
У перший список входять усі записи. В чергу- лише ті, у яких "Вартість"
більша ніж С. В стек - лише ті, дата постачання яких більш рання, ніж D.
Забезпечити виконання операцій:
 додавання нового елементу в список;
 роздрукування списків;
 видалення елементу з заданим полем;
 знаходження сумарної вартості товару;
 зміна критерію С.
143
Варіант №10.
Реалізувати лінійний список для зберігання і операцій з даними виду:
Відділ Тип ПК Розмір ОП Наявність мережі
У список входять усі записи. В стек - лише ті, у яких "Розмір ОП" не
нижче, ніж 8ГБ. В чергу - ПК, де є мережа.
Забезпечити виконання операцій:
 додавання нового елементу в список;
 дооснащення відділу технікою;
 списання старої техніки;
 встановлення у відділі мережевого обладнання;
 роздрукування списків;
Варіант №11
Реалізувати лінійний список для зберігання і операцій з даними виду:
Прізвище Рік народження Освіта Стаж
У перший список входять усі записи. В стек записати лише ті, у яких "Рік
народження" менше, ніж G. В чергу записати - лише ті компоненти, у яких стаж
більше n років.
Забезпечити виконання операцій:
 додавання нового елементу в невпорядкований список;
 сортування списку за полем "Прізвище";
 додавання нового елементу в впорядкований список;
 роздрукування черги;
 видалення елементу з списку;
 визначення кількості осіб з вищою освітою.

Оформити звіт:
1. Тема.
2. Мета.
3. Постановка задачі.
4. Програма.
5. Результати роботи.
6. Висновки.

Лабораторна робота №15. Тема: Програмування задач з використанням


дерев.
МЕТА:Метою даної лабораторної роботи є закріплення та доповнення
лекційного матеріалу, та набуття студентами практичних навичок вирішення
основних завдань програмування задач на С++ з використанням динамічної
структури - дерево.

144
Для лабораторної роботи наведені теоретичні та довідкові положення,
приклади рішень типових задач та завдання до лабораторної роботи. Номер
завдання відповідає порядковому номеру за журналом.

В ході самостійної підготовки, що передує лабораторній роботі,


вивчається лекційний та допоміжний матеріал, проводиться аналіз завдання,
виконується розробка алгоритму його вирішення та підготовлюється вихідний
текст програми на паперовому та електронному носії.

1. Теоретичні відомості
Дерева
Дерево - це граф, який характеризується наступними властивостями:
1. Існує єдиний елемент (вузол або вершина), на який не посилається
ніякий інший елемент, і який називається коренем.
2. Починаючи з кореня і слідуючи по певному ланцюжку покажчиків, що
містяться в елементах, можна здійснити доступ до будь-якого елементу
структури.
3. На кожен елемент, окрім кореня, є єдине посилання, тобто кожен
елемент адресується єдиним покажчиком.
Бінарні дерева

Існують m-арне дерева, тобто такі дерева у яких напівступінь результату


кожної вершини менше або рівна m (де m може бути рівне 0,1,2,3 і так далі).
Якщо напівступінь результату кожної вершини в точності рівний або m, або
нулю, то таке дерево називається повним m-арним деревом.
При m=2 такі дерева називаються відповідно бінарними, або повними
бінарними. На малюнку 1.(a) зображено бінарне дерево, 1.(b) - повне бінарне
дерево, а на (c) показані всі чотири можливі розташування синів деякої вершини
бінарного дерева.

145
Рис. 1 Зображення бінарних дерев

Бінарні дерева, зображені на рис.1. a) і 1.(d), є різними позиційними


деревами, хоча вони не є різними впорядкованими деревами.
У позиційному бінарному дереві кожна вершина представлена єдиним
чином за допомогою рядка символів над алфавітом {0,1}, при цьому корінь
характеризується порожнім рядком. Будь-який син вершини "u"
характеризується рядком, префікс (початкова частина) якого є рядком,
характеризуючою "u".
Прикладом бінарного дерева є фамільне дерево з отцем і матерью людини
як його нащадки. Ще один приклад - це арифметичний вираз з двомісними
операціями, де кожна операція є вузлом, що гілкується, з операндами як
піддерева.
Представити m-арне дерево в пам'яті ЕОМ складно, оскільки кожен
елемент дерева повинен містити стільки покажчиків, скільки ребер виходить з
вузла (при m-3,4.5.6... відповідає 3,4,5,6... покажчиків). Це приведе до
підвищеної витрати пам'яті ЕОМ, різноманітності початкових елементів і
ускладнить алгоритми обробки дерева. Тому m-арне дерева, ліс необхідно
привести до бінарних для економії пам'яті і спрощенню алгоритмів . Всі вузли
бінарного дерева представляються в пам'яті ЕОМ однотипними елементами з
двома покажчиками, крім того, операції над двійковими деревами виконуються
просто і ефективно.

Приклади програм

3.Створити двійкове дерево з цілих чисел. Забезпечити операції : додавання


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

#include <iostream.h>
#include <conio.h>
// Структура елементу дерева.
struct Ttree {
int Info;// інформаційне поле.
Ttree* Brother;// покажчик на наступного за старшинством брата.
Ttree* Son;// покажчик на старшого сина.
};
// Покажчик на корінь дерева. Спочатку рівний NULL, оскільки дерево порожнє.
Ttree* Root = NULL;

// Додавання елементу в дерево.


// Parent - батьківський елемент. Якщо він рівний NULL
146
// то відбувається додавання в корінь.
// Value - значення, записуване в інформаційне поле.
void Add(Ttree* Parent, int Value)
{
Ttree* Newrecord = new Ttree;// Створюється новий елемент дерева.
Newrecord->info = Value;// Заповнюється інформаційне поле.
Newrecord->son = NULL;// Покажчик на сина обнуляється.

if (Parent) {// Якщо існує батьківський елемент


// то його братом стає старший син його батька.
Newrecord->brother = Parent->son;
// Створений елемент стає сином елементу Parent.
Parent->son = Newrecord;

else {// Якщо батьківського елементу не існує


// то братом створеного елементу стає корінь дерева.
Newrecord->brother = Root;
// Створений елемент стає коренем.
Root = Newrecord;

}
// Пошук елементу.
// Повертає покажчик на знайдений елемент або NULL
// якщо шуканий елемент не існує.
// Вважаємо, що поле Info має унікальне значення у кожного елементу дерева.
// Currentroot - поточний корінь дерева.
// Value - значення, яке повинне міститися в полі Info шуканого елементу.
Ttree* Find(Ttree* Currentroot, int Value)
{
// Якщо поточний корінь дерева існує
if (Currentroot) {
// то перевірятимуться, чи співпадає його поле Info із значенням Value.
// Якщо співпадає, то повертається покажчик на поточний корінь.
if (Currentroot->info == Value) return Currentroot;
else {// Інакше здійснюється пошук в поддереве, де
// коренем є Currentroot->son.
Ttree* Temp = Find(Currentroot->son,value);
// Якщо значення Temp не нульове, означає шуканий елемент
// знайдений в поддереве з коренем Currentroot->son.
// Тоді Temp повертається як відповідь.
if (Temp) return Temp;
// Інакше повертається покажчик, знайдений в поддереве
// з коренем Currentroot->brother.
147
else return Find(Currentroot->brother,value);

// Якщо поточний корінь не існує, повертається NULL.


else return NULL;
}
// Відображає дерево на екрані.
// Currentroot - покажчик на поточний корінь.
void Show(Ttree* Currentroot)
{
// Якщо поточний корінь існує, то
if (Currentroot) {
// значення поля Info поточного кореня виводиться на екран.
cout << Currentroot->info << " ";
// Виводиться поддерево з коренем Currentroot->son.
Show(Currentroot->son);
// Виводиться поддерево з коренем Currentroot->brother.
Show(Currentroot->brother);

}
// Видаляє всі вузли дерева.
// Currentroot - покажчик на поточний корінь.
void Clear(Ttree* Currentroot)
{
// Якщо поточний корінь існує, то
if (Currentroot) {
// Віддаляється поддерево з коренем Currentroot->son.
Clear(Currentroot->son);
// Віддаляється поддерево з коренем Currentroot->brother.
Clear(Currentroot->brother);
// Віддаляється поточний корінь.
delete Currentroot;

}
// Головна функція.
int main() {
// Додаємо елемент в корінь.
Add(Null,1);
// Додаємо синів до елементу 1.
Add(Find(Root,1),11);
Add(Find(Root,1),12);
Add(Find(Root,1),13);
// Додаємо синів до елементу 11.
148
Add(Find(Root,11),111);
Add(Find(Root,11),112);
// Додаємо синів до елементу 13.
Add(Find(Root,13),131);
Add(Find(Root,13),132);
Add(Find(Root,13),133);
// Додаємо ще одного сина до елементу 1.
Add(Find(Root,1),14);
// Додаємо ще один елемент в корінь.
Add(Null,2);
// Виводимо дерево на екран.
Show(Root);
// Очищаємо дерево.
Clear(Root);

return 0;
}
Задача1. Варіанти завдань

Варіант №1.
Реалізувати бінарне дерево для зберігання і операцій з даними виду:
Ім'я Рік народження Місто
Забезпечити виконання операцій:
 додавання нового елементу в дерево у діалоговому режимі;
 обхід зверху;
 підрахунок кількості листів;
 знаходження найдовшої гілки;
 роздрукування дерева;
 роздрукування усіх вузлів з однаковим містом.

Варіант №2.
Реалізувати бінарне дерево для зберігання і операцій з даними виду:
Найменування блоку Вартість Кількість вузлів
Забезпечити виконання операцій:
 додавання нового елементу в дерево у діалоговому режимі;
 обхід зліва направо;
 підрахунок кількості гілок;
 знаходження блоку з найбільшим числом вузлів;
 роздрукування листя;
 роздрукування дерева.

Варіант №3.
149
Реалізувати бінарне дерево для зберігання і операцій з даними виду:
Найменування товару Кількість Вартість одиниці
Забезпечити виконання операцій:
 додавання нового елементу в дерево у діалоговому режимі;
 обхід знизу;
 виділення піддерева в самостійне дерево (задається вузел);
 побудова копії вказаного дерева;
 роздрукування дерева;
 підрахунок загальної вартості товару.

Варіант №4.
Реалізувати бінарне дерево для зберігання і операцій з даними виду:
Деталь Кількість Постачальник
Забезпечити виконання операцій:
 додавання нового елементу в дерево у діалоговому режимі;
 обхід зверху;
 визначення входження "Деталі" в дерево;
 роздрукування дерева;
 визначення постачальника найбільшої кількості деталей.

Варіант №5.
Реалізувати бінарне дерево для зберігання і операцій з даними виду:
Найменування служби Кількість співробітників Сума заробітної платні
Забезпечити виконання операцій:
 додавання нового елементу в дерево у діалоговому режимі;
 обхід зліва направо;
 видалення із дерева вказаного вузла;
 визначення найбільш дорогої служби;
 роздрукування дерева;
 визначення кількості співробітників у вказаній службі та в усіх її підлеглих.

Варіант №6.
Реалізувати бінарне дерево для зберігання і операцій з даними виду:
Найменування Рік видання Кількість сторінок Автор
Забезпечити виконання операцій:
 додавання нового елементу в дерево у діалоговому режимі;
 обхід знизу;
 роздрукування усіх вузлів, що створюють заданий рівень;
 формування окремого дерева з творів заданого автора;
 підрахунок кількості творів кожного автора;
 видалення із дерева однакових вузлів.
150
Варіант №7.
Реалізувати бінарне дерево для зберігання і операцій з даними виду:
Найменування процесу Кількість складових Тривалість
Забезпечити виконання операцій:
 додавання нового елементу в дерево у діалоговому режимі;
 обхід зверху;
 створення окремого дерева із усіх процесів з однаковою тривалістю;
 перерозподіл вузлів в дереві таким чином, щоб процеси з найбільшою
кількістю складових займали найбільш високий рівень;
 роздрукування вказаного піддерева;
 роздрукування дерева.

Варіант №8.
Реалізувати бінарне дерево для зберігання і операцій з даними виду:
Клас Кількість підкласів Місце проживання
Забезпечити виконання операцій:
 додавання нового елементу в дерево у діалоговому режимі;
 обхід зліва направо;
 роздрукування усіх узлів з однаковим місцем проживання;
 знаходження місця проживання, де знаходиться найбільша кількість класів і
підкласів;
 роздрукування найбільш довгої гілки дерева;
 роздрукування дерева.

Варіант №9.
Реалізувати бінарне дерево для зберігання і операцій з даними виду:
Найменування Вага Вартість Колір
Забезпечити виконання операцій:
 додавання нового елементу в дерево у діалоговому режимі;
 обхід знизу;
 побудова окремих дерев для різних кольорів;
 роздрукування дерева;
 видалення із дерева усіх вузлів, що повторюються (в діалоговому режимі з
підтвердженням).

Задача 2 варіанти завдань:


1. Впорядкувати довільну послідовність цілих чисел в порядку зростання,
використовуючи війкове (бінарне) дерево. Прочитати на екран. Скласти
процедуру виключення елементу з дерева.
2. Побудувати бінарне дерево цілих чисел, вивести його і обчислити середнє
арифметичне усіх його вузлів
151
3. Впорядкувати довільну послідовність чисел в порядку спадання,
використовуючи, двійкове дерево. Прочитати на екран. Скласти
процедуру включення елемента в дерево.
4. Створити дерево – словник (рос-англ). Прочитати дерево на екран.
Підрахувати кількість його листків. Скласти процедуру пошуку слова по
заданому ключу. ( на „ відмінно”).
5. Створити дерево із ключових термінів, та їх визначень. Прочитати дерево
на екран. Скласти процедуру пошуку визначення терміну по заданому
ключу. Визначити рівень по якому розташовано цей елемент. ( на
„ відмінно”).
6. Впорядкувати довільну послідовність символів в порядку зростання,
використовуючи, двійкове дерево. Прочитати на екран. Скласти
процедуру виключення елементу з дерева.
7. Впорядкувати довільну послідовність символів в порядку спадання,
використовуючи, двійкове дерево. Прочитати на екран. Скласти
процедуру включення елемента в дерево.
8. .Створити дерево – словник (укр-англ). Прочитати дерево на екран.
Скласти процедуру виключення слова зі словника ( на „ відмінно”).
9. Створити дерево із ключових термінів, та їх визначень. Прочитати дерево
на екран. Скласти процедуру включення терміну в дерево.
10. Створити бінарне дерево .Визначити максимальне значення вузла дерева.
11. Побудувати бінарне дерево і поміняти місцями найбільший і найменший
його елементи. Відобразити початкове і отримане дерево. ( на
„ відмінно”).

Оформити звіт.
1. Тема.
2. Мета.
3. Постановка задачі.
4. Програма.
5. Результати роботи.
6. Висновки.

Література

1. Ахо Альфред В., Хопкрофт Джон Ульман, Джеффри, Д. Структуры данных и


алгоритмы : Пер. с англ. : Уч. пос. - М. : Издательский дом "Вильяме", 2000. -
384 с.

152
2. Матьяш В.А., Путилов В.А., Фильчаков В.В. , Щёкин С.В. Структуры и
алгоритмы обработки данных - Апатиты, КФ ПетрГУ, 2000. - 80 с.
3. Дейтел Х.М., Дейтел П.Дж., Как программировать на С++, Москва-Радио и
связь. 1996. - 447 с.
4. Герберт Шилд, Программярование на языке C++ - М.: Высшая школа, 2002. -
584 с.
5. Шпак З.Я. Програмування мовою С. – Львів: Оріяна-Нова, 2006. – 432 с.
6. Ковалюк Т.В. Основи програмування. – К.: Видавнича група BHV, 2005. -
384c.

Лабораторна робота №16. Тема: Алгоритми програмування задач з


графами
Тема. Побудова остовного дерева (каркаса) графа мінімальної вартості
Загальна інформація
Завдання складається з двох частин, обидві обов'язкові для
виконання. Необхідно реалізувати два алгоритму побудови каркаса графа
мінімальної вартості: алгоритм Прима і алгоритм Краскала.
Хід виконання
Розглянемо деякий зв'язний неорієнтований зважений граф. 
Каркасом, або остовне деревом для цього графа називається зв'язний підграф
цього графа, що містить всі вершини графа і не має циклів. Кількість ребер в
каркасі зв'язкового графа завжди на одиницю менше кількості вершин графа.
Ясно, що у графа може бути кілька каркасів. Наприклад, різні каркаси можна
побудувати, запускаючи пошук в глибину від різних вершин
графа. Назвемо вартістю каркаса суму ваг ребер, що входять в нього. 
На малюнку зображений граф і два його каркаса. Каркас вартості 40 є
мінімальним.

Алгоритм Прима (Prim)


Будемо будувати каркас графа наступним чином. Помітимо всі вершини графа,
крім однієї (довільної), як невикористані. Поки є невикористані вершини,
вибираємо ребро найменшої ваги, що з'єднує використану вершину з
невикористаної, і додаємо його в каркас, роблячи цю невикористану вершину
використаної.
Більш формально алгоритм записується в такий спосіб. Введемо
масив used [N], спочатку заповнений нулями. Нехай наш каркас спочатку
порожній.
Помітимо першу вершину як використану: used [0] = 1.
Знайдемо ребро (i, j), що
з'єднує використану вершину (used [i] == 1) з невикористаної (used [j] == 0). Як
153
що таких ребер кілька,виберемо ребро з мінімальної вартістю. Якщо таких ребе
р немає, закінчимо виконання алгоритму.
Додамо це ребро до каркасу.
Помітимо used [j] = 1.
Перейдемо до кроку 2.
Так як на кожному кроці алгоритму до каркасу додається нова вершина, в
каркасі НЕ будуть з'являтися цикли. Каркас виходитиме мінімальним, так як
кожен раз вибирається ребро з мінімальною вагою з усіх можливих (такі
алгоритми називають «жадібними»).
Алгоритм Краскала (Kruskal)
В алгоритмі Краскала ми не зберігаємо масив used [N]. Замість цього ми будемо
на кожній ітерації алгоритму перевіряти належність кінців розглянутого ребра
до різних компонентів зв'язності (і додавати ребро до каркасу, якщо це так).
Введемо лічильник int counter = 0. Нехай N - кількість вершин графа.
Впорядкуємо список ребер по зростанню ваги.
Якщо counter == N - 1, закінчимо виконання алгоритму.
Проходячи по списку ребер, знайдемо ребро (i, j) таке, що  і j належать різним
компонентам зв'язності. Так як список впорядкований по зростанню ваги ребер,
ми будемо вибирати ребро з мінімальною вагою, що задовольняє умові.
Додамо це ребро в каркас, збільшимо на одиницю лічильник counter.
Перейдемо до кроку 2.
При реалізації алгоритму можна використовувати систему непересічних
множин для перевірки того, чи входять дві вершини в одну компоненту
зв'язності (спочатку кожна вершина входить в своє безліч, при додаванні ребра
в каркас два відповідних безлічі об'єднуються). Також для перевірки зв'язності
двох вершин можна використовувати будь-який відомий алгоритм: пошук в
ширину, пошук в глибину або що-небудь інше.
формулювання завдання
 
b. алгоритм Краскала
Опис алгоритму Краскала У вхідному файлі input.txt заданий неорієнтовний
зважений граф у вигляді списку ребер. У файл output.txt видати мінімальний
каркас цього графа у вигляді списку назв ребер.

Алгоритм Краскала може будувати дерево одночасно для декількох компонент


зв'язності, які в процесі вирішення об'єднуються в одне пов'язане дерево.
Повний граф задається списком ребер. Перед роботою список ребер сортується
по зростанню довжини. На кожному кроці проглядається список ребер,
починаючи з ребра, наступного за який увійшов в рішення на попередньому
кроці, і до споруджуваного Піддерева приєднують то ребро, яке не утворює
циклу з ребрами, вже включеними в рішення.
Алгоритм складається з наступної послідовності дій:

154
1. Створюється список ребер R, що містить довжину ребра, номер вихідної
вершини ребра (i), номер кінцевої вершини ребра (j), ознака включення даного
ребра в дерево.
2. Даний список впорядковується в порядку зростання довжин ребер.
3. Проглядається список R і вибирається з нього ребро з максимальною
довжиною, ще не включене в результуюче дерево і не утворює циклу з вже
побудованими ребрами.
4. Якщо все вершини включені в дерево і кількість ребер на одиницю менше
кількості вершин, то алгоритм свою роботу закінчив. В іншому випадку
здійснюється повернення до пункту 3.
This Program is to implement Kruskal algorithm. Edit &
-> This program is to find minimum spanning tree Run
for undirected weighted graphs
-> Data Structers used:
Graph: Adjacency Matrix
-> This program works in microsoft vc ++ 6.0 environment.
**************************************************
************ /
#include <iostream>
#include <fstream>
using namespace std;
class kruskal
{
    private:
    int n; // no of nodes
    int noe; // no edges in the graph
    int graph_edge [100] [4];
    int tree [10] [10];
    int sets [100] [10];
    int top [100];
    public:
    int read_graph ();
    void initialize_span_t ();
    void sort_edges ();
    void algorithm ();
    int find_node (int);
    void print_min_span_t ();
};
int kruskal :: read_graph ()
{
cout << "This program implements the kruskal algorithm \ n";
cout << "Enter the no. of nodes in the undirected weighted graph";
cin >> n;
155
noe = 0;
cout << "Enter the weights for the following edges :: \ n";
for (int i = 1; i <= n; i ++)
{
        for (int j = i + 1; j <= n; j ++)
{
cout << i << "," << j;
        int w;
cin >> w;
            if (w! = 0)
{
noe ++;
graph_edge [noe] [1] = i;
graph_edge [noe] [2] = j;
graph_edge [noe] [3] = w;
}
}
}
// Print the graph edges
cout << "\ n \ nThe edges in the given graph are :: \ n";
for (int i = 1; i <= noe; i ++)
{
cout << "<" << graph_edge [i] [1]
<< "," << Graph_edge [i] [2]
<< ">" << Graph_edge [i] [3] << endl;
}
}
void kruskal :: sort_edges ()
{
/ **** Sort the edges using bubble sort in increasing order ************** /
for (int i = 1; i <= noe-1; i ++)
{
    for (int j = 1; j <= noe-i; j ++)
{
        if (graph_edge [j] [3]> graph_edge [j + 1] [3])
{
        int t = graph_edge [j] [1];
graph_edge [j] [1] = graph_edge [j + 1] [1];
graph_edge [j + 1] [1] = t;
t = graph_edge [j] [2];
graph_edge [j] [2] = graph_edge [j + 1] [2];
graph_edge [j + 1] [2] = t;
t = graph_edge [j] [3];
156
graph_edge [j] [3] = graph_edge [j + 1] [3];
graph_edge [j + 1] [3] = t;
}
}
}
// Print the graph edges
cout << "\ n \ nAfter sorting the edges in the given graph are :: \ n";
for (int i = 1; i <= noe; i ++)
cout << "" << graph_edge [i] [1]
<< "," << Graph_edge [i] [2]
<< "> ::" << Graph_edge [i] [3] << endl;
}
void kruskal :: algorithm ()
{
    // -> Make a set for each node
    for (int i = 1; i <= n; i ++)
{
sets [i] [1] = i;
top [i] = 1;
}
cout << "\ nThe algorithm starts :: \ n \ n";
    for (int i = 1; i <= noe; i ++)
{
    int p1 = find_node (graph_edge [i] [1]);
    int p2 = find_node (graph_edge [i] [2]);
        if (p1! = p2)
{
cout << "The edge included in the tree is ::"
<< "<" << Graph_edge [i] [1] << ","
<< graph_edge [i] [2] << ">" << endl << endl;
tree [graph_edge [i] [1]] [graph_edge [i] [2]] = graph_edge [i] [3];
tree [graph_edge [i] [2]] [graph_edge [i] [1]] = graph_edge [i] [3];
            // Mix the two sets
            for (int j = 1; j <= top [p2]; j ++)
{
top [p1] ++;
sets [p1] [top [p1]] = sets [p2] [j];
}
top [p2] = 0;
}
        else
{
cout << "Inclusion of the edge"
157
<< "<" << Graph_edge [i] [1] << ","
<< graph_edge [i] [2] << ">" << "forms a cycle so it is removed \ n \ n";
}
}
}
int kruskal :: find_node (int n)
{
    for (int i = 1; i <= noe; i ++)
{
        for (int j = 1; j <= top [i]; j ++)
{
        if (n == sets [i] [j])
            return i;
}
}
    return -1;
}
void kruskal :: print_min_span_t ()
{
for (int i = 1; i <= n; i ++)
{
for (int j = 1; j <= n; j ++)
cout << tree [i] [j] << "\ t";
cout << endl;
}
}
int main ()
{
kruskal obj;
obj.read_graph ();
obj.sort_edges ();
obj.algorithm ();
obj.print_min_span_t ();
    return 0;
}

#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;
int cost [10] [10], i, j, k, n, m, c, visit, visited [10], l, v, count, count1, vst, p;
main ()
{
158
int dup1, dup2;
cout << "enter no of vertices";
cin >> N;
cout << "Enter no of edges";
cin >> M;
cout << "EDGE Cost";
for (k = 1; k <= m; k ++)
{
cin >> I >> j >> c;
cost [i] [j] = c;
cost [j] [i] = c;
}
for (i = 1; i <= n; i ++)
for (j = 1; j <= n; j ++)
if (cost [i] [j] == 0)
cost [i] [j] = 31999;
visit = 1;
while (visit <n)
{
v = 31999;
for (i = 1; i <= n; i ++)
for (j = 1; j <= n; j ++)
if (cost [i] [j]! = 31999 && Cost [i] [j] <v && cost [i] [j]! = - 1 )
{
int count = 0;
for (p = 1; p <= n; p ++)
{
if (visited [p] == i || visited [p] == j)
count ++;
}
if (count> = 2)
{
for (p = 1; p <= n; p ++)
if (cost [i] [p]! = 31999 && P! = J)
dup1 = p;
for (p = 1; p <= n; p ++)
if (cost [j] [p]! = 31999 && P! = I)
dup2 = p;
if (cost [dup1] [dup2] == - 1)
continue;
}
l = i;
k = j;
159
v = cost [i] [j];
}
cout << "Edge from" << L << "->" << k;
cost [l] [k] = - 1;
cost [k] [l] = - 1;
visit ++;
int count = 0;
count1 = 0;
for (i = 1; i <= n; i ++)
{
if (visited [i] == l)
count ++;
if (visited [i] == k)
count1 ++;
}
if (count == 0)
visited [++ vst] = l;
if (count1 == 0)
visited [++ vst] = k;
}
}
OUTPUT
enter no of vertices4 
enter no of edges4 
EDGE Cost 
1 2 1 
2 3 2 
3 4 3 
133
edge from 1-> 2edge from 2-> 3edge from 1-> 3

Алгоритм Прима побудови кістякового дерева мінімальної ваги


#include <conio.h>
#include <iostream.h>
int a, b, u, v, n, i, j, ne = 1;
int visited [10] = {0}, min, mincost = 0, cost [10] [10];
void main ()
{
int path [100] = {0}; // В цей масив будуть записуватися вершини, за якими
скластися шлях
int path_index = 0;
clrscr ();
cout << "Введи кількість вершин"; cin >> n;
160
cout << "Введи матрицю суміжності \ n";
for (i = 1; i <= n; i ++)
for (j = 1; j <= n; j ++)
{
cin >> cost [i] [j];
if (cost [i] [j] == 0)
cost [i] [j] = 999; // 999 - це щось типу нескінченності. Повинно бути
більше ніж значення ваги кожного з ребер в графі
}
visited [1] = 1;
cout << "\ n";
while (ne <n)
{
for (i = 1, min = 999; i <= n; i ++)
for (j = 1; j <= n; j ++)
if (cost [i] [j] <min)
if (visited [i]! = 0)
{
min = cost [i] [j];
a = u = i;
b = v = j;
}
if (visited [u] == 0 || visited [v] == 0)
{
path [path_index] = b;
path_index ++;
// cout << "\ n" << ne ++ << "" << a << "" << b << min; // Можна вивести так
ne ++; // якщо рядок вище розкоментувати - цю закомментировать
mincost + = min;
visited [b] = 1;
}
cost [a] [b] = cost [b] [a] = 999;
}
cout << "\ n";
cout << 1 << "->";
for (int i = 0; i <n-1; i ++)
{
cout << path [i];
if (i <n-2) cout << "->";
}
cout << "\ n Мінімальна вартість" << mincost;
cin.get ();
cin.get ();
161
}

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


програмування, тобто розбивши реалізацію на певні блоки- підпрограми
(функції.)

162

You might also like