Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Стеки-масиви



Оголосимо константну змінну capacity, що задає максимальний розмір стека-масиву, і тип даних el, що визначає тип елементів масиву:

const int capacity = 128;

typedef int el;

Оголошення класу стека запишемо у вигляді:

class Stack {

public:

Stack();

bool empty();

void push(const el & value);

el top();

void pop();

private:

el myArray[capacity]; //Масив елементів типу el

int myTop; //Вершина стека

};

Конструктор створює порожній стек:

Stack:: Stack() {

myTop=-1;

}

Функція empty визначає, чи є стек порожнім:

bool Stack:: empty(){

return (myTop == -1);

}

Функція push додає елемент до стека:

void Stack:: push(const el & value) {

if (myTop < capacity - 1) { //Якщо стік не повний

++myTop; //Зсув вершини стека

myArray[myTop] = value; //Запис значення value

}

else

cerr << "Stack is full!\n";

}

Функція pop видаляє елемент із стека:

void Stack:: pop() {

if (myTop >= 0) // Якщо стік не порожній

myTop--; //Зсув вершини стека

else

cerr << "Stack is empty -і can't remove a value" << endl;

}

Функція top повертає значення елемента у вершині стека (без видалення елемента):

el Stack:: top() {

if (myTop >= 0) // Якщо стік не порожній

return myArray[myTop];

else {

cerr << "Stack is empty!" << endl;

return(0);

}

}

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

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

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

1. Реалізувати стек для статичного масиву дійсних чисел. Створити клас стека з функціями-членами: запис у стек, видалення із стека, читання елемента у вершині стека, визначення довжини стека.

2. На основі статичного масиву створити клас стека цілих чисел. Функції-члени: заповнення всього стека випадковими числами, видалення елементів із стека, перегляд вмісту стека.

3. На основі статичного масиву створити клас стека символів. Функції-члени: запис у стек, видалення із стека, визначення довжини стека. попарне зчитування елементів.

4. На основі статичного масиву створити клас черги цілих чисел. Функції-члени: додавання в чергу, видалення із черги, виведення всіх елементів черги на екран.

5. На основі статичного масиву створити клас черги випадкових чисел. Функції-члени: додавання в чергу, видалення із черги, виведення першого елемента черги на екран, визначення довжини черги.

6. На основі статичного масиву створити клас черги Реалізувати додавання елемента в чергу, виведення елементів черги на екран, а також видалення елемента із черги, якщо користувач угадав, що елемент-кандидат на видалення є прописна або мала літера.

7. На основі статичного масиву створити клас стека символів. Функції-члени: запис у стек, видалення із стека, перегляд елементів стека. Створити новий стек, у який записати вихідні елементи у зворотному порядку.

8. На основі статичного масиву створити клас стека символів. Функції-члени: запис у стек, видалення елемента із стека, перегляд елементів стека. Створити новий стек, у який записати тільки голосні букви з вихідного стека.

9. На основі цілочисельного масиву створити клас стека. Функції-члени: додавання й видалення елемента із стека, а також зведення в ступінь (основа – передостанній елемент, показник ступеня – останній елемент стека).

10. На основі цілочисельного масиву створити клас стека. Функції-члени: заповнення всього стека випадковими числами, видалення елемента із стека, перегляд вмісту стека, а також створення нового стека, у який копіюються елементи в непарних позиціях.

11. На основі цілочисельного масиву створити клас стека. Функції-члени: заповнення всього стека випадковими числами, видалення елемента із стека, перегляд вмісту стека, створення копії стека, очищення стека.

12. На основі цілочисельного масиву створити клас стека. Функції-члени: заповнення стека випадковими числами, видалення із стека, перегляд умісту стека. Скласти програму, що за допомогою двох стеків моделює роботу черги.

13. На основі статичного масиву створити клас черги цілих чисел. Функції-члени: додавання в чергу, видалення із черги, перегляд черги, створення копії черги, перегляд копії.

14. На основі статичного масиву створити клас черги цілих чисел. Функції-члени: додавання в чергу, видалення із черги, перегляд черги. Створити чергу з інверсним порядком елементів.

15. На основі дійсного масиву створити клас стека. Функції-члени: додавання й видалення елемента із стека, а також арифметичне додавання й віднімання значень елементів (результат записується у вершину стека).

16. Для масиву цілих чисел створити клас стека. Функції-члени: додавання й видалення елемента із стека, інкрементування й декрементування елемента, а також перегляд стека.

17. На основі дійсного масиву створити клас стека. Функції-члени: додавання й видалення елемента, перегляд стека. Припустити, що в стек записуються сторони прямокутника. Визначити функцію обчислення площі прямокутника. Проілюструвати застосування всіх функцій стека.

18. На основі дійсного масиву створити клас стека. Функції-члени: додавання й видалення елемента, перегляд стека. Припустити, що в стек записуються сторони трикутника, визначити функцію обчислення площі трикутника. Проілюструвати застосування всіх функцій стека.

19. На основі цілочисельного масиву створити клас стека. Функції-члени: додавання, видалення елемента із стека, а також чотири арифметичні операції (додавання, віднімання, множення й цілочисельне ділення) із записом результату у вершину стека.

20. На основі масиву дійсних чисел створити клас стека. Функції-члени: додавання елемента в стек, очищення стека, а також чотири арифметичні операції (додавання, віднімання, множення й ділення) із записом результату у вершину стека. Скласти програму калькулятора, який управляється за допомогою меню й виводить на екран результат операції.

21. Створити клас стека на основі масиву випадкових чисел. Функції-члени: додавання, видалення елемента із стека, перегляд вмісту стека. Заповнити стек випадковими числами й створити два нових стеки: в один помістити парні числа вихідного стека, а в іншій - непарні.

22. Створити клас черги на основі масиву випадкових чисел. Функції-члени: додавання, видалення елемента із черги, перегляд черги. Заповнити чергу випадковими числами й створити дві нових черги: в одну помістити парні числа вихідної черги: в іншу – непарні.

23. Створити клас стека на основі масиву випадкових чисел від –M до M. Функції-члени: додавання, видалення елемента, перегляд стека. Заповнити стек числами й створити два нових стеки, в один із яких помістити від'ємні числа вихідного стека, а в іншій – невід'ємні.

24. Створити клас черги на основі масиву випадкових чисел від –M до M. Функції-члени: додавання, видалення елемента, перегляд черги. Заповнити чергу числами й сформувати дві нових черги, в одну з них помістити від’ємні числа вихідної черги, а в іншу – невід’ємні.

3.4. Методичні вказівки

1. Для операцій, які виконуються за допомогою функцій-членів класу, скласти меню (див. розд. "2.1.1. Списки" лабораторної роботи 2).

2. У функціях-членах класів передбачити виведення повідомлень у випадку, якщо список (стек, черга) порожній.

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

3.5. Зміст звіту

1. Постановка завдання.

2. Код програми.

3. Скриншот з результатами роботи програми.

4. Пояснення результатів і висновки.


4. Лабораторна робота 4.
"Перезавантаження конструкторів"

Ціль роботи: Вивчення механізму перезавантаження конструкторів. Застосування перезавантаження до створення об'єктів матриць, виконання операцій над об'єктами.

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

4.1.1. Перезавантаження конструкторів

Конструктор – це опис, як створювати значення даного типу, тобто об'єкт даного класу. Програміст може перевизначати зміст конструктора при створенні об'єктів заданого класу.

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

Наведемо приклад конструювання об'єктів у вигляді квадратних матриць. Сформуємо верхню трикутну матрицю й матрицю випадкових чисел, менших max. Оголосимо клас матриць:

class Matrix{

int a[N][N];

int max, i, j, k;

public:

Matrix(); //Конструктор за замовчуванням

Matrix(int); //Конструктор із цілим параметром

void outm(); //Функція виведення

Matrix mult (Matrix, Matrix); //Функція множення матриць

};

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

Matrix:: Matrix() {

for (j=0; j<N; j++)

for (k=0; k<N; k++)

if (j<=k) a[j][k]=1;

else a[j][k]=0;

}

Matrix:: Matrix(int max) {

for (j=0; j<N; j++)

for (k=0; k<N; k++)

a[j][k]=rand()%max;

}

4.1.3. Операції з матрицями

Функції-члени outm і mult класу Matrix виконують відповідно виведення матриці на екран і множення двох матриць. Визначення цих функцій має вигляд:

//-------Функція печатки матриці-----------

void Matrix:: outm(){

for (j=0; j<N; j++) {

for (k=0; k<N; k++)

printf("%4d\t", a[j][k]);

printf("\n");};

}

//----Функція множення матриць, повертає об'єкт класу Matrix---

Matrix Matrix:: mult(Matrix m1, Matrix m2){

Matrix mx;

for (i=0; i<N; i++)

for (j=0; j<N; j++){

mx.a[i][j] = 0;

for (k=0; k<N; k++)

mx.a[i][j] += m1.a[i][k] * m2.a[k][j]; };

return mx;

}

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

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

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

1. А– верхня трикутна матриця N×N з одиниць;

B – матриця N×N випадкових цілих чисел, менших M;

С – матриця N×N випадкових дійсних чисел, менших 1.

Обчислити добутки матриць: А×B, B×А, B×C.

2. А – верхня трикутна матриця N×N з одиниць;

B – матриця-рядок з N випадкових цілих чисел, менших M;

С – матриця-стовпець із N випадкових цілих чисел, в інтервалі від M1 до М2.

Обчислити добутки матриць: B×А×C і C×B.

3. А – діагональна матриця N×N; на діагоналі перебувають числа 1, 2,..N;

B – діагональна матриці M×M, на діагоналі – числа 12, 2 2,..N 2;

С – матриця N×M з випадкових цілих чисел в інтервалі від M1 до М2.

Обчислити добуток матриць А×C×B.

4. А – діагональна матриця N×N, на діагоналі - числа 1, 1/2,..1/N;

B – нижня трикутна матриця N×N випадкових чисел, менших М;

С – верхня трикутна матриця N×N випадкових цілих чисел, в інтервалі від M1 до М2 (елементи, менші М1, замінені нулями).

Обчислити добутки матриць: А×B, B×C, C×A.

5. А – одинична матриця N×N;

B – нижня трикутна матриця N×N випадкових чисел з М ненульовими діагоналями;

С – матриця N×N випадкових цілих чисел, в інтервалі від M1 до М2 (елементи, менші М1, замінені нулями).

Обчислити суму А+B+С, а також добуток матриць B×C..

6. А – матриця N×N з елементами aij = i;

B – матриця N×N випадкових чисел, менших М;

С – матриця N×N з елементами aij = i* M1+j*М2.

Обчислити добутки матриць: А×B, B×C, C×B.

7. А – матриця-рядок з N елементів ai = i;

B – матриця N×N випадкових дійсних чисел, менших 1;

С – матриця-стовпець із N елементів ai = im.

Обчислити добутки матриць: А×B×C і C×А.

8. А – нижня трикутна матриця N×N з елементами aij = i (при i>=j);

B – матриця N×N випадкових дійсних чисел, менших M;

С – верхня трикутна матриця N×N з aij = i*M1+j*М2 (при i<=j).

Обчислити добутки матриць: А×C, B×А, B×C.

9. А – діагональна матриця N×N з елементами aij = i (при i=j);

B – матриця N×N випадкових дійсних чисел, менших M;

С – діагональна матриця N×N з елементами aij = m1*im2 (при i=j).

Обчислити добутки матриць: А×B, B×A, C×A.

10. А – нижня трикутна матриця N×N з елементами aij=5*i (при i>=j);

B – матриця N×N випадкових дійсних чисел, менших 1;

С – верхня трикутна матриця N×N з елементами aij=M*(i+j).

Обчислити добутки матриць: А×C, B×А, B×C.

11. А – нижня трикутна матриця N×N з елементами aij=i (при i>=j);

B – матриця N×N з дійсними елементами aij = i/j;

С – верхня трикутна матриця N×N з елементами aij = m1*im2.

Обчислити добутки матриць: А×B, B×А, C×B.


12. А – верхня трикутна матриця N×N з елементами aij=i (при i<=j);

B – нижня трикутна матриця N×N з елементами aij = i/j;

С – верхня трикутна матриця N×N з елементами aij = m1*im2.

Обчислити добутки матриць: А×B, B×C, A×C.

13. А – верхня трикутна матриця N×N з одиниць;

B – матриця-стовпець із N випадкових цілих чисел, в інтервалі від M1 до М2;

С – матриця-рядок з N випадкових цілих чисел, менших M.

Обчислити добутки матриць: А×B, B×C, C×В.

14. А – верхня трикутна матриця N×N з випадкових чисел, менших M;

B – нижня трикутна матриця N×N випадкових чисел з М ненульовими діагоналями;

С – матриця N×N з випадкових цілих чисел в інтервалі від M1 до М2.

Обчислити суму А+B+C, а також добуток матриць А×В і B×C.

15. А – верхня трикутна матриця N×N з елементами, рівними 1;

B – матриця N×N з елементами aij = i+j;

С – верхня трикутна матриця N×N з елементами aij = M*i.

Обчислити добутки матриць: А×B, B×С, C×А.

16. А – діагональна матриця N×N; на діагоналі перебувають числа 1, 1/2,..1/N;

B – нижня трикутна матриця N×N випадкових чисел з М ненульовими діагоналями;

С – матриця N×N з елементами aij = i2+j2.

Обчислити суму А+B+З, а також добуток матриць А×В і B×C.

17. А – матриця-стовпець із N елементами 1, 2,..N;

B – нижня трикутна матриця N×N з одиниць;

С – матриця-рядок з елементами ai = (N-i)2.

Обчислити добутки матриць: А×C і C×B×А.

18. А – матриця-рядок з N елементами 1, 2,..N;

B – матриця N×N випадкових чисел, менших M1;

С – матриця-стовпець з елементами ai = (M2-i)2.

Обчислити добутки матриць: А×В×C, А×C і C×А.

19. А – матриця N×N; на головній і побічній діагоналях перебувають 1, інші елементи – 0;

B – нижня трикутна матриця N×N з 1 і M у випадковому порядку;

С – матриця-стовпець із елементами ai = (N-i)2.

Обчислити добутки матриць: А×B×C і В×А.


20. А – матриця N×N, заповнена 0 і 1 у випадковому порядку;

B – нижня трикутна матриця N×N з елементів 1 і M, розташованими у випадковому порядку;

С – верхня трикутна матриця N×N з елементів М1 і M2 у випадковому порядку.

Обчислити добутки матриць: А×B×C і C×B×А.

21. А – верхня трикутна матриця N×N з одиниць;

B – матриця N×N, заповнена 0 і 1 у випадковому порядку;

С – верхня трикутна матриця N×N з елементів М1 і M2, розташованими у випадковому порядку.

Обчислити добутки матриць: А×B×C і C×B×А.

22. А – матриця N×N, заповнена 0 і 1 у випадковому порядку;

B – матриця-рядок з N випадкових цілих чисел, менших M;

С – матриця-стовпець із N випадкових цілих чисел, в інтервалі від M1 до М2.

Обчислити добутки матриць: А×C×В і C×В.

23. А – діагональна матриця N×N; на діагоналі – числа 1, 1/2,..1/N;

B – матриця N×N випадкових дійсних чисел, менших M;

С – верхня трикутна матриця N×N з елементів М1 і M2, розташованими у випадковому порядку;

Обчислити добутки матриць: А×B×C і C×B×А.

24. А – нижня трикутна матриця N×N з елементами aij=i (при i>=j);

B – матриця N×N випадкових дійсних чисел, менших 1;

С – верхня трикутна матриця N×N з елементів М1 і M2, розташованими у випадковому порядку;

Обчислити добутки матриць: А×B×C і C×B×А.

4.4. Методичні вказівки

1. Всі операції над матрицями виконувати за допомогою функцій-членів класу.

2. Програма має виводити на екран вихідні матриці й результати обчислень.

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

4.5. Зміст звіту

1. Постановка завдання.

2. Код програми.

3. Скриншот з результатами роботи програми.

4. Пояснення результатів і висновки.


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();

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

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

Алгоритм обчислення ряду налагодити для певного значення , з урахуванням 100 членів ряду. Результати обчислення ряду при зміні дійсної й уявної частин аргументу вивести у вигляді таблиці (мал. 3.1).

Рис. 3.1 Зразок виведення результатів перевірочних обчислень і значень ряду

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

Ряд Перевірочна функція (позначення: )
 
 
 
 
 
 
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
  ,
 
 
 
 
 
 

5.4. Методичні вказівки

1. При визначенні перезавантажених операторів використати звичайні правила дій над комплексними числами:

;

;

;

.

2. Виведення результатів на екран (у тому числі таблиці) супроводжувати заголовками. Для побудови таблиці використати функцію printf.

5.5. Зміст звіту

1. Постановка завдання.

2. Код програми.

3. Скриншот з результатами роботи програми.

4. Пояснення принципів використання дружніх функцій і перезавантаження операторів.


6. Лабораторна робота 6. "Спадкування.
Віртуальні функції"

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

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

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

6.1.1. Спадкування й модифікатори спадкування

Коли один клас успадковується іншим, клас, що успадковується, називається базовим класом. Клас, що успадковує, називають похідним класом.

Новый клас Child будується на базі існуючого Parent за допомогою конструкції виду:

class Parent {...};
class Child: [модифікатор спадкування] Parent {...};

Модифікатор спадкування визначає, які права доступу до змінних і методів класу-батька будуть "делеговані" класу-нащадкові. Права доступу до елементів базового класу з методів похідного класу, залежно від значення модифікаторів спадкування, наведені в табл. 4.1. У похідному класі доступ до елементів базового класу може бути зроблений більше обмеженим, але ніколи не можна зробити його менш обмеженим.

Таблица 4.1. Права доступу до елементів базового класу

  Модифікатор спадкування
public protected private
Модифікатор у базовому класі public public protected private
protected protected protected private
private немає доступу немає доступу немає доступу

Оголосимо у базовому класі дві закритих змінних і функції введення й виведення змінних, а у похідному класі – функції множення й ділення:

class Base {

protected:

int i,j;

public:

void get(){cout<<"Input two numbers:"; cin>>i>>j;}

void put(){cout<<"i="<<i<<" j="<<j<<endl;}

};

class Deriv:public Base {

public:

void mult(){cout<<"i*j="<<i*j<<endl;};

void div(){cout<<"i/j="<<i/j<<endl;};

};

Тоді до об'єкта похідного класу можна застосовувати функції як похідного, так и базового класів:

void main(){

Deriv var;

var.get();

var.put();

var.mult();

var.div();

}

6.1.2. Віртуальні функції

Нехай у базовому Base і в похідному Deriv класах визначені однойменні функції func. Якщо створити об'єкти obBase і obDeriv цих класів, то директиви

obBase.func();

і

obDeriv.func();

будуть викликати функцію func відповідного класу. Однак у мові С++ при створенні інтерфейсу класів прийнято використати покажчик на базовий клас:

Base *pGen;

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

pGen=&obBase;

або адресу екземпляра похідного класу:

pGen=&obDeriv;

Якщо звернутися до функції func через такий покажчик, то незалежно від того, адресу якого об'єкта містить покажчик, буде викликана версія func базового класу. Щоб викликати потрібну версію функції func залежно від того, на який тип об'єкта вказує pGen, вводиться віртуальна функція. Така функція визначається в класі Base ключовим словом virtual.

Виртуальні функції дозволяють складати прості універсальні програми для маніпулювання об'єктами різних типів і дозволяють підтримувати в С++ динамічний поліморфізм.

Наведемо приклад, у якому створюється базовий клас – квадрат і похідний клас – паралелепіпед. Класи містять функцію ar() для обчислення площі, вона оголошується як віртуальна:

class Square{

public:

double a;

Square(double a1) {a=a1;};

virtual double ar() {return a*a;};

};

class Parall: public Square{

double h;

public:

Parall (double height,double a): Square (a){h=height;}

double ar() {return 2*a*(a+2*h);};

};

У функції main оголосимо покажчик p класу Square і створимо об'єкт sq1, на який буде вказувати p. Обчислимо площу квадрата за допомогою віртуальної функції ar() і виведемо ії значення на екран. Потім створимо об'єкт par1 похідного класу, привласнимо покажчику p адресу нового об'єкта й виведемо площу паралелепіпеда, звернувшись до функції ar() також через p:

Square *p, sq1(a);

p=&sq1;

cout<<"\nArea of square: "<<p->ar()<<endl;

Parall par1(b,a);

p=&par1;

cout<<"\nArea of parallelepiped: "<<p->ar()<<endl;

6.1.3. Відділення інтерфейсу від реалізації

Для створення зручних додатків інтерфейс класу (оголошення класу) відокремлюється від його реалізації (визначення функцій-членів). Оголошення класу міститься в заголовному файлі.h, щоб воно було доступно будь-якому клієнтові. Визначення функцій-членів класу містяться в файлі реалізації.cpp. При необхідності модифікувати функції, зміни торкаються тільки файлу реалізації.

Приклад додатка, що складається із заголовного файлу Date.h, файлу реалізації Date.cpp і керуючого файлу MyDate.cpp, що містить функцію main.

Заголовний файл Date.h:

#ifndef DATE_H //Запобігання багаторазового

#define DATE_H //включення заголовного файлу

#include <iostream>

using namespace std;

class Date { //Оголошення абстрактного типу Date

int day, month, year;

public:

Date();

void set(int, int, int);

void print();

};

#include "Date.cpp" //Підключення файлу реалізації

#endif

Файл реалізації Date.cpp:

Date:: Date() {

day=1; month=1; year=1;

}

void Date:: set(int d, int m, int y) {

day=d; month=m; year=y;

};

void Date:: print() {

cout <<day<<"."<<month<<"."<<year;

}

Керуючий файл MyDate.cpp:

#include "date.h"

void main(){

Date birthday;

birthday.set(29,3,1980);

birthday.print();

}

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

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

2. Розмістити оголошення класів у заголовному файлі, визначення функцій-членів – у файлі реалізації, а функцію main – у керуючому файлі.

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

Базовий клас Похідний клас(ы) Функції
  Квадрат: сторона a Ромб: сторона a,кут α Площа, довжина діагоналей, виведення параметрів фігури
  Квадрат: сторона a Прямокутник: сторони a і b Площа, довжина діагоналей, виведення параметрів фігури
  Квадрат: сторона a Паралелепіпед: сторони а, а, b Площа, сума всіх сторін (ребер), виведення параметрів фігури
  Квадрат: сторона a Паралелепіпед: сторони а, b, з Площа, сума всіх сторін (ребер), виведення параметрів фігури
  Квадрат: сторона a Піраміда: сторона основи а, висота h Площа, сума всіх сторін (ребер), виведення параметрів фігури
  Прямокутник: сторони a і b Паралелограм: сторони a і b, кут α Площа, довжина діагоналей, виведення параметрів фігури
  Ромб: сторона a,кут α Паралелограм: сторони a і b, кут α Площа, сума всіх сторін (ребер), виведення параметрів фігури
  Ромб: сторона a,кут α Прямокутна призма: сторона основи a, кут α, висота h Площа, сума всіх сторін (ребер), виведення параметрів фігури
  Ромб: сторона a,кут α Піраміда: сторона основи a, кут α, висота h Площа, сума всіх сторін (ребер), виведення параметрів фігури
  Паралелограм: сторони a і b, кут α Прямокутна призма: сторони основи a і b, кут α, висота h Площа, сума всіх сторін (ребер), виведення параметрів фігури
  Рівносторонній трикутник: сторона а Прямокутна призма: сторона основи a, висота h Площа, сума всіх сторін (ребер), виведення параметрів фігури
  Рівносторонній трикутник: сторона а Піраміда: сторона основи a, висота h Площа, сума всіх сторін (ребер), виведення параметрів фігури
  Рівносторонній трикутник: сторона а Тетраедр: ребро a, Площа, сума всіх сторін (ребер), виведення параметрів фігури
  Трикутник: сторони а, b, з Прямокутна призма: сторони основи а, b, з, висота h Площа, сума всіх сторін (ребер), виведення параметрів фігури
  Коло: радіус r Еліпс: півосі r і q Площа, довжина окружності, еліпса, виведення параметрів фігури
  Коло: радіус r Сектор: радіус r, кут α Площа, периметр, виведення параметрів фігури
  Коло: радіус r Сегмент: радіус r, кут α Площа, периметр, виведення параметрів фігури
  Коло: радіус r Кільце: радіуси r1 і r2 Площа, довжина окружності й окружностей кілець, виведення параметрів фігури
  Коло: радіус r Куля: радіус r. Циліндр: радіус r, висота h Площа, виведення параметрів фігури
  Коло: радіус r Куля: радіус r. Конус: радіус r, висота h Площа, виведення параметрів фігури
  Еліпс: півосі a і b Циліндр: основа з півосями a і b, висота h Площа, виведення параметрів фігури
  Куб: ребро а Паралелепіпед: сторони а, а, b Площа, об'єм, виведення параметрів фігури
  Куб: ребро а Куля, вписана в куб. Куля, описана навколо куба Площа, об'єм,, виведення параметрів фігури
  Куб: ребро а Куб, розтягнутий уздовж однієї з діагоналей: ( -вихідна діагональ) Площа, об'єм,, виведення параметрів фігури
  Паралелепіпед: сторони а, b, з Прямокутна призма: сторони а, b, з, кут між сторонами основи α Площа, об'єм, виведення параметрів фігури

6.4. Методичні вказівки

При визначенні функцій-членів у деяких варіантах завдань урахувати наступні формули для геометричних фігур:

Куля: – площа, – об'єм.

Сектор: -площа.

Сегмент: - площа.

Еліпс: - площа: – довжина.

Еліпсоїд: – об'єм;

Піраміда й конус: - об'єм, – площа основи, – висота.

Круговий конус: – площа, – утворююча.

6.5. Зміст звіту

1. Постановка завдання.

2. Код програми.

3. Скриншот з результатами роботи програми.

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


7. Лабораторна робота 7.
"Шаблони"

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

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

7.1.1. Шаблони функцій

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

Формат визначення функції-шаблона записується в такий спосіб:

template <class Тип_функції> Тип_значення_що_повертає_функція Ім'я_функції (Список_параметрів) {

/*Тіло_функції*/

}

Приведемо приклад функції-шаблона, що виконує пошук мінімального елемента в цілочисельному масиві або в рядку (символа з мінімальним кодом). Використаємо також функцію-шаблон для ініціалізації масиву:

#include <iostream>

#include <cstring>

using namespace std;

//-------Шаблон функції пошуку елемента------

template <class T> int find(T *a, int n){

int res=0;

for (int i=0; i<n; i++)

if (a[i]<a[res])

res=i;

return res;

}

//-------Шаблон функції ініціалізації масиву--------

template <class T> void in(T *a, int n){

cout<<"Enter elements: ";

for (int i=0; i<n; i++)

cin>>a[i];

};

void main(){

int n, im;

cout<<"Enter size of array"<<endl;

cin>>n; //Введення розміру масиву

int *a=new int[n];

in(a,n); //Введення значень у цілочисельный масив

im = find(a,n); //Пошук мінімального елемента

cout<<"min: a["<<im<<"]="<<a[im]<<endl;

delete [] a;

cout<<"Enter string length"<<endl;

cin>>n; //Введення довжини рядка

char *str=new char[n];

in(str,n); //Введення символів у рядок

im = find(str,n); //Пошук мінімального елемента

cout<<"min: str["<<im<<"]="<<str[im]<<endl;

delete [] str;

}

У визначеннях функцій-шаблонів Т є параметром, що при виклику функції задає тип даних (у даному прикладі – int або char).

7.1.2. Шаблони класів

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

template <class Параметр_шаблона> class Ім'я_класу {

/*Члени_класу*/

};

У списку параметрів шаблона (у кутових дужках <...>) може бути кілька параметрів – тоді вони записуються через кому.

Приклад опису шаблона вектора (одновимірного масиву):

template <class T> class vector{

int i, num;

T *a;

public:

vector (int); //Конструктор

T find (int &); //Функція пошуку мінімального ел-та

void in();//Функція введення

void show();//Функція відображення

};

Методи (функції) шаблона автоматично є шаблонами функцій. Якщо метод описується поза шаблоном, треба дотримуватися синтаксису:

template <class Параметр_шаблона>

Тип_значення_що_повертається Ім'я_класу <Параметр_шаблона>::
Ім'я_функції (Список_параметрів_функції) {

/*Тіло_функції*/

}





Дата публикования: 2015-04-07; Прочитано: 1734 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.104 с)...