Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB_TP_2013.doc
Скачиваний:
82
Добавлен:
02.06.2015
Размер:
15.36 Mб
Скачать

Лабораторная работа 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;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]