Введение.

Очень часто при работе с какой-либо информацией приходится иметь дело с табличными данными. Современные программы очень часто работают именно с такими данными. Самый простой пример - это программирование игр на клетчатой доске: крестики-нолики, шахматы, шашки и т.п.

В математике такие структуры называются матрицами.

 
Матрица - это прямоугольная таблица составленная из элементов одного типа (чиcел, строк и т.д).

Такие данные на языке C# можно хранить и обрабатывать в виде двумерных массивов - "массивов массивов".
Чтобы обработать данные в таблице, надо запоминать состояние каждой ячейки (клетки). Каждая ячейка имеет два номера: номер строки и номер столбца.
В матрице каждый элемент имеет два индекса: сначала указывается номер строки, затем номер столбца. Нумерация строк и столбцов начинается с нуля.
Например, элемент A[1, 2] - это элемент расположенный во второй строке и третьем столбце.

Так же как и с обычными массивами, для того, чтобы работать с матрицами, необходимо научиться их создавать, вводить, обрабатывать и выводить на экран.

Создание матрицы.

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

int[,] array = new int[4, 2]; // 4 строки, 2 столбца

 

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

for (int i=1; i <= N, i++) {       // N - число строк
    for (int j=1; j <= N, j++) {   // M - число столбцов
        A[i, j] = ...
    }
}
Вывод матрицы на экран.

Для обработки и вывода списка, как правило, используется два вложенных цикла. Первый цикл по номеру строки, второй цикл - по элементам внутри строки. Для того, чтобы вывести матрицу на экран построчно, разделяя числа пробелами внутри одной строки, необходимо написать такой фрагмент:
 
for (int i=1; i <= N, i++) { 
    for (int j=1; j <= N, j++) { 
        Console.Write(A[i, j] + " ");
    }
    Console.WriteLine(); // переход на новую строку 
}
   

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

Заполнение матрицы значениями с клавиатуры.

Пусть программа получает на вход двумерный массив, в виде n строк, каждая из которых содержит m чисел, разделенных пробелами. Как их считать? Например, так:

int[,] array = new int[n,m];                                  // создаем массив, который будем заполнять
for (int i = 0; i <  n; i++)
{
       string A = Console.ReadLine();                         // считываем строку 
       int[] curr = A.Split(' ').Select(int.Parse).ToArray(); // преобразуем эту строку в одномерный массив curr
       for (int j = 0; j < m; j++)
       {
           array[i, j] = curr[j];                             // заполняем строку нужного нам массива значениями из массива curr
       }
}

 

Каждый элемент матрицы имеет два индекса, поэтому для перебора всех элементов нужно использовать вложенный цикл.
Обычно матрицу перебирают по строкам: внешний цикл перебирает индексы строк, а внутренний - индексы столбцов.
Но при необходимости можно перебирать матрицу и по столбцам, тогда циклы меняются местами.