Теперь используем Length для отображения массива kvadrat   



Console.Write(" Содержимое массива kvadrat: ");

for (int i = 0; i < kvadrat.Length; i++) Console.Write(kvadrat[i] + " ");

Console.WriteLine ();

Console.Write("Для завершения работы приложения нажмите

                             клавишу <Enter>");

Console.Read();

}

 

Пример 3. Рассмотрим программу, которая определяет сумму и количество отрицательных элементов, а также максимальный элемент массива, состоящего из 6 целочисленных элементов.

using System;

namespace ConsoleApplication1

{ class Class1

{

  static void Main()

   {

       const int n = 6;

       int[] a = new int[n] { 3, 12, 5, -9, 8, -4 };

 

       Console.WriteLine( "Исходный массив:" );

       for ( int i = 0; i < n; ++i )

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

       Console.WriteLine();

 

       long sum = 0;         // cумма отрицательных элементов

       int num = 0;         // количество отрицательных элементов

       for ( int i = 0; i < n; ++i )

           if ( a[i] < 0 )

           {

               sum += a[i];

               ++num;

           }

 

       Console.WriteLine( "Сумма отрицательных = " + sum );

       Console.WriteLine( "Кол-во отрицательных = " + num );

 

       int max = a[0];        // максимальный элемент

       for ( int i = 1; i < n; ++i )

           if ( a[i] > max ) max = a[i];

 

       Console.WriteLine( "Максимальный элемент = " + max );

   }

}

}

Динамические массивы

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

Пример, в котором описана работа с динамическим массивом:

public void TestDynAr()

{

//объявление динамического массива A1

Console.WriteLine("Введите число элементов массива A1");

  int size = int.Parse(Console.ReadLine());

  int[] A1 = new int[size];

}

В данной процедуре верхняя граница массива определяется пользователем.

Многомерные массивы

Разделение массивов на одномерные и многомерные носит исторический характер. Никакой принципиальной разницы между ними нет. Одномерные массивы - это частный случай многомерных. Можно говорить и по - другому: многомерные массивы являются естественным обобщением одномерных. Одномерные массивы позволяют задавать такие математические структуры как векторы, двумерные - матрицы, трехмерные - кубы данных, массивы большей размерности - многомерные кубы данных. Объявление многомерного массива в общем случае:

<тип>[, ... ,] <имя_массива>;

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

Примеры:

Двумерный массив:

int[,] k = new int [2,3]

Обратите внимание, что пара квадратных скобок только одна. В нашем примере у массива 6 (=2*3) элементов. Аналогично мы можем задавать многомерные массивы.

Варианты описания двумерного массива:

тип[,] имя;

тип[,] имя = new тип [ разм_1, разм_2 ];

тип[,] имя = { список_инициализаторов };

тип[,] имя = new тип [,] { список_инициализаторов };

тип[,] имя = new тип [ разм_1, разм_2 ] { список_инициализаторов };

Примеры описаний (один пример на каждый вариант описания):

int[,] a;                                 // 1 элементов нет

int[,] b = new int[2, 3];                 // 2 элементы равны 0

int[,] c = {{1, 2, 3}, {4, 5, 6}};        // 3 new подразумевается

int[,] c = new int[,] {{1, 2, 3}, {4, 5, 6}}; // 4 размерность вычисляется

int[,] d = new int[2,3] {{1, 2, 3}, {4, 5, 6}};// 5 избыточное описание

Массивы массивов

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

В каких ситуациях может возникать необходимость в таких структурах данных? Эти массивы могут применяться для представления деревьев, у которых узлы могут иметь произвольное число потомков. Таковым может быть, например, генеалогическое дерево. Вершины первого уровня - Fathers, представляющие отцов, могут задаваться одномерным массивом, так что Fathers[i] - это i-й отец. Вершины второго уровня представляются массивом массивов - Children, так что Children[i] - это массив детей i-го отца, а Children[i][j] - это j-й ребенок i-го отца. Для представления внуков понадобится третий уровень, так что GrandChildren [i][j][k] будет представлять к-го внука j-го ребенка i-го отца.

Есть некоторые особенности в объявлении и инициализации таких массивов. Если при объявлении типа многомерных массивов для указания размерности использовались запятые, то для изрезанных массивов применяется более ясная символика - совокупности пар квадратных скобок; например, int[][] задает массив, элементы которого - одномерные массивы элементов типа int.

Сложнее с созданием самих массивов и их инициализацией. Здесь нельзя вызвать конструктор new int[3][5], поскольку он не задает изрезанный массив. Фактически нужно вызывать конструктор для каждого массива на самом нижнем уровне. В этом и состоит сложность объявления таких массивов.

Пример:

//массив массивов

//объявление и инициализация

int[][] jagger= new int[3][]

{

new int[] {5,7,9,11},

new int[] {2,8},

new int[] {6,12,4}

};

Массив jagger имеет всего два уровня. Можно считать, что у него три элемента, каждый из которых является массивом. Для каждого такого массива необходимо вызвать конструктор new, чтобы создать внутренний массив. В данном примере элементы внутренних массивов получают значение, будучи явно инициализированы константными массивами. Конечно, допустимо и такое объявление:

int[][] jagger1 = new int[3][]

{

new int[4],

new int[2],

new int[3]

};

В этом случае элементы массива получат при инициализации нулевые значения. Реальную инициализацию нужно будет выполнять программным путем. Стоит заметить, что в конструкторе верхнего уровня константу 3 можно опустить и писать просто new int[][]. Вызов этого конструктора можно вообще опустить - он будет подразумеваться:

int[][] jagger2 =

{

new int[4],

new int[2],

newint[3]

};

А вот конструкторы нижнего уровня необходимы. Еще одно важное замечание - динамические массивы возможны и здесь. В общем случае, границы на любом уровне могут быть выражениями, зависящими от переменных. Более того, допустимо, чтобы массивы на нижнем уровне были многомерными.

Еще несколько примеров:

//Объявляем 2-мерный ступенчатый массив

int[][] k = new int [2][];

//Объявляем 0-й элемент нашего ступенчатого массива

//Это опять массив и в нем 3 элемента

k[0]=new int[3];

//Объявляем 1-й элемент нашего ступенчатого массива

//Это опять массив и в нем 4 элемента

k[1]=new int[4];

k[1][3]=22;

//записываем 22 в последний элемент массива

...

Обратите внимание, что у ступенчатых массивов задается несколько пар квадратных скобок (столько, какова размерность у массива).

 

Цикл foreach

Новым видом цикла, который часто используется и достаточно удобен при работе с массивами, есть цикл foreach.

Его синтаксис:

foreach(тип идентификатор in контейнер) оператор

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

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

Метод toString () возвращает строковое представление указанного объекта Number.

Пример 4. Использование цикла foreach:

Class Program

{

   Static void Main(string[] args)

         {

             int[] array1 = {0, 2, 4, 6, 8, 10};

          foreach(int n in array1)

                    {

                 System.Console.WriteLine(n.ToString());

                     }

string[] array2 = {hello", "world"};

foreach(string s in array2)

{

System.Console.WriteLine(s);

}

             }

}

В приведенном примере наш цикл перебирает все элементы массива array1. На это указывает строка

foreach(int n in array1),

которая интерпретируется так: для каждого целого числа из массива array1 делаем перевод в строковое значение и печатаем. Если бы элементами массива были бы не целые, а, скажем, вещественные числа, то запись выглядела бы так:

foreach(float n in array1);

Т.е. мы пишем именно тип элементов массива. Цикл foreach используется не только для массивов, но и для других объектов.

 

Пример 5. Работа с одномерным массивом (пример 3) с использованием цикла foreach

using System;

namespace ConsoleApplication1

{ class Class1

{ static void Main()

   {

       int[] a = { 3, 12, 5, -9, 8, -4 };

 

       Console.WriteLine( "Исходный массив:" );

       foreach ( int elem in a )

           Console.Write( "\t" + elem );

       Console.WriteLine();

 

       long sum = 0;         // cумма отрицательных элементов

       int num = 0;         // количество отрицательных элементов

       foreach ( int elem in a )

           if ( elem < 0 )

           {

               sum += elem;

               ++num;

           }

 

       Console.WriteLine( "sum = " + sum );

       Console.WriteLine( "num = " + num );

 

       int max = a[0];       // максимальный элемент

       foreach ( int elem in a )

           if ( elem > max ) max = elem;

 

       Console.WriteLine( "max = " + max );

   }

}

}

Задание 1.

Задание выполнять по вариантам. Создать и вывести массив Zk с элементами, которые вычисляются по формулам из списка. В ниже приведенных формулах отсутствует индекс k, но надо считать, что индекс стоит для всех необходимых элементов. Перед составлением программы создать блок-схему алгоритма решения задачи. N=10.

 

 

Таблица 1

Задание 2

Перед составлением программы создать блок-схему алгоритма решения задачи.


Дата добавления: 2020-11-15; просмотров: 102; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!