
- •Лабораторная работа 1 Тема: Типы данных и операторы языка с#. Массивы. Строки. Регулярные выражения
- •Типы данных c#
- •Преобразования типов
- •Преобразования строк в число. Класс Convert
- •Массивы в c#
- •Int[] k; //k – одномерный массив
- •Базовый класс System.Array
- •Строки в с# Класс Сhar
- •Класс String
- •Строковые константы
- •Пространство имен RegularExpression и классы регулярных выражений
- •Синтаксис регулярных выражений
- •Классы пространства RegularExpressions
- •1. Проработать примеры 1-8, данные в теоретических сведениях. Создать на их основе программы. Получить результаты работы программ и уметь их объяснить. Внести их в отчет с комментариями.
- •2. Выполнить два задания на двумерный массив по заданному номеру варианта и номеру, отсчитанному с конца.
- •3. Выполнить два задания на строки по заданному номеру варианта и номеру, отсчитанному с конца. Использовать в задачах два класса строк: String и StringBuilder.
- •4. Выполнить задание на применение регулярных выражений. Выбрать одно по заданному номеру.
- •Лабораторная работа 2 Тема: Структуры и перечисления как частные виды классов. Классы. Интерфейсы
- •[Атрибуты][модификаторы]enum имя_перечисления[: базовый класс] {список_возможных_значений}
- •[Атрибуты][модификаторы]struct имя_структуры [:список_интерфейсов] {тело_структуры}
- •Классы в c# [атрибуты][модификаторы]class имя_класса [:список_родителей] {тело_класса}
- •Индексаторы
- •Статические поля и методы класса
- •Наследование
- •Интерфейсы
- •Две стратегии реализации интерфейса
- •Преобразование к классу интерфейса
- •Проблемы множественного наследования
- •Коллизия имен
- •Ip1.Prop1("интерфейс iProps: свойство 1");
- •Ip1.Prop2("интерфейс 1 ", 88);
- •Ip2.Prop1("интерфейс iPropsOne: свойство1");
- •2. Наследование от общего предка
- •Обработка исключительных ситуаций
- •Блок finally
- •Лабораторная работа 3 Тема: Разработка gui. Создание sdi-приложений. Обработка событий
- •Создание простых форм с помощью комплекса инструментальных средств разработки программ .Net sdk
- •Режимы дизайна и кода
- •Элементы управления
- •Общие свойства, события и методы элементов управления
- •Обработка событий в Windows Forms
- •События MouseDown и Keypress
- •Форматирование элементов управления
- •Создание меню
- •Закрытие формы
- •Диалоговые окна
- •Создание панели инструментов
- •Список элементов ListBox
- •Потоковые классы
- •Встроенные типы данных и потоки
- •Класс File
- •Сериализация объектов
- •Создание многооконного приложения
- •Для каждого пункта меню пишем обработчики событий, выполняющие соответсвтвующие пункту действия. Перечисление MdiLayout
- •Вырезание, копирование и вставка текстовых фрагментов
- •Контекстное меню
- •Диалоговые окна
- •Сохранение файла при закрытии формы
- •OpenFileDialog и SaveFileDialog для sdi-приложений
- •Лабораторная работа 5 Тема: Создание и вывод графический изображений на форму. Анимация.
- •Класс Region
- •Вывод графических объектов без события Paint
- •Возможности класса Graphics
- •Класс Pen
- •Вывод изображений
- •Элемент управления PictureBox
- •Вывод изображений и двойная буферизация
Классы пространства RegularExpressions
Класс Regex
Это основной класс, объекты которого определяют регулярные выражения. Конструктор класса перегружен. В простейшем варианте ему передается в качестве параметра строка, задающая регулярное выражение. Основные методы класса Regex:
Метод Match запускает поиск соответствия. В качестве параметра методу передается строка поиска, где разыскивается первая подстрока, которая удовлетворяет образцу, заданному регулярным выражением. В качестве результата метод возвращает объект класса Match, описывающий результат поиска.
using System.Text.RegularExpressions;
string FindMatch(string str, string strpat){
Regex pat = new Regex(strpat);
Match match =pat.Match(str);
string found = "";
if (match.Success) {
found =match.Value;
Console.WriteLine("Строка ={0}\tОбразец={1}\t
Найдено={2}", str,strpat,found);
}
return(found);
}
public void TestSinglePat(){
//поиск по образцу первого вхождения
string str, strpat, found;
Console.WriteLine("Поиск по образцу");
//образец задает подстроку, начинающуюся с символа a, далее идут буквы или цифры.
str ="start"; strpat =@"a\w+";
found = FindMatch(str,strpat); //art
str ="fab77cd efg";
found = FindMatch(str,strpat); //ab77cd
//образец задает подстроку, начинающуюся с символа a,
//заканчивающуюся f с возможными символами b и d в середине
strpat = "a(b|d)*f"; str = "fabadddbdf";
found = FindMatch(str,strpat); //adddbdf
//диапазоны и escape-символы
strpat = "[X-Z]+"; str = "aXYb";
found = FindMatch(str,strpat); //XY
strpat = @"\u0058Y\x5A"; str = "aXYZb";
found = FindMatch(str,strpat); //XYZ
}
Метод Matches позволяет разыскать все вхождения, то есть все подстроки, удовлетворяющие образцу. У алгоритма поиска есть важная особенность - разыскиваются непересекающиеся вхождения подстрок. В качестве результата возвращается объект MatchCollection, представляющий коллекцию объектов Match.
void FindMatches(string str, string strpat) {
Regex pat = new Regex(strpat);
MatchCollection match =pat.Matches(str);
Console.WriteLine("Строка ={0}\tОбразец={1}\tНайдено={2}", str,strpat,match.Count);
}
Console.WriteLine("око и рококо");
strpat="око"; str = "рококо";
FindMatches(str, strpat); //найдено =1
Метод NextMatch запускает новый поиск, начиная с того места, на котором остановился предыдущий поиск.
Метод Split является обобщением метода Split класса String. Он позволяет, используя образец, разделить искомую строку на элементы. Поскольку образец может быть устроен сложнее, чем простое множество разделителей, то метод Split класса Regex эффективнее, чем его аналог класса String.
static void Main() {
string si = "Один, Два, Три, Строка для разбора"; 1: Один
Regex theRegex = new Regex(" |, |,"); 2: Два
3: Три
int id = 1; 4: Строка
foreach (string substring in theRegex.Split(si)) 5: для
Console.WriteLine("{0}: {1}", id++, substring); 6: разбора
}
Метод Replace – позволяет делать замену найденного образца. Метод перегружен. При вызове метода передаются 2 строки - первая задает строку, в которой необходимо произвести замену, а вторая - на что нужно заменить найденную подстроку, причем во второй строке можно использовать подстановки (substitutions) - в указанные места будут подставлены значения захваченных групп с заданными именами. Синтаксис подстановок следующий:
$n - Подставляет последнюю подстроку, соответствующую группе с номером n.
Например, обрамляет все последовательности букв 'a' символами подчеркивания (например, строка "bacghghaaab" превратится в "b_a_cghgh_aaa_b"
Regex r = new Regex(@"(a+)");
string s="bacghghaaab";
s=r.Replace(s,"_$1_");
Console.WriteLine("{0}",s);
Можно задать третий параметр, указывающий сколько замен нужно произвести:
Regex r = new Regex(@"(dotsite)");
string s="dotsitedotsitedotsiterulez";
s=r.Replace(s,"f",1);
Console.WriteLine("{0}",s);
Если параметр не задан, то заменяются все найденные образцы.
Также можно задать четвертый параметр, указывающий с какого вхождения производить замены:
Regex r = new Regex(@"(dotsite)");
string s="dotsitedotsitedotsiterulez";
s=r.Replace(s,"f",2,1);
Console.WriteLine("{0}",s);
Классы Match и MatchCollection
Объекты этих классов создаются автоматически при вызове методов Match и Matches. Коллекция MatchCollection, как и все коллекции, позволяет получить доступ к каждому ее элементу - объекту Match. Можно, конечно, организовать цикл foreach для последовательного доступа ко всем элементам коллекции.
При работе с объектами класса Match наибольший интерес представляют не столько методы класса, сколько его свойства, большая часть которых унаследована от родительских классов. Рассмотрим основные свойства:
свойства Index, Length и Value наследованы от прародителя Capture. Они описывают найденную подстроку- индекс начала подстроки в искомой строке, длину подстроки и ее значение;
свойство Groups класса Match возвращает коллекцию групп - объект GroupCollection, который позволяет работать с группами, созданными в процессе поиска соответствия;
свойство Captures, наследованное от объекта Group, возвращает коллекцию CaptureCollection. Как видите, при работе с регулярными выражениями реально приходится создавать один объект класса Regex, объекты других классов автоматически появляются в процессе работы с объектами Regex.
// Программа 7. Поиск всех образцов, соответствующих регулярному выражению
public static void Main( ) {
string si = "Это строка для поиска";
// найти любой пробельный символ следующий за непробельным
Regex theReg = new Regex(@"(\S+)\s");
// получить коллекцию результата поиска
MatchCollection theMatches = theReg.Matches (si);
// перебор всей коллекции
foreach (Match theMatch in theMatches) {
Console.WriteLine( "theMatch.Length: {0}", theMatch.Length);
if (theMatch.Length != 0)
Console.WriteLine("theMatch: {0}", theMatch.ToString( ));
} }
theMatch.Length: 4
theMatch: Это
theMatch.Length: 7
theMatch: строка
theMatch.Length: 4
theMatch: для
Классы Group и GroupCollection
Коллекция GroupCollection возвращается при вызове свойства Group объекта Match. Имея эту коллекцию, можно добраться до каждого объекта Group. Класс Group является наследником класса Capture и, одновременно, родителем класса Match.
Внимательно рассматривая таблицу, которая описывает символы, используемые в регулярных выражениях, в частности символы группирования, то можно понять несколько важных фактов, связанных с группами:
при обнаружении одной подстроки, удовлетворяющей условию поиска, создается не одна группа, а коллекция групп;
группа с индексом 0 содержит информацию о найденном соответствии;
число групп в коллекции зависит от числа круглых скобок в записи регулярного выражения. Каждая пара круглых скобок создает дополнительную группу, которая описывает ту часть подстроки, которая соответствует шаблону, заданному в круглых скобках;
группы могут быть индексированы, но могут быть и именованными, поскольку в круглых скобках разрешается указывать имя группы.
Создание именованных групп крайне полезно при разборе строк, содержащих разнородную информацию.
Класс Regex позволяет объединять регулярные выражения в группы. Это бывает очень полезно, если необходимо выбрать из исходной строки все подстроки, удовлетворяющие определенной категории, и таких категорий несколько.
Например, нужно выбрать все подстроки, которые могут являться IP адресами и объединить их вместе. Для этого существует класс Group. Любое регулярное выражение может быть добавлено в группу и представлять свою группу по имени.
Например: @"(? <ip>(\ d |\ .)+)\s "
Имя группы задается в скобках, перед которыми ставится знак (?). Далее следует описание регулярного выражения, определяющего группу. Класс Match явлется производным от класса Group и содержит коллекцию объектов Group, к которым можно обратиться через свойство Groups.
// Программа 8. Создание именованных групп регулярных выражений
public static void Main( ) {
string stringl = "04:03:27 127.0.0.0 GotDotNet.ru";
Regex theReg = new Regex(
@"(?<время>(\d|\:)+)\s" +
@"(?<ip>(\d|\ .)+)\s" +
@"(?<url>\S+)");
// группа time = одна и более цифр или двоеточий за которыми следует пробельный символ
// группа ip адрес = одна и более цифр или точек за которыми следует пробельный символ
// группа url = один и более непробельных символов
// получаем коллекцию поиска
MatchCollection theMatches = theReg.Matches (stringl);
foreach (Match theMatch in theMatches) {
if (theMatch.Length != 0) {
// выводим найденную подстроку
Console.WriteLine("\ntheMatch: {0}", theMatch.ToString ());
// выводим группу "time"
Console.WriteLine ("время: {0}", theMatch.Groups["время"]);
// выводим группу "ip"
Console.WriteLine("ip: {0}", theMatch.Groups["ip"]);
// выводим группу "url"
Console.WriteLine("url: {0}", theMatch.Groups["url"]);
}}}
theMatch: 04:03:27 127.0.0.0 GotDotNet.ru
время: 04:03:27
ip: 127.0.0.0
url: GotDotNet.ru
Вопросы к защите лабораторной работы
На какие виды и разновидности разделяются все типы данных в C#? Примеры.
Основное отличие структурных типов?
Основное отличие ссылочных типов?
Перечислить все целочисленные арифметические типы данных в C# и их названия в CLR. Указать их диапазон и размер занимаемой памяти.
Перечислить все вещественные арифметические типы данных в C# и их названия в CLR. Указать их диапазон и размер занимаемой памяти.
Перечислить все символьные типы данных в C# и их названия в CLR. Указать их диапазон и размер занимаемой памяти.
Оператор ветвления if … else и его применение в программах.
Оператор ветвления switch и его применение в программах.
Оператор цикла for и его применение в программах.
Оператор цикла foreach и его применение в программах.
Операторы цикла while и do…while. Применение в программах.
Что такое массив?
Определение одномерного массива в С#. Инициализация одномерного массива.
Определение многомерного массива в С#. Инициализация многомерного массива.
Определение ступенчатых массивов и их инициализация.
Базовый класс Array, его методы и свойства.
Тип char и принимаемые значения переменными типа char.
Методы и свойства класса Char.
Тип char[] и его отличительные особенности от С/С++.
Тип String и способы его конструирования.
Операции над строками типа string.
Задание строковых констант.
Методы и свойства класса String.
Динамические методы и свойства класса String.
Класс StringBuilder. Конструкторы.
Операции над строками StringBuilder.
Основные методы класса StringBuilder.
Что такое регулярные выражения. Применение регулярных выражений.
Задание регулярного выражения. Поиск подстрок с помощью регулярного выражения.
Класс Regex и его методы.
Поиск первого вхождения образца с текст.
Поиск всех вхождений образца в текст.
Замена образца в тексте.
Разбор текста на слова.
Свойства класса Match.
Классы Match и MatchCollection и их свойства.
Классы Group и GroupCollection и их свойства.
Задания к лабораторной работе