ЛАБОРАТОРНАЯ РАБОТА 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; просмотров: 293;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.