Скачать презентацию Лекция 10 Динамические массивы План Одномерные динамические Скачать презентацию Лекция 10 Динамические массивы План Одномерные динамические

Лекция 10_Динамические_массивы.ppt

  • Количество слайдов: 26

Лекция 10. Динамические массивы. Лекция 10. Динамические массивы.

План. Одномерные динамические массивы 1. • • • Массивы указателей Двумерные динамические массивы. 2. План. Одномерные динамические массивы 1. • • • Массивы указателей Двумерные динамические массивы. 2. 3. • • 2 Объявление Создание Обращение к элементам массива • Объявление Создание Обращение к элементам массива

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

Особенности динамических массивов 1. Количество элементов при объявлении неизвестно. 2. Память для массива выделяется Особенности динамических массивов 1. Количество элементов при объявлении неизвестно. 2. Память для массива выделяется на этапе выполнения программы, объём памяти определяется программистом. 3. Массив реализуется через систему указателей 4

Создание динамического массива 1. 2. 3. 4. 5 Объявление указателя нужного типа Выделение памяти Создание динамического массива 1. 2. 3. 4. 5 Объявление указателя нужного типа Выделение памяти для необходимого количества элементов (оператор new). Обработка массива Освобождение памяти (оператор delete)

Одномерные динамические массивы. Объявление указателя на массив. базовый_тип * имя_массива; Выделение памяти для динамического Одномерные динамические массивы. Объявление указателя на массив. базовый_тип * имя_массива; Выделение памяти для динамического массива: имя_массива = new базовый_тип [колво_элементов] 6

Обращение к элементу массива (в общем случае) К элементу массива любого типа (статического или Обращение к элементу массива (в общем случае) К элементу массива любого типа (статического или динамического) можно обратиться: - через индекс; - используя имя массива как указатель на его первый элемент (адресная арифметика). 7

Примеры 8 int p 1[80], *p 2, n=10; p 2 = new int [n]; Примеры 8 int p 1[80], *p 2, n=10; p 2 = new int [n]; Указателю p 2 присвоен адрес первого байта блока памяти, выделенного для 10 -ти целых чисел. Доступ к элементу массивов можно организовать двумя способами: k = p 1 [4]; k=p 2[5]; //доступ через индекс или k = * (p 1 + 4); //доступ через указатель (имя массива) k = * (p 2 + 5)

9 9

Пример: сортировка динамического массива методом «пузырька» int main (){ int *massiv; // указатель на Пример: сортировка динамического массива методом «пузырька» int main (){ int *massiv; // указатель на исходный массив int n; //переменные для количества элементов int tmp; // вспомогательная переменная //заполнение массива и его вывод на экран srand(time (NULL)); cout<<“enter number of elemets of massiv”<>n; //ввод количества элементов массива massiv = new int [n]; //выделение памяти под массив 10

11 for (int i=0; i<n; i++) { massiv [ i ] = rand (RAND_MAX) 11 for (int i=0; imassiv [ j+1 ]){ tmp=massiv[ j ]; massiv[ j ]=massiv[ j+1 ]; massiv[ j+1 ]=tmp; }

12 //вывод на экран результата for (int i=0; i<10; i++) cout<<massiv [ i ]<<“, 12 //вывод на экран результата for (int i=0; i<10; i++) cout<

Пример. Реверс массива (динамический массив) 13 #include <stdio. h> #include <conio. h> void invert(int Пример. Реверс массива (динамический массив) 13 #include #include void invert(int *a, int n); //прототип функции void main() { int *a, n; printf(“Ведите количество элементов массива: n"); scanf(“%d”, &n); printf(“Исходный массив: n"); a=new int [n]; for(int j=0; j

{ *(a+j)=j+1; printf( { *(a+j)=j+1; printf("%3 d", *(a+j)); 14 } invert(a, n); printf("n. After reverse: n"); for(int j=0; j

void invert (int *a, int n) //передача массива в функцию { for(int j=0, tmp; void invert (int *a, int n) //передача массива в функцию { for(int j=0, tmp; j

Массивы указателей Синтаксис: Тип_указателей *имя_массива [размер]; 16 Пример. int *points[10]; //объявление массива из 10 Массивы указателей Синтаксис: Тип_указателей *имя_массива [размер]; 16 Пример. int *points[10]; //объявление массива из 10 //целочисленных указателей points[2] = &n; //присвоить третьему элементу массива //адрес переменной n N = *points[3]; //присвоить переменной n значение, //находящееся по адресу, хранимому в //четвертом элементе массива.

17 При передаче в функцию массива указателей достаточно указать имя массива в качестве параметра. 17 При передаче в функцию массива указателей достаточно указать имя массива в качестве параметра. Пример void print_array (int *q[ ]) { int t; for (t = 0; t<10; t++) cout<<*q[t]; } q – указатель на массив целочисленных указателей.

Двумерные динамические массивы Представляют собой сложную конструкцию и реализуются через вспомогательный массив указателей 18 Двумерные динамические массивы Представляют собой сложную конструкцию и реализуются через вспомогательный массив указателей 18

Двумерные динамические массивы 19 Объявление динамического двумерного массива int **a; Выделение памяти под массив Двумерные динамические массивы 19 Объявление динамического двумерного массива int **a; Выделение памяти под массив указателей a=new int * [n]; Выделение памяти под i-ю строку массива a[i]=new int [n]; Алгоритм работы с динамическим двумерным массивом более громоздкий, чем с одномерным.

Пример. Сложение квадратных матриц 20 void main () { int **a, **b, **c; //объявление Пример. Сложение квадратных матриц 20 void main () { int **a, **b, **c; //объявление указателей int n; cout<<”введите размер матрицы”<>n; //ввод количества строк и столбцов a=new int * [n]; // выделение памяти под массив указателей b=new int * [n]; c=new int * [n];

21 for (int i=0; i<=n; i++) { a[i]=new int [n]; /*выделение памяти под i-ю 21 for (int i=0; i<=n; i++) { a[i]=new int [n]; /*выделение памяти под i-ю строку массива*/ b[i]=new int [n]; c[i]=new int [n]; } FILE *f; f=fopen(“input. txt”, ”r”);

for (int i=0; i<=n; i++) for (int j=0; j<=n; j++) fscanf(f, “%d”, &a[ i for (int i=0; i<=n; i++) for (int j=0; j<=n; j++) fscanf(f, “%d”, &a[ i ][ j ]); 22 for (int i=0; i<=n; i++) for (int j=0; j<=n; j++) { fscanf(f, “%d”, &b[ i ][ j ]); c[ i ][ j ]=a[ i ][ j ]+b[ i ][ j ]; }

for (int i=0; i<=n; i++) { for (int j=0; j<=n; j++) printf(“%5 d”, c[ for (int i=0; i<=n; i++) { for (int j=0; j<=n; j++) printf(“%5 d”, c[ i ][ j ]); printf(“n”); } 23

for (i=0; i<=n; i++) { delete [] a[i]; //освобождение памяти для i-ой строки delete for (i=0; i<=n; i++) { delete [] a[i]; //освобождение памяти для i-ой строки delete [] b[i]; delete [] c[i]; } 24

delete [] a; //освобождение памяти массива указателей delete [] b; delete [] c; _getch(); delete [] a; //освобождение памяти массива указателей delete [] b; delete [] c; _getch(); } 25

Самостоятельно Написать программу, определяющую имеет ли матрица диагональное преобладание, используя динамические массивы 26 Самостоятельно Написать программу, определяющую имеет ли матрица диагональное преобладание, используя динамические массивы 26