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

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

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

Динамические массивы создают с помощью операции new, при этом необходимо указать тип и размерность, например:

int n;

cout<<”Введите размер массива\n”;

cin>>n;

float *A = new float [n];

В этом случае создается переменная-указатель на float, в динамической памяти отводится непрерывная область, достаточная для размещения n элементов вещественного типа, и адрес ее начала записывается в указатель A. Динамические массивы нельзя при создании инициализировать.

C элементами массива можно работать при помощи индекса (A[i]) и при помощи указателя( к i-тому элементу массива можно обратиться, используя выражение *(A+i).

Например. Вычисление суммы элементов массива можно оформить :

  1. float sum=0;

for(i=0;i<n;i++) sum+=A[i];

  1. float sum=0;

for(i=0;i<n;i++) sum+=*(A+i);

6.2.1 Примеры работы с динамическими массивами.

Размер массива и массив вводятся с клавиатуры.

Пример 1. Выполнить циклический сдвиг массива влево на одну позицию

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

A0,A1,A2,…,An-1

После сдвига

A1,A2,...An-1, A0

Алгоритм :

1) запомнить в z A0;

2) сдвинуть влево на 1 позицию A1 ,A2 ,...An-1;

3) в последний элемент записать копию первого.

#include <iostream.h>

#include <conio.h>

int *input(int &n)

{ cout<<”\n введите размер массива \n”;

cin>>n;

int* w=new int[n]; cout<<"\nвведите “,n,” элементов массива\n”; for(i=0;i<n;i++)

cin>>w[i];

return w;

}

void output(int *w,int n,char message[])

{

cout<<message;

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

cout<<' '<<w[i];

cout<<endl;

}

void shift(int*x,int n)

{int z=x[0];

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

x[i-1]=x[i];

x[n-1]=z;

}

int main(){

int n; clrscr();

int*A= input(n);

shift(A,n);

output(A,n,"\nмассив после сдвига\n" ;

return 0;

}

6.2.2 Функции преобразования динамических массивов.

1. Проверить, является ли массив упорядоченным по возрастанию.

bool prov(int *A,int n)

{ int i;

for ( i=0;i<n-1&&A[i]<=A[i+1];i++);

if (i==n-1)return true; else return false;

}

2. Выполнить циклический сдвиг массива вправо на одну позицию

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

A0,A1,A2,…,An-1

После сдвига

An-1, A0, A1,A2,...,An –2

Действия :

  1. запомнить в z An-1

  2. сдвинуть вправо на 1 позицию A0,A1,...,An-2; cдвиг начать с Аn-2

  3. в первый элемент записать копию последнего

void shift_R(int *w,int n)

{ z=A[n-1];

for(i=n-2;i>=0;i--)

A[i+1]=A[i];

A[0]=z;

}

3. Элемент с заданным номером k исключить из массива.

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

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

A0, A1, A2,…,Ak-1, Ak, Ak+1,...,An-1

После сдвига

A0, A1, A2,…,Ak-1, Ak+1,...,An-1, 0

Действия :

1) сдвинуть влево на 1 позицию Ak+1, Ak+2,…,An-1; начать сдвиг с позиции k+1

2) в последний элемент записать 0

void del(int *A,int n,int k)

{

for(i=k+1;i<n;i++)

A[i-1]=A[i];

A[n-1]=0;

}

4. Элемент с заданным номером k сдвинуть в конец массива.

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

A0, A1, A2,…,Ak-1, Ak, Ak+1,...,An-1

После сдвига

A0, A1, A2,…,Ak-1, Ak+1,...,An-1, Ak

Действия :

  1. запомнить в z Ak

  2. сдвинуть влево на 1 позицию Ak+1, Ak+2,...,An-1; начать сдвиг с позиции k+1

  3. в последний элемент записать копию Ak

void shift_End(int *A,int n,int k)

{z=A[k];

for(i=k+1;i<n;i++)

A[i-1]=A[i];

A[n-1]=z;

}

5. Элемент с заданным номером k сдвинуть в начало массива.

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

A0, A1, A2,…,Ak-1, Ak, Ak+1,...,An-1

После сдвига

Ak, A0, A1, A2,…,Ak-1, Ak+1,...,An-1

Действия :

  1. запомнить в z Ak

  2. сдвинуть вправо на 1 позицию A0, A1,...,Ak-1; начать сдвиг с позиции k-1

  3. в первый элемент записать копию Ak

void shift_Beg(int *A,int n,int k)

{ z=A[k];

for (i=k-1;i>=0;i--)

A[i+1]=A[i];

A[0]=z;

}

_________________________________________________

  1. Эффективный алгоритм исключения всех отрицательных.

void del(int *A,int n)

{ int k=0; {количество отрицательных}

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

if (A[i]<0) k++; else A[i-k]=A[i];

for (i=n-k;i<n;i++)

A[i]=0;

}

___________________________________________________________

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