Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 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. Ввожу код на сайте, пишет:

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

 

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