Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика 1 курс / метод указания / Информатика. Основы программирования на С++. Учебное пособие.doc
Скачиваний:
150
Добавлен:
08.06.2015
Размер:
2.15 Mб
Скачать

7.2. Динамические массивы

Динамическим называется массив, размерность которого становится известной в процессе выполнения программы. Такие массивы делают последнюю более общей.

Формирование динамических массивов осуществляется с помощью указателей и средств распределения памяти. Память выделяется в специальной области оперативной памяти – heap, которую часто называют свободной памятью.

Для выделения памяти в С++ используется операция new, а для для ее освобождения – операцияdelete.

Ниже приводится общепринятый способ динамического распределения памяти под одномерный массив.

int n, *mas; //объявление указателя

. . . . . . .

cin>>n; //ввод размерности массива

mas=new int[n]; //выделение памяти

. . . . . . . . . .

delete [] mas; //освобождение памяти

mas=NULL; //обнуление указателя

В данном примере переменная mas является указателем на массив изnэлементов (и его именем одновременно). Ему присваивается адрес выделенной области памяти в соответствии с заданным типом объекта. Иногда объявление указателя и операциюnew совмещают.

int *mas = new int[n];

Если объем любого свободного участка памяти недостаточен для размещения массива, операция newвозвращает нулевой указатель (адрес 0), индицируя тем самым безуспешную попытку выделения памяти. Поэтому результат операцииnewобычно проверяют следующим образом:

float *mas = new float[n];

if (mas == NULL)

{ cout<<"Свободной памяти нет"<<endl;

exit (1); //аварийное завершение программы

}

Пример. Формирование и сортировка массивас n элементами (лист. 7.1).

Листинг 7.1. ukaz_1.сpp

#include <iostream.h>

#include <stdlib.h> //Для функции exit

void main()

{ int n;

double a,*mas; //mas - указатель на динамический массив

//Ввод размерности массива

cout<<"Введите размерность массива:\n";

cout<<"n=",cin>>n;

mas=new double[n]; //Выделение памяти под массив

if(mas==NULL)

{

cout<<"Свободной памяти нет"<<endl;

exit(1);

}

//Ввод массива

cout<<"Введите элементы массива:\n";

for(int i=0;i<n;i++)

{

cout<<"mas["<<i<<"]=";cin>>mas[i];

}

cout<<"\n Исходный массив чисел:\n"<<"mas["<<n<<"]={";

for(int i=0;i<n;i++)

cout<<mas[i]<<" ";

cout<<"}"<<endl;

//Сортировка массива методом "пузырька"

for(int i=0;i<n-1;i++)

for(int j=i+1;j<n;j++)

if (mas[j]<mas[i])

{a=mas[i];

mas[i]=mas[j];

mas[j]=a;

}

//Вывод отсортированного массива

cout<<"\nОтсортированный массив чисел:\n"<<"mas["<<n<<"]={";

for(int i=0;i<n;i++)

cout<<mas[i]<<" ";

cout<<"}";

delete [] mas; //Освобождение памяти

mas=NULL; //Инициализация указателя

}

Результат выполнения программы

Исходный массив чисел:

mas[6]={3.6 -1 4 3.4 -0.5 0 }

Отсортированный массив чисел:

mas[6]={-1 -0.5 0 3.4 3.6 4 }

!! Проанализируйте программу. Создав новый файл проекта с именем ukaz_1.ide, наберите в нем текст данной программы, откомпилируйте ее и произведите запуск программы на выполнение.

При работе с матрицами различной размерности возникает необходимость создания двумерных динамических массивов. В этом случае сначала с помощью операцииnewвыделяется память подnуказателей, гдеn– число строк матрицы. После этого каждому указателю присваивается с помощьюnewадрес выделенной области памяти с размеромm,гдеm– число столбцов матрицы (рис. 7.3).

Рис. 7.3. Размещение динамического двумерного массива в памяти

Такой динамический массив по расположению элементов в памяти существенно отличается от статического двумерного массива, для которого память выделяется последовательно для всех строк. Для первого память выделяется последовательно только для каждой строки матрицы, а строки могут располагаться в разных местах памяти.

Пример. Формирование двумерного целочисленного массива размерностьюnxmс вводом элементов матрицы с клавиатуры и последующим вычислением нормы матрицы по формуле

.

Программа для решения данной задачи приведенавлистинге 7.2.

Листинг 7.2. ukaz_2.сpp

#include <iostream.h>

#include <stdlib.h> //Для функции exit

#include <iomanip.h> //Для функции setw

void main()

{

int n,m,**mas; //mas - указатель на указатель

//Ввод размерностей массива

cout<<"Введите размерность матрицы:\n";

cout<<"число строк n=",cin>>n;

cout<<"число столбцов m=",cin>>m;

mas=new int*[n]; //Выделение памяти под n указателей

if(mas==NULL) //Проверка выделения памяти

{

cout<<"Свободной памяти нет"<<endl;

exit(1);

}

for(int i=0;i<n;i++)

{ mas[i]=new int[m]; //Выделение памяти для i строки

if(mas[i]==NULL) //Проверка выделения памяти

{

cout<<"Свободной памяти нет"<<endl;

exit(1);

}

}

//Ввод массива

cout<<"Введите элементы массива:\n";

for(int i=0;i<n;i++)

for(int j=0;j<m;j++)

{

cout<<"mas["<<i<<"]"<<"["<<j<<"]=";

cin>>mas[i][j];

}

//Вывод исходной целочисленной матрицы

cout<<"\nИсходный массив чисел:"

<<"\nmas["<<n<<"]"<<"["<<m<<"]=\n";

for(int i=0;i<n;i++)

for(int j=0;j<m;j++)

{ cout<<setw(6)<<mas[i][j];

if(j==m-1)cout<<endl;

}

cout<<endl;

//Вычисление нормы матрицы

int max=0;

for(int i=0;i<n;i++)

{ int s=0;

for(int j=0;j<m;j++)

s+=abs(mas[i][j]);

if (s>max) max=s;

}

cout<<"Норма матрицы="<<max;

for(int i=0;i<n;i++) //Освобождение памяти, отведенную

delete mas[i]; // под матрицу

delete [] mas; //Освобождение памяти под указатели

}