Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр_2_С++.doc
Скачиваний:
4
Добавлен:
23.04.2019
Размер:
217.09 Кб
Скачать

7.8. Массивы динамической памяти Одномерные динамические массивы

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

Тип ИмяМассива [Константное выражение] ;

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

Решить указанную проблему можно с помощью формирования массивов динамической памяти, для чего используются указатели и операторы для динамического выделения памяти - new и delete.

В соответствии с синтаксисом оператор new при использовании с одномернам массивом имеет следующий формат:

ТипМассива* ИмяМассива = new ТипМассива[РазмерМассива];

Такой оператор позволяет при выполнении программы выделить в динамической памяти участок для размещения массива заданного размера и типа. Оператор new возвращает адрес блока динамической памят,.т.е. адрес первого элемента массива.

Существенным отличием динамически создаваемых массивов от обычных является возможность удаления динамического массива (освобождения памяти) в процессе выполнения программы. Статический локальный массив создается автоматически при запуске функции в которой он объявлен, и удаляется, когда функция прекращает свою работу. Статический глобальный массив создается при запуске программы и существует все время, исполнения программы. Таким образом, если массив не используется далее в программе, он продолжает существовать и занимать память.

Динамически созданный массив может быть удален, когда работа с ним завершена. Для освобождения ранее выделенной динамической области памяти служит оператор delete.

В соответствии с синтаксисом оператор delete при использовании с одномерным массивам имеет следующий формат:

delete [] ИмяМассива;

Пример 7.5. Дан одномерный целочисленный массив. Отсортировать массив по неубыванию методом "пузырька" или выбором наименьшего элемента. Массив и его размер ввести с клавиатуры. Основные этапы решения задачи оформить в виде функций. Использовать динамический массив.

Текст программы.

#include <iostream.h>

#include <stdlib.h>

int* Input (int);

void Output(int*, int);

void SortMin(int*, int);

void SortBubble(int*, int);

int main()

{

int n;

cout << "n=";

cin >> n;

int * A = Input(n);

if (A == NULL )

{

cout << "Error!"<<endl;

system("pause");

return 0;

}

cout << "Massiv: ";

Output(A,n);

int nsort;

cout<<"SortMin--->1"<<endl<<"SortBubble--->2"<<endl;

cin>>nsort;

switch (nsort)

{

case 1: SortMin(A,n);

break;

case 2: SortBubble(A,n);

break;

}

Output(A,n);

delete [] A;

cout << endl;

system("pause");

return 0;

}

int * Input(int n)

{

int* P = new int[n];

if ( P == NULL )

return NULL;

for(int* uk=P; uk<P+n; uk++)

*uk = rand()%10-rand()%10;

return P;

}

void Output(int* P,int n)

{

for(int* uk=P; uk<P+n; uk++)

cout<< *uk<<' ';

cout<<endl;

}

void SortMin(int* P, int n)

{

cout << "SortMin massiv: ";

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

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

if (P[j]<P[k]) k=j;

int t=P[i];

P[i]=P[k];

P[k]=t;

}

}

void SortBubble(int* P, int n)

{

cout << "SortBubble massiv: ";

int flag=1;

while(flag)

{

flag=0;

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

if (P[j]>P[j+1])

{

int t=P[j];

P[j+1]=t;

flag=1;

}

}

}