KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Герберт Шилдт - C# 4.0: полное руководство

Герберт Шилдт - C# 4.0: полное руководство

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Герберт Шилдт, "C# 4.0: полное руководство" бесплатно, без регистрации.
Перейти на страницу:

  static void Main() {

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

    int sum = 0;

    int n = 1;


    for(int x=0; x < 3; x++)

      for(int y=0; y < 3; y++)

        for(int z=0; z < 3; z++)

          m[x, y, z] = n++;

    sum = m[0, 0, 0] + m[1, 1, 1] + m[2, 2, 2];


    Console.WriteLine("Сумма значений по первой диагонали: " + sum);

  }

}


Вот какой результат дает выполнение этой программы.


Сумма значений по первой диагонали: 42


Инициализация многомерных массивов

Для инициализации многомерного массива достаточно заключить в фигурные скобки список инициализаторов каждого его размера. Ниже в качестве примера приведена общая форма инициализации двумерного массива:


тип[,] имя_массив а = {

{val, val, val ..., val},

{val, val, val,..., val},

{val, val, val,..., val}

};


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

В качестве примера ниже приведена программа, в которой двумерный массив sqrs инициализируется числами от 1 до 10 и квадратами этих чисел.


// Инициализировать двумерный массив, using System;

using System;

class Squares { 

  static void Main() { 

    int[,] sqrs = {

      { 1, 1 },

      { 2, 4 },

      { 3, 9 },

      { 4, 16 },

      { 5, 25 },

      { 6, 36 },

      { 7, 49 },

      { 8, 64 },

      { 9, 81 },

      { 10, 100 }

    };

    int i, j;

    for(i=0; i < 10; i++) { 

      for(j=0; j < 2; j++) 

        Console.Write(sqrs[i,j] + " ");  

      Console.WriteLine(); 

    } 

  }


При выполнении этой программы получается следующий результат.


1 1 

2 4 

3 9 

4 16

5 25

6 36

7 49

8 64

9 81

10 100


Ступенчатые массивы

В приведенных выше примерах применения двумерного массива, по существу, создавался так называемый прямоугольный массив. Двумерный массив можно представить в виде таблицы, в которой длина каждой строки остается неизменной по всему массиву. Но в C# можно также создавать специальный тип двумерного массива, называемый ступенчатым массивом. Ступенчатый массив представляет собой массив массивов, в котором длина каждого массива может быть разной. Следовательно, ступенчатый массив может быть использован для составления таблицы из строк разной длины.

Ступенчатые массивы объявляются с помощью ряда квадратных скобок, в которых указывается их размерность. Например, для объявления двумерного ступенчатого массива служит следующая общая форма:


тип[] [] имя_массива = new тип [размер] [];


где размер обозначает число строк в массиве. Память для самих строк распределяется индивидуально, и поэтому длина строк может быть разной. Например, в приведенном ниже фрагменте кода объявляется ступенчатый массив jagged. Память сначала распределяется для его первого измерения автоматически, а затем для второго измерения вручную.


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

jagged[0] = new int [4];

jagged[1] = new int[3];

jagged[2] = new int[5];


После выполнения этого фрагмента кода массив jagged выглядит так, как показано ниже.

Теперь нетрудно понять, почему такие массивы называются ступенчатыми! После создания ступенчатого массива доступ к его элементам осуществляется по индексу, указываемому в отдельных квадратных скобках. Например, в следующей строке кода элементу массива jagged, находящемуся на позиции с координатами (2,1), присваивается значение 10.


jagged[2] [1] = 10;


Обратите внимание на синтаксические отличия в доступе к элементу ступенчатого и прямоугольного массива.

В приведенном ниже примере программы демонстрируется создание двумерного ступенчатого массива.


// Продемонстрировать применение ступенчатых массивов.

using System;

class Jagged {

  static void Main() {

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

    jagged[0] = new int[4];

    jagged[1] = new int[3];

    jagged[2] = new int[5];


    int i;


    // Сохранить значения в первом массиве.

    for(i=0; i < 4; i++)

      jagged[0][i] = i;


    // Сохранить значения во втором массиве.

    for(i=0; i < 3; i++)

      jagged[1][i] = i;


    // Сохранить значения в третьем массиве.

    for(i=0; i < 5; i++)

      jagged[2][i] = i;


    // Вывести значения из первого массива.

    for(i=0; i < 4; i++)

      Console.Write(jagged[0] [i] + " ") ;


    Console.WriteLine();


    // Вывести значения из второго массива,

    for (i=0; i < 3; i++)

      Console.Write(jagged[1][i] + " ");


    Console.WriteLine() ;


    // Вывести значения из третьего массива.

    for(i=0; i < 5; i++)

      Console.Write(jagged[2] [i] + " ") ;


    Console.WriteLine() ;

  }

}


Выполнение этой программы приводит к следующему результату.


0 1 2 3

0 1 2

0 1 2 3 4


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

И последнее замечание: ступенчатые массивы представляют собой массивы массивов, и поэтому они не обязательно должны состоять из одномерных массивов. Например, в приведенной ниже строке кода создается массив двумерных массивов.


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


В следующей строке кода элементу массива jagged[0] присваивается ссылка на массив размерами 4x2.


jagged[0] = new int [4, 2];


А в приведенной ниже строке кода элементу массива jagged[0] [1,0] присваивается значение переменной i.


jagged[0][1,0] = i;


Присваивание ссылок на массивы

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


// Присваивание ссылок на массивы.

using System;

class AssignARef {

  static void Main() { int i;

    int[] numsl = new int [10];

    int[] nums2 = new int [10];

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*