Назад Вперед Зміст


Ступінчатий (jagged) масив

Двовимірний масив можна представити у вигляді таблиці, в якій довжина кожного рядка залишається незмінною по всьому масиву. Але в C# можна також створювати спеціальний тип двовимірного масиву, який називається ступінчатим масивом.

Ступінчатий масив представляє собою масив масивів, у якому довжина кожного масиву може бути різною. Отже, ступінчатий масив може бути використаний для складання таблиці з рядків різної довжини.

Ступінчаті масиви оголошуються за допомогою ряду квадратних дужок, у яких вказується їх розмірність. Наприклад, для оголошення двовимірного ступінчатого масиву служить наступна загальна форма: тип [][] ім'я масиву = new тип[розмір] [];

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

Приклад 1

Розглянемо приклад використання ступінчатого масиву:

class Program
{
    static void Main(string[] args)
    {
        int i = 0;
        int j = 0;
        // Оголошення ступінчастого масиву (jagged array)
        int[][] myArr = new int[5][];
        for (i = 0; i < 5; i++) 
            myArr[i] = new int[i + 1];

        // Ініціалізація ступінчастого масиву
        for (i = 0; i < 5; i++)
        {
            for (j = 0; j < i + 1; j++)
            {
                myArr[i][j] = i + 1;
            }
        }

        // Виведення масиву на екран
        for (i = 0; i < 5; i++)
        {
            Console.WriteLine();
            for (j = 0; j < i + 1; j++)
            {
                Console.Write("{0}\t", myArr[i][j]);
            }
        }
        Console.ReadKey();
    }
}
1	
2	2	
3	3	3	
4	4	4	4	
5	5	5	5	5	

Приклад 2

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

class Program
{
    static void Main(string[] args)
    {
        int i = 0;
        int j = 0;
        // Оголошуємо ступінчатий масив (jagged array)
        int[][] myArr = new int[5][];
        Random rand = new Random();
        int t1; // Тимчасова змінна для зберігання розміру підмасиву

        // Ініціалізуємо ступінчатий масив випадковими значеннями
        for (i = 0; i < 5; i++)
        {
            t1 = rand.Next(10); // Генеруємо випадковий розмір підмасиву (до 10 елементів)
            myArr[i] = new int[t1];
            
            for (j = 0; j < t1; j++)
                myArr[i][j] = rand.Next(50, 100); // Заповнюємо випадковими числами від 50 до 100
        }

        // Виводимо масив на екран
        for (i = 0; i < 5; i++)
        {
            Console.WriteLine();
            foreach (int x in myArr[i])
            {
                Console.Write("{0}\t", x); // Виводимо елементи через табуляцію
            }
        }

        Console.ReadKey(); // Очікуємо натискання клавіші
    }
}
67    89    53    78    
91    55    
84    72    93    61    88    
57    65    74    
76    83    94    

Властивість Length

Приклад 3

Розглянемо приклад використання ступінчатого масиву:

static void Main(string[] args) 
{
    int i = 0;
    // Оголошення ступінчастого масиву
    int[][] myArr = new int[4][]; 
    myArr[0] = new int[4];
    myArr[1] = new int[6]; 
    myArr[2] = new int[3];
    myArr[3] = new int[4];
    
    // Ініціалізація та виведення першого підмасиву
    for (; i  < 4; i++) 
    {
        myArr[0][i] = i+1; 
        Console.Write("{0}\t", myArr[0][i]); 
    }
    Console.WriteLine();
    
    // Ініціалізація та виведення другого підмасиву
    for (i = 0; i < 6; i++) 
    {
        myArr[1][i] = i+1;
        Console.Write("{0}\t", myArr[1][i]);
    }
    Console.WriteLine();
    
    // Ініціалізація та виведення третього підмасиву
    for (i = 0; i  < 3; i++) 
    {
        myArr[2][i] = i+1;
        Console.Write("{0}\t", myArr[2][i]);
    }
    Console.WriteLine();
    
    // Ініціалізація та виведення четвертого підмасиву
    for (i = 0; i  < 4; i++) 
    {
        myArr[3][i] = i+1;
        Console.Write("{0}\t", myArr[3][i]);
    }
    
    Console.ReadKey();
}
1    2    3    4    
1    2    3    4    5    6    
1    2    3    
1    2    3    4    


Приклад 4

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

static void Main(string[] args)
{
    int j, max = 0;
    int[] MyArr = new int[5];
    
    // Заповнення масиву та знаходження максимального значення
    for (j = 0; j < 5; j++)
    { 
        MyArr[j] = j + 2;
        if (MyArr[j] > max) max = MyArr[j]; 
    }
    
    // Розрахунок розмірів для ступінчастого масиву
    int size0 = 5;
    int size1 = max;
    int size2 = Convert.ToInt32((4 * max - 1) / 3);
    int[] sizes = { size0, size1, size2 }; // Допоміжний масив розмірів
    
    // Створення ступінчастого масиву
    int[][][] MyStArr = new int[3][][];
    MyStArr[0] = new int[sizes[0]];
    MyStArr[1] = new int[sizes[1]];
    MyStArr[2] = new int[sizes[2]];
    
    // Виведення заголовків
    Console.WriteLine();
    Console.Write(" ");
    for (j = 0; j < size2; j++)
        Console.Write("({0,5})", j);
    Console.WriteLine("\n\t --- ");
    
    // Заповнення та виведення першого підмасиву
    Console.Write(" MyStArr[0][5]");
    for (j = 0; j < size0; j++)
        MyStArr[0][j] = j + 1;
    foreach (int jj in MyStArr[0])
        Console.Write("({0,5})", jj);
    Console.WriteLine();
    
    // Заповнення та виведення другого підмасиву
    Console.Write(" MyStArr[1][6]");
    for (j = 0; j < size1; j++)
        MyStArr[1][j] = j + 11;
    foreach (int jj in MyStArr[1])
        Console.Write("({0,5})", jj);
    Console.WriteLine();
    
    // Заповнення та виведення третього підмасиву
    Console.Write(" MyStArr[2][7]");
    for (j = 0; j < size2; j++)
        MyStArr[2][j] = j + 111;
    foreach (int jj in MyStArr[2])
        Console.Write("({0,5})", jj);
    Console.WriteLine("\n\t --- ");
    
    Console.ReadKey();
}

Усі масиви є об'єктами і вони мають деякі властивості. Найкориснішою для нас буде властивість Length, яка повертає кількість елементів у масиві (у всіх розмірностях)


static void Main(string[] args)
{
   int[] numbers = new int[5];
   int size = numbers.Length; // size = 5 
}

Ступінчаті масиви знаходять корисне застосування не у всіх, а лише у деяких випадках. Наприклад, якщо потрібен дуже довгий двовимірний масив, який заповнюється не повністю, тобто такий масив, у якому використовуються не всі, а лише окремі його елементи, то для цієї мети ідеально підходить ступінчатий масив.

І останнє зауваження: ступінчаті масиви представляють собою масиви масивів, і тому вони не обов'язково повинні складатися з одновимірних масивів. Наприклад, у наведеному нижче рядку коду створюється масив двовимірних масивів.

int[][,] jagged = new int[3][,];

У наступному рядку коду елементу масиву jagged[0] присвоюється посилання на масив розмірами 4:2. jagged[0] = new int[4, 2];

А у наведеному нижче рядку коду елементу масиву jagged[0][1,0] присвоюється значення змінної i. jagged[0][1,0] = i;

foreach з двовимірними та ступінчастими масивами



    class Program
    {
        static void Main(string[] args)
        {
            int[,] c = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7,8,9} };
            int[] a = new int[3] ;
            for (int j=0; j < 3; j++) a[j] = c[2, j];
                foreach (int i in a) Console.WriteLine(i);
            Console.WriteLine();
            int[][] d = new int[3][];
            d[0] = new int[2] { 1, 2 };          // виділяємо пам'ять для першого підмасиву
            d[1] = new int[3] { 1, 2, 3 };       // виділяємо пам'ять для другого підмасиву
            d[2] = new int[5] { 1, 2, 3, 4, 5 };
            foreach (int i in d[2]) Console.WriteLine(i);
            Console.ReadKey();
        }
    }


Назад Вперед Зміст