Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 5:

Контролирующий код C#

< Лекция 4 || Лекция 5: 123 || Лекция 6 >
Трехмерные массивы

Приведем пример, из которого все ясно

// Файл Program.cs
using System;
    
class MyClass
{
    public MyClass()
    {
        // Настройка консоли
        Console.Title = "Трехмерный массив 5x4x3";
        Console.ForegroundColor = ConsoleColor.White;
        Console.CursorVisible = false;
    
        // Работа с трехмерным массивом
        const int ROWS = 5, COLUMNS = 4, DEPTH = 3;// Границы
        int[, ,] array = new int[ROWS, COLUMNS, DEPTH];// Создание
    
        // Наполнение
        int count = 1;
        for (int i = 0; i < ROWS; i++)
            for (int j = 0; j < COLUMNS; j++)
                for (int k = 0; k < DEPTH; k++)
                    array[i, j, k] = count++;
    
        // Печать
        for (int i = 0; i < ROWS; i++)
        {
            string strTab = "";// Сбрасываем сдвиг для новой строки
            for (int k = 0; k < DEPTH; k++)// Выборка глубины
            {
                string str = "";
                for (int j = 0; j < COLUMNS; j++)
                {
                    str += String.Format("a[{0},{1},{2}]={3, -6}",
                        i, j, k, array[i, j, k]);
                }
                Console.WriteLine(strTab + str);// Строка в глубину
                strTab += "   ";// Сдвиг 3 пробела
            }
            Console.WriteLine();
        }
    }
}
    
class Program
{
    static void Main()
    {
        new MyClass();// Чтобы сработал конструктор
        // Для задержки консольного окна
        Console.ReadLine();
    }
}

Зубчатый двумерный массив

Предыдущие двумерные массивы можно сравнить с прямоугольной матрицей, все строки которой имеют одинаковое число элементов, трехмерный с кубом и т.д. Такие массивы можно назвать прямоугольными. Свойство Length определяет общее количество элементов, которое может хранить прямоугольный массив.

Но язык C# поддерживает также двумерные массивы, в которых строки могут содержать разное количество элементов. Такие массивы называются зубчатыми (или ломаный, рваный ). Зубчатый ( jagged ) двумерный массив представляет собой матрицу со строками разной длины. Зубчатые массивы используются редко, но в некоторых случаях они могут дать красивый экономный код.

Зубчатые массивы создаются в два этапа:

  • Сначала создается шаблон с фиксированным количеством строк по следующему синтаксису тип[][] имя = new тип[размер][];
  • Затем для каждой строки создается одномерный массив того же типа с заданным количеством элементов

В зубчатом двумерном массиве имеется два свойства Length. Если это свойство применить к самому массиву, то оно означает количество строк. Если его применить к отдельной строке, то оно будет означать длину этой строки.

// Файл Program.cs
using System;
    
class MyClass
{
    public MyClass()
    {
        // Настройка консоли
        Console.Title = "Зубчатый массив";
        Console.ForegroundColor = ConsoleColor.White;
        Console.CursorVisible = false;
    
        // Работа с зубчатым массивом
        const int ROWS = 4; // Количество строк
        int[][] jagged = new int[ROWS][]; // Создание шаблона
    
        // Создание элементов строк как одномерных массивов
        jagged[0] = new int[3];
        jagged[1] = new int[1];
        jagged[2] = new int[4];
        jagged[3] = new int[2];
    
        // Наполнение значениями
        int count = 1;
        for (int row = 0; row < jagged.Length; row++)
            for (int col = 0; col < jagged[row].Length; col++)
                jagged[row][col] = count++;
    
        // Печать
        Console.WriteLine("Первый зубчатый массив");
        print(jagged);// Вызов вспомогательной функции
        Console.WriteLine();// Новая пустая строка
    
    
        // К прежней ссылке цепляем новый зубчатый массив
        // Старый массив остается неадресуемым
        // и становится добычей сборщика мусора GC 
        jagged = new int[][] // Шаблон и инициализация
            {
                new int[]{1, 2, 3, 4, 5},
                new int[]{6, 7, 8},
                new int[]{9, 10, 11, 12},
                new int[]{13},
                new int[]{14, 15, 16, 17, 18, 19, 20}
            };
    
        // Печать
        Console.WriteLine("Второй зубчатый массив");
        print(jagged);// Вызов вспомогательной функции
        Console.WriteLine();// Новая пустая строка
    
        // Использование цикла foreach для перебора 
        // всех элементов массива в порядке их следования
        Console.WriteLine("Перебор с помощью foreach");
        for (int row = 0; row < jagged.Length; row++)
        {
            foreach (int elem in jagged[row])
                Console.Write("{0, -4}", elem);
            Console.WriteLine();
        }
    }
    
    // Закатали в метод, т.к. код повторяется
    private void print(int[][] jagged)
    {
        for (int row = 0; row < jagged.Length; row++)
        {
            string str = "";
            for (int col = 0; col < jagged[row].Length; col++)
                str += String.Format("{0, -4}", jagged[row][col]);
            Console.WriteLine(str);
        }
    }
}
    
class Program
{
    static void Main()
    {
        new MyClass();// Чтобы сработал конструктор
        // Для задержки консольного окна
        Console.ReadLine();
    }
}

Поскольку массивы - ссылочные типы, то присвоение одного массива другому ведет к созданию ссылок-псевдонимов на одну и ту же область памяти с содержимым самого массива. Чтобы действительно получить копию массива, можно воспользоваться статическим методом Array.Copy() или объектным методом array.CopyTo().

< Лекция 4 || Лекция 5: 123 || Лекция 6 >
Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974