ЛАБОРАТОРНАЯ РАБОТА 1
ФОРМИРОВАНИЕ И ОБРАБОТКА ДИНАМИЧЕСКИХ МАССИВОВ
ОДНОМЕРНЫЕ МАССИВЫ
Формирование динамического массива осуществляется в два этапа: на первом – выделяют под массив динамическую память, на втором – инициализируют (заполняют данными) выделенную память. После обработки массива и получения результатов использованную память необходимо освобождать. Выделение и освобождение динамической памяти под массив производится по указателю при помощи операций new и delete соответственно. Контроль за правильностью выполнения операции выделения динамической памяти осуществляется с помощью макроса assert, определенного в файле <assert.h>. Например,
int n, *iptr; // n – размер массива
------------ инициализация n -------------
iptr = new int[n];
assert(iptr!=0);
// инициализация элементов массива случайными числами
// в диапазоне значений от -9 до 9
for(int i=0: i<n; i++)
iptr[i]= (rand()-16383)%10; }
--------- обработка динамического массива --------
delete[]iptr;
iptr=0;
Операция newвыделяет непрерывный участок динамической памяти под массив длиной n, для целых чисел, и возвращает адрес этого участка, т.е. адрес элемента массива с индексом 0 – iptr[0]. Если память не выделена, то значение указателя iptr окажется равным нулю, а значение выражения iptr!=0 – ложным (нулевым). Тогда макрос assert прерывает выполнение программы. При завершении работы выводится сообщение об ошибке вида: Assertion failed: expression, file <имя файла>, line <номер строки>. После того, как отладка программы будет закончена и макросы assert будут больше не нужны, в начале программы достаточно добавить строку #define NDEBUG вместо того, чтобы удалять в программе каждый макрос assert вручную. Операция delete объявляет участок памяти под массивом свободным. После применения операции deleteуказатель рекомендуется обнулять, с целью защиты программного продукта.
ДВУМЕРНЫЕ МАССИВЫ (МАТРИЦЫ)
Выделение и освобождение динамической памяти для размещения двумерного массива (матрицы) выполняется, например, следующим образом.
int n, m, **iptr; // n – число строк, m – число столбцов матрицы
------------ инициализация n, m -------------
// выделение памяти под массив указателей на строки
iptr=new int*[n];
assert(iptr!=0);
for(int i=0; i<n; i++) {
// выделение памяти под i – ю строку
iptr[i]=new int[m];
assert(iptr[i]!=0);
for(int j=0; j<m; j++)
// инициализация строк матрицы случайными
// числами в диапазоне значений от -99 до 99
iptr[i][j] = (rand()-16383)%100;}
------------- обработка динамической матрицы ------------
for(int i=0: i<n; i++)
// освобождение памяти под i – й строкой
delete[]iptr[i];
// освобождение памяти под массивом указателей на строки
delete[]iptr;
iptr=0;
Возможен и другой вариант, когда память выделяется под столбцы. В этом случае приведенный выше фрагмент программы будет выглядеть следующим образом.
int n, m, **iptr; // n – число строк, m – число столбцов матрицы
------------ инициализация n, m -------------
// выделение памяти под массив указателей на столбцы
iptr=new int*[m];
assert(iptr!=0);
for(int j=0; j< m; j++) {
// выделение памяти под j – й столбец
iptr[j]=new int[n]
assert(iptr[j]!=0);
for(int i=0: i<n; i++)
// инициализация столбцов матрицы случайными
// числами в диапазоне значений от -99 до 99
iptr[j][i]= (rand()-16383)%100; }
------------- обработка динамической матрицы ------------
for(int j=0; j<m; j++)
// освобождение памяти под j– м столбцом
delete[]iptr[j];
// освобождение памяти под массивом указателей на столбцы
delete[]iptr;
iptr=0;
Задания
1.В одномерном массиве нулевые элементы удалить, положительные элементы расставить по убыванию, отрицательные - по возрастанию. Получить зависимость затрат машинного времени от размера массива.
2.В матрице удалить строки с последними отрицательными элементами, а затем добавить строку из сумм элементов по столбцам.
Дата добавления: 2020-10-14; просмотров: 345;