Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемВалентин Пожарский
3 Под объявлением одномерного динамического массива понимают объявление указателя на переменную заданного типа для того, чтобы данную переменную можно было использовать как динамический массив. Синтаксис: Тип * Имя_Массива; Имя_Массива – идентификатор массива, то есть имя указателя для выделяемого блока памяти. Тип – тип элементов объявляемого динамического массива. Элементами динамического массива не могут быть функции и элементы типа void. Например: /*указатели на начало выделяемого участка памяти, принимающие значения адреса выделяемой области памяти для значений типа int и типа double*/ int *a; double *d;
4 Существует 2 способа: 1. При помощи операции new 2. При помощи библиотечной функции malloc (calloc)
6 /*выделение динамической памяти размером 100*sizeof(int) байтов*/ int *mas; mas = new int [100]; /*выделение динамической памяти размером n*sizeof(double) байтов*/ double *m = new double [n]; /*выделение динамической памяти размером 2*4*sizeof(long) байтов. При выделении динамической памяти размеры массива должны быть полностью определены*/ long (*lm)[4]; lm = new long [2] [4];
7 Синтаксис: Имя_Массива = (Тип *) malloc(N*sizeof(Тип)); или Имя_Массива = (Тип *) calloc(N, sizeof(Тип)); Имя_Массива – идентификатор массива, то есть имя указателя для выделяемого блока памяти. Тип – тип указателя на массив. N – количество элементов массива.
8 /*выделение динамической памяти размером 10*sizeof(float) байтов*/ float *a; a=(float *)malloc(10*sizeof(float)); // или float *a; a=(float *)calloc(10,sizeof(float)); Так как функция malloc (calloc) возвращает нетипизированный указатель void *, то необходимо выполнять преобразование полученного нетипизированного указателя в указатель объявленного типа.
9 Освобождение памяти, выделенной под одномерный динамический массив, также осуществляется 2 способами. 1. При помощи операции delete, которая освобождает участок памяти ранее выделенной операцией new. Синтаксис: delete [] Имя_Массива; Имя_Массива – идентификатор массива, то есть имя указателя для выделяемого блока памяти. Например: delete [] mas; /*освобождает память, выделенную под массив, если mas адресует его начало*/ delete [] m; delete [] lm; Квадратные скобки [] сообщают оператору, что требуется освободить память, занятую всеми элементами, а не только первым. 2. При помощи библиотечной функции free, которая служит для освобождения динамической памяти. Синтаксис: free (ИмяМассива); Имя_Массива – идентификатор массива, то есть имя указателя для выделяемого блока памяти. Например: free (a); //освобождение динамической памяти
10 Адресация элементов динамического массива осуществляется аналогично адресация элементов статического массива, то есть с помощью индексированного имени. Синтаксис: Имя_Массива[Размерность]; или Имя_Массива[ЗначениеИндекса]; Например: mas[5] – индекс задается как константа, sl[i] – индекс задается как переменная, array[4*p] – индекс задается как выражение.
11 Пример 1. Сформировать динамический одномерный массив, заполнить его случайными числами. Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в чётных позициях, а во второй половине – элементы, стоявшие в нечётных позициях. #include "stdafx.h" #include using namespace std; Int main(){ int *a, n, i; //количество элементов cout > n; cout n; cout ">
12 Указатель на массив не обязательно должен показывать на начальный элемент некоторого массива. Он может быть сдвинут так, что начальный элемент будет иметь индекс, отличный от нуля, причем он может быть как положительным, так и отрицательным. int main() { float *mas; int m; scanf("%d",&m); mas=(float *)calloc(m,sizeof(float)); //сейчас указатель q показывает на начало массива mas[0]=22.3; mas-=5; /*теперь начальный элемент массива имеет индекс 5, а конечный элемент индекс n-5*/ mas[5]=1.5; /*сдвиг индекса не приводит к перераспределению массива в памяти и изменится начальный элемент*/ mas[6]=2.5; // это второй элемент mas[7]=3.5; // это третий элемент mas+=5; /*теперь начальный элемент вновь имеет индекс 0, а значения элементов q[0], q[1], q[2] равны соответственно 1.5, 2.5, 3.5*/ mas+=2;
13 /*теперь начальный элемент имеет индекс -2, следующий -1, затем 0 и т.д. по порядку*/ mas[-2]=8.2; mas[-1]=4.5; mas-=2; /*возвращаем начальную индексацию, три первых элемента массива q[0],q[1],q[2], имеют значения 8.2, 4.5, 3.5*/ mas--; /*вновь изменим индексацию. Для освобождения области памяти, в которой размещен массив q используется функция free(q), но поскольку значение указателя q смещено, то выполнение функции free(q) приведет к непредсказуемым последствиям. Для правильного выполнения этой функции указатель q должен быть возвращен в первоначальное положение */ free(++mas); system("pause"); return 0; }
14 Пример 3. Задача Иосифа Флавия или считалка Джозефуса. Задача в своей основе имеет легенду. Отряд из 41-го сикария, защищавший галилейскую крепость Массада, не пожелал сдаваться в плен блокировавшим его превосходящим силам римлян. Сикарии стали в круг и договорились, что каждые два воина будут убивать третьего, пока не погибнут все. Самоубийство – тяжкий грех, но тот, кто в конце концов останется последним, должен будет его совершить. Иосиф Флавий, командовавший этим отрядом, якобы быстро рассчитал, где нужно стать ему и его другу, чтобы остаться последними. Но не для того, чтобы убить друг друга, а чтобы сдать крепость римлянам. В современной формулировке задачи участвует n воинов и убивают каждого k-го. Требуется определить номера m и t начальных позиций двоих воинов, которые должны будут остаться последними. void kill(int *mass,int n,int i); void krug(int *mass,int n,int k, int i=0); int main() { int n,k,*mass,i; FILE *f; f=fopen("input.txt","r"); fscanf(f,"%d %d",&n,&k); fclose(f);
15 mass=(int *)malloc(n*sizeof(int)); for (i=0;i
16 задания 1.Задан массив. Определить сколько раз меняется знак в данной последовательности чисел, запомнить номера позиций, в которых меняется знак. 2.Задана последовательность из N вещественных чисел. Вычислить сумму чисел, порядковые номера которых являются числами Фибоначчи. 3.Задана последовательность из N вещественных чисел. Найти частное средних арифметических значений элементов с нечетными и четными индексами. 4.Напишите программу, оформив её в виде функций генерации, вывода и обработки массивов. Сформируйте динамический одномерный массив, заполните его случайными числами и выведите на печать. Добавьте после каждого отрицательного элемента его модуль и выведите массив на печать. Реализуйте данную программу двумя способами: a) с помощью операций new и delete; b) с помощью библиотечных функций malloc (calloc) и free.
17 Контрольные вопросы 1.В каких ситуациях в программировании целесообразно использовать динамические массивы? 2.Что будет возвращено при попытке объявить динамический массив недопустимо большого размера? 3.Как размещаются в памяти элементы одномерного динамического массива? 4.С какой целью используется первая пара скобок при объявлении (Тип*) malloc(N* sizeof(Тип))? 5.С какой целью выполняется явное преобразование типов значений функций malloc (сalloc) при объявлении массивов? 6.Почему указатель на одномерный динамический массив не всегда показывает на его начальный элемент? 7.Какими способами можно обратиться к элементам одномерного динамического массива? 8.С какой целью используются квадратные скобки в операции освобождения динамической памяти, выделенной под массив: delete [] mass;?
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.