- •Національний університет “Львівська політехніка” Інститут підприємництва та перспективних технологій
- •Короткі теоретичні відомості
- •1.1. Десяткова система числення
- •1.2. Двійкова система числення
- •1.3. Вісімкова та шістнадцяткова системи числення
- •Алгоритми переведення чисел з однієї позиційної системи числення в іншу
- •Постановка завдання
- •4. Висновки
- •5. Контрольні запитання
- •Лабораторні роботи №2-3. Тема: "Знайомство з с. Виконання програми простої структури"
- •1. Короткі теоретичні відомості
- •1.1. Структура програми
- •1.2. Константи й змінні
- •1.3. Операції
- •1.4. Вирази
- •2. Постановка завдання
- •3. Варіанти
- •4. Методичні вказівки
- •6. Висновки
- •7. Контрольні запитання
- •Лабораторні роботи №4-5. Тема: "Використання основних операторів мови с"
- •Короткі теоретичні відомості
- •Складені оператори
- •Оператори вибору
- •Оператори циклів
- •Оператори переходу
- •2. Постановка завдання
- •3. Варіанти
- •5. Методичні вказівки
- •6. Висновки
- •7. Контрольні запитання
- •Лабораторна робота №6. Тема: "Обчислення функцій з використанням їхнього розкладу в степеневий ряд"
- •1. Короткі теоретичні відомості
- •2. Постановка завдання
- •3. Варіанти
- •4. Методичні вказівки
- •5. Отримані результати. Лабораторні роботи № 7.
- •Короткі теоретичні відомості
- •1.1. Функції
- •1.2 Бібліотека математичних функцій.
- •2. Постановка завдання
- •Лабораторна робота № 8. Тема: "Робота з одновимірними масивами"
- •Короткі теоретичні відомості
- •1.2. Ініціалізація масиву
- •1.3. Вказівники
- •1.4. Вказівники й масиви
- •2. Варіанти завдань
- •3. Методичні вказівки
- •Короткі теоретичні відомості
- •1.2. Масиви й рядки як параметри функцій
- •2. Постановка завдання
- •3. Варіанти
- •4. Методичні вказівки
- •Висновки
- •6. Контрольні запитання
- •4) Як здійснюється передача багатовимірних масивів у функцію? Лабораторні роботи №11-12. Тема: "Символьна інформація"
- •1. Короткі теоретичні відомості
- •2. Постановка завдання
- •3. Варіанти
- •Тема: " Використання бібліотечних функцій для обробки символьної інформації."
- •Короткі теоретичні відомості
- •2. Варіанти індивідуальних завдань
- •Методичні вказівки
- •Контрольні запитання
- •Лабораторна робота № 15 Тема: "Динамічні масиви"
- •Короткі теоретичні відомості
- •Формування динамічних масивів з використанням бібліотечних функцій
- •Формування динамічних масивів з використанням операцій new й delete
- •2. Постановка завдання
- •3. Порядок виконання роботи
- •4. Варіанти завдань
- •Лабораторна робота № 16. Тема: "Інформаційні динамічні структури"
- •Короткі теоретичні відомості
- •2. Постановка завдання
- •Порядок виконання роботи
- •4. Варіанти завдань
- •Список літератури
Лабораторна робота № 15 Тема: "Динамічні масиви"
Мета: Організація динамічних масивів.
Короткі теоретичні відомості
При традиційному визначенні масиву:
тип ім'я_масиву [кількість_елементів];
загальна кількість пам'яті, що виділяється під масив, задається визначенням і дорівнює кількість_елементів * sizeof(тип).
Але іноді буває потрібно щоб пам'ять під масив виділялася для вирішення конкретного завдання, причому її розміри заздалегідь не відомі й не можуть бути фіксовані.
Формування масивів зі змінними розмірами можна організувати за допомогою вказівників і засобів динамічного розподілу пам'яті двома способами:
з використанням бібліотечних функцій, описаних у заголовкових файлах alloc.h й stdlib.h (стандартний С);
з використанням операцій new й delete (С++).
Формування динамічних масивів з використанням бібліотечних функцій
Для виділення й звільнення динамічної пам'яті використовуються функції
Функція |
Прототип і короткий опис |
malloc |
void * malloc(unsigned s) Повертає вказівник на початок області динамічної пам'яті довжиною в s байт, при невдалому завершенні повертає NULL |
calloc |
void * calloc(unsigned n, unsigned m) Повертає вказівник на початок області динамічної пам'яті для розміщення n елементів довжиною по m байт кожний, при невдалому завершенні повертає NULL |
realloc |
void * realloc(void * p, unsigned s) Змінює розмір блоку раніше виділеної динамічної пам'яті до розміру s байт, р – адреса початку змінюваного блоку, при невдалому завершенні повертає NULL |
free |
void *free(void p) Звільняє раніше виділену ділянку динамічної пам'яті, р – адреса першого байта |
Приклад:
Функція для формування одновимірного динамічного масиву
int * make_mas(int n)
(
int *mas;
mas=(int*)malloc(n*sizeof(int));
for(int i=0;i<n;i++)
mas[i]=random(10);
return mas;
}
Для виділення пам'яті використовується функція malloc, параметром якої є розмір виділеної ділянки пам'яті, що дорівнює n*sizeof(int). Тому що функція malloc повертає нетипізований вказівник void*, то необхідно виконати перетворення отриманого нетипізованого вказівника у вказівник int*.
Звільнити виділену пам'ять можна функцією free(mas).
Формування динамічних масивів з використанням операцій new й delete
Для динамічного розподілу пам'яті використовуються операції new й delete. Операція
new ім'я_типу
або
new ім'я_типу ініціалізатор
дозволяє виділити й зробити доступною вільну ділянку пам'яті, розміри якої відповідають типу даних, обумовленому іменем типу. У виділену ділянку записується значення визначене ініціалізатором, що не є обов'язковим параметром. У випадку успішного виділення пам'яті операція повертає адресу початку виділеної ділянки пам'яті, якщо ділянка не може бути виділеною, то повертається NULL.
Приклади:
1) int *i;
i=new int(10);
2) float *f;
f=new float;
int *mas=new[5];
У прикладах 1, 2 показано як виділити пам'ять під скалярні змінні, приклад 3 показує виділення пам'яті під масив змінних.
Операція delete вказівник звільняє ділянку пам'яті раніше виділену операцією new.
Приклад:
Функція для формування двовимірного динамічного масиву
int ** make_matr(int n)
{
int **matr;
int i,j;
matr=new int*[n];
for (i=0;i<n;i++)
{
matr[i]=new int[n];
for (j=0;j<n;j++)
matr[i][j]=random(10);
}
return matr;
}
При формуванні матриці спочатку виділяється пам'ять для масиву вказівників на одновимірні масиви, а потім у циклі з параметром виділяється пам'ять під n одновимірних масивів.
* *matr
*matr[1] |
*matr[2] |
*matr[3] |
. . . . |
*matr[n] |
Щоб звільнити пам'ять необхідно виконати цикл для звільнення одновимірних масивів
for(int i=0;i<n;i++)
delete matr[i];
Після цього звільняємо пам'ять на яку вказує вказівник matr
delete [] matr;