№ | Слайд | Текст |
1 |
 |
Перечисления и массивы1 ©Павловская Т.А. (НИУ ИТМО) |
2 |
 |
Перечислимый тип данныхПеречисление — отдельный тип-значение, содержащий совокупность именованных констант. Пример: enum Color : long { Red, Green, Blue } Каждый элемент перечисления имеет связанное с ним константное значение, тип которого определяется базовым типом перечисления. Базовые типы: byte, sbyte, short, ushort, int, uint, long и ulong. По умолчанию – int. Базовый класс - System.Enum. Перечисление может иметь модификатор (new, public, protected, internal, private). Он имеет такое же значение, как и при объявлении классов. 2 ©Павловская Т.А. (НИУ ИТМО) |
3 |
 |
Значения элементов перечисленияЗначение элемента задается либо явно, либо неявно, а именно: Первый элемент автоматически принимает значение 0. Последующие элементы принимают значение предыдущего + 1. enum Button {Start, Stop, Play, Next, Prev }; // неявно enum Color { Red, // 0 неявно Green = 10, // 10 явно Blue // 11 неявно } enum Nums { two = 2, three, ten = 10, eleven, fifty = ten + 40 }; Несколько элементов перечисления могут иметь одно и то же значение. Элементы одного перечисления не могут иметь одинаковые имена. 3 ©Павловская Т.А. (НИУ ИТМО) |
4 |
 |
Действия с элементами перечисленийАрифметические операции (+, –, ++, ––) логические поразрядные операции (^, &, |, ~) сравнение с помощью операций отношения (<, <=, >, >=, ==, !=) получение размера в байтах (sizeof) вывод на консоль enum Menu { Read, Write, Edit, Quit }; Menu m, n; … m = Menu.Read; n = m; n++; if (n > m ) Console.WriteLine(n); Каждое перечисление определяет отдельный тип; для преобразования между перечислением и целым типом или между двумя перечислениями требуется явное приведение типа. 4 ©Павловская Т.А. (НИУ ИТМО) |
5 |
 |
ИзменениеПример 1 enum Color { Red, Yellow, Green } class Test { static void Main() { Color color = Color.Red; // или Color color = 0; … // изменение color switch (color) { case Color.Red: Console.WriteLine("Стойте"); break; case Color.Green: Console.WriteLine("Идите"); break; case Color.Yellow: Console.WriteLine("Ждите"); break; default: Console.WriteLine("Светофор сломан");break; } } 5 ©Павловская Т.А. (НИУ ИТМО) |
6 |
 |
Enum colorПример 2 enum Color { Red = 0x000000FF, Green = 0x0000FF00, Blue = 0x00FF0000 } class Test { static void Main() { Console.WriteLine(StringFromColor(Color.Green)); } static string StringFromColor(Color c) { switch (c) { case Color.Red: return String.Format("Red = {0:X}", (int)c); case Color.Green: return String.Format("Green = {0:X}", (int)c); case Color.Blue: return String.Format("Blue = {0:X}", (int)c); default: return "Invalid color"; } } } 6 ©Павловская Т.А. (НИУ ИТМО) |
7 |
 |
ConsoleБазовый класс - System.Enum int x = (int) Color.Green; enum Color { Red, Yellow, Green } class Test { static void Main() { Color color = 0; string[] names = Enum.GetNames(typeof(Color)); foreach (string name in names) Console.WriteLine(name); int[] values = (int[])Enum.GetValues(typeof(Color)); foreach (int value in values) Console.WriteLine(value); if (Enum.IsDefined(typeof(Color), "Blue")) Console.WriteLine("Есть такой цвет!"); else Console.WriteLine("Нет такого цвета!"); int x = (int) Enum.Parse(typeof(Color), "Green"); Console.WriteLine(x); 7 ©Павловская Т.А. (НИУ ИТМО) |
8 |
 |
МассивыМассив — ограниченная совокупность однотипных величин Элементы массива имеют одно и то же имя, а различаются по порядковому номеру (индексу) Виды массивов в C#: одномерные многомерные (например, двумерные, или прямоугольные) массивы массивов (др. термины: невыровненные, ступенчатые). 8 ©Павловская Т.А. (НИУ ИТМО) |
9 |
 |
Создание массиваМассив относится к ссылочным типам данных (располагается в хипе), поэтому создание массива начинается с выделения памяти под его элементы. Элементами массива могут быть величины как значимых, так и ссылочных типов (в том числе массивы), например: int[] w = new int[10]; // массив из 10 целых чисел string[] z = new string[100]; // массив из 100 строк Monster [] s = new Monster[5]; // массив из 5 монстров double[,] t = new double[2, 10]; // прямоуг. массив 2х10 int[,,,] m = new int[2,2,2,2]; // 4-xмерный массив int[][][] a = new int[2][][]; … // массив массивов массивов Массив значимых типов хранит значения, массив ссылочных типов — ссылки на элементы. Всем элементам при создании массива присваиваются значения по умолчанию: нули для значимых типов и null для ссылочных. 9 ©Павловская Т.А. (НИУ ИТМО) |
10 |
 |
Размещение массивов в памяти10 ©Павловская Т.А. (НИУ ИТМО) |
11 |
 |
Размерность массиваКоличество элементов в массиве (размерность) задается при выделении памяти и не может быть изменена впоследствии. Она может задаваться выражением: short n = ...; string[] z = new string[2*n + 1]; Размерность не является частью типа массива. Элементы массива нумеруются с нуля. Для обращения к элементу массива после имени массива указывается номер элемента в квадратных скобках, например: w[4] z[i] 11 ©Павловская Т.А. (НИУ ИТМО) |
12 |
 |
Действия с массивамиС элементом массива можно делать все, что допустимо для переменных того же типа. При работе с массивом автоматически выполняется контроль выхода за его границы: если значение индекса выходит за границы массива, генерируется исключение IndexOutOfRangeException. Массивы одного типа можно присваивать друг другу. При этом происходит присваивание ссылок, а не элементов: int[] c = new int[10]; int[] b = c; // b и c указывают на // один и тот же массив 12 ©Павловская Т.А. (НИУ ИТМО) |
13 |
 |
Одномерные массивыВарианты описания массива: тип[] имя; тип[] имя = new тип [ размерность ]; тип[] имя = { список_инициализаторов }; тип[] имя = new тип [] { список_инициализаторов }; тип[] имя = new тип [ размерность ] { список_инициализаторов }; Примеры описаний (один пример на каждый вариант описания, соответственно): int[] a; // память под элементы не выделена int[] b = new int[4]; // элементы равны 0 int[] c = { 61, 2, 5, -9 }; // new подразумевается int[] d = new int[] { 61, 2, 5, -9 }; // размерность вычисляется int[] e = new int[4] { 61, 2, 5, -9 }; // избыточное описание 13 ©Павловская Т.А. (НИУ ИТМО) |
14 |
 |
Количество отрицательных элементовПример Для массива, состоящего из 6 целочисленных элементов, программа определяет: сумму и количество отрицательных элементов; максимальный элемент. 14 ©Павловская Т.А. (НИУ ИТМО) |
15 |
 |
ПрограммаПрограмма (не лучший способ) 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_otr = 0; // cумма отрицательных элементов int num_otr = 0; // количество отрицательных элементов for ( int i = 0; i < n; ++i ) if ( a[i] < 0 ) { sum_otr += a[i]; ++num_otr; } Console.WriteLine( "Сумма отрицательных = " + sum_otr ); Console.WriteLine( "Кол-во отрицательных = " + num_otr ); int max = a[0]; // максимальный элемент for ( int i = 0; i < n; ++i ) if ( a[i] > max ) max = a[i]; Console.WriteLine( "Максимальный элемент = " + max ); 15 ©Павловская Т.А. (НИУ ИТМО) |
16 |
 |
ОператорОператор foreach (упрощенно) Применяется для перебора элементов массива. Синтаксис: foreach ( тип имя in имя_массива ) тело_цикла имя задает локальную по отношению к циклу переменную, которая будет по очереди принимать все значения из массива, например: int[] massiv = { 24, 50, 18, 3, 16, -7, 9, -1 }; foreach ( int x in massiv ) Console.WriteLine( x ); 16 ©Павловская Т.А. (НИУ ИТМО) |
17 |
 |
Исходный массивПрограмма с использованием foreach int[] a = { 3, 12, 5, -9, 8, -4 }; Console.WriteLine( "Исходный массив:" ); foreach ( int elem in a ) Console.Write( "\t" + elem ); Console.WriteLine(); long sum_otr = 0; // cумма отрицательных элементов int num_otr = 0; // количество отрицательных элементов foreach ( int elem in a ) if ( elem < 0 ) { sum_otr += elem; ++num_otr; } Console.WriteLine( "sum = " + sum_otr ); Console.WriteLine( "num = " + num_otr ); int max = a[0]; // максимальный элемент foreach ( int elem in a ) if ( elem > max ) max = elem; Console.WriteLine( "max = " + max ); - Cумма и количество отрицательных элементов; - максимальный элемент. for ( int i = 0; i < n; ++i ) if ( a[i] < 0 ) { sum_otr += a[i]; ++num_otr; } 17 ©Павловская Т.А. (НИУ ИТМО) |
18 |
 |
Cумма отрицательных элементовПрограмма в true style ? class Mas_1 // класс для работы с 1-мерным массивом { int[] a = { 3, 12, 5, -9, 8, -4 }; // для простоты слайда public void PrintMas() // вывод массива { Console.Write("Массив: "); foreach (int elem in a) Console.Write(" " + elem); Console.WriteLine(); } public long SumOtr() // cумма отрицательных элементов { long sum_otr = 0; foreach (int elem in a) if (elem < 0) sum_otr += elem; return sum_otr; } 18 ©Павловская Т.А. (НИУ ИТМО) |
19 |
 |
Максимальный элементPublic int numotr() // кол-во отрицательных элементов { int num_otr = 0; foreach (int elem in a) if (elem < 0) ++num_otr; return num_otr; } public int maxelem() // максимальный элемент { int max = a[0]; foreach (int elem in a) if (elem > max) max = elem; return max; } } 19 ©Павловская Т.А. (НИУ ИТМО) |
20 |
 |
Суммаclass Program // класс-клиент { static void Main(string[] args) { Mas_1 mas = new Mas_1(); mas.PrintMas(); long sum_otr = mas.SumOtr(); if (sum_otr != 0) Console.WriteLine("Сумма отриц. = " + sum_otr); else Console.WriteLine("Отриц-х эл-тов нет"); int num_otr = mas.NumOtr(); if (num_otr != 0) Console.WriteLine("Кол-во отриц. = " + num_otr); else Console.WriteLine("Отриц-х эл-тов нет"); Console.WriteLine("Макс. элемент = " + mas.MaxElem()); } } 20 ©Павловская Т.А. (НИУ ИТМО) |
21 |
 |
Пример анализа заданияНайти среднее арифметическое элементов, расположенных между минимумом и максимумом Варианты результата: выводится среднее арифметическое выводится сообщение «таких элементов нет» (мин. и макс. рядом или все элементы массива одинаковы) Вопрос: если макс. или мин. эл-тов несколько? Варианты тестовых данных: минимум левее максимума наоборот рядом более одного мин/макс все элементы массива равны все элементы отрицательные 21 ©Павловская Т.А. (НИУ ИТМО) |
22 |
 |
Варианты тестовых данныхЕще один пример анализа задания Найти сумму элементов, расположенных между первым и последним элементами, равными нулю Варианты результата: выводится сумма выводится сообщение «таких элементов нет» (нулевые эл-ты рядом или их меньше двух) Варианты тестовых данных: два эл-та, равных нулю, не рядом два эл-та, равных нулю, рядом один эл-т, равный нулю ни одного более двух … 22 ©Павловская Т.А. (НИУ ИТМО) |
23 |
 |
Сортировка выбором23 ©Павловская Т.А. (НИУ ИТМО) |
24 |
 |
Алгоритм сортировкиНайти, где расположен минимальный элемент массива Поменять его местами с 1-м элементом. Первый элемент теперь на нужном месте. Среди элементов, начиная со 2-го, найти, где расположен минимальный элемент массива Поменять его местами со 2-м элементом. Второй элемент теперь на нужном месте. Среди элементов, начиная с 3-го, найти, где расположен минимальный элемент массива Поменять его местами с 3-м элементом. Третий элемент теперь на нужном месте. ... Среди элементов, начиная с предпоследнего (n-1), найти, где расположен минимальный элемент массива Поменять его местами с (n-1)-м элементом. Повторить (n-1) раз (i := 1 to n-1): Среди элементов, начиная с i-го, найти, где расположен минимальный элемент массива Поменять его местами с i-м элементом. i-й элемент теперь на нужном месте. 24 ©Павловская Т.А. (НИУ ИТМО) |
25 |
 |
Обмен значений двух переменных5 3 5 3 3 25 ©Павловская Т.А. (НИУ ИТМО) |
26 |
 |
Базовый класс ArrayВсе массивы в C# имеют общий базовый класс Array, определенный в пространстве имен System. Некоторые элементы класса Array: Length (Свойство) - Количество элементов массива (по всем размерностям) BinarySearch (Статический метод) - Двоичный поиск в отсортированном массиве IndexOf – (Статический метод) - Поиск первого вхождения элемента в одномерный массив Sort (Статический метод) - Упорядочивание элементов одномерного массива 26 ©Павловская Т.А. (НИУ ИТМО) |
27 |
 |
Использование методов класса Arraystatic void Main() { int[] a = { 24, 50, 18, 3, 16, -7, 9, -1 }; PrintArray( "Исходный массив:", a ); Console.WriteLine( Array.IndexOf( a, 18 ) ); Array.Sort(a); // Array.Sort(a, 1, 5); PrintArray( "Упорядоченный массив:", a ); Console.WriteLine( Array.BinarySearch( a, 18) ); Array.Reverse(a); // Array.Reverse(a, 2, 4); } public static void PrintArray( string header, int[] a ) { Console.WriteLine( header ); for ( int i = 0; i < a.Length; ++i ) Console.Write( "\t" + a[i] ); Console.WriteLine(); } 27 ©Павловская Т.А. (НИУ ИТМО) |
28 |
 |
Номер минимума/максимумаЧто вы должны уметь найти в массиве: минимум/максимум [по модулю] номер минимума/максимума [по модулю] номер первого/второго/последнего положительного/отрицательного/нулевого эл-та сумма/произведение/количество/сред. арифм-е положительных/отрицательных/нулевых эл-тов упорядочить массив НЕ методом пузырька. анализировать все возможные варианты расположения исходных данных 28 ©Павловская Т.А. (НИУ ИТМО) |
29 |
 |
Прямоугольные массивыПрямоугольный массив имеет более одного измерения. Чаще всего в программах используются двумерные массивы. Варианты описания двумерного массива: тип[,] имя; тип[,] имя = new тип [ разм_1, разм_2 ]; тип[,] имя = { список_инициализаторов }; тип[,] имя = new тип [,] { список_инициализаторов }; тип[,] имя = new тип [ разм_1, разм_2 ] { список_инициализаторов }; Примеры описаний (один пример на каждый вариант описания): int[,] a; // элементов нет int[,] b = new int[2, 3]; // элементы равны 0 int[,] c = {{1, 2, 3}, {4, 5, 6}}; // new подразумевается int[,] c = new int[,] {{1, 2, 3}, {4, 5, 6}}; // разм-сть вычисляется int[,] d = new int[2,3] {{1, 2, 3}, {4, 5, 6}}; // избыточное описание 29 ©Павловская Т.А. (НИУ ИТМО) |
30 |
 |
Номера строки и столбцаК элементу двумерного массива обращаются, указывая номера строки и столбца, на пересечении которых он расположен: a[1, 4] b[i, j] b[j, i] Компилятор воспринимает как номер строки первый индекс, как бы он ни был обозначен в программе. 30 ©Павловская Т.А. (НИУ ИТМО) |
31 |
 |
Среднее арифметическое всех элементовПример Программа определяет: среднее арифметическое всех элементов; количество положительных элементов в каждой строке для целочисленной матрицы размером 3 х 4 31 ©Павловская Т.А. (НИУ ИТМО) |
32 |
 |
Const int m = 3const int m = 3, n = 4; int[,] a = new int[m, n] { { 2,-2, 8, 9 }, {-4,-5, 6,-2 }, { 7, 0, 1, 1 } }; Console.WriteLine( "Исходный массив:" ); for ( int i = 0; i < m; ++i ) { for ( int j = 0; j < n; ++j ) Console.Write( "\t" + a[i, j] ); Console.WriteLine(); } 32 ©Павловская Т.А. (НИУ ИТМО) |
33 |
 |
Количество положительных элементовint nPosEl; for ( int i = 0; i < m; ++i ) { nPosEl = 0; for ( int j = 0; j < n; ++j ) if ( a[i, j] > 0 ) ++nPosEl; Console.WriteLine( "В строке {0} {1} положит-х эл-в", i, nPosEl); } double sum = 0; foreach ( int x in a ) sum += x; // все элементы массива! Console.WriteLine( "Среднее арифметическое всех элементов: " + sum / m / n ); - Среднее арифметическое всех элементов; - количество положительных элементов в каждой строке 33 ©Павловская Т.А. (НИУ ИТМО) |
34 |
 |
Ступенчатые массивыВ ступенчатых массивах количество элементов в разных строках может различаться. В памяти ступенчатый массив хранится иначе, чем прямоугольный: в виде нескольких внутренних массивов, каждый из которых имеет свой размер. Кроме того, выделяется отдельная область памяти для хранения ссылок на каждый из внутренних массивов. 34 ©Павловская Т.А. (НИУ ИТМО) |
35 |
 |
Описание ступенчатого массиватип[][] имя; Под каждый из массивов, составляющих ступенчатый массив, память требуется выделять явным образом: int[][] a = new int[3][]; // память под ссылки на 3 строки a[0] = new int[5]; // память под 0-ю строку (5 эл-в) a[1] = new int[3]; // память под 1-ю строку (3 эл-та) a[2] = new int[4]; // память под 2-ю строку (4 эл-та) Или: int[][] a = { new int[5], new int[3], new int[4] }; Обращение к элементу ступенчатого массива: a[1][2] a[i][j] a[j][i] 35 ©Павловская Т.А. (НИУ ИТМО) |
36 |
 |
Поиск числаПример int[][] a = new int[3][]; a[0] = new int [5] { 24, 50, 18, 3, 16 }; a[1] = new int [3] { 7, 9, -1 }; a[2] = new int [4] { 6, 15, 3, 1 }; Console.WriteLine( "Исходный массив:" ); for ( int i = 0; i < a.Length; ++i ) { for ( int j=0; j < a[i].Length; ++j) Console.Write( "\t" + a[i][j] ); Console.WriteLine(); } // поиск числа 18 в нулевой строке: Console.WriteLine( Array.IndexOf( a[0], 18 ) ); foreach ( int [] mas1 in a ) { foreach ( int x in mas1 ) Console.Write( "\t" + x ); Console.WriteLine(); } 36 ©Павловская Т.А. (НИУ ИТМО) |
37 |
 |
Эффективность работы с двумерными массивами37 ©Павловская Т.А. (НИУ ИТМО) |
38 |
 |
Передача массивов как параметров методаclass Program { static void Main(string[] args) { const int n = 3, m = 4; double[,] a = new double[n, m] {{2,3,4,7}, {4,3,2,0}, {2,0,1,8}}; Console.WriteLine("Сумма элементов: " + Sum(a)); bool[] nums = RowsWithNulls(a, n, m); Console.Write("Номера строк, содержащих нули: "); for (int i = 0; i < n; ++i) if (nums[i]) Console.Write(" " + i); } static double Sum(double[,] x) { double sum = 0; foreach (double elem in x) sum += elem; return sum; } } - Сумма всех элементов; - номера строк, содержащих нули static bool[] RowsWithNulls(double[,] x, n,m) { bool[] nums = new bool[n]; for( int i = 0; i < n; ++i) for( int j = 0; j < m; ++j) if(Math.Abs(x[i,j]) < 1e-9) nums[i] = true; return nums; } 38 ©Павловская Т.А. (НИУ ИТМО) |
39 |
 |
ТрудПреодолевши какой ни на есть труд, человек чувствует удовольствие. Суворов А. В. 39 ©Павловская Т.А. (НИУ ИТМО) |
«Перечисления и массивы» |