Краткие теоретические сведения. Массивы могут быть многомерными
Массивы могут быть многомерными. Самые распространенные многомерные массивы – это матрицы (двумерные массивы). Объявляются они следующим образом:
тип_элементов имя [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;
}