Ступенчатые (jagged) массивы в Си-шарп




 

Ступенчатый (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();

}

}

} }}

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-29 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: