Professional Documents
Culture Documents
Методичка
Методичка
Методичні вказівки
до лабораторних робіт та самостійної роботи студентів
спеціальності «Інженерія програмного забезпечення »
з дисципліни
«Основи програмування»
Мова С++
Розробили:
викладачі-методисти
Гуменна В.В, Соломко Л.А
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++.Навчитись створювати, редагувати, налагоджувати, тестувати та зберігати
проекти в консольному режимі.
Хід роботи
3
Консольний додаток Win32, справа внизу вписати ім'я проекту (наприклад,
proga1), в графі розташування вибрати вашу теку, де зберігатимуться усі
програми, залишити галочку створити каталог для вирішення. Діалогове вікно
Створити проект представлено на рис.1.2.
увеличить изображение
Рис.1.2. Діалогове вікно Створити проект
Після цього треба натиснути ОК. Відкриється майстер налаштування
нашого майбутнього консольного застосування, який представлений нарис. 3.3.
увеличить изображение
Рис. 1.3. Окно Мастер приложений Win32
4
увеличить изображение
Рис. 1.4. Заготовка нового проекта в Visual Studio 2010
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.
8
Рис. 1.9. Консоль виконання програми
Звичайно, в процесі роботи з додатком Visual Studio може виникнути
безліч питань. У меню програми передбачена довідка і стандартні приклади, які
можна подивитися. Щоб включити довідку, необхідно нажатьСправка/Перегляд
довідки або скористатися гарячими клавішами Ctrl+F1. Щоб подивитися
приклади кодів, в меню треба вибрати Довідка/Приклади (Справка/Примеры.)
Виконання роботи
Постановка задачі: Виконайте реалізацію програм на ПК
Зайняття 1. Програмна реалізація лінійного алгоритму
Приклад 1. Дані числа . Вичислити суму і різницю чисел .
Приведемо блок-схему на на рис. 4.1.
Ручной счет:
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):
12
Пример 4. Найти длину окружности и площадь круга, если известен
радиус.
Решение. Введем обозначения: – радиус, который будет считываться с
клавиатуры (т.к. он не задан конкретным числом); – длина окружности,
вычисляемая по формуле – площадь круга, вычисляемая по
формуле .
Приведем блок-схему на рис. 4.4.
Зміст звіту:
- Тема роботи
- Мета роботи
- Постановка задачі
- Програма
- Результати роботи
13
- Відповіді на контрольні запитання
- Висновки.
Хід роботи
1. Скласти програму для обчислення значення складних арифметичних
функцій.
Зміст звіту:
- Тема роботи
- Мета роботи
- Постановка задачі згідно варіанту
- Програма
- Результати роботи
- Відповіді на контрольні запитання
- Висновки.
14
Зразок виконання роботи
Програма 1.
//підключаємо файл для організації уведення-виведення
#include <iostream >
//підключаємо файл для використовування функцій
алгебри
#include <math.h>
// підключаємо файл для виклику функції очищення екрану
#include <conio.h>
15
//виводимо текст-підказку для користувача
cout<<"Введіть значення змінних а, b, с, x: ";
//чекаємо введення значень з клавіатури
cin>>a>>b>>c>>x;
16
якщо х = 1,45, у = -1,22; z=3,5.
4. Обчислити
якщо x=1,2; y=-0,8.
Довідка: n!=1*2*3….*n.
5. Обчислити площу поверхні та об’єм зрізаного конуса за формулами
якщо а=-0,5; b=1,7; t=0,44.
7. Обчислити
якщо x = l,82; у =18,5; z = -3,4.
10. Обчислити
17
якщо a = 0,7; b = 0,05; x = 0,43.
11. Обчислити
Хід роботи
1. Скласти програму для розв’язання задачі 1.
Варіанти завдань:
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
- Результати роботи
- Відповіді на контрольні запитання
- Висновки.
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.Оформити звіт з виконання роботи. Зміст звіту:
- Тема роботи
- Мета роботи
- Постановка задачі згідно варіанту
- Програма
- Результати роботи
- Висновки.
Варіанти завдань
№ по
Функция 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
J mR 2 , де R- радіус основи конуса;
10
1
центр стержня перпендикулярно до нього); J ml 2 , де l– довжина стержня;
12
2
J mR 2 , де R- радіус кулі.
5
Примітка: m- всюди є масою відповідного тіла.
д) бісектриса кута l = b c
2
bcp( p a )
31
3
-якщо x=0, y<0 то 2
y
-якщо x>0, y<0, то arctg 2
x
-якщо x=0, y=0, то полярний кут невизначений. У цьому випадку
програма повинна виводити відповідне повідомлення.
A B
2 2
2 2
2
11.a) висота підйому тіла, кинутого вертикально вгору: h
2g
б) початкова швидкість тіла, кинутого вертикально вгору, висота підйому
якого дорівнює h: 2 gh
2g
в) час підйому тіла:
h
1
г) висота підйому тіла: h g 2
2
Примітка: Прискорення вільного падіння g=9,8 м/сек2.
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
p
г) уявна піввісь гіперболи b .
e 12
16.а) Тіло вільно падає. Визначити пройдений тілом шлях після першої та
другої секунди падіння.
б) Паралалельно з’єднано три задані опори. Який опір з’єднання і струми
у кожній гілці, якщо прикладено напругу U вольт.
в) вввести п’ятизначне ціле числоо. Обчислити суму його чисел.
г) Виконати облік трьох наіменувань товарів, які є на складі. Запитати
про кількість і ціни товарів. Виести інформацію про товари на складі.
33
17. Бригада із шести робітників може виконати завдання за одну зміну (8
год).
а) Скільки потрібно робітників щоб щоб це завдання виконати за к годин.
б) Ввести тризначне ціле число. Визначити суму і добуток крайніх цифр.
в) Обчислити довжину гіпотенузи та площу прямокутного трикутника за
двома катетами.
г) Обчислити усі висоти прямокутного трикутника за двома катетами.
34
Лабораторна робота №5. Тема: Створення програм з операторами циклів
МЕТА РОБОТИ: отримати практичні навики по використовуванню операторів
циклу в програмах на C++
Хід роботи
1. Скласти програму для знаходження значення функції вигляду:
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. Обчислити функцію у та знайти добуток їхніх додатних значень,
якщо:
38
де а = 1; b= 2; х є [1; 2], h x = 0,1; у є [1; 2], h y = 0,2.
4. Обчислити функцію у та підрахувати суму її перших трьох значень:
де а=5,3; у=1,1; х є [-3;3], h x =0,5.
8. Обчислити функцію у та для кожного значення парамет -
ра b знайти суму її від'ємних значень:
39
11. Обчислити функцію у та знайти кількість її від'ємних значень для
кожного значення параметра с:
де параметри a, b, h, R задані довільно.
13. Обчислити функцію z та знайти для кожного парного значення
параметра у кількість додатних значень цієї функції:
де 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. Обчислити значення функції у за умови:
41
23. Ввести п'ять наборів значень сторін трикутника а, в, с і визначити,
для яких сторін висота (h a , h b , h c ) буде найменшою.
Довідка:
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 Обчислити середнє
арифметичне значення дійсні
відємних елементів
масиву,які лежать нище
головної діагоналі.
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) за зростанням значень елементів, або задані ряд ки матриці за
спаданням значень їх елементів.
Варіанти завдань:
Постановка задачі:
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
Варіанти завдань:
61
10. Ввести список викладачів кафедри з такою інформацією: прізвище
та ініціали, стать, посада, назва дисципліни, яку викладає. Вивести за
вказівкою користувача або список викладачів-жінок заданої посади,
або повідомлення про викладачів- чоловіків.
11. Ввести список літератури з програмування з такою ін формацією:
прізвища авторів, назва книги та видавнитцва, рік і місце видання.
Вивести за вказівкою користувача або повідомлення про літературу,
що вийшла у заданому році, або назву видань заданих авторів.
12. Ввести список студентів, які проживають у гуртожит ку,
враховуючи прізвище, ініціали, рік народження, номер гуртожитку і
кімнати. Вивести за вказівкою користувача або повідомлення про
студентів, які проживають у заданому гурто житку і народились у
заданому році, або прізвища студентів, які проживають у кімнатах із
заданим номером у двох заданих гуртожитках.
13. Ввести інформацію про групу студентів: прізвище та ініціали,
місце народження, захоплення, стать. Вивести за вказівкою
користувача повідомлення про студенток, які захоплю ються спортом,
або список юнаків, які люблять програмувати та народились у
Харкові.
14. Ввести список, у якому зазначені прізвища, ініціали, адреса та
номери телефонів абонентів. Вивести за вказівкою користувача або
прізвище абонента за заданою адресою і номе ром телефону, або
повідомлення про абонентів, що мають задане прізвище та ініціали.
15. Ввести список, який містить прізвище, ініціали і рік на родження
працівників окремого підрозділу. Вивести за вказівкою користувача
повідомлення про працівників заданого року народження, або список
прізвищ за зростанням року народження.
16. Ввести розклад занять із зазначенням дня тижня, назви предмета,
виду заняття (лекції, практичні, лабораторні) і часу проведення.
Вивести за вказівкою користувача дні тижня, коли із заданого
предмета проводяться лекції, або повідомлення про заняття в заданий
день тижня.
17. Ввести список літературних джерел з курсів, що чита ються у
поточному семестрі. За вказівкою користувача вивести повідомлення
або про літературу з заданої дисципліни, або про назви книг заданого
року видання.
18. Ввести в комп'ютер інформацію про захворювання співробітників:
прізвище та ініціали, рік народження, захворюван ня, тривалість
хвороби. Вивести за вказівкою користувача або прізвище працівника,
який хворів найдовше, або список працівників за зростанням
тривалості хвороби.
62
19. Ввести список спортсменів, що складається з прізвища, статі,
року народження і виду спорту. Вивести за вказівкою користувача
список легкоатлетів або список жінок-гімнасток.
20. Ввести в комп'ютер інформацію про асортимент продо вольчих
товарів в магазині такого змісту: назва магазину, код товару,
кількість цього товару, ціна за кілограм. За вказівкою користувача
або відсортувати магазини за спаданням оптової ціни заданого
товару, або вивести повідомлення, в яких мага зинах є потрібний
товар.
21. Ввести в комп'ютер таку інформацію про потяги: номер потяга,
назву напрямку руху, час прибуття. Вивести за вказів кою
користувача або повідомлення про потяги, що прибувають у заданий
час, або про кількість потягів заданого користувачем напрямку руху.
22. Ввести в комп'ютер інформацію про книги з програму вання
мовою С++. На екран за вказівкою користувача вивести або
повідомлення про книги вітчизняних авторів, або список книг
закордонних авторів, розташованих за спаданням кіль кості сторінок.
23. Ввести в комп'ютер таку інформацію про автомобілі: прізвище та
ініціали власника, модель автомобіля, рік його випуску та
потужність. Вивести за вказівкою користувача марки автомобілів, рік
випуску та потужність яких співпадають з вве деними в рядку запиту,
або прізвища власників автомобілів за алфавітом з відповідними
повідомленнями про їхні автомобілі.
24. Ввести в комп'ютер інформацію про користувачів бібліотеки:
прізвище та ініціали читача, назву кафедри, кількість книг на
абонементі. Вивести за вказівкою користувача або повідомлення про
читача, що має найбільшою кількість книг, або спи сок працівників
заданої кафедри за зростанням кількості книг.
25. Ввести інформацію про студентів групи: прізвище та ініціали,
середні бали за два семестри. Вивести за вказівкою користувача або
повідомлення про студентів, що мають однако вий середній бал за
обидва семестри, або список студентів за спаданням їх середнього
бала в другому семестрі.
63
1. Скласти програму для знаходження значення функції:
Виконання роботи
1. Для вирішення першої задачі програма може мати вигляд:
//головна програма
void main()
{
//описуємо три масиви
float mas1[20],mas2[20], mas3[20];
//описуємо змінні для зберігання
//сум по трьох масивах
float s1,s2,s3;
//описуємо змінні для зберігання
//кількості елементів по трьох масивах
int kol1,kol2,kol3;
//очищаємо екран
clrscr();
70
18. Скласти функцію, що визначає в кожному стовпці мат риці
кількість від'ємних елементів та максимальний елемент. Використати
цю функцію для обробки декількох матриць довільного розміру.
19. Розробити функцію, що визначає корені квадратного рівняння і
перевіряє їх за теоремою Вієта, та розв'язати за її допомогою
декілька рівнянь.
20. Розробити функцію визначення частоти появи голосних літер у
тексті та використати її для обробки декількох речень.
21. Розробити функцію визначення суми членів арифметич ної
прогресії і реалізувати її для трьох арифметичних прогресій з різною
кількістю членів.
22. Розробити функцію визначення кількості появи заданої
приголосної в тексті та застосувати цю функцію для обробки
декількох речень.
23. Скласти функцію перестановки максимального елемен та заданого
стовпця матриці з мінімальним елементом заданого рядка матриці.
Застосувати цю функцію для обробки трьох двовимірних масивів.
24. Розробити функцію, що здійснює сортування всіх еле ментів
масиву за спаданням і знаходить добуток парних елементів, та за
допомогою цієї функції обробити три одновимірних масиви довільної
довжини.
25. Скласти функцію обчислення найбільшого спільного дільника
двох чисел та продемонструвати її роботу для наборів пар чисел.
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;
}
экран DOS:
73
табличный файл 1.xls:
74
Код программы:
Задача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:
78
fxls<<"a=\t"<<a<<"\tb=\t"<<b;
ftxt.close();
fxls.close();//
return 0;
}
экран DOS:
текстовый файл 1.txt:
табличный файл 2.xls:
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;
}
Виконати програму, Переглянути результати!
Бінарні файли:
У попередніх програмах запис даних у файл та їх читання з файла
здійснювалось послідовно поелементно. Але записати або прочитати декілька
даних (наприклад, масив чисел) можна однією операцією.
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)
{
//очищаємо екран
83
file1.clear();
break;
}
84
cout << "Для продовження натискуйте будь-яку клавішу...";
break;
}
break;
}
case 5:
{
//описуємо змінну для читання з файлу
ifstream file1;
//пов'язуємо змінну з файлом biblio.dat
file1.open("biblio.dat");
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 годин)
Багатофайлові проекти
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
#ifndef імя_макроса
послідовність операторів
#endif
#define визначити
Постановка задачі:
1. Нехайай є деякий об'єкт «товар». Даний об'єкт має ряд властивостей:
шифр;
назва;
ціна.
Над об'єктом можна виконати ряд дій:
введення даних про n товарів і запис їх у файл;
додавання даних про m товарів у файл;
пошук даних по назві товару (назва вводиться з клавіатури).
Для вибору потрібної дії на екран видати меню користувача.
Кожну дію з даними оформити у вигляді окремого програмного модуля.
90
Хід виконання роботи
#endif
Збережіть файл під ім'ям modul1.h.
91
2. Для реалізації другої функції створимо модуль для додавання m записів у
файл. Файл модуля може мати вигляд:
#ifndef MODUL2_H
#define MODUL2_H
#endif
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
//обробляємо вибір
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), а саме створити файл структур та модулі для опрацювання
файлу та читання усього файлу на екран.
95
3.Які методи доступу використовуються для роботи з файлами
даних?
4. Які компоненти і функції можна використовувати для роботи з
файлами даних?
5. Які оператори мови С++ застосовуються при відкритті потоків
для роботи з файлами даних?
6. Які функції існують для ініціювання прямого доступу до даних?
96
Лабораторна робота №12. Тема: Розробка алгоритмів і програм обробки
динамічних масивів.
97
4. Розробити алгоритм, схему алгоритму та функцію обробки динамічного
масиву, відповідно до завдання 3 та використати її в пакеті функцій
завдання 1.
5. Основна частина головної програми роботи з динамічними масивами (не
враховуючи меню, а лише виклики функцій обробки масивів) не повинна
перевищувати 5-6 стрічок.
6. Розробити 2-3 теста для перевірки правильності роботи всього
розробленого комплексу програм.
7. Скласти звіт за результатами лабораторної роботи.
8. Зробити висновки.
Завдання 1
Завдання 2
98
2. Розробити функцію, яка формує новий двовимірний масив з усіх
від’ємних елементів кожного рядка двовимірного динамічного масиву та
їх порядкових номерів.
3. Розробити функцію, яка формує новий двовимірний масив з усіх додатних
елементів кожного стовпця даного двовимірного динамічного масиву та їх
порядкових номерів.
4. Розробити функцію, яка формує новий двовимірний масив з усіх
від’ємних елементів кожного стовпця даного двовимірного динамічного
масиву та їх порядкових номерів.
5. Розробити функцію, яка створює новий масив з суми і кількості всіх
додатних елементів кожного рядка даного двовимірного динамічного
масиву.
6. Розробити функцію, яка створює новий масив з суми усіх від’ємних
елементів кожного рядка даного двовимірного динамічного масиву і їх
кількості в кожному рядку.
7. Розробити функцію, яка створює новий масив з середніх арифметичних
значень всіх додатних елементів кожного стовпця з даного динамічного
масиву.
8. Розробити функцію, яка створює новий масив з середніх арифметичних
значень всіх від’ємних елементів кожного стовпця з даного динамічного
масиву.
9. Розробити функцію, яка створює новий масив з суми усіх додатних
елементів верхньої і нижньої трикутних матриць даного двовимірного
динамічного масиву та їхньої кількості в кожній.
10.Розробити функцію, яка створює новий масив з суми усіх від’ємних
елементів верхньої і нижньої трикутних матриць даного двовимірного
динамічного масиву і їх кількості в кожній.
11.Розробити функцію, яка створює новий масив з вихідного двовимірного
динамічного масиву, перетвореного таким чином, що кожен стовпець
матриці упорядкований за зростанням методом бульбашки.
Завдання 3
99
4. Розробити функцію для визначення числа кратного одинадцяти і функцію,
що її використовує для визначення кількості і суми елементів даного
одновимірного динамічного масиву, кратних одинадцяти.
5. Розробити функцію для визначення числа кратного дванадцяти і функцію,
що її використовує для визначення кількості і суми елементів даного
одновимірного динамічного масиву, кратних дванадцяти.
6. Розробити функцію для визначення кубічного кореня з заданого числа і
функцію, що її використовує для перетворення кожного елемента даного
одновимірного динамічного масиву.
7. Розробити функцію для визначення квадратного кореня з заданого числ і
функцію, що її використовує для перетворення кожного парного елемента
одновимірного динамічного масиву.
8. Розробити функцію для визначення а3для заданого числа а, і функцію, що
її використовує для перетворення кожного елемента заданого
одновимірного динамічного масиву.
9. Розробити функцію для визначення а2для заданого числа а, і функцію, що
її використовує для перетворення кожного елемента заданого
одновимірного динамічного масиву.
10.Розробити функцію для визначення парного числа і функцію, що її
використовує для визначення суми, кількості і середнього арифметичного
значення всіх парних елементів динамічного масиву.
11.Розробити функцію для визначення непарного числа і функцію, що її
використовує для формування нового динамічного масиву, що містить
тільки парні елементи вихідного одновимірного динамічного масиву.
Теоретичні відомості
100
Таблиця 1.1 – Бібліотечні функції стандартної бібліотеки
Наприклад:
В обох цих випадках покажчик 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(),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;
103
printf("%s\n", ptr);
realloc(ptr, 0);
Приклад 4
/* … перевіркауспішностівиділенняпам’яті,використанняблока пам’яті…*/
free(pointer);
pointer = NULL;
new() і delete():
#include <iostream.h>
void main(void)
Дана програма буде складатися з основної функції int main(), та п’яти функцій
для виконання поставленої задачі:
104
void Sortirovka_1D_Mas(float*m,int n) - функція призначена для сортування
масиву методом бульбашки;
Лістинг програми
#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;
}
Тестування:
Для перевірки правильності роботи програми введемо в неї дані, при введені
яких результат заздалегідь відомий.
106
42512
12345
Вихідний масив:
12345
Дана програма буде складатися з основної функції int main(), та п’яти функцій
для виконання поставленої задачі.
107
void Print_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;}
Тестування:
Для перевірки правильності роботи програми введемо в неї дані, при введені
яких результат заздалегідь відомий.
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
Дана програма буде складатися з основної функції int main(), та п’яти функцій
для виконання поставленої задачі:
110
float()*Create_1D_Mas(float*m,int n)- функція призначена для створення масиву;
Лістинг програми
#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;
}
Тестування:
Для перевірки правильності роботи програми введемо в неї дані, при введені
яких результат заздалегідь відомий.
112
8 225 27 64 1
2 15 3 4 1
225
27
64
Вихідний масив:
2 15 3 4 1
Контрольні запитання
Теоретичні відомості
Лінійний список це динамічна структура даних, кожний елемент якої за
допомогою вказівника зв’язується з наступним елементом.
З визначення випливає, що кожен елемент списку містить поле даних
(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;// Вказівник на наступний елемент пустий
Після включення першого елемента список можна зобразити так:
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 — це покажчик на початок списку.
118
Коли дані, що зберігаються в списку, стають непотрібними, можна
очистити весь список, тобто звільнити пам'ять, яку займали всі елементи
списку. Виконувати цю операцію бажано відразу після того, як список
став не потрібний.
Реалізація цієї операції може бути такою:
Опис простого елементу такого списку виглядає таким чином: struct імя_тіпа
{ інформаційне поле; адресне поле; }; де інформаційне поле – це поле будь-яке,
раніше оголошеного або стандартного типа; адресне поле – це покажчик на
об'єкт того ж типа, що і визначувана структура, в нього записується адреса
наступного елементу списку. Наприклад:
struct Node {
int key;//информационное поле
Node*next;//адресное поле
};
struct point {
char*name;//информационное поле
119
int age;//информационное поле
point*next;//адресное поле
};
Кожен елемент списку містить ключ, який ідентифікує цей елемент. Ключ
зазвичай буває або цілим числом, або рядком.
Основними операціями, здійснюваними з однонаправленими списками, є:
• створення списку;
• друк (перегляд) списку;
• вставка елементу в список;
• видалення елементу із списку;
• пошук елементу в списку ;
• перевірка порожнечі списку;
• видалення списку.
Особливу увагу слід звернути на те, що при виконанні будь-яких операцій з
лінійним однонаправленим списком необхідно забезпечувати позиціювання
якого-небудь покажчика на перший елемент. Інакше частина або весь список
буде недоступна.
Розглянемо детальніше кожну з приведених операцій.
Для опису алгоритмів цих основних операцій використовується наступне
оголошення:
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).
Варіанти завдань
№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
Список студентів групи містить наступну інформацію: П.І.Б., ріст і вага.
Вивести П.І.Б. студентів, ріст і вага яких є в списку унікальними.
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. Встановити вершину стеку на новостворений елемент.
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>
int main() {
Add(1);// Вносимо до черги значення 1,2,3
Add(2);
Add(3);
return 0;
}
139
3.2. Стек
#include <iostream.h>
#include <conio.h>
int main() {
Push(1);// Вносимо до стека значення 1,2,3
140
Push(2);
Push(3);
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. Висновки.
144
Для лабораторної роботи наведені теоретичні та довідкові положення,
приклади рішень типових задач та завдання до лабораторної роботи. Номер
завдання відповідає порядковому номеру за журналом.
1. Теоретичні відомості
Дерева
Дерево - це граф, який характеризується наступними властивостями:
1. Існує єдиний елемент (вузол або вершина), на який не посилається
ніякий інший елемент, і який називається коренем.
2. Починаючи з кореня і слідуючи по певному ланцюжку покажчиків, що
містяться в елементах, можна здійснити доступ до будь-якого елементу
структури.
3. На кожен елемент, окрім кореня, є єдине посилання, тобто кожен
елемент адресується єдиним покажчиком.
Бінарні дерева
145
Рис. 1 Зображення бінарних дерев
Приклади програм
#include <iostream.h>
#include <conio.h>
// Структура елементу дерева.
struct Ttree {
int Info;// інформаційне поле.
Ttree* Brother;// покажчик на наступного за старшинством брата.
Ttree* Son;// покажчик на старшого сина.
};
// Покажчик на корінь дерева. Спочатку рівний NULL, оскільки дерево порожнє.
Ttree* Root = NULL;
}
// Пошук елементу.
// Повертає покажчик на знайдений елемент або 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);
}
// Видаляє всі вузли дерева.
// 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.
Реалізувати бінарне дерево для зберігання і операцій з даними виду:
Найменування Вага Вартість Колір
Забезпечити виконання операцій:
додавання нового елементу в дерево у діалоговому режимі;
обхід знизу;
побудова окремих дерев для різних кольорів;
роздрукування дерева;
видалення із дерева усіх вузлів, що повторюються (в діалоговому режимі з
підтвердженням).
Оформити звіт.
1. Тема.
2. Мета.
3. Постановка задачі.
4. Програма.
5. Результати роботи.
6. Висновки.
Література
152
2. Матьяш В.А., Путилов В.А., Фильчаков В.В. , Щёкин С.В. Структуры и
алгоритмы обработки данных - Апатиты, КФ ПетрГУ, 2000. - 80 с.
3. Дейтел Х.М., Дейтел П.Дж., Как программировать на С++, Москва-Радио и
связь. 1996. - 447 с.
4. Герберт Шилд, Программярование на языке C++ - М.: Высшая школа, 2002. -
584 с.
5. Шпак З.Я. Програмування мовою С. – Львів: Оріяна-Нова, 2006. – 432 с.
6. Ковалюк Т.В. Основи програмування. – К.: Видавнича група BHV, 2005. -
384c.
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
162