- •1. Лабораторна робота 1. "Структури: складені типи даних"
- •Теоретичні відомості
- •1.1.1. Структури
- •1.1.2. Робота з масивом структур
- •1.2. Постановка задачі
- •1.3. Варіанти
- •1.4. Методичні вказівки
- •Постановка задачі.
- •2. Лабораторна робота 2 "Динамічні структури даних"
- •2.1. Теоретичні відомості
- •2.1.1. Списки
- •2.1.2. Стеки
- •2.1.3. Черги
- •2.2. Постановка задачі
- •2.3. Варіанти завдань
- •3.1.2. Члени класу
- •3.1.3. Доступ до членів класу
- •3.1.4. Черги-масиви
- •3.1.5. Стеки-масиви
- •3.2. Постановка задачі
- •3.3. Варіанти завдань
- •3.4. Методичні вказівки
- •4. Лабораторна робота 4. "Перезавантаження конструкторів"
- •4.1. Теоретичні відомості
- •4.1.1. Перезавантаження конструкторів
- •4.1.3. Операції з матрицями
- •4.2. Постановка задачі
- •4.3. Варіанти завдань
- •4.4. Методичні вказівки
- •5. Лабораторна робота 5. "Перезавантаження операторів. Дружні функції"
- •5.1. Теоретичні відомості
- •5.1.1. Дружні функції
- •5.1.1. Перезавантаження операторів
- •5.1.2. Операторні функції для комплексних чисел
- •5.2. Постановка задачі
- •5.3. Варіанти завдань
- •5.4. Методичні вказівки
- •6. Лабораторна робота 6. "Спадкування. Віртуальні функції"
- •6.1 Теоретичні відомості
- •6.1.1. Спадкування й модифікатори спадкування
- •6.1.2. Віртуальні функції
- •6.1.3. Відділення інтерфейсу від реалізації
- •6.2. Постановка задачі
- •6.3. Варіанти завдань
- •6.4. Методичні вказівки
- •7. Лабораторна робота 7. "Шаблони"
- •7.1. Теоретичні відомості
- •7.1.1. Шаблони функцій
- •7.1.2. Шаблони класів
- •7.1.3. Приклад. Методи шаблона вектора
- •7.1.4. Приклад. Шаблон класу зв'язного списку
- •7.2. Постановка задачі
- •7.3. Варіанти завдань
- •7.4. Методичні вказівки
- •8. Лабораторна робота 8. "Файловий введення-виведення"
- •8.1. Теоретичні відомості
- •8.1.2. Потоки й файли
- •8.1.3. Текстові файли. Форматоване введення-виведення
- •8.1.4. Неформатоване двійкове введення-виведення
- •8.1.5. Файли довільного доступу
- •8.2. Постановка задачі
- •8.3. Варіанти завдань
- •8.4. Методичні вказівки
- •Література
4.4. Методичні вказівки
Всі операції над матрицями виконувати за допомогою функцій-членів класу.
Програма має виводити на екран вихідні матриці й результати обчислень.
У деяких варіантах в заголовку конструктора використати фіктивні параметри, які не беруть участь у побудові матриць, але служать розпізнаванню конструктора.
4.5. Зміст звіту
Постановка завдання.
Код програми.
Скриншот з результатами роботи програми.
Пояснення результатів і висновки.
5. Лабораторна робота 5. "Перезавантаження операторів. Дружні функції"
Ціль роботи: Створення й застосування дружніх функцій. Вивчення механізму перезавантаження операторів і застосування перезавантаження до операцій з комплексними числами, зокрема, до обчислення рядів функцій комплексного аргументу.
5.1. Теоретичні відомості
5.1.1. Дружні функції
Функції, що не є членами класу, можуть оперувати тільки з відкритими членами класу (з розділу public). Щоб забезпечити доступ до закритих членів класу (з розділу private), вводяться дружні функції або функції-друзі. Щоб зробити функцію "дружньою" класу, необхідно включити її прототип в оголошення класу із ключовим словом friend. Функція-член одного класу може бути friend-функцією іншого класу. Прототип дружньої функції записується в оголошення класів, з якими вона "дружить":
class t1 {
friend void a(); // функція-друг
int b(); // функція-член
};
class t2 {
friend int t1::b(); // функція-член класу t1 //має доступ до всіх закритих полів класу t2
};
Приведемо приклад, у якому визначений клас вектора й оголошена дружня функція, що обчислює суму елементів вектора:
#include <iostream.h>
const int N=5;
class Vector{
int j, a[N];
public:
Vector() { //Визначення конструктора
cout<<"Enter numbers\n";
for (j=0; j<N; j++)
cin>>a[j];
};
friend int sum(Vector); //Прототип функції-друга
};
int sum(Vector v){ //Визначення функції-друга
int s=0;
for (int j=0; j<N; j++) s+=v.a[j];
return s;};
void main(){
Vector v1;
//Звертання до функції-друга
cout<<"Sum of numbers: "<<sum(v1)<<endl;
};
Тут дружня функція sum(), не будучи членом класу Vector, забезпечує доступ до закритих членів класу, а саме до змінного a[j].
5.1.1. Перезавантаження операторів
У С++ можна перезавантажувати не тільки функції й конструктори класів, але й оператори. Значення оператора, що перезавантажується, визначається для конкретного класу. Наприклад, клас, що визначає матриці, може використати оператор «+» для додавання матриць, а оператор * – для їхнього множення. У якому-небудь іншому класі ці оператори можуть використовуватися для інших операцій. Оператори перезавантажуються й вибираються на підставі відповідності типів.
Можна перезавантажувати множину операцій С++:
+ - * / % ^ & | ~ !
= < > += -= *= /= %= ^= &=
|= << >> >>= <<= == != <= >= &&
|| ++ -і [] () new delete
Змінювати пріоритети операцій не можна. Також не можна змінювати синтаксис виразів, наприклад, визначити унарну операцію % або бінарну !.
5.1.2. Операторні функції для комплексних чисел
Оскільки операції мови C++ визначені лише для основних типів даних, для виконання операцій над комплексними числами зручніше за все визначити відповідний клас Complex. Тоді для двох змінних a і b, що є об'єктами класу Complex, будуть працювати очевидні операції додавання, віднімання, множення й ділення:
Complex c1=a+b, c2=a-b, c3=a*b, c4=a/b;
Оператори +, -, *, / є перезавантаженими. Кожний з них трактується як функція, для назви якої використається ключове слово operator і знак оператора, що перезавантажується:
<тип> operator <знак оператора> ([<параметри-операнди>]);
Наприклад,
Complex operator + (Complex a, Complex b)
Оголошення класу Complex і операторних функцій, необхідних для дій над комплексними числами, записуються у такий спосіб:
class Complex {
double Re, Im;
public:
//Конструктор за умовчанням (нульового числа)
Complex () { Re = 0; Im = 0; };
//Конструктор дійсного числа
Complex (double re) { Re = re; Im = 0; };
//Конструктор комплексного числа
Complex (double re, double im) { Re = re; Im = im; };
//Прототипи дружніх функцій
friend Complex operator + (Complex a, Complex b);
friend Complex operator + (double a, Complex b);
friend Complex operator + (Complex a, double b);
friend Complex operator - (Complex a, Complex b);
friend Complex operator - (double a, Complex b);
friend Complex operator - (Complex a, double b);
friend Complex operator * (Complex a, Complex b);
friend Complex operator * (double a, Complex b);
friend Complex operator * (Complex a, double b);
friend Complex operator / (Complex a, Complex b);
friend Complex operator / (double a, Complex b);
friend Complex operator / (Complex a, double b);
void show () {//Функція виведення комплексного числа
cout<<Re<<" "<<Im<<"i"; };
};
Тут кожний з операторів (+, -, * , /) перезавантажується для трьох можливих наборів операндів, з яких хоча б один є об'єктом класу Complex. Наприклад, перезавантажені оператори для додавання об'єктів записуються так:
Complex operator + (Complex a, Complex b) {
return Complex (a.Re + b.Re, a.Im+b.Im); };
Complex operator + (double a, Complex b) {
return Complex (a + b.Re, b.Im); };
Complex operator + (Complex a, double b) {
return Complex (a.Re + b, a.Im); };
Дружні функції введені для того, щоб можна було оперувати не тільки з об'єктами класу Complex, але й зі звичайними дійсними числами. Тому доцільно визначити операторну функцію + поза класом і оголосити ії дружньої.
Робота з об'єктами класу Complex у функції main може виглядати в такий спосіб:
Complex a (1, 2), b (4, -2.1);
a = a+b; a.show ();
b=b+5; b.show();