Ступенчатый (jagged) массив – это массив массивов. В нем длина каждого массива может быть разной. Примерно это выглядит так:
a0 0 | a0 1 | a0 2 | ||
a1 0 | a1 1 | |||
a2 0 | a2 1 | a2 2 | a2 3 | a2 4 |
Объявление ступенчатого массива:
static void Main(string[] args)
{
// объявляем массив, который содержит 3 массива
int[][] array = new int[3][];
array [0] = new int[3]; //создание внутреннего массива
array [1] = new int[2];
array [2] = new int[5];
}
Доступ к элементам осуществляется по тому же принципу, как и с многомерными массивам, только тут уже участвуют две пары квадратных скобок (продолжение примера выше):
array [0][1] = 5;
array [1][1] = 8;
array [1][2] = 5; // ошибка, индекс «2» вне границ массива
Пример использования ступенчатого массива.
Есть ступенчатый массив из 12 элементов (соответствующих месяцам), содержащий массивы разной длины, равной количеству дней в месяце. В качестве данных будет количество осадков, выпавших в этот день. Значение осадков с координатами [5,15] будет соответствовать количеству осадков в в мае, 15 числа.
Класс System.Array
Все массивы в С# построены на основе базового класса Array, который содержит свойства и методы, представленные в таблице.
Таблица. Основные элементы класса Array (представлены не полностью)
Свойство | Описание |
Length | Количество элементов массива (по всем размерностям) |
Rank | Количество размерностей массива |
BinarySearch | Двоичный поиск в отсортированном массиве |
Clear | Выполняет начальную инициализацию элементов. В зависимости от типа элементов устанавливает значение 0 для арифметического типа, false - для логического типа, Null для ссылок, "" - для строк. |
Copy | Копирование части или всего массива в другой массив. |
IndexOf | Поиск индекса первого вхождения элемента в одномерный массив. |
LastIndexOf | Поиск индекса последнего вхождения элемента в одномерный массив. |
Reverse | Изменение порядка следования элементов на обратный. |
Sort | Сортировка элементов одномерного массива |
CopyTo | Копируются все элементы одномерного массива в другой одномерный массив, начиная с заданного индекса |
GetLength | Возвращает число элементов массива по указанному измерению. |
GetValue, SetValue | Возвращает или устанавливает значение элемента массива с указанными индексами. |
|
Свойство Length позволяет реализовывать алгоритмы, которые будут работать с массивами различной длины. Использование этого свойства вместо явного задания размерности исключает возможность выхода индекса за границы массива.
Пример применения элементов класса Array для работы с одномерным массивом.
using System;
namespace ConsoleApplication1
{
class Class1
{
static void Main()
{
int [] a= {3,12,5,18,-9,8,-4};
PrintArray (“Исходный массив:”, a);// пользовательская функция (метод)
Console.WriteLine(Array.IndexOf(a,18);
Array.Sort(a);
PrintArray (“Отсортированный массив:”, a);
Console.WriteLine(Array.BinarySearch(a,18));
}//конец Main()
public static void PrintArray(string s, int[] a)
{
Console.WriteLine(s);
for (int i=0;i<a.Length;++i)
Console.Write(“\t”+a[i]);
Console.WriteLine();
} //конец функции
}//конец класса Class1
}//конец пространства имен ConsoleApplication1
Методы Sort(), IndexOf(), BinarySearch() являются статическими, поэтому к ним обращаются через имя класса и передают в них имя массива. Двоичный поиск можно применять только для упорядоченных массивов.
В приведенном примере поиск элемента со значением 18 выполняется двумя способами.
Статический метод PrintArray() предназначен для вывода массива на экран. В него передаются два параметра – строка и одномерный массив. Количество элементов массива определяется с помощью свойстваLength, поэтому этот метод можно использовать для вывода любого целочисленного одномерного массива.
|
Для того, чтобы метод PrintArray() мог применяться к массивам другого типа необходимо вместо передачи обычного одномерного массива использовать класс Array. Значения элементов такого массива получают с помощью метода GetValue, так как доступ по индексу для класса Array не предусмотрен.
Модифицированный метод PrintArray()с использованием оператора цикла for
public static void PrintArray(string s, Array a)
{
Console.WriteLine(s);
for (int i=0;i<a.Length;++i)
Console.Write(“\t”+a.GetValue(i));
Console.WriteLine();
}
Модифицированный метод PrintArray() с использованием оператора цикла foreach
public static void PrintArray(string s, Array a)
{
Console.WriteLine(s);
foreach (object x in a)
Console.Write(“\t”+x);
Console.WriteLine();
}
Такая запись становится возможной потому, что любой объект может быть неявно преобразован к типу базового класса object.
Ограничением применения оператора foreachявляется то, что с помощью его можно только просматривать значения в группе данных, но не изменять их.
Использование оператора foreach для вывода на экран двумерного массива имеет вид:
foreach (int [] x in a)
{
foreach (int y in x) Console.Write(“\t”+y);
Console.WriteLine();
}
Примеры обработки массивов с использованием класса Array
ОДНОМЕРНЫЙ МАССИВ
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.Write("Введите размерность массива: ");
int n=Convert.ToInt32(Console.ReadLine());
int[] a = new int[n];
ВводМассива(a);
РешениеЗадачи(a);
ВыводМассива(a);
Console.ReadKey();
}
//----------------------------------------------------------------
|
public static void ВводМассива(Array a)
{
for (int i = 0; i < a.Length; ++i)
{
Console.Write("Введите {0} элемент массива: ", i + 1);
a.SetValue(Convert.ToInt32(Console.ReadLine()),i);
}
Console.WriteLine("******************************************");
}
//----------------------------------------------------------------
public static void РешениеЗадачи(Array a)
{
for (int i = 0; i < a.Length; ++i)
{
//обработка массива – решение задачи
}
}
//----------------------------------------------------------------
public static void ВыводМассива(Array a)
{
Console.WriteLine("Вывод массива: ");
Foreach (object x in a)
Console.Write(" "+x);
}
}
}
ДВУМЕРНЫЙ МАССИВ
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.Write("Введите количество строк массива: ");
int n=Convert.ToInt32(Console.ReadLine());
Console.Write("Введите количество столбцов массива: ");
int m=Convert.ToInt32(Console.ReadLine());
int[,] a = new int[n,m];
ВводМассива(a);
РешениеЗадачи(a);
ВыводМассива(a);
Console.ReadKey();
}
//----------------------------------------------------------------
public static void ВводМассива(Array a)
{
for (int i = 0; i < a.GetLength(0); ++i)
for (int j = 0; i < a.GetLength(1); ++i)
a.SetValue(Convert.ToInt32(Console.ReadLine()),i,j);
}
//----------------------------------------------------------------
public static void РешениеЗадачи(Array a)
{
for (int i = 0; i < a.GetLength(0); ++i)
for (int j = 0; i < a.GetLength(1); ++i)
{
//обработка массива – решение задачи
}
}
//----------------------------------------------------------------
public static void ВыводМассива(Array a)
{
// 1 способ
Console.WriteLine("Вывод массива: ");
for (int i = 0; i < a.GetLength(0); ++i)
{
for (int j = 0; i < a.GetLength(1); ++i)
Console.Write(“\t” +a[i,j]);
Console.WriteLine();
{
// 2 способ
Console.WriteLine("Вывод массива: ");
foreach (int [] x in a)
{
Foreach (int y in x)
Console.Write("\t "+y);
Console.WriteLine();
}
}
} }}