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

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

Обычно объем памяти необходимой для той или иной переменной задается еще до процесса компиляции посредством объявления этой переменной.

Если возникает необходимость в создании переменной, размер которой неизвестен заранее, то используют динамическую память.

Резервирование и освобождение памяти в программах на С++ может происходить в любой момент времени.

Оператор new выделяет память.

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

Возвращает оператор указатель на начало выделенного блока памяти.

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

Динамический массив – массив переменной длины, память под который выделяется в процессе выполнения программы. Выделение памяти осуществляется оператором new. Адрес первого элемента выделенного участка памяти хранится в переменной объявленной как указатель. Оператор

int *mas=new int[10];

означает, что описан указатель mas и ему присвоен адрес начала непрерывной области динамической памяти, выделенной с помощью оператора new8. Фактически в переменной mas хранится адрес нулевого элемента динамического массива. Адрес следующего, первого элемента, в выделенном участке памяти – mas+1, а mas+i является адресом i-го элемента. Обращение к i-му элементу динамического массива можно выполнить как обычно mas[i]. Важно следить за тем, чтобы не выйти за границы выделенного участка памяти.

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

4.6.6. Использование указателей в качестве аргументов функций

Указатели можно использовать в качестве аргументов функций. Если в роли параметра функции выступает массив, то в функцию передается указатель на его первый элемент. С++ автоматически передает массив в функцию, используя его адрес.

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

ЗАДАЧА 16. Из массива целых чисел удалить все числа, значение которых меньше среднего арифметического. Полученный массив упорядочить по возрастанию.

Разобьем задачу на подзадачи:

  • вычисление среднего арифметического элементов массива;

  • удаление элемента из массива;

  • упорядочивание массив.

Функция, которая вычисляет среднее арифметическое массива x из n элементов (рис. 27):

float sr_arifm(int *x, int n)

Рис. 27. Алгоритм вычисления среднего

арифметического элементов массива

Функция удаления элемента с номером m в массиве x из n элементов (рис. 28):

void udal(int *x, int m, int *n)

Рис. 28. Алгоритм удаления элемента из масисав

Функция сортировки по убыванию массив x из n элементов (рис. 29):

void upor(int *x,int N)

Рис. 29. Сортировка элементов массива по убыванию

Далее приведен текст программы.

#include<iostream.h>

#include<math.h>

float sr_arifm(int *x, int n)

{

int i; float s=0;

for(i=0;i<n;s+=x[i],i++);

if (n>0) return(s/n);

else return 0;

}

void udal(int *x, int m, int *n)

{int i;

for(i=m;i<*n-1;x[i]=x[i+1],i++);

--*n;

}

void upor(int *x, int n)

{

int i,j,b;

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

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

if (x[i]<x[i+1])

{

b=x[i];

x[i]=x[i+1];

x[i+1]=b;

}

}

int main()

{

int n,i; float sr;

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

int *a=new int[n];

cout << "Vvedite massiv A\n";

for(i=0;i<n;cin>>a[i],i++);

sr=sr_arifm(a,n);

cout<<"sr="<<sr<<"\n";

for(i=0;i<n;)

{

if(a[i]<sr) udal(a,i,&n);

else i++;

}

cout << "Massiv A\n";

for(i=0;i<n;cout<<a[i]<<"\t",i++);

cout<<"\n";

upor(a, n);

cout << "Upor Massiv A\n";

for(i=0;i<n;cout<<a[i]<<"\t",i++);

cout<<"\n";

delete [] a;

}

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