Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие КНЕУ.doc
Скачиваний:
24
Добавлен:
07.03.2016
Размер:
3.9 Mб
Скачать

6.3. Ступінчасті масиви

У ступінчастих масивах кількість елементів в різних рядках може розрізнятися. У пам'яті ступінчастий масив зберігається інакше, ніж прямокутний: у вигляді декількох внутрішніх масивів, кожен з яких має свій розмір. Крім того, виділяється окрема область пам'яті для зберігання посилань на кожен з внутрішніх масивів.

Опис ступінчастого масиву:

тип[][] ім’я;

Під кожен з масивів, складових ступінчастий масив, пам'ять потрібно виділяти явним чином, наприклад:

int[][] а = new int[3][]; // виділення пам'яті під посилання на три рядки

а[0] = new int[5]; // виділення пам'яті під 0-й рядок (5 елементів)

а[1] = new int[3]; // виділення пам'яті під 1-й рядок (3 елементи)

a[2] = new int[4]; // виділення пам'яті під 2-й рядок (4 елементи)

Тут а[0],а[1] і а[2] – це окремі масиви, до яких можна звертатися по імені. Інший спосіб виділення пам'яті:

int[][ ] а = { new int [5], new int[3], new int[4] };

До елементу ступінчастого масиву звертаються, указуючи кожну розмірність в своїх квадратних дужках, наприклад:

a[1][2] a[i][j] a[j][i]

У останньому випадку використання ступінчастих масивів не відрізняється від використання прямокутних. Невирівняні масиви зручно застосовувати, наприклад, для роботи з трикутними матрицями великого об'єму.

6.4. Клас System.Array

Раніше вже розповідалося, що всі масиви в С# побудовані на основі базового класу Array, який містить корисні для програміста властивості і методи, частина з яких перераховані в таблиці 6.1.

Таблиця 6.1

Основні елементи класу Array

Елемент

Вигляд

Опис

Length

Властивість

Кількість елементів масиву (по всіх размерностям)

Rank

Властивість

Кількість размерностей масиву

BinarySearch

Статичний

метод

Двійковий пошук у відсортованому масиві

Clear

Статичний

метод

Привласнення елементам масиву значень за умовчанням

Copy

Статичний

метод

Копіювання заданого діапазону елементів одного масиву в інший масив

CopyTo

Метод

Копіювання всіх елементів поточного одновимірного масиву в інший одновимірний масив

GetValue

Метод

Набуття значення елементу масиву

IndexOf

Статичний

метод

Пошук першого входження елементу в одновимірний масив

LastIndexOf

Статичний

метод

Пошук останнього входження елементу в одновимірний масив

Reverse

Статичний

метод

Зміна порядку проходження елементів на зворотний

SetValue

Метод

Установка значення елементу масиву

Sort

Статичний

метод

Впорядковування елементів одновимірного масиву

Властивість Length дозволяє реалізовувати алгоритми, які працюватимуть з масивами різної довжини або, наприклад, із ступінчастим масивом. У лістингу 6.3 продемонстровано застосування елементів класу Array при роботі з одновимірним масивом.

Лістинг 6.3. Використання методів класу Array з одновимірним масивом

using System;

namespace ConsoleApplication1

{

class Classl

{

static void Main( )

{

int[] a ={24, 50, 18, 3, 16, 7, 9, -1};

PrintArray( "Початковий масив:", a );

Console.WriteLine( Array.IndexOf( a, 18) );

Array.Sort(a);

PrintArray( "Впорядкований масив:", a );

Console.WriteLine(Array.BinarySearch(a, 18) );

}

public static void PrintArray( string header, int[] a )

{

Console.WriteLine(header);

for ( int i = 0; i < a.Length; i ++)

Console.Write( "\t" + a[i] );

Console.WriteLine( );

}

}

}

Методи Sort, IndexOf і BinarySearch є статичними, тому до них звертаються через ім'я класу, а не екземпляра, і передають в них ім'я масиву. Двійковий пошук можна застосовувати тільки для впорядкованих масивів. Він виконується набагато швидше, ніж лінійний пошук, реалізований в методі IndexOf. У лістингу пошук елементу, що має значення 18, виконується обома цими способами.

У класі Class1 описаний допоміжний статичний метод PrintArray, призначений для виведення масиву на екран. У нього передаються два параметри: рядок заголовка header і масив. Кількість елементів масиву визначається усередині методу за допомогою властивості Length. Цей метод можна використовувати для виведення будь-якого цілочисельного одновимірного масиву.

Результат роботи програми:

Початковий масив:

24 50 18 3 16 -7 9 -1

2

Впорядкований масив:

-7 -1 3 9 16 18 24 50

5

Для того, щоб застосовувати метод PrintArray до масивів, що складаються з елементів іншого типу, можна описати його другий параметр як Array. Правда, при цьому значення елементу масиву доведеться набувати за допомогою методу GetValue, оскільки доступ по індексу для класу Array не передбачений. Узагальнений метод виведення масиву виглядає так:

public static void PrintArray(string header, Array a )

{

Console.WriteLine( header );

for ( int i = 0; i < a.Length; i ++)

Console.Write( "\t" + a.GetValue(i) );

Console.WriteLine( );

}

У лістингу 6.4 продемонстровано застосування елементів класу Array при роботі із ступінчастим масивом.

Лістинг 6.4. Використання методів класу Array зі ступінчастим масивом

using System;

namespace ConsoleApplication1

{

class Classl

{

static void Main( )

{

int[][] a = new int[3][];

a[0] = new int [5] {24, 50, 18, 3, 16};

a[1] = new int [3] {7, 9,-1};

a[2] = new int [4] {6, 15, 3, 1 };

Console.WriteLine("Початковий масив:");

for ( int i = 0; i < a.Length; i ++)

{

for ( int j = 0; j < a[i].Length; j ++)

Console.Write("\t" + a[i][j]);

Console.WriteLine();

}

Console.WriteLine(Array.IndexOf(a[0], 18));

}

}

}

Зверніть увагу на те, як усередині циклу по рядках визнається довжина кожного масиву. Результат роботи програми:

Початковий масив:

24

50

18

3

16

7

9

-1

6

15

3

1

2