Частина тексту файла (без зображень, графіків і формул):
Національний технічний університет України
«КПІ імені Ігоря Сікорського»
Кафедра автоматизації проектування енергетичних процесів і систем
ЗВІТ
з лабораторної роботи № 2
з дисципліни «Алгоритмізація та Програмування 2»
Тема «Динамічне виділення пам’яті для одно- та двовимірних масивів»
Варіант: 17
Завдання на лабораторну роботу
1. Ознайомитись з особливостями роботи з динамічними двовимірними масивами.2. Виконати індивідуальне завдання.3. Оформити ЗВІТ до лабораторної роботи згідно вимог та методичних рекомендацій.4. Вихідні дані (завдання) обрати згідно свого варіанта у Додатку B-2.
Мій варіант 17:
Теоретичні відомості:
Для виділення пам’яті необхідно виконати наступні кроки:
1. Об’явити масив вказівників (наприклад, int **parray;);
2. Виділити блоки оперативної пам’яті під одномірні масиви, що
представляють собою рядки заданої матриці (наприклад, parray =
(int**)malloc(N * sizeof(int*)););
3. записати адреси рядків в масив вказівників (наприклад, parray[i] =
(int*)malloc(M * sizeof(int));).
Для звільнення пам’яті необхідно виконати такі кроки:
1. Видалити адреси рядків в масиві покажчиків (наприклад, for (i = 0; i < N;
i++) {free(parray[i]);})
2. Видалити масив вказівників (наприклад, free(parray);)
При такому способі динамічного виділення пам’яті компілятору явно
вказується кількість рядків і кількість стовпців в масиві.
Функція realloc перерозподіляє пам’ять.
Синтаксис: #include <stdlib.h>
#include <alloc.h>
void * realloc(void *block, size_t size);
Опис: realloc намагається стиснути або збільшити попередньо виділений блок
block до нового розміру в size байт. Аргумент block вказує на блок пам’яті,
отриманий при виклику функцій malloc або realloc. Якщо block є нульовим
покажчиком, realloc працює також як і malloc. realloc змінює розмір виділеного
блоку пам’яті і при необхідності копіює його вміст в новий блок.
Код програми:
#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define SIZE 5#define nCol 2#define nRow 1#define K 7int main(void) { int **parray; parray = (int**)malloc(SIZE * sizeof(int*)); for (int i = 0; i < SIZE; i++) { parray[i] = (int*)malloc(SIZE * sizeof(int)); } for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { parray[i][j] = 9 + rand() % (99 + 1 - 9); } } int counter = 0; int newRow; int newCol = SIZE; for (int i = nCol; counter <= K; i++) { newRow = SIZE; for (int j = 0; j < SIZE; j++) { if (counter == K) break; if (i == nCol) j = nRow; newRow--; counter++; } parray[i] = realloc(parray[i], sizeof(int) * newRow); if (counter == K) break; newCol--; } parray = realloc(parray, sizeof(int *) * newCol); parray = realloc(parray, sizeof(int *) * (newCol + 1)); for (int i = 0; i < SIZE; i++) { free(parray[i]); } free(parray); return 0;}
Посилання на програму в repl.it: https://replit.com/join/ilsdgyefzj-dolphiedude
Висновок:
Я ознайомився з особливостями роботи з динамічними двовимірними масивами. Дослідив особливості їхнього застосування. Це мені дозволило написати програму, що розподіляє, змінює та звільняє пам’ять масиву. Спочатку видалив пам’ять N елементів починаючи з елемента K, а потім додав стовпець. Особливих труднощів при виконанні не зустрів
Ви не можете залишити коментар. Для цього, будь ласка, увійдіть
або зареєструйтесь.
Ділись своїми роботами та отримуй миттєві бонуси!
Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!