Оператор цикла foreach в Си-шарп




Массивы в Си-шарп.

Операторы break и continue

 

Массив – это набор однотипных данных, которые располагаются в памяти последовательно друг за другом.

· Все массивы в С# имеют общий базовый класс Array, определенный в пространстве имен System.

· В языке С# массив относится к ссылочным типам данных, то есть располагается только в динамической памяти, поэтому создание массива начинается с выделения памяти под его элементы.

· Всем элементам при создании массива присваиваются значения по умолчанию – нули для значимых типов, и null для ссылочных.

· Количество элементов в массиве (размер массива) задается при выделении памяти и не может быть изменено.

· Элементы массива нумеруются с нуля.

· Для обращения к элементу массива после имени массива указывается номер (индекс) элемента в квадратных скобках.

· Массивы одного типа можно присваивать друг другу.

· Массивы в Си-шарп могут быть одномерными и многомерными.

· Массив может содержать элементы любого типа данных, можно даже создавать массив массивов (ступенчатый массив).

 

 

Одномерные массивы

Одномерный массив по-другому еще называется вектором, и для доступа к его элементам используется только один индекс.

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

a0 a1   an-1

 

В Си-шарп объявление массива имеет такую структуру:

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

 

Пример:

// создаем массив целых чисел:

int[] array = new int[5];

//объявление массива строк и его инициализация значениями:

string[] seasons = new string[4] {"зима","весна","лето","осень"};

Если происходит инициализация, оператор new можно упускать:

 

string[] seasons = {"зима","весна","лето","осень"}; //корректно

 

Доступ к элементам осуществляется по индексу. Индексация начинается с нуля – первый элемент массива имеет индекс 0, а последний n-1, где n – размер массива.

 

static void Main(string[] args)
{
int[] numbers = new int[5];
numbers[0] = 5;
numbers[1] = 2;
numbers[4] = 3;
numbers[5] = 2; // ошибка, индекс вне рамок массива
}

 

Свойство Length

Все массивы являются объектами и у них есть некоторые свойства.

Самым полезным для нас будет свойство Length, которое возвращает количество элементов в массиве (во всех размерностях)

 

static void Main(string[] args)
{
int[] numbers = new int[5];
int size = numbers.Length; // size = 5
}

 

 

При работе с массивами, как правило, используют циклы.

 

Пример.

Найти и вывести на экран сумму элементов массива:

static void Main(string[] args)
{
int[] numbers = { 4, 7, 1, 23, 43 };
int s = 0;
for (int i = 0; i < numbers.Length; i++)
{
s += numbers[i];
}
Console.WriteLine(s);
Console.ReadKey();
}

Оператор break

 

Оператор break может завершать case-ветвь в операторе switch (пример его использования в операторе switch уже демонстрировался) или стоять в теле цикла.

Из любого цикла можно досрочно выйти, используя оператор break. Его есть смысл использовать в случае удовлетворения некоторого условия, иначе цикл завершится на первой итерации.

Если оператор break стоит в теле цикла во вложенном цикле, завершается выполнение самого внутреннего цикла.

Пример.

Проверить, есть ли в массиве число кратное 13-ти. Найдя такое число, нет смысла дальше проверять остальные элементы массива, и здесь мы используем оператор break:

static void Main(string[] args)
{
int[] numbers = { 4, 7, 13, 20, 33, 23, 54 };
bool b = false;
for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] % 13 == 0)
{
b = true;
break;
}
}
Console.WriteLine(b? "В массиве есть число кратное 13": "В массиве нет числа кратного 13");
Console.ReadKey();
}

 

Оператор continue

Данный оператор позволяет перейти к следующей итерации, не завершив до конца текущую.

Пример.

Найти сумму нечетных элементов массива:

static void Main(string[] args)
{
int[] numbers = { 4, 7, 13, 20, 33, 23, 54 };
int s = 0;
for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] % 2 == 0)
continue; //переход к следующей итерации
s += numbers[i];
}
Console.WriteLine(s);
Console.ReadKey();
}

 

Пример.

Найти сумму и количество отрицательных элементов массива:

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();

int s=0,k=0;

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

if (a[i]<0)

{

s+=a[i];

++k;

}

Console.WriteLine(“Сумма отрицательных ”+s);

Console.WriteLine(“Количество отрицательных ”+k);

}

 

Оператор цикла foreach в Си-шарп

 

Оператор цикла foreach в Си-шарп служит для перебора элементов коллекции. К коллекциям относятся массивы, списки List и пользовательские классы коллекций. В данном операторе не нужно создавать переменную-счетчик для доступа к элементам коллекции, в отличии от других циклов. Оператор foreach имеет следующую структуру:

foreach ([тип] [переменная] in [коллекция])
{
//тело цикла
}

Пример.

Найти сумму элементов массива с использованием цикла foreach:

static void Main(string[] args)
{
int[] a = { 4, 7, 13, 20, 33, 23, 54 };
int s = 0;

foreach (int el in a)
{
s += el;
}
Console.WriteLine(s);
Console.ReadKey();
}

 

На каждой итерации в переменную el последовательно записывается элемент коллекции. На первой итерации значение переменной el равно “4”, на второй итерации - “7” и т.д.

Как и в других циклах, в foreach можно использовать операторы break и continue.

 

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

Collection was modified; enumeration operation may not execute.

 

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

Одним из случаев многомерного массива служит двумерный массив (матрица). В матрице для доступа к элементам необходимо использовать два индекса.

 

a0 0 a0 1   a0 m-1
a1 0 a1 1   a1 m-1
       
an-1 0 an-1 1   an-1 m-1

 

Количеством индексов, используемых для доступа к элементам массива называется размерностью массива.

 

int[,] numbers1 = new int[2, 2]; // объявление двумерного массива
int[,,] numbers2 = new int[2, 2,3]; // объявление трехмерного массива
int[,] numbers3 = new int[3, 2] { {6, 0},
{5, 7},
{8, 9} }; // инициализация двумерного массива

 

Элементу массива numbers1 с координатами 1,1 присвоим значение 8:

numbers1[1, 1] = 8;

Есть матрица 7х4. Строки, которых семь, будут соответствовать дням недели, а 4 столбца - времени дня (00:00, 06:00, 12:00, 18:00). В качестве данных будет температура воздуха. Значение температуры с координатами [2,3] будет соответствовать температуре в среду в 18:00.

 

Пример.

Найти произведение двух матриц

using System;

static void Main()

{

const int m=3,n=3;

int [,] a= new int[m,n]

{

{1,1,1},

{0,0,0},

{3,3,3}

};

int [,] b= new int[m,n]

{

{1,2,3},

{4,5,6},

{7,8,9}

};

int [,] c= new int[m,n];

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

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

{

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

Console.Write(“\t” +a[i,j]);

Console.WriteLine();

}

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

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

{

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

Console.Write(“\t” +b[i,j]);

Console.WriteLine();

}

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

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

{

int s=0;

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

s+= a[i,k]*b[k,j];

c[i,j] = s;

}

Console.WriteLine(“Полученное произведение матриц: ”);

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

{

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

Console.Write(“\t” +с[i,j]);

Console.WriteLine();

}

}

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-12-29 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: