Введение.
Очень часто при работе с какой-либо информацией приходится иметь дело с табличными данными. Современные программы очень часто работают именно с такими данными. Самый простой пример - это программирование игр на клетчатой доске: крестики-нолики, шахматы, шашки и т.п.
В математике такие структуры называются матрицами.
Матрица - это прямоугольная таблица составленная из элементов одного типа (чи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
}
}
|
Каждый элемент матрицы имеет два индекса, поэтому для перебора всех элементов нужно использовать вложенный цикл.
Обычно матрицу перебирают по строкам: внешний цикл перебирает индексы строк, а внутренний - индексы столбцов.
Но при необходимости можно перебирать матрицу и по столбцам, тогда циклы меняются местами.
|