АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ
425.00K
Category: programmingprogramming

Лекция 4

1. АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ

2.

Массивы
Основные понятия массивов
Ранг: количество измерений массива
Длина измерения: длина отдельного измерения массива
Длина массива: количество всех элементов массива
Пример:
int[,] а = new int[3, 4];
Массив а двухмерный, имеет два измерения, ранг равен 2.
Длина первого измерения - 3, длина второго измерения - 4.
Длина массива - 12.

3.

Массивы
Массив представляет поименованную область данных одного типа.
• Для любого созданного массива память выделяется с помощью
оператора new. Это означает, что массивы есть ссылочного типа (а не
типа значения). Следовательно переменные типа «массив» являются
ссылками на эти массивы.
• После присваивания значения одной переменной (ссылки на массив)
другой переменной, обе переменные будут указывать (ссылаться) на
один и тот же массив. То есть, копия массива не создается.
• Чтобы переменные указывали на разные участки памяти (разные
массивы данных) – для любой из них нужно выделять память
оператором new.
• Если нужно выполнить копирование данных одного массива в другой,
то это нужно выполнить программным путем, например с помощью
операторов цикла.
Объявление массива:
тип_переменной[ ] название_массива;

4.

Массивы
Пример:
int [ ] а;
Пример:
int[ ] а = new int[4]; выделение памяти под массив из 4 элементов
При таком определении все элементы получают значение по
умолчанию, которое предусмотрено для их типа. Для типа int значение
по умолчанию - 0.
Можно провести инициализацию значений элементов массива.
Пример:
int[] а1 = new int[4] { 1, 2, 3, 5 };
int[] а2 = new int[] { 1, 2, 3, 5 };
int[] а3 = new[] { 1, 2, 3, 5 };
int[] а4 = { 1, 2, 3, 5 };
string[] a5 = { "Tom", "Som", "Bob" };

5.

Массивы
Пример присваивания переменным ссылок на массив:
// объявление массива M1 из 20 вещественных чисел
double[] M1 = new double[20];
// объявление переменной типа массив M2 (память не выделяется)
double[] M2;
// заполнение массива M1 произвольными значениями
for (int i = 0; i < 20; i++)
M1[i] = 0.1 * i;
M2 = M1; // теперь M2 и M1 ссылаются на один и тот же участок памяти
double d;
d = M2[3];
// d = 0.3

6.

Массивы
В языке C# можно объявлять неявно-типизированные массивы.
Объявление неявно-типизированных массивов подобно объявлению
неявно типизированных одиночных переменных.
Общая форма объявления неявно типизированного одномерного
массива:
var имя_массива = new[] { значение1, значение2, ..., значениеN };
• имя_массива – непосредственно имя массива;
• значение1, значение2, значениеN – набор значений, которые
получают элементы массива. На основе типа данных этих значений
определяется тип элементов массива.
Для обращения к элементам массива используются индексы. Индекс
представляет номер элемента в массиве, при этом нумерация
начинается с нуля, поэтому индекс первого элемента будет равен 0,
индекс четвертого элемента - 3.
Используя индексы, можно получить значение элемента массива.

7.

Массивы
Пример:
var A = new[] { 5, 10, 23, 16, 8 };
5
var B = new[] { true, false, false };
var C = new[] { 'A', ';', '\'', '\n', '5', 'z' };
var X = new[] { 2.86, 2.0, 3.5 };
int d;
bool b; char c; float f;
d = A[2]; // d = 23
b = B[1]; // b = false
c = C[4]; // c = '5'
f = (float)X[2]; // f = 3.5
Пример:
int[] а1 = { 1, 2, 3, 5 };
Console.WriteLine(а1[3]); // 5
var n = а1[1]; // 2
Console.WriteLine(n); // 2
// тип элементов - int, количество // тип bool, количество - 3
// тип char, количество - 6
// тип double, количество - 3

8.

Массивы
Свойство Length
Каждый массив имеет свойство Length, которое хранит длину массива
или количество элементов массива.
Пример:
int[] а = { 1, 2, 3, 5 };
Console.WriteLine(а.Length); // 4

9.

Массивы
Получение элементов с конца массива
Пример:
int[] а = { 1, 2, 3, 5};
Console.WriteLine(а[а.Length - 1]); // 5
Console.WriteLine(а[а.Length - 2]); // 3
Console.WriteLine(а[а.Length - 3]); // 2
int[] а = { 1, 2, 3, 5};
Console.WriteLine(а[^1]); // 5 - первый с конца или последний элемент
Console.WriteLine(а[^2]); // 3 - второй с конца или предпоследний
элемент
Console.WriteLine(а[^3]); // 2 - третий элемент с конца
Перебор массивов
Пример:
int[] а = { 1, 2, 3, 4, 5 };
foreach (int i in а)
{
Console.WriteLine(i);
}

10.

Массивы
Пример:
int[] а = { 1, 2, 3, 4, 5};
for (int i = 0; i < а.Length; i++)
{
Console.WriteLine(а[i]);
}
Цикл
for
более
гибкий
по
сравнению
с
foreach.
Если foreach последовательно извлекает элементы контейнера и только
для чтения, то в цикле for можно обращаться к элементам в зависимости
от приращения счетчика или заданного номера элемента, а также можно
изменять элементы:
Пример:
int[] а = { 1, 2, 3, 4, 5 };
for (int i = 0; i < а.Length; i++)
{
а[i] = а[i] * 2;
Console.WriteLine(а[i]);
}

11.

Массивы
Многомерные массивы
Массивы характеризуются таким понятием как ранг или количество
измерений. У многомерных массивов количество измерений (то есть
ранг) больше 1.
Массивы которые имеют два измерения (ранг равен 2) являются
двухмерными.
Пример:
int[] а1 = new int[] { 0, 1, 2, 3, 4, 5 };
int[,] а2 = { { 0, 1, 2 }, { 3, 4, 5 } };
1.
012345
2.
012
345

12.

Массивы
Многомерные массивы
Пример:
int[,] а1;
int[,] а2 = new int[2, 3];
int[,] а3 = new int[2, 3] { { 0, 1, 2 }, { 3, 4, 5 } };
int[,] а4 = new int[,] { { 0, 1, 2 }, { 3, 4, 5 } };
int[,] а5 = new [,]{ { 0, 1, 2 }, { 3, 4, 5 } };
int[,] а = { { 0, 1, 2 }, { 3, 4, 5 } };
Пример:
int[,,] а1 = new int[2, 3, 4];
Перебор значений.
Пример:
int[,] а = { { 1, 2, 3 }, { 4, 5, 6 }};
foreach (int i in а)
Console.Write($"{i} ");
123456

13.

Массивы
Многомерные массивы
Пример объявления и использования неявно
двумерного массива
типизированного
Пример:
var MI = new[,] { { 3, 5, -4 },{ 2, -1, 0 },{ 4, 9, 3 },{ -11, -5, 91 } };
// двумерный массив размером 3*4, тип элементов - char
var MC = new[,] { { '1', '2', '3', '4' },{ 'A', 'B', 'C', 'D' },{ 'e', 'f', 'g', 'h' } };
var MD = new[,] { { 0.2, 3.5 },{ 3.3, -3.88 } };
int i;
char c;
double d;
i = MI[2,1];
c = MC[0, 2];
d = MD[1, 0];
// i = 9
// c = '3'
// d = 3.3

14.

Массивы
Многомерные массивы
Для движения по элементам массива
количество элементов в размерности.
необходимо
получить
Метод GetUpperBound(номер_размерности), который возвращает
индекс последнего элемента в определенной размерности.
Первая размерность (с индексом 0) это и есть таблица. И с помощью
выражения
а.GetUpperBound(0) + 1
можно получить количество
двухмерным массивом.
строк
таблицы,
представленной
Через выражение
а.Length / количество_строк
можно получить количество элементов в каждой строке

15.

Массивы
Многомерные массивы
Пример:
int[,] а= { { 1, 2, 3 }, { 4, 5, 6 }};
int rows = а.GetUpperBound(0) + 1; // количество строк
int columns = а.Length / rows;
// количество столбцов
// int columns = а.GetUpperBound(1) + 1;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
Console.Write($"{а[i, j]} \t");
}
Console.WriteLine();
}
1
2
3
4
5
6

16.

Массивы
Многомерные массивы
Массив массивов или «зубчатый массив» или «ступенчатый»:
Пример:
int[][] nums = new int[3][];
nums[0] = new int[2] { 1, 2 };
// память для первого подмассива
nums[1] = new int[3] { 1, 2, 3 };
// память для второго подмассива
nums[2] = new int[5] { 1, 2, 3, 4, 5 }; // память для третьего подмассива
Две группы квадратных скобок, которые указывают, что это массив
массивов, то есть такой массив, который в свою очередь содержит в
себе другие массивы.
Длина массива указывается только в первых квадратных скобках, все
последующие квадратные скобки должны быть пусты: new int[3][]. В
данном случае массив nums содержит три массива.
Размерность каждого из этих массивов может не совпадать.
Альтернативное определение массива массивов:

17.

Массивы
Многомерные массивы
Альтернативное определение массива массивов.
Пример:
int[][] numbers = {
new int[] { 1, 2 },
new int[] { 1, 2, 3 },
new int[] { 1, 2, 3, 4, 5 }
};
Пример:
var A = new[] {
new[] { 1, 3, 4, 10, 23, 46 },
new[] { 2, -4, 8 },
new[] { 0, -1, 2, -3, 0 }
};
int d;
d = A[0][2];
// d = 2
d = A[2][3];
// d = -3

18.

Массивы
Многомерные массивы
Перебор зубчатых массивов.
Пример:
int[][] а= new int[3][];
а[0] = new int[] { 1, 2 };
а[1] = new int[] { 1, 2, 3 };
а[2] = new int[] { 1, 2, 3, 4, 5 };
foreach(int[] row in а)
{
foreach(int number in row)
{
Console.Write($"{number} \t");
}
Console.WriteLine();
}
// перебор с помощью цикла for
for (int i = 0; i<а.Length;i++)
{
for (int j =0; j<а[i].Length; j++)
{
Console.Write($"{а[i][j]} \t");
}
Console.WriteLine();
}

19.

Массивы
Все массивы в C# построены на основе класса Array из пространства
имен System. Этот класс определяет ряд свойств и методов, которые
можно использовать при работе с массивами.
Основные свойства и методы:
• Свойство Length возвращает длину массива (количество элементов
массива)
int[,] UI = new int[200,10]; // двумерный массив
Пример:
bool[][] B = new bool[3][]; // зубчатый массив
char[] C = new char[20]; float[, ,] F = new float[3, 4, 5]; // трехмерный массив
float[] F = new float[100];
int[] I = new int[500];
int d;
d = C.Length; // d = 20
d = F.Length; // d = 100
d = I.Length; // d = 500
B[0] = new bool[10];
B[1] = new bool[15];
B[2] = new bool[20];
int d;
d = UI.Length; // d = 200*10 = 2000
d = B[0].Length; // d = 10
d = B[1].Length; // d = 15
d = B.Length; // d = 3
d = F.Length; // d = 3*4*5 = 60

20.

Массивы
• Свойство
измерений)
Rank
возвращает
размерность
массива
(количество
Пример:
string[] D;
D = new string[] {"S", "M", "T", "W", “A", "F", “B" };
Console.WriteLine(“Измерение для массива: " + D.Rank); //1
Пример:
int[][] a1 = new int[2][];
int[, ] a2 = new int[4, 2];
int[,, ] a3 = new int[4, 2, 3];
Console.WriteLine("Измерение для массива a1:"+ a1.Rank);//1
Console.WriteLine(" Измерение для массива a2: "+ a2.Rank);//2
Console.WriteLine(" Измерение для массива a3: "+ a3.Rank);//3

21.

Массивы
• Метод int BinarySearch (Array array, object? value) выполняет
бинарный поиск в отсортированном массиве и возвращает индекс
найденного элемента
аrray - отсортированный одномерный массив, в котором
выполняется поиск.
value – значение объекта, которое нужно найти.
Результатом работы будет индекс заданного параметра value в
указанном массиве array, если параметр value найден; в противном
случае - отрицательное число.
Если параметр value не найден и значение параметра value меньше
одного или нескольких элементов массива array, возвращенное
отрицательное число - это побитовое дополнение индекса первого
элемента, превышающего по значению параметр value.
Если параметр value не найден и значение value больше всех
элементов массива array, возвращенное отрицательное число является
побитовым дополнением увеличенного на 1 индекса последнего
элемента.
Если этот метод вызывается с неотсортированным array,
возвращаемое значение может быть неправильным, и может быть
возвращено отрицательное число, даже если value присутствует в array.

22.

Массивы
Данный метод не поддерживает поиск массивов, содержащих
отрицательные индексы.
Допустимы повторяющиеся элементы. Если содержится несколько
элементов, равных value, метод возвращает индекс только одного из
вхождений, и не обязательно первого.

23.

Массивы
• Метод void Clear очищает массив, устанавливая для всех его
элементов значение по умолчанию.
void Clear(Array array, int index, int length);
Array массив, элементы которого необходимо очистить.
• Index начальный индекс диапазона элементов, которые необходимо
очистить.
Length число элементов, подлежащих очистке.
Тип
Значение
Boolean
false
Все целочисленные и числовые
типы с плавающей запятой
0 (ноль)

24.

Массивы
• Метод void Copy (Array array1, int Index1, Array array2, int Index, int
length) копирует из массива array1 начиная с индекс Index1, количество
length элементов в массив аrray2 начиная с индекса Index2.
Копирует диапазон элементов из массива array1,
начиная с первого элемента, и вставляет его в другой
Copy (array1, array2, int32)
массив array2, также начиная с первого элемента. Длина
задается как 32-битовое целое число.
Копирует диапазон элементов из массива array1,
начиная с первого элемента, и вставляет его в другой
Copy (array1, array2, int64))
массив array2, также начиная с первого элемента. Длина
задается как 64-битовое целое число.
Копирует диапазон элементов из массива array1,
начиная с заданного индекса источника, и вставляет его
Copy (array1, int32, array2,
в другой массив array2, начиная с заданного индекса
int32, int32)
назначения. Длина и индексы задаются как 32-битовые
целые числа.
Копирует диапазон элементов из массива array1,
начиная с заданного индекса источника, и вставляет его
Copy (array1, int64, array2,
в другой массив array2, начиная с заданного индекса
int64, int64
назначения. Длина и индексы задаются как 64разрядные целые числа.

25.

Массивы
• Параметры аrray1 аrray2 должны иметь одинаковое количество
измерений. Кроме того, аrray2 должен быть уже измерен и должно быть
достаточно элементов для размещения скопированных данных.
• При копировании между многомерными массивами массив ведет себя
как длинный одномерный массив, где строки (или столбцы)
концептуально располагаются в конце. Например, если массив содержит
три строки (или столбцы) с четырьмя элементами, копирование шести
элементов из начала массива приведет к копированию всех четырех
элементов первой строки (или столбца) и первых двух элементов второй
строки (или столбца).

26.

Массивы
• bool Exists<T> (T[] array, Predicate<T> match) проверяет, содержит
ли массив array элементы, которые удовлетворяют условию делегата
match
bool Exists<T> (T[] array, Predicate<T> match);
T - тип элементов массива.
аrray T[] - одномерный массив, индексация которого начинается с нуля и
в котором нужно выполнить поиск.
мatch Predicate<T> - Объект Predicate<T>, определяющий условия
поиска элементов.
Возвращаемое значение - значение true, если массив array содержит
один или несколько элементов, удовлетворяющих условиям указанного
предиката; в противном случае — значение false.
Пример:
string[] planets = {
"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Uranus", "Neptune" };
Console.WriteLine(«Определение наличия Pl вмассиве: {0}",
Array.Exists(planets, element => element == "Pl"));

27.

Массивы
• Метод void Fill<T> (T[] array, T value) заполняет массив array
значением value
void Fill<T> (T[] array, T value, int startIndex, int count);
Присваивает
заданное
value
типа
T
элементам
array,
которые
находятся
в
Fill<T>(T[], T, указанного
Int32, Int32) диапазоне startIndex (включительно) и следующем
количестве count индексов.
Присваивает заданное value типа T каждому элементу
Fill<T>(T[], T)
указанного array.

28.

Массивы
void Reverse располагает элементы массива в обратном порядке
Изменяет порядок подмножества элементов в
Reverse(аrray,
одномерном массиве Array на обратный с
Int32, Int32)
определенного элемента в заданном количестве.
Изменяет порядок элементов во всем одномерном
Reverse(Array)
массиве Array на обратный.
Изменяет порядок последовательности элементов в
Reverse<T>(T[]) одномерном общем массиве на обратный.
Изменяет порядок последовательности подмножества
Reverse<T>(T[],
элементов в одномерном общем массиве на
Int32, Int32)
обратный.

29.

Массивы
void Sort сортирует элементы одномерного массива
Сортирует
диапазон
элементов
в
паре
одномерных
объектов Array (один содержит ключи, а другой — соответствующие
Sort(аrray, аrray, Int32, Int32,
элементы) по ключам в первом массиве Array, используя указанный
IComparer)
интерфейс IComparer.
Сортирует элементы в диапазоне элементов одномерного
Sort(аrray, Int32, Int32, IComparer)
массива Array, используя указанный интерфейс IComparer.
Сортирует
диапазон
элементов
в
паре
одномерных
объектов Array (один содержит ключи, а другой — соответствующие
Sort(аrray, аrray, Int32, Int32)
элементы) по ключам в первом массиве Array, используя
реализацию интерфейса IComparable каждого ключа.
Сортирует элементы в диапазоне элементов одномерного
массива
Array
с
помощью
реализации
Sort(аrray, Int32, Int32)
интерфейса IComparable каждого элемента массива Array.
Сортирует элементы в одномерном массиве Array, используя
Sort(аrray, IComparer)
указанный интерфейс IComparer.
Сортирует пару одномерных объектов Array (один содержит ключи, а
другой — соответствующие элементы) по ключам в первом
Sort(аrray, аrray)
массиве
Array,
используя
реализацию
интерфейса IComparable каждого ключа.
Сортирует элементы во всем одномерном массиве Array, используя
реализацию
интерфейса
IComparable
каждого
элемента
Sort(аrray)
массива Array.
Сортирует пару одномерных объектов Array (один содержит ключи, а
другой — соответствующие элементы) по ключам в первом
Sort(аrray, аrray, IComparer)
массиве Array, используя указанный интерфейс IComparer.

30.

Массивы
Сортирует элементы во всем массиве Array, используя реализацию
универсального интерфейса IComparable<T> каждого элемента
Sort<T>(T[])
массива Array.
Сортирует элементы в массиве Array, используя указанный
Sort<T>(T[], IComparer<T>)
универсальный интерфейс IComparer<T>.
Сортирует элементы массива Array с использованием указанного
Sort<T>(T[], Comparison<T>)
объекта Comparison<T>.
Сортирует элементы в диапазоне элементов массива Array,
используя
реализацию
универсального
Sort<T>(T[], Int32, Int32)
интерфейса IComparable<T> каждого элемента массива Array.
Сортирует элементы в диапазоне элементов массива Array,
Sort<T>(T[], Int32, Int32,
используя указанный универсальный интерфейс IComparer<T>.
IComparer<T>)
Сортирует пару объектов Array (один содержит ключи, а другой —
соответствующие элементы) по ключам в первом массиве Array,
Sort<TKey,TValue>(TKey[], TValue[])
используя
реализацию
универсального
интерфейса IComparable<T> каждого ключа.
Сортирует пару объектов Array (один содержит ключи, а другой —
Sort<TKey,TValue>(TKey[], TValue[],
соответствующие элементы) по ключам в первом массиве Array,
IComparer<TKey>)
используя указанный универсальный интерфейс IComparer<T>.
Сортирует диапазон элементов в паре объектов Array (один
Sort<TKey,TValue>(TKey[], TValue[], содержит ключи, а другой — соответствующие элементы) по
ключам в первом массиве Array, используя реализацию
Int32, Int32)
универсального интерфейса IComparable<T> каждого ключа.
Сортирует диапазон элементов в паре объектов Array (один
Sort<TKey,TValue>(TKey[], TValue[], содержит ключи, а другой — соответствующие элементы) по
Int32, Int32, IComparer<TKey>) ключам в первом массиве Array, используя указанный
универсальный интерфейс IComparer<T>.
English     Русский Rules