Алгоритмизация и программирование – семестр 2
Практическое занятие №2 «Динамические массивы»
Требования к заданию:
1.Выполнение заданий организовать в формате интерфейс-меню с указанными функционалами.
2.Отдельно должны быть описаны функции заполнения, обработки и печати массивов.
Задания (2 балла):
1.(1 балл). Работа с одномерным динамическим массивом.
Функционалы:
1.- создание массива с длиной, заданной пользователем;
2.- заполнение массива случайными числами в интервале 0-9;
3.- довыделение 1 ячейки;
4.- удаление 1 ячейки;
5.- удаление М значений из массива (диапазон ячеек для удаления задает пользователь);
6.- добавление М значений в массив (диапазон ячеек задает пользователь);
7.- вывод массива на экран;
8.- выход.
2.(1 балл). Работа с прямоугольным двумерным динамическим массивом.
Функционалы:
1.- создание массива с размерами, заданными пользователем;
2.- заполнение массива случайными числами в интервале 0-9;
3.- добавление 1 строки в указанное пользователем место массива;
4.- добавление 1 столбца в указанное пользователем место массива;
5.- удаление указанной пользователем строки;
6.- вывод массива на экран;
7.- выход.
Бонус (1 балл):
Задание 2 сделать с помощью «гибридных» массивов, в которых «старший» массив указателей
— статический, а элементы этого массива уже указывают на области в динамической памяти (старшую размерность сделать константной, вторая размерность задается с клавиатуры);
«Гибридные» многомерныединамические массивы
Динамический массив — это массив, расположенный в динамической памяти и доступный
только через указатель.
В языке Си бывают массивы указателей:
int* arr[5]; |
// массив из 5 указателей на int |
Каждый из этих 5-ти указателей можно использовать по своему усмотрению. Например — выделить под каждый из них по блоку динамической памяти на 10 int’ов:
for(int i=0; i<5; i++){
arr[i] = (int*)malloc(10*sizeof(int));
}
Графически это выглядит следующим образом:
Практическоезанятие№2 |
Страница1 |
Алгоритмизация и программирование – семестр 2
arr
arr[0] arr[0][0] arr[0][1] … arr[0][9] arr[1] arr[1][0] arr[1][1] … arr[1][9] arr[2] arr[2][0] arr[2][1] … arr[2][9] arr[3] arr[3][0] arr[3][1] … arr[3][9] arr[4] arr[4][0] arr[4][1] … arr[4][9]
Работа с таким массивом осуществляется по общим правилам обращения с массивами и указателями.
Когда такой массив больше не нужен — его аналогичным образом нужно удалить (вернуть память системе):
for(int i=0; i<5; i++){ free(arr[i]);
}
Настоящие многомерныединамические массивы
На практике описанный выше «гибридный» вариант используется редко. Гораздо чаще «главный» массив (массив указателей на массивы) тоже создается как динамический. Ну а поскольку в нем хранятся указатели (элементы типа int*), то указатель на этот массив должен иметь на одну звездочку больше (int** — указатель на указатель на int).
Его создание (и удаление) требуют на одну операцию выделения (и освобождения) памяти больше.
Практическоезанятие№2 |
Страница2 |