
- •Лабораторна робота №1
- •Порядок виконання роботи
- •Завдання 1
- •Завдання 2
- •Завдання 3
- •Теоретичні відомості Масиви динамічної пам'яті
- •Приклад виконання завдання 1
- •Лістинг програми
- •Приклад виконання завдання 2
- •Лістинг програми
- •Приклад виконання завдання 3
- •Лістинг програми
- •Контрольні запитання
- •Лабораторна робота №2
- •Порядок виконання роботи
- •Завдання 1
- •Завдання 2
- •Теоретичні відомості Читання і запис текстових файлів
- •Читання і запис бінарних файлів
- •Відкриття бінарних файлів
- •Файли з послідовним доступом
- •Запис даних у файл з послідовним доступом
- •Файли з довільним доступом
- •Приклад виконання завдання 1
- •Приклад виконання завдання 2
- •Контрольні запитання
- •Лабораторна робота №3
- •Порядок виконання роботи
- •Завдання 1
- •Завдання 2
- •Завдання 3
- •Теоретичні відомості
- •Обмеження доступу до членів класу
- •Специфікатори доступу
- •Вбудовані функції-члени
- •Приклад виконання завдання 1.
- •Приклад виконання завдання 2.
- •Приклад виконання завдання 3.
- •Контрольні запитання
- •Лабораторна робота №4
- •Порядок виконання роботи
- •Завдання 2
- •Теоретичні відомості Конструктори і деструктори
- •Правила роботи з конструкторами і деструкторами
- •Варіант 10. Розробити описовий алгоритм, схему алгоритму і написати метод для підрахування кількості слів в текстовому файлі.
- •Приклад виконання завдання 2
- •Контрольні запитання
- •Лабораторна робота №5
- •Порядок виконання роботи
- •Завдання 1
- •Завдання 2
- •Теоретичні відомості Принципи спадкування в ооп
- •Оголошення похідних класів
- •Конструктори похідного класу
- •Функції члени похідного класу
- •Заборонені члени класу (Protected)
- •Приклад виконання Завдання 1
- •Контрольні запитання
- •Лабораторна робота №6
- •Порядок виконання роботи
- •Завдання 1
- •Теоретичні відомості Перевантаження операторів
- •Приклад виконання завдання 1
- •Приклад виконання завдання 2
- •Приклад виконання завдання 3
- •Приклад виконання завдання 4
- •Контрольні запитання
- •Лабораторна робота №7
- •Порядок виконання роботи
- •Завдання 1.
- •Завдання 2.
- •Теоретичні відомості
- •Структура наслідування класів
- •Постановка задачі
- •Розробити клас трикутника, чотирикутника, кола, точки
- •Контрольні запитання
- •Лабораторна робота №8
- •Порядок виконання роботи
- •Завдання 1
- •Контрольні запитання
- •Лабораторна робота №9
- •Порядок виконання роботи
- •Завдання 1
- •Теоретичні відомості Множинне спадкування
- •Контрольні запитання
- •Лабораторна робота №10
- •Порядок виконання роботи
- •Завдання 1
- •Теоретичні відомості Шаблони
- •Параметризовані класи
- •Визначені об’єкти-потоки
- •Операції поміщення та вилучення
- •Приклад виконання Завдання з варіанту 2
- •Контрольні запитання.
- •Лабораторна робота №11
- •Порядок виконання
- •Завдання 1
- •Завдання 2
- •Завдання 3 Варіант 1. Задача “Банківське переведення” (дата, час, № рахунку, розмір рахунку).
- •Ітератори
- •Для роботи з вектором необхідно:
- •Приклад роботи з вектором
- •Алгоритми
- •Застосування алгоритмів до вектора
- •Приклад 1 виконання Завдання 1
- •Приклад 2 виконання Завдання 2
- •Приклад 3 виконання завдання №3
- •Контрольні запитання
- •Завдання 1
- •Теоретичні відомості Приклад розробки програми
- •Контрольні запитання
- •Лабораторна робота №13
- •Порядок виконання
- •Завдання 2.
- •Теоретичні відомості
- •Стандартні потоки для базових класів
- •Форматування даних при обмінах з потоками
- •Маніпулятори
- •Приклад розробки програми
- •Контрольні запитання
- •Лабораторна робота №14
- •Порядок виконання
- •Завдання
- •Теоретичні відомості
- •Контрольні запитання
Теоретичні відомості Масиви динамічної пам'яті
При традиційному визначенні масиву:
Тип ім'я_масиву [кількість елементів] ;
Загальна кількість елементів масиву і розміри пам'яті, виділеної для нього, цілком і однозначно задано визначенням. Це не завжди зручно. Іноді в професійних програмах необхідно, щоб пам'ять для масиву виділялася в таких розмірах, які потрібні для рішення конкеретної задачі, причому потреби в пам'яті заздалегідь не відомі і не можуть бути фіксовані.
Формування масивів з змінними розмірами можна організувати за допомогою покажчиків і засобів для динамічного виділення пам'яті. Для цього використовують бібліотечні функції, описані в заголовочних файлах alloc.h і stdlib.h стандартної бібліотеки(таблиця 1.1).
Таблиця 1.1 – Бібліотечні функції стандартної бібліотеки
Функція |
Прототип і короткий опис |
malloc() |
void*malloc(unsigned s); Повертає покажчик на початок області (блоку) динамічної пам'яті довжиною в s байт. При невдалому завершенні повертає значення NULL |
calloc() |
void*calloc(unsigned n,unsigned m); Повертає покажчик на початок області (блока) пам'яті обнуленої динамічної пам'яті, виділеної для розміщення n елементів по m байт кожний. При невдалому завершенні повертає значення NULL |
realloc() |
void*realloc(void*bl,unsigned ns); Змінює розмір блоку раніше виділеної динамічної пам'яті до розміру ns байт. bl – адреса початку змінюваного блоку. Якщо bl дорівнює NULL (пам'ять не виділялася), то функція виконується як malloc() |
free() |
void*free(void*bl); Звільняє раніше виділену ділянка динамічної пам'яті, адреса першого байта якого дорівнює bl |
new() |
void*new() Створює масив( під час виконання програми також). Повертає адрес першого елемента виділеного блока. |
delete() |
void*delete() Звільняє пам’ять, відведену для масиву. |
Існує кілька способів резервування пам'яті в купі для динамічних змінних. Найпоширеніший спосіб використовує бібліотечну функцію malloc( ) – memory allocation чи memory allocator (виділення пам'яті чи розподільник пам'яті)
Наприклад:
Sp=malloc(129); /*резервування 128 байт
Sp=(char*)malloc(129); /*ті ж дії, тільки виконане приведення типів, тому що функція повертає тип void*/.
В обох цих випадках покажчик sp адресує блок купи з 129 байт, зарезервованих винятково для його особистого виконання.
Якщо купа вже заповнена, то функція malloc() повертає нуль, тому необхідно перевіряти після виклику функції, чи нерівний нулю покажчик:
sp=malloc(129);
if(sp==NULL)
error();
чи if((sp=malloc(129)!=NULL)оператор;
чи v=malloc(sizeof(double));
long*1;
p=calloc(1,sizeof(long));
У функціях malloc(),calloc(),realloc() динамічно виділяють пам'ять у відповідності зі значеннями параметрів і повертають адресу початку виділеної ділянки пам'яті. Для універсальності тип значення, що повертається, кожної з цих функцій є void*. Покажчик такого типу можна перетворити до покажчика будь-якого типу за допомогою операції явного приведення типу.
У функції free() аргументом являється вказівник на блок пам’яті, яка вже виділена функцією malloc(). Після виконання free() ця частина пам’яті може бути виділена знову, але її зміст втрачається . У випадку виходу за межі блока, виділеного функцією malloc(), також при виклику функції free() з аргументом, яки не є результатом malloc(), ефект буде непередбаченим.
Приклад використання :
malloc(),calloc(),realloc(),free():
Приклад 1
d_array=malloc((number_of_elements)*sizeof(float));
if(!d_array)
{
/* обробка помилки виділення пам’яті*/
}
/*…робота з елементами масиву …*/
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;
ptr = realloc(NULL, 20*sizeof(char));
strcpy(ptr, "Це перша частина, ");
ptr = realloc(ptr, 100*sizeof(char));
strcat(ptr, "Це друга частина);
printf("%s\n", ptr);
realloc(ptr, 0);
}
Приклад 4
pointer = malloc(sizeof(data) * 1000);
/* … перевірка успішності виділення пам’яті, використання блока пам’яті … */
free(pointer);
pointer = NULL;
Приклад використання функцій:
new() і delete():
Наприклад, наступна програма USE_NEW.CPP використовує оператор new для одержання вказівника на 100-байтний масив:
#include <iostream.h>
void main(void)
{
сhar *pointer = newchar[100]; if (pointer != NULL) cout << "Пам’ять успішно виділена" <<endl; else cout << "Помилка виділення пам’яти" << endl; }