Лекция 13. Динамические массивы. 1. Способы объявления и обращения к элементам массивов. ü освоить методику написания алгоритмов с использованием динамических массивов, перевода таких алгоритмов на язык программирования С++ и разработки соответствующ
Лекция 13 Динамические массивы Цели: ü получить представление о способах объявления и обращения к элементам массивов; ü освоить методику написания алгоритмов с использованием динамических массивов, перевода таких алгоритмов на язык программирования С++ и разработки соответствующего проекта в среде Visual C++ 6. 0.
1. Способы объявления и обращения к элементам массивов 1. 1. Способы объявления и обращения к элементам одномерных массивов
Объявление одномерного массива с явным указанием количества элементов массива: < тип_элементов_массива> < имя_массива> [< количество_элементов> ]; Обращение к элементам одномерного массива в общем случае можно представить индексированием: < имя_массива> [< выражение> ]; где < имя_массива> – указатель–константа, адрес нулевого элемента массива; < выражение> определяет индекс элемента массива. Элементы одномерного массива располагаются в ОП последовательно друг за другом: нулевой, первый и т. д. При объявления массива int а[10]; компилятор выделяет массиву ОП для размещения его элементов в размере sizeof(< тип_элементов_массива> )*< размер_массива> байт, т. е. 4 ∙ 10 = 40 байт. Запись & a[i] равносильна записи (а + i). В программе & a[i] или (а + i) определяет адрес i-го элемента массива. На машинном уровне (в соответствии с определением операций над указателями) адрес i-го элемента массива & a[i] формируется в виде а + i*sizeof(int). В связи с вышеизложенным, будут справедливы соотношения: & а а + 0 & а[0] – адрес нулевого элемента массива а; а + 2 & а[2] – адрес второго элемента массива а; а + i & a[i] – адрес i-го элемента массива а;
*а *(а + 0) *(& а[0]) а[0] – значение нулевого элемента массива а; *(а+2) а[2] – значение второго элемента массива; *(а + i) a[i] – значение i-го элемента массива;
*а + 2 а[0] + 2 – сумма значений а[0] и 2. Если р – указатель на тип данных, совпадающий с типом элементов массива а и адрес, который содержит указатель р, совпадает с адресом массива а, то а и р взаимозаменяемы. При этом р & а[0] а + 0; р + 2 & а[2] а + 2; *(р + 2) *(& а[2]) а[2]; *(p + i) *(& a[i]) a[i]. 1. 2. Способы объявления и обращения к элементам двухмерных массивов
Рассмотрим объявление и связь указателей и элементов двухмерных массивов. Двухмерный массив в языке С++ рассматривается как совокупность одномерных массивов (его строк), а строка – совокупность элементов одномерного массива. Объявление двухмерного массива с явным указанием количества элементов массива: < тип_элементов_массива> < имя_массива> [< кол–во_строк> ][< кол–во_столбцов> ]; Для обращения к элементам двухмерного массива используется два индекса (индексных выражений): < имя_массива> [< выражение1> ][< выражение2> ]; Индексные выражения вычисляются слева направо, полученные значения применяется после вычисления последнего индексного выражения. Элементы массивов располагаются в ОП таким образом, что быстрее изменяются самые правые индексы, т. е. элементы одномерного массива располагаются подряд, а двухмерного – по строкам. Пример объявления двухмерного массива значений типа: int a[m][n]; Этот массив состоит из m одномерных массивов (строк), каждый из которых содержит n элементов (столбцов). При работе с этим двухмерным массивом можно использовать одно или два индекса (индексных выражения), например, а[i][j] содержит 2 индекса. Такая запись используется для обращения к элементу, расположенному на пересечении i-й строки и j-го столбца массива. Для получения значения этого элемента вначале вычисляются индексные выражения, затем определяется адрес элемента массива в ОП и извлекается его значение.
a[i] содержит один индекс: подобная запись определяет адрес одномерного массива, т. е адрес начала i-й строки массива. Имя массива а не содержит индекса и определяет адрес массива, т. е. адрес его нулевого элемента. Таким образом, обращение к двухмерным массивам с помощью имени и только одного индекса определяет указатель на начало соответствующей строки массива (адрес ее нулевого элемента). Напомним, что в одномерном массиве адрес i-го элемента массива & a[i] формируется в виде а + i*sizeof(int). Используя это, определим соотношения: a[0] & а[0][0] a + 0*n*sizeof(int); a[1] & а[1][0] а + 1*n*sizeof(int); a[i] & а[i][0] а + i*n*sizeof(int); Обращение к элементам многомерного массива более детально рассмотрим на примере двухмерного массива: int a[3][4]; //а – указатель-константа int *р=& а[0][0]; // р – указатель-переменная После этого указатель р можно использовать вместо указателя а для обращения к строкам или элементам массива. В ОП элементы массива а располагаются таким образом, что быстрее всех изменяется самый правый индекс, т. е. в последовательности: a[0][0] а[0][1] а[0][2] а[0][3] а[1][0]... а[2][0] а[2][1] а[2][2] а[2][3] При этом для обращения к массиву а можно использовать имена: & а а & а[0][0] *а – адрес элемента 0-й строки и 0-го столбца массива а; *(& а[0][0]) а[0][0] – значение элемента 0-й строки 0-го столбца массива а; a[i] (а+i) *(а+i) & a[i][0] – адрес начала i-й строки, т. е. адрес элемента i-й строки и 0-го столбца; *a[i] *(& a[i][0]) a[i][0] – значение 0-го элемента i-й строки; a[i][j] *(*(a+i)+j) *(a[i]+j) a[i][j] – значение элемента i-й строки j-го столбца массива а; где (а+i) *(a+i) a[i] – адрес 0-го элемента i-й строки, т. е. & a[i][0]; (*(a+i)+j) – адрес j-го элемента i-й строки, т. е. & a[i][j]; *(*(a+i)+j) – значение j-го элемента i-й строки, т. е. a[i][j]. Значение адреса начала i-й строки (адреса 0-го элемента i-й строки) на машинном уровне формируется в виде: a[i] а+i (a+i*n*sizeof(int)) где n — количество элементов в одной строке. Таким образом, адрес (i+1)-й строки смещен относительно i-й строки на (n*sizeof(int)) байт, т. е. на одну строку массива. Выражение a[i][j] компилятор С++ переводит в эквивалентное выражение *(*(а+i)+j).
К элементам двухмерного массива можно обратиться и с помощью скалярного указателя на массив. Например, после объявления: int a[m][n], *р = & а[0][0]; где n – количество элементов в строке; i*n+j – смещение элемента a[i][j] относительно начала массива а.
Пример 1. Дан одномерный динамический массив. Вычислить среднее арифметическое модулей элементов массива.
Ход выполнения работы 1. Алгоритмы решения задач с использованием динамических массивов схожи с алгоритмами, использующими статические массивы. 2. Написать программу, соответствующую алгоритму:
Примечание. Для выделения динамической памяти под массив из n элементов использовалась библиотечная функция malloc():
Для ввода элементов массива как обычно использовалась функция scanf(). Вторым аргументов этой функции является адрес переменной, которая получает вводимое значение. В данном примере это адрес i-го элемента динамического массива a+i. При вычислении суммы значение i-го элемента получали с помощью записи
Вывод элементов массива осуществляется при помощи функции printf(), где для вывода элементов применялась та же форма записи. 3. Создать проект и реализовать данную задачу в среде Visual C++ 6. 0. Пример 2. Сформировать двухмерный динамический массив по закону .
Ход выполнения работы 1. Алгоритмы решения задач с использованием динамических массивов схожи с алгоритмами, использующими статические массивы. 2. Написать программу, соответствующую алгоритму:
3. Создать проект и реализовать данную задачу в среде Visual C++ 6. 0.
Пример 3. Дан двухмерный динамический массив размера . Сформировать одномерный динамический массив, каждый элемент которого – произведение нечетных элементов соответствующего столбца двухмерного массива. Указать номер столбца с наименьшим произведением элементов.
Ход выполнения работы 1. Решение этой задачи было подробно рассмотрено в разделе «Двухмерные массивы». 2. Написать программу, соответствующую алгоритму:
3. Создать проект и реализовать данную задачу в среде Visual C++ 6. 0.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|