Многомерные массивы. Рассмотрим более подробно работу с многомерными массивами

Рассмотрим более подробно работу с многомерными массивами. Размерность массива – это число индексов, используемых для ссылки на конкретный элемент в массиве. Многомерный массив – это массив, состоящий из массивов, то есть его элементами являются массивы. Например, двухмерный массив, описанный как int m[2][3],
состоит из двух элементов-строк (одномерных массивов): m = { m[0], m[1] } по три элемента в каждом:

массив с индексом 0: m[0] с элементами m[0][0], m[0][1], m[0][2],

массив с индексом 1: m[1] с элементами m[1][0], m[1][1], m[1][2].

Имя массива m является указателем -константой на начало двухмерного массива: m= &m[0][0]; в свою очередь элементы m[0], m[1] являются указателями -константами на начала своих одномерных массивов: m[0] = &m[0][0], m[1] = &m[1][0]. Поскольку m = m[0] = &m[0][0], постольку имя массива m является указателем на массив указателей на начала своих одномерных массивов, что определяет вид адресных выражений для двухмерного массива. Для ссылки на элементы двухмерного массива “точкой отсчета” может быть как самый первый элемент, так и указатели на строки массива.

Адрес начала i-й строки массива (m[i]) можно получить выражением *(m+i), где имя массива m используется как адрес начала массива указателей. Адрес j-го элемента i-й строки определяется эквивалентными выражениями:

m[i] + j = *(m+i) + j = &m[i][j].

Поэлементный ввод-вывод двумерного массива можно осуществить несколькими способами, используя индексные и адресные выражения.

Пример. Ввести и вывести по строкам двумерный массив.

Программа:

void main ()

{ int m[2][3], i, j; /* описание массива и параметров циклов */

puts (“Ввод массива m по строкам”);

for (i=0; i<2; i++) /* цикл по строкам */

for (j=0,j<4,j++) /* цикл по столбцам */

scanf (“%d”, &m[i][j]); /* ввод элемента массива */

/* варианты адресных выражений: m[i]+j; *(m+i)+j) */

puts (“Вывод массива m по строкам:”);

for (i=0; i<2; i++) /* цикл по строкам */

{ for (j=0; j<4; j++) /* цикл по столбцам */

printf (“%d”, m[i][j]); /* индексное выражение */

printf (“\n”); /* переход на новую строку */

/* варианты адресных выражений: *(m[i]+j); *(*(m+i)+j) */

}

}

Отметим, что использование указателей для доступа к элементам массива дает более короткие подпрограммы.

Пример. Найти индекс и значение минимального элемента массива.

В задаче достаточно определить индекс искомого элемента массива, и с его помощью получить доступ к самому элементу.

Программа:

# define k 10 /* количество элементов массива */

void main ()

{ float a[k]; int i; im; /* описание массива и переменных */

clrscr(); /* очистка экрана */

puts (“Ввести %d элементов массива”; k);

for (i=0;i<k;i++) /* цикл по индексам элементов */

scanf (“%f”, ar+i); /* ввод элемента */

im=0; /* индекс начального элемента */

for (i=1; i<k; i++) /* цикл поиска индекса минимума */

if (a[i] < a[im]) im=i; /* проверка элемента на минимум */

printf (“Минимум = %f индекс=%d”, a[im], im);

}

Пример. Упорядочить по возрастанию элементы массива методом простого выбора.

Программа:

#define k 10

void main ()

{ float a[k], r; /* описание массива и переменной */

int i, j, im; /* описание переменных индексов */

clrscr(); /* очистка экрана */

printf (“Ввод массива:\n”);

for (i=0; i<k; i++) scanf (“%f”, a+i); /* цикл ввода элементов массива */

for (j=0; j<k; j++) /* цикл шагов упорядочения */

{ im=j; /* начальный индекс */

for (i=j+1; i<k; i++) /* цикл поиска индекса */

if (a[i]<a[im]) im=i; /* минимального элемента */

if (im!= j) /* если индекс изменился */

{ r=a[j]; /* перестановка минимального */

a[j]=a[im]; /* элемента в начало неупоря- */

a[im]=r; /* доченной последовательности */

} /* конец цикла поиска */

} /* конец цикла упорядочения */

puts (“Массив упорядочен по возрастанию”);

for (i=0; i<k; i++) printf (“%5.2f”, a[i]); /* цикл вывода массива */

} /* конец программы */


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: