Прямоугольный массив имеет более одного измерения. Чаще всего в программах используются двумерные массивы. Варианты описания двумерного массива:
тип[,] имя;
тип[,] имя - new тип [ разм_1, разм_2 ];
тип[,] имя = { список_инициализаторов };
тип[,] имя = new тип [,] { список_инициализаторов };
тип[,] имя = new тип [ разм_1, разм_2 ] { список_инициализаторов };
Примеры описаний (один пример для каждого варианта описания):
int[,] a; // 1 элементов нет
int[,] b = new int[2, 3]; // 2 элементы равны О
int[,] с = {{1, 2, 3}, {4, 5, 6}}; // 3 new подразумевается
int[,] с = new int[,] {{1, 2, 3}, {4, 5, 6}}; // 4 размерность вычисляется
int[,] d = new int[2,3] {{1, 2, 3}, {4, 5, 6}};// 5 избыточное описание
Если список инициализации не задан, размерности могут быть не только константами, но и выражениями типа, приводимого к целому. К элементу двумерного массива обращаются, указывая номера строки и столбца, на пересечении которых он расположен, например:
а[1, 4] b[i, j] b[j, i]
ВНИМАНИЕ
Необходимо помнить, что компилятор воспринимает как номер строки первый индекс, как бы он ни был обозначен в программе.
В качестве примера рассмотрим программу, которая для целочисленной матрицы размером 3x4 определяет среднее арифметическое ее элементов и количество положительных элементов в каждой строке (рис. 6.3).
Рис. 6.3. Матрица из т строк и n столбцов
Для нахождения среднего арифметического элементов массива требуется найти их общую сумму, после чего разделить ее на количество элементов. Порядок перебора элементов массива (по строкам или по столбцам) роли не играет. Нахождение количества положительных элементов каждой строки требует просмотра матрицы по строкам. Схема алгоритма приведена на рис. 6.4, программа — в листинге 6.2.
Листинг 6.2. Работа с двумерным массивом
using System;
namespace ConsoleApplication1
{
class Class1
{
static void Main()
{
const int m = 3, n = 4; int[,] a = new int[m, n] { { 2,-2, 8, 9 },
{-4,-5, 6,-2 }, { 7, 0, 1, 1 }};
Console.WriteLine("Исходный массив:");
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
Console.Write("\t" + a[i, j]);
Console.WriteLine();
}
double sum = 0;
int nPosEl;
for (int i = 0; i < m; ++i)
{
nPosEl = 0;
for (int j = 0; j < n; ++j)
{
sum += a[i, j];
if (a[i, j] > 0)
++nPosEl;
}
Console.WriteLine("В строке {0} {1} положит-х элементов",
i, nPosEl);
}
Console.WriteLine("Среднее арифметическое всех элементов: " +
sum / m / n);
}
}
}
ПРИМЕЧАНИЕ
Для суммирования элементов описана переменная sum вещественного типа. Если описать ее как целую, при делении на количество элементов будет отброшена дробная часть.
Обратите внимание на то, что переменная sum обнуляется перед циклом просмотра всей матрицы, а количество положительных элементов — перед циклом просмотра очередной строки, поскольку для каждой строки его вычисление начинается заново.