- •1.Классы в с#: данные класса: поля и константы, спецификаторы доступа.
- •2. Классы в с#: методы класса, конструкторы и деструкторы.
- •3. Классы в c#: свойства класса, индексаторы.
- •4.Операции класса: перегрузка унарных и бинарных операций.
- •5.Операции класса: перегрузка операции преобразования типа.
- •6. Наследование классов, пример реализации механизма наследования.
- •7. Виртуальные методы класса
- •8. Абстрактные метода и классы, пример использования абстрактных классов.
- •9. Интерфейсы: пользовательские интерфейсы.
- •10. Интерфейсы: стандартные интерфейсы.
- •11. Структуры, как значимый тип данных.
- •12.Коллекции: классификация коллекций.
- •13. Коллекции: класс Stack.
- •14. Коллекции: класс Queue.
- •15. Коллекции: класс ArrayaList.
- •16.Коллекции: коллекция Hashtable.
- •17. Регулярные выражения, язык описания регулярных выражений.
- •18. Класс Regex и обработка текстовых данных.
- •19. Рекурсивные методы. Прямая рекурсия.
- •20. Рекурсивные методы. Косвенная рекурсия.
- •38. Обработка событий клавиатуры.
18. Класс Regex и обработка текстовых данных.
Важнейшим классом, поддерживающим регулярные выражения, является класс Regex, который представляет неизменяемые откомпилированные регулярные выражения. Для описания регулярного выражения в классе определено несколько перегруженных конструкторов:
Regex() - создает пустое выражение;
Regex(String) - создает заданное выражение;
Regex(String, RegexOptions) - создает заданное выражение и задает параметры для его обработки с помощью элементов перечисления RegexOptions (например, различать или нет прописные и строчные буквы).
Поиск фрагментов строки, соответствующих заданному выражению, выполняется с помощью методов IsMach, Mach, Matches класса Regex.
static void Main()
{
Regex r = new Regex("собака",RegexOptions.IgnoreCase);
string text1 = "Кот в доме, собака в конуре.";
string text2 = "Котик в доме, собачка в конуре.";
Console.WriteLine(r.IsMatch(text1));
Console.WriteLine(r.IsMatch(text2));
}
Попытаемся определить, есть ли в заданных строках номера телефона в формате xx-xx-xx или xxx-xx-xx:
static void Main()
{
Regex r = new Regex(@"\d{2,3}(-\d\d){2}");
string text1 = "tel:123-45-67";
string text2 = "tel:no";
string text3 = "tel:12-34-56";
Console.WriteLine(r.IsMatch(text1));
Console.WriteLine(r.IsMatch(text2));
Console.WriteLine(r.IsMatch(text3));
}
19. Рекурсивные методы. Прямая рекурсия.
Рекурсивным называют метод, если он вызывает сам себя в качестве вспомогательного. В основе рекурсивного метода лежит так называемое "рекурсивное определение" какого-либо понятия. Классическим примером рекурсивного метода является метод, вычисляющий факториал.
Рассмотренный вид рекурсии называют прямой. Метод с прямой рекурсией обычно содержит следующую структуру:
if (<условие>)
<оператор>;
else <вызов данного метода с другими параметрами>;
В качестве <условия> обычно записываются некоторые граничные случаи параметров, передаваемых рекурсивному методу, при которых результат его работы заранее известен, поэтому далее следует простой оператор или блок, а в ветви else происходит рекурсивный вызов данного метода с другими параметрами.
Со входом в рекурсию осуществляется вызов метода, а для выхода необходимо помнить точку возврата, т.е. то место программы откуда мы пришли и куда нам нужно будет возвратиться после завершения метода. Место хранения точек возврата называется стеком вызовов и для него выделяется определенная область оперативной памяти. При развертывании рекурсии за счет создания копий параметров возможно переполнение стека. Это является основным недостатком рекурсивного метода. С другой стороны, рекурсивные методы позволяют перейти к более компактной записи алгоритма.
Следует понимать, что любой рекурсивный метод можно преобразовать в обычный метод. И практически любой метод можно преобразовать в рекурсивный, если выявить рекуррентное соотношение между вычисляемыми в методе значениями.
Пример 1: Найти сумму цифр числа А.
class Program
{ static long Sum(long a) //нерекусивный метод {
long sum=0;
while (a>0) //пока a больше нуля
{ sum+=a%10; //добавляем к сумме последнюю цифру числа а
a/=10; //отбрасываем от числа а последнюю цифру }
return sum; //возвращаем в качестве результата сумму цифр числа a }
static long SumR(long a) //рекурсивный метод
{ if (a==0) //если a =0, то
return 0; // возвращаем 0
else return SumR(a/10)+ a%10; //иначе обращаемся к рекуррентному соотношению }
static void Main()
{ Console.Write("n=");
long n=long.Parse(Console.ReadLine());
Console.WriteLine("Нерекурсивный метод: "+Sum(n));
Console.WriteLine("Рекурсивный метод: "+SumR(n)); } }}