Массивы в Си-шарп.
Операторы 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();
}
}