Теперь используем 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!