Краткие теоретические сведения. Массивы могут быть многомерными

Массивы могут быть многомерными. Самые распространенные многомерные массивы – это матрицы (двумерные массивы). Объявляются они следующим образом:

тип_элементов имя [m][n];

где m – это количество строк, n – количество столбцов.

Нумерация строк и столбцов начинается с нуля.

Например, объявление

float b[4][6];

означает массив из четырех элементов, каждый из которых есть массив из шести вещественных чисел. Отдельные величины этого массива обозначаются именами с двумя индексами: b[0][0], b[0][1], …, b[3][5].

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

Существуют два варианта объявления массива:

§ неинициализированный (пример выше);

§ инициализированный. Определяется следующим образом: int b[3][4]={ {2, 3, 5, 7},

{0, 8, 12, 1},

{1, -8, 6, 9} };

Если в строке указано меньше элементов, чем требуется, то остальные инициализируются нулями.

При работе с матрицами организуются два цикла. Внешний цикл отвечает за перебор всех строк матрицы, а внутренний перебирает все элементы строки.

Ввод элементов матрицы

const int m=3, n=5; // количество строк и столбцов

float b[m][n]; // объявление массива

int i, j ; // объявление индексов элементов

for (i=0; i<m; i++)

{ puts(“Введите %d-ю строку”, i); // печать подсказки

for (j=0; j<n; j++)

scanf(“%f ”, &b[i][j]); // считывание с клавиатуры элемента

}

Функция scanf обеспечивает каждый раз ввод одного элемента массива, т. е. после набора на клавиатуре значения очередного элемента нужно нажимать пробел, а после последнего элемента строки – клавишу Enter.

Ввод по строкам является наиболее естественным. В случае необходимости можно организовать заполнение массива по столбцам. Для этого нужно поменять местами операторы for:

const int m=3, n=5; // количество строк и столбцов

float b[m][n]; // объявление массива

int i, j ; // объявление индексов элементов

for (j=0; j<n; j++)

{ puts(“Введите %d-й столбец”, j); // печать подсказки

for (i=0; i<m; i++)

scanf(“%f ”, &b[i][j]); // считывание с клавиатуры элемента

}

Заполнение матрицы случайными числами

Выполняется также в двойном цикле аналогично одномерным массивам. В примере показано заполнение целой матрицы случайными числами в интервале [a,b](для вещественных чисел формула изменится – см. одномерные массивы). В этой и последующих программах будем считать, что объявлена целая матрица Mна N, где Mи N— целые константы (объявленные через const), а также целые переменные i и j.

for ( i = 0; i < M; i ++ )

for ( j = 0; j < N; j ++ )

A[i][j] = random(b-a+1) + a;

Вывод элементов матрицы

Двумерные массивы необходимо выводить в привычном виде (по строкам), начиная вывод новой строки массива в новую строку экрана.

for ( i = 0; i < M; i ++ )

{ for ( j = 0; j < N; j ++ )

printf(“%d \t”, A[i][j]);

printf (“\n”);

Суммирование элементов матрицы

for (S=0, i=0; i<m; i++)

for (j=0; j<n; j++)

S=S+b[i][j];

Суммирование диагональных элементов матрицы (вычисление следа матрицы)

for (S=0, i=0; i<n; i++)

S=S+b[i][i];

Суммирование элементов заданной строки матрицы

Для двумерного массива b размером Mна N необходимо вычислить сумму элементов строки с номером k.

for (S=0, j=0; j<n; j++)

S=S+b[k][j];

Суммирование элементов строк матрицы

Необходимо вычислить сумму элементов каждой строки двумерного массива b размером Mна Nс выводомрезультатов на экран.

for (i=0; i<m; i++)

{ S=0; // обнуление суммы каждой строки

for (j=0; j<n; j++)

S=S+b[i][j];

printf (“Сумма элементов строки %d=%d \n “, i, S); }

Транспонирование матрицы

Необходимо заменить строки матрицы ее столбцами, а столбцы – строками.

int b[m][n], a[n][m], i, j;

….

for (i=0; i<n; i++)

for (j=0; j<m; j++)

a[i][j]=b[j][i];

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

int b[n][n], i, j, P;

….

for (i=0; i<n-1; i++)

for (j=i+1; j<n; j++)

{ P= b[i][j];

b[i][j]=b[j][i];

b[j][i]=P;

}

Наши рекомендации