Динамічна пам’ять. Команди new і delete. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Динамічна пам’ять. Команди new і delete.



 

Значення даних у комп’ютера можна зберігати в області даних (статистична пам’ять),

у стеку або в динамічній пам’яті (“на купі “). Усі змінні, які ми розглядали досі -статистичні.

Під час їх оголошення система автоматично надає для зберігання їхнії значень певний обсяг

оперативної пам’яті, і цей розподіл пам’яті залишається незмінним протягом виконання

програми. Пам’ять, надана цим змінним, резервується (фіксується) у середині exe – файлу

відкомпільованої програми. Навіть якщо не всі будуть використані у програмі, пам’ять буде

зарезервована, тобто використана неефективно. Пам’ять, надана таким змінним, виділяється

лише обмежену кількість даних.

Однак, є задачі, де заздалегіть невідомо, скільки змінних потрібно для їх розв’язування,

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

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

таких випадках застосовують динамічну організацію пам’яті.

 

Принцип динамічної організації пам’яті.

Полягає в тому, що для змінних надається пам’ять за необхідністю (за вказівкою

програміста). Далі ці змінні опрацьовують і в потрібний момент пам’ять вивільняють (знову за

вказівкою програміста). Такі змінні називаються динамічними.

Для роботи з динамічними змінними використовуються вказівники. Для виділення

динамічної пам’яті застосовується команда new так:

 

< тип вказівника > * < назва > =new < тип змінної >;

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

неперервна ділянка пам’яті. Команда new повертає обсяг цієї ділянки, а вказівник вказує на її

початок. Наприклад, щоб зарезервувати у пам’яті комп’ютера область для зберігання значення

цілого типу, застосовують таку команду:

 

int * ptr = new int;

 

Надати ділянку пам’яті й відразу занести у неї значення можна так:

 

int * ptr2 = new float (3.14);

 

У адресу, на яку показує ptr2, буде занесено число 3,14.

З динамічною змінною можна виконувати операції, визначенні для даних відповідного

базового типу.

Після опрацювння динамічних змінних пам’ять необхідно вивільняти, а відповідний

вказівник занулити. Якщо цього не зробити, то пам’ять можна вичерпати. Вивільняють

пам’ять за допомогою команди.

 

delete < назва вказівника >

 

Масиви.

Масив - це впорядкований скінчений набір одного типу, які зберігаються в послідовно

розташованих комірках оперативної пам’яті, та мають спільну назву.

Оголошення одновимірного масиву.

 

Тип Ім’я [ Кількість Елементів ];

 

Найпростішим прикладом масиву є набір із 12 -ти цілих чисел, які відповідь

кількістю днів в конкретному місці:

 

int days [ 12 ];

days [ 0 ] = 31; // січень

days [ 1 ] = 28; // лютий

days [ 2 ] = 31; // березень

days [ 3 ] = 30; // квітень

days [ 4 ] = 31; // травень

days [ 5 ] = 30; // червень

days [ 6 ] = 31; // липень

days [ 7 ] = 31; // серпень

days [ 8 ] = 30; // вересень

days [ 9 ] = 31; // жовтень

days [ 10 ] = 30; // листопад

days [ 11 ] = 31; // грудень

 

В першому рядку оголошено масив з 12 елементів int з іменем days. Інші стрічки

прикладу - присвоюють значень елементам масиву. Для того, щоб звернутися до конкретного

елементу масиву використовуються [ ]. Як бачимо перший елемент масиву має індекс 0,

відповідно останній 11.

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

в якості розміру можна використовувати тільки цілу константу.

Приклад 1:

Припустимо, що нам потрібно вивести на екран усі елементи масиву days. Для цього

Зручно використовувати цикл for.

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

{

cout << days [ i ];

}

 

Приклад 2:

Створити масив з перших ста цілих чисел і обчислити суму всіх його значень.

int n [ 100 ];

int s = 0;

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

{

n [ i ] = i+1;

s = s + n [ i ];

}

Оголошення двовимірного масиву

 

Тип Ім’я [ Кількість елементів 1 ] [ Кількість Елементів 2 ];

 

Приклад: int m [ 10 ] [ 5 ];

Дане оголошення представляє матрицю цілих чисел 10x5.

Звернення до елементу двовимірного масиву аналогічне до звернень одновимірних

масивів m [ 1 ] [ 2 ], звертається до третього елементу другої стрічки матриці m.

 

 

Ініціалізація масиву.

При оголошенні масиву можна присвоїти початкові значення його елементами

(ініціалізувати масив). Для одновимірного масиву ініціалізація має наступний вигляд:

 

int days [ 12 ] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

 

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

дужках;

 

double temp [ 2 ] [ 3 ] {

{ 3. 2, 3. 3, 3. 4 },

{ 4.1, 3. 9, 3. 9 } };

 

Масиви сталі (значення яких змінювати у програмі не можна) оголошуються так:

 

const int days [ ] = { 1, 3 }.

 

Динамічне оголошення масивів.

< тип вказівника > * < назва > = new < тип змінної > [ < кількість > ];

 

Після опрацювання масиву вивільнити пам’ять можна за допомогою команди:

 

delete [ ] < назва вказівника та масив даних >

 

Розв’яжемо приклад2, використовуючи динамічний розподіл пам’яті.

 

int *n = new int [ 100 ];

// Виділяємо пам’ять для ста цілих чисел;

int s = 0;

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

{

n [ i ] = i+1;

s = s + n [ i ];

}

delete [ ] n;

// Вивільняємо пам’ть;

 

Завдання.

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

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

 

2. Ввести двомірний масив який містить N рядків та M стовпців

використовуючи динамічний розподіл пам’ять. Значення N та M

задайте самі. Сформулюйте одномірний масив, який складається з

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

 

3. Ввести двомірний масив який містить N рядків та M стовпців

використовуючи динамічний розподіл пам’яті. Значення N та M

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

масиві.

 

4. Ввести двомірний масив який містить N рядків та M стовпців

використовуючи динамічний розподіл пам’яті. Значення N та M

задайте самі. Сформулюйте одномірний масив, який складається з

максимальних елементів кожного стовпця.

 

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

1. Який принцип динамічної організації пам’яті?

2. Для чого застосовується команда new?

3. Для чого застосовується команда delete?

4. Що таке масив?

5. Як оголосити одновимірний масив?

6. Як оголосити двовимірний масив?

7. Як ініціалізувати одновимірний масив?

8. Як ініціалізувати двовимірний масив?

9. Як оголошується масив сталі?

10. Як оголосити маси використовуючи динамічну пам’ять?

Лабораторна робота №6.

Тема: Створення класів та основні прийоми роботи з ними.

Мета: Ознайомитись з поняттям класу, створенням класу. Звернення до

членів класу.

 

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

Основною відміністю С++ від С є можливість опрацьовувати новий тип даних – клас.

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

Кожна окрема складова не описує людину, суть має лише разом взята інформація. Проста

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

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

комплексної інформації.

В С++ структура, яка може об’єднати декілька різноманітних змінних в одному

об’єкті - називається класом.

У об’єктно – орієнтованому підході до розробки програм основним є поняття класу

об’єкту.

 

Базовий клас.

Базовий клас визначається таким чином (синтаксис):

 

claas className

{

private:

< закриті елементи >

protected:

< захищені елементи >

public:

< відкриті елементи >

};

 

Клас С ++ мають три різні доступу до своїх елементів – як до даних, так

і до функції:

Закриті ( приватні) елементи - доступні лише для функцій класу. Захищені

елементи - доступні лише для функцій класу та функцій похідних класів.

Відкриті елементи - доступність для будь – якої зовнішньої функції.

Існують наступні правила для розділів класу:

 

· Розділи можуть з’являтися у будь – якому порядку.

· Один і той же розділ можна визначати кілька разів.

· Якщо не визначений жоден розділ, компілятор (за замовчуванням) оголошує

всі елементи закритими.

Приклад:

Клас, який описує об’єкт, що може містити ім’я та середній бал можна

записати так:

 

class Student

{

private:

float serBall;

public:

char firstName [ 128 ];

char lastName [128 ];

};

// екземпляр класу Student

Student nds;

 

Оголошення класу починається з ключового слова class, після якого іде

ім’я класу та пара фігурних дужок, які відкривають і закривають тіло класу.

Можна використовувати альтернативне ключове слово struct, яке повністю

ідентичне class, з використанням оголошення public.

Після ключового слова public відбувається опис полів класу. У даному

прикладі клас Student містить поля імен, прізвище та середній бал.

 

Звернення до членів класу.

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

Student nds;

nds. serBall = 3. 8;

cin >> nds. firstName;

cin >> nds. lastName;

 

Тут nds - екземпляр класу Student (або окремий об’єкт типу Student)

Оголосити масив об’єктів, в якому міститься 10 об’єктів типу Student можна

так:

Student nds [ 10 ];

cin >> nds [ 6 ]. firstName;

// Введення прізвища для 6-го об’єкта класу Student;

 

Завдання.

1. Написати програму в якій оголошено клас Client з полями ім’я,

прізвище та номер кредитної картки. Ввести масив об’єктів типу

Client з допомогою циклу та вивести номери усіх кредитних карток.

 

2. Написати програму в якій оголошено клас City з полями назва міста,

та кількість населення. Ввести масив об’єктів типу City з допомогою

циклу та вивести загальну кількість населення усіх міст.

 

3. Написати програму в якій оголошено клас Book з полями назва книги,

прізвище автора та кількість сторінок. Ввести масив об’єктів типу

Book з допомогою циклу та вивести прізвище усіх авторів.

 

4. Написати програму в якій оголошено клас TV, що містить поля:

виробник, ціна, дата випуску. Ввести масив об’єктів типу TV з

допомогою циклу та вивести загальну ціну за всі телевізори.

 

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

1. Що таке клас?

2. Синтаксис побудови класу?

3. Які рівні доступу мають класи С++?

4. Назвіть правила для розділів класу?

5. Як звернутись до членів класу?

6. Як оголосити масив об’єктів класу?

 

 

Лабораторна робота №7.

Тема: Робота з класами.

Мета: Освоїти використання класів. Створення функції-членів класу.

Виклик функції-членів.

 

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

Клас описує тип предмета, а об’єкт являється екземпляром класу.

Об’єкти можуть створюватися та знищуватися, а класи просто існувати.

Різні типи об’єктів створюються в різний час. Коли програма починає виконуватися

створюються глобальні об’єкти. Локальні об’єкти починають створюватися коли програма

стикається з їх оголошенням.

Глобальним об’єктом є об’єкт, який оголошений поза будь - якою функцією.

Локальний об’єкт оголошується всередині функції.

Ідея класу полягає в об’єднанні даних та алгоритмі в їх опрацюваннях. Дані

називаються полями клас, алгоритми - методами, а об’єднання - інкапсуляцією. Методами

класу є функції, які визначені для полів чи зовнішніх змінних, інколи їх називають

функціями - членами.

Приведений далі приклад Saving об’єднує в собі баланс і номер рахунку.

 

class Saving

{

unsigned Number;

float balance;

};

 

Реальні об’єкти мають властивості - дані, наприклад номер рахунку і баланс. Проте

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

В приведеному прикладі окрім номера рахунку і балансу в класі Saving додана

функція deposit (). Тепер клас Saving може самостійно управляти своїм станом.

 

class Saving

{

unsigned Number;

float balanse;

unsigned deposit (unsigned amout) // функція - член

{

balanst + = amout;

return balanse;

}

};

 

Повне ім’я функції unsigned deposit (unsigned amount) записується так:

Saving:: deposit (unsigned amount).

Ім’я класу на початку повного імені означає, що ця функція являється членом

класу Saving (:: між іменем функції та класу являється просто символом, який їх

розділяє).

 



Поделиться:


Последнее изменение этой страницы: 2016-04-18; просмотров: 615; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.119.126.80 (0.11 с.)