Скачать презентацию Лекция 9 Динамические массивы Визуальное программирование Ст преп Скачать презентацию Лекция 9 Динамические массивы Визуальное программирование Ст преп

ВП_Лекция 9_C_Динамические_массивы.ppt

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

Лекция 9. Динамические массивы. Визуальное программирование. Ст. преп. М. А. Сокольская Лекция 9. Динамические массивы. Визуальное программирование. Ст. преп. М. А. Сокольская

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

9 9

Пример: сортировка динамического массива методом «пузырька» int main (){ int *massiv; // указатель на Пример: сортировка динамического массива методом «пузырька» int main (){ int *massiv; // указатель на исходный массив int i, j, n; //переменные циклов и количества элементов int tmp; // вспомогательная переменная //заполнение массива и его вывод на экран srand(time (NULL)); cin>>n; //ввод количества элементов массива massiv = new int [n]; //выделение памяти под массив 10

11 for (i=0; i<т; i++) { massiv [ i ] = rand (RAND_MAX) % 11 for (i=0; i<т; i++) { massiv [ i ] = rand (RAND_MAX) % 100; cout<massiv [ j+1 ]){ tmp=massiv[ j ]; massiv[ j ]=massiv[ j+1 ]; massiv[ j+1 ]=tmp; }

12 //вывод на экран результата for (i=0; i<10; i++) cout<<massiv [ i ]<<“, “; 12 //вывод на экран результата for (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 j, *a, n; scanf(“%d”, &n); printf(“Исходный массив: n"); a=new int [n]; for(j=0; j

*(a+j)=j+1; printf( *(a+j)=j+1; printf("%3 d", *(a+j)); } invert(a, n); printf("n. After reverse: n"); for(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

Объявление динамического двумерного массива char *sp [ ]={ Объявление динамического двумерного массива char *sp [ ]={"Иванов", “Суриков", "Репин"}; int **a; Алгоритм работы с динамическим двумерным массивом более громоздкий, чем с одномерным. 19

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

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

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

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

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