При объявлении можно сразу задать все или часть ее элементов, например так
float X[2][3] = {{1., 2., 3.},{4., 5., 6.}};
Как видно из примера, элементы каждой строки заключаются в отдельные фигурные скобки.Если задать не все элементы, то остальные заполнятся нулями:
float X[2][3] = {{1., 3.},{6.}};
Здесь элементы X[1][2], X[2][1] и X[2][2] будут нулевыми.
Расположение матриц в памяти
Иногда бывает полезно знать, как матрицы располагаются в памяти ЭВМ. Оказывается во
всех современных языках программирования (кроме Фортрана) элементы матрицы располагаются по строкам, то есть сначала изменяется последний индекс. Объявленная выше матрица
X расположена так:
X[0][0] X[0][1] X[0][2] X[1][0] X[1][1] X[1][2]
Стандартный ввод и вывод
Как и для одномерных массивов, матрицы могут быть введены с клавиатуры, из файла, и
заполнены с помощью случайных чисел. Общий принцип – для каждого элемента функция чтения вызывается отдельно. Представим себе матрицу как массив строк равной длины. Для ввода одной строки требуется цикл, и таких строк несколько. Поэтому для работы с матрицами требуется двойной или вложенный цикл, то есть цикл в цикле.
Ввод с клавиатуры
Единственная проблема состоит в том, чтобы не перепутать переменные в двух циклах и
пределы их изменения.
#include<stdio.h>
const int M = 5; // числострок
const int N = 4; // числостолбцов
Main()
{
int i, j, A[M][N];
for (i = 0; i < M; i ++) // циклпострокам
for (j = 0; j < N; j ++) // цикл по столбцам строки
{
printf ("A[%d][%d]=", i, j); // подсказка для ввода
scanf ("%d", & A[i][j]); // ввод A[i][j]
}
// работа с матрицей
}
Заметьте, что при изменении порядка циклов (если поменять местами два оператора for) изменится и порядок ввода элементов в память.
Заполнение случайными числами
Выполняется также в двойном цикле аналогично одномерным массивам. В примере пока-
зано заполнение целой матрицы случайными числами в интервале [a,b] (для вещественных чисел формула изменится – см. одномерные массивы). Функция
int random (int N) { return rand() % N; }
возвращающая случайное целое число в интервале [0,N-1], была рассмотрена выше, когда
мы говорили о массивах (ее нужно добавить в программу).В этой и следующей программах мы будем считать, что объявлена целая матрица 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;
Вывод на экран
При выводе матрицы ее элементы желательно расположить в привычном виде – по стро-
кам. Напрашивается такой прием: вывели одну строку матрицы, перешли на новую строку экрана, и т.д. Надо учитывать, что для красивого вывода на каждый элемент матрицы надо отвести равное количество символов (иначе столбцы будут неровные). Делается это с помощью форматирования – цифра после знака процента задает количество символов, отводимое на данное число.
printf("Матрица A\n");
for (i = 0; i < M; i ++) { // циклпострокам
for (j = 0; j < N; j ++) // вывод одной строки (в цикле)
printf ("%4d", A[i][j]); // 4 символа на число
printf("\n"); // переход на другую строку
}
Работа с файлами
Текстовые файлы
При вводе из текстового файла надо читать последовательно все элементы, обрабатывая
(так же, как и для линейных массивов) ошибки отсутствия или недостатка данных в файле.
#include <stdio.h>
const int M = 5; // числострок
const int N = 4; // числостолбцов
Main()
{
int i, j, A[M][N];
FILE *fp;
fp = fopen("input.dat", "r");
for (i = 0; i < M; i ++) // циклпострокам
for (j = 0; j < N; j ++) // цикл по столбцам
if (0 == fscanf(fp,"%d",&A[i][j])) // ввод A[i][j]
{
puts("Не хватает данных");