Частина тексту файла (без зображень, графіків і формул):
Національний технічний університет України
«КПІ імені Ігоря Сікорського»
Кафедра автоматизації проектування енергетичних процесів і систем
ЗВІТ
з лабораторної роботи № 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, а потім додав стовпець. Особливих труднощів при виконанні не зустрів