Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_po_proge.docx
Скачиваний:
3
Добавлен:
25.09.2019
Размер:
70.06 Кб
Скачать

18. Класс Regex и обработка текстовых данных.

Важнейшим классом, поддерживающим регулярные выражения, является класс Regex, который представляет неизменяемые откомпилированные регулярные выражения. Для описания регулярного выражения в классе определено несколько перегруженных конструкторов:

  1. Regex() - создает пустое выражение;

  2. Regex(String) - создает заданное выражение;

  3. 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)); } }}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]