Слайд 1Системное программирование
для Microsoft.NET на языке C#
Лекция 7
Оцоков Шамиль
Алиевич,
Московский энергетический институт,
Email: otsokovShA@mpei.ru
Слайд 2Исключения
Исключение - это уведомление о том, что что-то прерывает нормальное
выполнение программы. Исключения обеспечивают парадигму программирования для обнаружения неожиданных событий
и реагирования на них. Когда возникает исключение, состояние программы сохраняется, нормальный поток прерывается, и управление передается обработчику исключения (если таковой существует в текущем контексте)
Исключения являются мощным механизмом для централизованной обработки ошибок и исключительных ситуаций.
иерархия исключений.
В ООП исключения - это классы, и их можно наследовать для построения иерархий.
Слайд 4Исключения
try
{
// Some code that may throw an exception
}
catch (ExceptionType objectName)
{
//
Code handling an Exception
}
catch (ExceptionType objectName)
{
// Code handling an Exception
}
Слайд 5Генерация исключений
static void Main()
{
Exception e = new Exception("There was a
problem");
throw e;
}
Слайд 7Коллекции
Коллекция в языке C# — это объединение произвольного количества объектов,
возможно, объектов разного типа.
Коллекция — это динамическая структура данных. Память
под коллекцию не фиксируется, данные могут добавляться или удаляться по мере необходимости. Кроме того, для многих видов коллекций возможно включение в коллекцию данных разного типа.
Коллекция — это более гибкая организация данных, чем обычный массив. Но работа с массивом всегда ведётся быстрее, чем с коллекцией.
Для работы с коллекциями используется область имён System.Collections. Наиболее популярными видами коллекций являются:
Слайд 8Наиболее часто используемые коллекций .NET
List (список)
Dictionary (словарь)
ArrayList (список с
разнотипными элементами)
Hashtable (хэш-таблица)
Stack (стэк)
Queue (очередь)
Слайд 9Коллекции
List (список)
Список позволяет связанно хранить однотипные элементы, динамически выделяя память
для последующих элементов. Это значит, что вам не нужно задавать
размер списка при его инициализации в отличии от массивов. Доступ к элементу списка возможен по индексу, но обычно элементы списка обрабатываются последовательно.
Слайд 10Коллекции
ArrayList arr = new ArrayList();
arr.Add(6);
arr.Add("5");
Console.WriteLine(int.Parse(arr[0].ToString()));
List list = newList();
list.Add(123);
list.Add("123"); //ошибка! коллекция
типизирована
Console.WriteLine(list[0]);
Слайд 11Коллекции
Описание коллекции List:
List имя=new List ();
Пример:
List строки=new List ();
Описание
коллекции ArrayList:
ArrayList имя = new ArrayList();
Пример:
ArrayList объекты=new ArrayList();
Для получения
текущего количества элементов в коллекции можно использовать свойство Count.
int[] arr = new int[] { 1, 2, 3 };
List list = new List(arr);
int[] convertedArray = list.ToArray();
Слайд 12Упражнения
№1 Напишите программу, которая считывает с консоли последовательность положительных целых
чисел. Последовательность заканчивается, когда вводится пустая строка. Вычислите и распечатайте
сумму и среднее значение последовательности. Сохраните последовательность в List .
№2 Напишите программу, которая считывает с консоли последовательность положительных целых чисел. Последовательность заканчивается, когда вводится пустая строка. Распечатать последовательность, отсортированную по возрастанию
Слайд 13Упражнения
№1 Напишите метод, который находит самую длинную подпоследовательность равных чисел
в данном List и возвращает результат как новый List
. Напишите программу, чтобы проверить, правильно ли работает метод.
№2 Напишите программу, которая удаляет все отрицательные числа из последовательности.
Слайд 14Коллекции
Dictionary (словарь)
Словарь — это подходящая коллекция для хранения и последующего
поиска однотипных элементов. В словаре элементы хранятся в виде пары
«ключ-значение». Это значит, что вы можете сохранить значение, и в дальнейшем используя ключ быстро получить значение из словаря обратно. Тип ключа задается пользователем и может быть любым: числом, строкой или просто объектом.
Слайд 15Коллекции
Главной отличительной особенностью списка Dictionary от списка List заключается в
том, что элементы в Dictionary представлены парой Ключ/значение, где каждому
ключу соответствует значение.
В отличие от List, Dictionary получает доступ к элементу по его ключу.
Описание коллекции
Dictionary<тип_ключа, тип_значения> имя=new Dictionary<тип_ключа, тип_значения>();
Пример:
Dictionary ведомость = new Dictionary ();
ведомость.Add(«Иванов»,4);
ведомость.Add(«Петров»,5);
ведомость.Add(«Сидоров»,4);
Слайд 16Упражнения
№1 Напишите программу, которая удаляет из заданной
последовательности все числа, которые
встречаются нечетное
количество раз.
№2. Напишите программу, которая находит в заданном массиве
целых
чисел (в диапазоне [0… 1000]), сколько раз встречается
каждое из них.
Пример: array = {3, 4, 4, 2, 3, 3, 4, 3, 2}
2 -> 2
3->4
Слайд 17Коллекции
ArrayList (список с разнотипными элементами)
Этот вид списка, в отличие от
List, позволяет хранить разнотипные элементы. Это означает, что в одном
и том же списке могут одновременно храниться как числа, структуры, так и строки, объекты и null значения. Что делает его значительно более медленным при поиске, чтении и записи элементов, чем его более строго типизированный аналог — List.
Слайд 18Коллекции
Hashtable (хэш-таблица)
По принципу работы хэш-таблица схожа с Dictionary, за тем
исключением, что позволяет одновременно использовать разнотипные ключи и хранить разнотипные
элементы. Например для первого элемента хэш-таблицы можно использовать ключ в виде числового значения, а для второго, все той же таблицы, — в виде строки.
Слайд 19Коллекции
Stack (стэк)
Стэк — это коллекция для организации хранения элементов по
модели LIFO (last-in-first-out), что означает «последний пришел, первый вышел». Коллекция
типа стэк незаменима для множества алгоритмов, среди наиболее известных — это алгоритм разбора (парсинга) xml документа.
Слайд 20Cтэк
Класс Stack - основные операции
Реализованы все основные операции по
работе со стеком:
- Push (T) - добавляет новый элемент вверху
стека
- Pop () - возвращает самый высокий элемент и удаляет его из стека
- Peek () - возвращает самый высокий элемент, не удаляя его
- Count - возвращает количество элементов в стеке
- Clear () - извлекает все элементы из стека
- Содержит (T) - проверить, есть ли в стеке элемент
- ToArray () - возвращает массив, содержащий все элементы стека
Слайд 21Cтэк
Напишите программу, которая считывает с консоли N целых чисел и
выводит их в обратном порядке. Используйте класс Stack .
static void Main()
{
Stack stack = new Stack();
stack.Push("1. John");
stack.Push("2. Nicolas");
stack.Push("3. Mary");
stack.Push("4. George");
Console.WriteLine("Top = " + stack.Peek());
while (stack.Count > 0)
{
string personName = stack.Pop();
Console.WriteLine(personName);
}
}
Слайд 22Cтэк
Напишите программу, которая проверяет, правильно ли помещены круглые скобки в
арифметическое выражение. Пример выражения с правильно расставленными скобками: ((a +
b) / 5-d). Пример неверного выражения:) (a + b)).
Указание.
Спецификация стека позволяет нам проверить, имеет ли встреченная скобка соответствующая закрывающая скобка. Когда мы встречаем открывающуюся скобку, мы добавляем ее в стек. Когда мы встречаем закрывающую скобку, мы удаляем элемент из стека. Если стек становится пустым до завершения программы в момент, когда нам нужно удалить элемент, скобки ставятся неправильно. То же самое остается, если в конце выражения есть элементы в стеке
Слайд 23Коллекции
Queue (очередь)
Очередь реализует другую модель добавления и удаления элементов —
FIFO (first-in-first-out), что означает «первый пришел, первый вышел». Но в
отличие от стэка очередь не так популярна, так как ту же функциональность может обеспечить коллекция List c лучшей производительностью. Очередь обычно используется для изящности кода при небольшой размере коллекции.
Слайд 24Коллекции
static void Main()
{
Queue queue = new Queue();
queue.Enqueue("Message One");
queue.Enqueue("Message Two");
queue.Enqueue("Message Three");
queue.Enqueue("Message
Four");
while (queue.Count > 0)
{
string msg = queue.Dequeue();
Console.WriteLine(msg);
}
}
Слайд 25Коллекции
Коллекции подразделяются на универсальные и неуниверсальные. Универсальные коллекции могут быть
типизированы и содержать объекты определенного типа. Это позволяет выигрывать в
производительности, особенно, если коллекции хранят типы значений (int, bool, double и т.п.). В неуниверсальных коллекциях происходит упаковка хранимых объектов в тип Object, что требует их последующей распаковки при работе с ними.
Слайд 26Методы Коллекций List и ArrayList
Добавление элементов
Add(элемент_коллекции); - добавляет элемент
в коллекцию. В случае универсальной коллекции тип элемента должен совпадать
с типом коллекции (пример был приведен выше)
AddRange(Коллекция); - добавляет в текущую коллекцию совокупность элементов заданной коллекции. При этом, коллекция, указанная в качестве параметра, должна реализовывать интерфейс ICollection (стандартный интерфейс коллекции, замечание значимо при использовании пользовательской коллекции).
Insert(место, элемент); - вставляет в заданное место (индекс элемента) заданный элемент
InsertRange(место, коллекция); - вставляет в заданное место в коллекции заданную коллекцию
Слайд 27Методы Коллекций List и ArrayList
Удаление элементов
Remove(элемент); - удаляет элемент из
коллекции (первое вхождение элемента)
RemoveAt(позиция); - удаляет элемент на заданной позиции
RemoveRange(позиция,
количество); - удаляет заданное количество элементов, начиная с заданной позиции
Clear(); - удаляет все элементы из коллекции
Слайд 28Методы Коллекций List и ArrayList
Поиск элементов
bool Contains(элемент); - возвращает,
содержится ли заданный элемент в коллекции
int IndexOf(элемент); - возвращает позицию,
на которой содержится в коллекции заданный элемент (первое вхождение)
int IndexOf(элемент, позиция); - возвращает позицию, на которой содержится заданный элемент (первое вхождение). Поиск осуществляется по коллекции, начиная с заданной и заканчивая концом коллекции)
Слайд 29Методы Коллекций List и ArrayList
Поиск элементов
int IndexOf(элемент, стартовая_позиция, финишная_позиция);
- возвращает позицию, на которой содержится заданный элемент (первое вхождение).
Поиск осуществляется по коллекции, начиная с заданной стартовой позиции и заканчивая заданной финишной позицией.
int LastIndexOf(элемент); - возвращает позицию, на которой содержится в коллекции заданный элемент (последнее вхождение). Метод перегружен, его перегруженные версии копируют перегрузки метода IndexOf(), рассмотренного выше
int BinarySearch(элемент); - возвращает позицию, на которой находится заданный элемент в коллекции. По коллекции осуществляется бинарный (двоичный) поиск. Коллекция должная быть отсортирована. Метод содержит несколько перегрузок, можно также задавать компаратор (метод сравнения) для элементов.
Слайд 30Методы Коллекций List и ArrayList
Дополнительные методы для работы с коллекциями
Sort();
- сортирует коллекцию, используя стандартный компаратор. Если тип элементов коллекции
является пользовательским, то компаратор (сравнение элементов) нужно реализовать в соответствующем классе этого типа.
string ToString(); - стандартный метод, переводящий коллекцию в строку
Reverse(); - переворачивает коллекцию, точнее, порядок элементов в коллекции. Первый элемент меняется с последним и т.д.
Reverse(стартовая_позиция, количество_элементов); - переворачивает в коллекции заданное количество элементов, начиная с заданного номера элемента
Слайд 31Методы Коллекций List и ArrayList
Дополнительные методы для работы с коллекциями
GetRange(стартовая_позиция,
количество элементов); - возвращает коллекцию, элементами которой является заданное количество
элементов данной коллекции, начиная с заданной стартовой позиции
GetType(); - возвращает тип элементов коллекции
CopyTo(массив); - копирует элементы коллекции в заданный массив
CopyTo(массив, номер_позиции); - копирует элементы коллекции в заданный массив, начиная с заданной позиции в массиве
CopyTo(массив, номер_позиции, количество_элементов); - копирует заданное количество элементов коллекции в заданный массив, начиная с заданной позиции в массиве
Слайд 32Методы Коллекций List и ArrayList
Перебор элементов списка
Перебрать все значения списка
можно с помощью операторов foreach:
var list = new List();
list.Add("Я ");
list.Add("люблю ");
list.Add("C#");
foreach
(var item in list) // Перебираем элементы списка
// с помощью foreach.
{ Console.WriteLine(item);
}
Локальным переменным вместо определенного типа может быть задан неявный "тип" var. Ключевое слово var сообщает компилятору необходимости определения типа переменной из выражения, находящегося с правой стороны оператора инициализации.
Слайд 33Методы Коллекций List и ArrayList
static void Main(string[] args)
{
string s;
StreamReader readfl;
List st = new List();
if (File.Exists(@"d:\строки.txt"))
readfl = new StreamReader(@"d:\строки.txt");
else
{
Console.WriteLine("Файл не найден");
Console.ReadKey();
return;
}
Слайд 34Методы Коллекций List и ArrayList
while (readfl.EndOfStream == false)
{ s = readfl.ReadLine();
st.Add(s);
}
foreach (var x in st)
Console.WriteLine(x);
Console.WriteLine();
st.Sort();
st.Remove("группа");
foreach (var x in st)
Console.WriteLine(x);
Console.ReadKey();
}