c# desktop. Занятие 05
TRANSCRIPT
Темы лекции: Строки, массивы, коллекции.
Практическое задание: Строки, массивы, коллекции.
Тренер: Игорь Шкулипа, к.т.н.
Платформа .Net и язык программирования C#.
Занятие 5
http://www.slideshare.net/IgorShkulipa 2
Массивы
Массивы в C# в значительной мере происходят от массивов С++. Дляобращения к массивам применяется указатель, который указывает наначало непрерывного диапазона элементов, находящегося внекотором блоке памяти.
При объявлении типа данных (класса или структуры), CLR генерирует типмассива, основанный на этом новом типе данных. Сгенерированныйтип массива – это ссылочный тип, то есть экземпляры типа массива –это объекты классов.
Этот сгенерированный тип наследуется от System.Array, который,естественно, наследуется от System.Object. Это обозначает, чтокаждый массив, независимо от типа элементов реализует все методыSystem.Array.
Способ объявления массивов в С# похож на С++, но квадратные скобкиследуют за типом, а не за именем переменной.
int[] array1= new int[10];
int[] array2= new int[] {1, 2, 3, 4, 5};
int[] array3= {10, 9, 8, 7, 6};
http://www.slideshare.net/IgorShkulipa 3
Неявно типизированные массивы
var implicitArray1= new [] {1, 2, 3, 4, 5};
В таком случае компилятор попытается неявно определить тип элементовмассива и задать тип массиву.
var implicitArray2= new [] {1, 2.34, 3, 4, 5.1};
В этом случае компилятор определит тип элементов массива, как тип, ккоторому приводимы все элементы, указанные в инициализаторе.
var implicitArray3= new [] {1, 2.34, ‘a’, “some string”};
В этом случае компилятор попытается определить тип массива, как и впредыдущем примере, не сможет этого сделать и выдаст исключение
Не найдено подходящего типа для неявно типизированного массива
Такое же исключение возникнет в случае, если попытаться объявить массив с типами, которые приводимы друг к другу (например, если объявлены два класса с неявными преобразованиям один к другому)
http://www.slideshare.net/IgorShkulipa 4
Sytem.Array свойства
Имя Описание
IsFixedSizeПолучает значение, показывающее, имеет ли список Array фиксированный размер.
IsReadOnlyПолучает значение, указывающее, доступен ли объект Array только для чтения.
IsSynchronizedПолучает значение, показывающее, является ли доступ к коллекции Array синхронизированным (потокобезопасным).
LengthПолучает 32-разрядное целое число, представляющее общее число элементов во всех измерениях массива Array.
LongLengthПолучает 64-разрядное целое число, представляющее общее число элементов во всех измерениях массива Array.
Rank Получает ранг (размерность) объекта Array.
SyncRootПолучает объект, который может использоваться для синхронизации доступа к объекту Array.
http://www.slideshare.net/IgorShkulipa 5
System.Array методы
Обнуление:Clear();
Поиск:LastIndexOf(), IndexOf(), Find(),
FindAll(), FindIndex(), FindLastIndex(),
FindLast(),
Сортировка:Sort()
Неглубокое копирование:Clone()
Глубокое копирование:Copy(), CopyTo()
Длина:GetLength()
Значение:GetValue()
http://www.slideshare.net/IgorShkulipa 6
Многомерные массивы
Прямоугольные массивы:
int[,] squareArray1= new int[10,10];
int[,] squareArray2= {{1,2,3},
{4,5,6},
{7,8,9}};
int[, ,] squareArray3 = new int[2, 3, 4];
Многомерные зубчатые массивы:
int[][] jaggedArray= new int[3][];
jaggedArray[0]= new int[] {1, 2};
jaggedArray[1]= new int[] {3, 4, 5, 6};
jaggedArray[2]= new int[] {7, 8, 9};
http://www.slideshare.net/IgorShkulipa 7
Коллекции
Пространство имен System.Collections предоставляет типы для обработкитак называемых коллекций – специализированных наборов данных,поддерживающих упорядочивание и специфичные методы обработки.
Все коллекции реализуют интерфейс ICollection или ICollection<T>.
public interface ICollection<T> : IEnumerable<T>,
IEnumerable
{
void Add(T item);
bool Remove(T item);
void Clear();
bool Contains(T item);
void CopyTo(T[] array, int arrayIndex);
int Count { get; }
bool IsReadOnly { get; }
}
Для использования обобщенных коллекций необходимо подключитьпространство имен System.Collections.Generic.
http://www.slideshare.net/IgorShkulipa 8
System.Collections
Класс Описание
ArrayListРеализует интерфейс IList с помощью массива с динамическим увеличением размера до нужного значения.
BitArrayУправляет компактным битовым массивом значений, представленных логическими значениями, где значение true соответствует 1, а значение false соответствует 0.
CaseInsensitiveComparer Проверяет равенство двух объектов без учета регистра строк.
CaseInsensitiveHashCodeProvider
Устаревшее. Предоставляет хэш-код объекта, используя алгоритм хэширования, при котором не учитывается регистр строк.
CollectionBaseПредоставляет базовый класс abstract для строго типизированной коллекции.
Comparer Проверяет равенство двух объектов с учетом регистра строк.
DictionaryBaseПредоставляет базовый класс abstract для строго типизированной коллекции ключ/значение.
HashtableПредоставляет коллекцию пар "ключ-значение", которые упорядочены по хэш-коду ключа.
QueueПредоставляет коллекцию объектов, которая обслуживается по принципу "первым поступил — первым обслужен".
ReadOnlyCollectionBaseПредоставляет базовый класс abstract для неуниверсальной коллекции со строгим типом, которая доступна только для чтения.
SortedListПредоставляет коллекцию пар "ключ-значение", упорядоченных по ключам. Доступ к парам можно получить по ключу и по индексу.
StackПредставляет простую неуниверсальную коллекцию объектов, действующую по принципу LIFO.
http://www.slideshare.net/IgorShkulipa 9
Использование коллекций
using System;
using System.Collections;
public class SamplesArrayList
{
public static void Main()
{
ArrayList myAL = new ArrayList();
myAL.Add("Hello");
myAL.Add("World");
myAL.Add("!");
Console.WriteLine("myAL");
Console.WriteLine(" Count: {0}", myAL.Count);
Console.WriteLine(" Capacity: {0}", myAL.Capacity);
Console.Write(" Values:");
PrintValues(myAL);
Console.ReadKey();
}
public static void PrintValues(IEnumerable myList)
{
foreach (Object obj in myList)
Console.Write(" {0}", obj);
Console.WriteLine();
}
}
http://www.slideshare.net/IgorShkulipa 10
Типы обобщенных коллекцийСледующие универсальные типы соответствуют существующим типам коллекций:
• List<T> — это универсальный класс, соответствующий ArrayList.• Dictionary<TKey, TValue> — это универсальный класс, соответствующий
Hashtable.• Collection<T> — это универсальный класс, соответствующий CollectionBase.
Класс Collection<T> можно использовать как базовый, но в отличие отCollectionBase он не является абстрактным. Это значительно упрощает егоиспользование.
• ReadOnlyCollection<T> — это универсальный класс, соответствующийReadOnlyCollectionBase. Класс ReadOnlyCollection<T> не является абстрактным иимеет конструктор, что облегчает предоставление существующей коллекцииList<T> в виде коллекции только для чтения.
• Универсальные классы Queue<T>, Stack<T> и SortedList<TKey, TValue>соответствуют нестандартным классам с соответствующими именами.
Дополнительные типыСуществует несколько универсальных типов коллекций, у которых нет нестандартных
аналогов:
• LinkedList<T> — это связанный список общего назначения, обеспечивающийоперации вставки и удаления с временной характеристикой О(1).
• SortedDictionary<TKey, TValue> — это сортируемый словарь с операциямивставки и извлечения с временной характеристикой O(log n), что делает егоальтернативой SortedList<TKey, TValue>.
• KeyedCollection<TKey, TItem> — это гибрид списка и словаря, которыйпредоставляет способ хранения объектов, содержащих свои собственные ключи.
http://www.slideshare.net/IgorShkulipa 11
Использование обобщенных коллекцийusing System;
using System.Collections;
using System.Collections.Generic;
public class SamplesArrayList {
public static void Main() {
List<List<string>> stringList = new List<List<string>>();
for (int i = 0; i < 10; i++)
{
List<string> item = new List<string>();
for (int j = 0; j <= i; j++)
{
item.Add("string #" + i.ToString() + j.ToString());
}
stringList.Add(item);
}
foreach (var stl in stringList) {
foreach (var st in stl) {
Console.WriteLine(st);
}
}
Console.ReadKey();
}
}
string #00
string #10
string #11
string #20
string #21
string #22
string #30
string #31
string #32
string #33
string #40
string #41
string #42
string #43
string #44
...
http://www.slideshare.net/IgorShkulipa 12
Паттерн Iterator
Назначение паттерна Iterator
• Предоставляет способ последовательного доступа ко всемэлементам составного объекта, не раскрывая его внутреннегопредставления.
• Абстракция в стандартных библиотеках C++ и Java, позволяющаяразделить классы коллекций и алгоритмов.
• Придает обходу коллекции "объектно-ориентированный статус".
• Полиморфный обход.
http://www.slideshare.net/IgorShkulipa 13
Интерфейсы
public interface IIterator
{
object Next();
object First();
bool Finished();
object Current();
}
public interface IIterCollection
{
IIterator GetIterator();
}
http://www.slideshare.net/IgorShkulipa 14
Реализация коллекции
public class IterCollection: IIterCollection
{
private ArrayList items = new ArrayList();
IIterator IIterCollection.GetIterator()
{
return new Iterator(this);
}
public object Get(int i)
{
return items[i];
}
public int GetCount()
{
return items.Count;
}
}
http://www.slideshare.net/IgorShkulipa 15
Реализация итератораpublic class Iterator : IIterator
{
private IterCollection collection;
private int current;
public Iterator(IterCollection col)
{
collection = col;
current = 0;
}
object IIterator.First()
{
return collection.Get(0);
}
object IIterator.Current()
{
return collection.Get(current);
}
bool IIterator.Finished()
{
return (current >= collection.GetCount());
}
object IIterator.Next()
{
return collection.Get(current++);
}
}
http://www.slideshare.net/IgorShkulipa 16
Использование
class Program
{
static void Main(string[] args)
{
IIterCollection ic = new IterCollection(10);
IIterator iter = ic.GetIterator();
while (!iter.Finished())
{
Console.WriteLine(iter.Next());
}
Console.ReadKey();
}
}
0
7
5
2
9
9
5
0
5
9
http://www.slideshare.net/IgorShkulipa 17
Альтернативная реализацияpublic class SquareCollection : IEnumerable<int> {
private int[][] items;
public SquareCollection(int number) {
Random rand = new Random();
this.items = new int[number][];
for (int i = 0; i < number; i++) {
int[] item = new int[number];
for (int j = 0; j < number; j++) {
item[j] = rand.Next() % 10;
}
this.items[i] = item;
}
}
public IEnumerator<int> GetEnumerator() {
for (int i = 0; i < items.Length; i++) {
for (int j = items[i].Length - 1; j >= 0; j--) {
yield return items[i][j];
}
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
}
http://www.slideshare.net/IgorShkulipa 18
Использование
class Program
{
static void Main(string[] args)
{
SquareCollection sc = new SquareCollection(10);
foreach (var item in sc)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
5
0
1
5
2
6
7
1
3
9
5
0
3
8
2
...
http://www.slideshare.net/IgorShkulipa 19
Класс StringПредставляет текст как последовательность знаков Юникода.
[SerializableAttribute]
[ComVisibleAttribute(true)]
public sealed class String : IComparable, ICloneable, IConvertible,
IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>
Имя Описание
String(Char*)Инициализирует новый экземпляр класса String значением, на которое указывает заданный указатель на массив знаков Юникода.
String(Char[])Инициализирует новый экземпляр класса String значением, заданным в виде массива знаков Юникода.
String(SByte*)Инициализирует новый экземпляр класса String значением, определенным указателем на массив 8-разрядных целых чисел со знаком.
String(Char, Int32)Инициализирует новый экземпляр класса String значением, полученным путем повторения заданного знака Юникода заданное число раз.
String(Char*, Int32, Int32)Инициализирует новый экземпляр класса String значением, которое определяется заданным указателем на массив знаков Юникода, начальной позицией знака в этом массиве и длиной.
String(Char[], Int32, Int32)Инициализирует новый экземпляр класса String значением, заданным массивом знаков Юникода, начальной позицией знака в пределах данного массива и длиной.
String(SByte*, Int32, Int32)Инициализирует новый экземпляр класса String значением, определяемым заданным указателем на массив 8-битовых целых чисел со знаком, позицией начального знака в пределах данного массива и длиной.
String(SByte*, Int32, Int32, Encoding)
Инициализирует новый экземпляр класса String значением, определенным заданным указателем на массив 8-разрядных целых чисел со знаком, начальной позицией знака в пределах данного массива, длиной и объектом Encoding.
http://www.slideshare.net/IgorShkulipa 20
Методы
• Contains () — позволяет узнать, содержит ли строка подстроку, переданнуюв качестве параметра.
• Format () — это статичный метод, который позволяет форматировать строки, какв консольных приложениях.
• IndexOf () — возвращает индекс символа, начиная с которого в строке найденаподстрока.
• Insert () — позволяет вставить подстроку, переданную во втором параметре, встроку, начиная с символа, указанного в первом параметре. При этомпеременная str не изменяется, а новая строка просто возвращается в видерезультата.
• Remove () — удаляет из строки символы, начиная с индекса, указанного вкачестве первого параметра, и ровно столько символов, сколько указано вовтором параметре. Сама строка не изменяется, измененный вариантвозвращается в качестве результата.
• Replace () — ищет в строке подстроку, указанную в качестве первогопараметра, и заменяет ее на подстроку из второго параметра, возвращаярезультат замены.
• ToUpper () и ToLower () — возвращают строку, в которой все символыприведены к верхнему ( ToUpper ()) или к нижнему (ToLower ()) регистру.
• Substring () — возвращает часть строки, начиная с символа, указанного вкачестве первого параметра, и ровно столько символов, сколько указано вовтором параметре.
• ToCharArray () — превращает строку в массив символов. Метод очень удобен,когда нужно проанализировать строку посимвольно.
http://www.slideshare.net/IgorShkulipa 21
Управляющие символы
• \' — одинарная кавычка, используется дляобъявления литералов типа System.Char
• \" — двойная кавычка, используется для объявлениястроковых литералов
• \\ — обратный слеш• \0 — null-символ в Юникоде• \a — символ Alert (№7)• \b — символ Backspace (№8)• \f —смена страницы FORM FEED (№12)• \n — перевод строки (№10)• \r — возврат каретки (№13)• \t — горизонтальная табуляция (№9)• \v — вертикальная табуляция (№11)• Uxxxx — символ Юникода с шестнадцатеричным
кодом xxxx• \xn[n][n][n] — символ Юникода с
шестнадцатеричным кодом nnnn, версия предыдущегопункта с переменной длиной цифр кода
http://www.slideshare.net/IgorShkulipa 22
Форматы строк
Интерфейс IFormatProvider предоставляет механизм извлечения объектадля управления форматированием.
.NET включает следующие три предопределенные реализацииIFormatProvider :• Класс NumberFormatInfo, который предоставляет сведения,
используемые для форматирования чисел, таких как валюта,разделитель разрядов, и десятичный разделитель дляопределенного языка и региональных параметров.
• Класс DateTimeFormatInfo, предоставляющий сведения,используемые для форматирования дат и времени, таких каксимволы разделителя даты и времени для определенного языка ирегиональных параметров или порядок и форма компонентов год,месяц и день.
• Класс CultureInfo, представляющий определенный язык ирегиональные параметры. Метод GetFormat возвращаетрегиональный объект NumberFormatInfo или DateTimeFormatInfo,в зависимости от того, используется ли объект CultureInfo вформатирование или анализе операции, которая включает числаили дату и время.
http://www.slideshare.net/IgorShkulipa 23
Пример
using System.Globalization;
class Program
{
static void Main(string[] args)
{
DateTime date = new DateTime(2013, 5, 30, 19, 00, 0);
CultureInfo[] cultures = { new CultureInfo("en-US"),
new CultureInfo("fr-FR"),
new CultureInfo("it-IT"),
new CultureInfo("de-DE"),
new CultureInfo("ru-RU")};
foreach (CultureInfo culture in cultures)
Console.WriteLine("{0}: {1}",
culture.Name, date.ToString(culture));
Console.ReadKey();
}
}en-US: 5/30/2013 7:00:00 PM
fr-FR: 30/05/2013 19:00:00
it-IT: 30/05/2013 19:00:00
de-DE: 30.05.2013 19:00:00
ru-RU: 30.05.2013 19:00:00
http://www.slideshare.net/IgorShkulipa 24
Паттерн Builder
Паттерн Builder может помочь в решении следующих задач:
◦ В системе могут существовать сложные объекты, созданиекоторых за одну операцию затруднительно или невозможно.Требуется поэтапное построение объектов с контролемрезультатов выполнения каждого этапа.
◦ Данные должны иметь несколько представлений. Например,если есть некоторый исходный документ в формате RTF (RichText Format), в общем случае содержащий текст,графические изображения и служебную информацию оформатировании (размер и тип шрифтов, отступы и др.).Если этот документ в формате RTF преобразовать в другиеформаты (например, Microsoft Word или простой ASCII-текст), то полученные документы и будут представлениямиисходных данных.
http://www.slideshare.net/IgorShkulipa 25
Описание паттерна Builder
Паттерн Builder отделяет алгоритм поэтапного конструированиясложного объекта от его внешнего представления так, что спомощью одного и того же алгоритма можно получать разныепредставления этого объекта.
Для этого паттерн Builder определяет алгоритм поэтапногосоздания продукта в специальном классе Director(распорядитель), а ответственность за координацию процессасборки отдельных частей продукта возлагает на иерархиюклассов Builder. В этой иерархии базовый класс Builderобъявляет интерфейс для построения отдельных частейпродукта, а соответствующие подклассы конкретныхстроителей их реализуют подходящим образом, например,создают или получают нужные ресурсы, сохраняютпромежуточные результаты, контролируют результатывыполнения операций.
http://www.slideshare.net/IgorShkulipa 26
Реализация паттерна Builder. Класс Computer
class Computer
{
public string Name { get; set; }
public string CPU { get; set; }
public string RAM { get; set; }
public string HDD { get; set; }
public string VGA { get; set; }
public void Print()
{
Console.Write(
"{0}: {1}/{2}/{3}/{4}\n",
Name, CPU, RAM, HDD, VGA);
}
}
http://www.slideshare.net/IgorShkulipa 27
Классы-строителиinterface ICompBuilder {
Computer Build();
}
class GameCompBuilder : ICompBuilder {
private Computer computer;
public GameCompBuilder() { computer = new Computer(); }
Computer ICompBuilder.Build() {
computer.Name = "Game Computer";
computer.CPU = "Core i7 3.0 GHz";
computer.RAM = "8 Gb";
computer.HDD = "1 Tb";
computer.VGA = "GeForce GTX 560";
return computer;
} }
class OfficeCompBuilder : ICompBuilder {
private Computer computer;
public OfficeCompBuilder() { computer = new Computer(); }
Computer ICompBuilder.Build() {
computer.Name = "Office Computer";
computer.CPU = "Core i3 3.0 GHz";
computer.RAM = "2 Gb";
computer.HDD = "500 Gb";
computer.VGA = "Intel GMA 4000";
return computer;
} }
http://www.slideshare.net/IgorShkulipa 28
Класс-директор
class Director
{
private ICompBuilder builder;
public Director() { }
public void SetBuilder(ICompBuilder builder)
{
this.builder = builder;
}
public Computer GetComp()
{
return builder.Build();
}
}
http://www.slideshare.net/IgorShkulipa 29
Использование строителей
class Program
{
static void Main(string[] args)
{
Director director = new Director();
//Building Game Computer
director.SetBuilder(new GameCompBuilder());
Computer comp = director.GetComp();
comp.Print();
//Building Office Computer
director.SetBuilder(new OfficeCompBuilder());
comp = director.GetComp();
comp.Print();
Console.ReadKey();
}
}
Game Computer: Core i7 3.0 GHz/8 Gb/1 Tb/GeForce GTX 560
Office Computer: Core i3 3.0 GHz/2 Gb/500 Gb/Intel GMA 4000
http://www.slideshare.net/IgorShkulipa 30
StringBuilder
Предоставляет изменяемую строку символов.
[SerializableAttribute]
[ComVisibleAttribute(true)]
public sealed class StringBuilder : ISerializable
Операция объединения объекта String всегда создает новый объект изсуществующей строки и новых данных. Объект StringBuilderподдерживает буфер для размещения и конкатенации новых данных.Новые данные добавляются в имеющийся буфер только в том случае,если в нем имеется достаточное свободное пространство для ихразмещения, в противном случае выделяется новый буфердостаточного размера, данные из оригинального буфера копируются вдругой буфер, и новые данные добавляются уже в новый буфер.
http://www.slideshare.net/IgorShkulipa 31
Пример
class Program
{
static void Main(string[] args)
{
string strText1 = "Hello" + "," + " " + "World" + "!";
string strText2 = "";
StringBuilder strBuilder = new StringBuilder(strText2);
strBuilder.Append("Hello");
strBuilder.Append(",");
strBuilder.Append(" ");
strBuilder.Append("World");
strBuilder.Append("!");
strText2 = strBuilder.ToString();
Console.WriteLine(strText1);
Console.WriteLine(strText2);
Console.ReadKey();
}
}Hello, World!
Hello, World!
http://www.slideshare.net/IgorShkulipa 32
Регулярные выражения
Пространство имен System.Text.RegularExpressions предоставляет классыдля работы с регулярными выражениями.
Регулярные выражения - формальный язык поиска и осуществленияманипуляций с подстроками в тексте, основанный на использованииметасимволов. По сути это строка-образец, состоящая из символов иметасимволов и задающая правило поиска.
Пример:
string emailExpression =
"[.\\-_a-z0-9]+@([a-z0-9][\\-a-z0-9]+\\.)+[a-z]{2,6}";
Ссылка на справочник по языку регулярных выражений .NEThttp://msdn.microsoft.com/ru-ru/library/az24scfc.aspx
http://www.slideshare.net/IgorShkulipa 33
Классы Regex и Match
Regex предлагает следующие функциональные возможности подборашаблонов:
• Проверка совпадения. Вызов метода IsMatch позволяетопределить, присутствует ли соответствие.
• Извлечения одного совпадения. Вызов метода Match позволяетизвлечь объект Match, который представляет первое совпадение,найденное в строке или в части строки. Последующие совпаденияможно извлечь, вызвав метод Match.NextMatch.
• Извлечение всех совпадений. Вызов метода Matches позволяетизвлечь объект System.Text.RegularExpressions.MatchCollection,который представляет все совпадения, найденные в строке или вчасти строки.
• Замена совпадающего текста. Вызов метода Replace позволяетзаменить совпадающий текст. Регулярным выражением такжеможет быть определен текст замещения. Кроме того, некоторыеметоды Replace включают параметр MatchEvaluator, которыйпозволяет программно определить текст замены.
• Создание массива строк, сформированный на основе частивходной строки. Вызов метода Split позволяет разбить входнуюстроку в позициях, определенных регулярным выражением.
http://www.slideshare.net/IgorShkulipa 34
Пример
class Program
{
static void Main(string[] args)
{
string strText =
"Lorem ipsum dolor sit amet, [email protected] consectetur adipiscing elit. "+
"In posuere, elit ut tristique condimentum, lectus est sodales nibh, "+
"sed adipiscing velit [email protected] lectus vel felis. Praesent id urna "+
"ut quam dapibus sollicitudin sit amet et mi. Quisque in magna nisi, in "+
"scelerisque mi [email protected]! Vestibulum suscipit lacinia tempor. Donec "+
"euismod massa sit amet tellus consectetur dapibus. Donec nisl justo, egestas at "+
"mattis ut, sagittis eu ipsum. Aliquam porttitor massa [email protected] in.";
string strFind = "([A-Z;a-z;0-9;\x2E;\x2D;_]+)?@([A-Z;a-z;0-9;\x2E;-;]+)?";
string strReplace = "$1";
Console.WriteLine(strText);
Console.WriteLine();
Regex regex = new Regex(strFind);
MatchCollection matches = regex.Matches(strText);
foreach(var match in matches)
{
Console.WriteLine(match);
}
Console.WriteLine();
strText = regex.Replace(strText, strReplace, 10);
Console.WriteLine(strText);
Console.ReadKey();
}
}
http://www.slideshare.net/IgorShkulipa 35
Результат
Lorem ipsum dolor sit amet, [email protected] consectetur adipiscing elit.
In posuere, elit ut tristique condimentum, lectus est sodales nibh, sed adipisci
ng velit [email protected] lectus vel felis. Praesent id urna ut quam dapibus soll
icitudin sit amet et mi. Quisque in magna nisi, in scelerisque mi [email protected]
om.ua! Vestibulum suscipit lacinia tempor. Donec euismod massa sit amet tellus c
onsectetur dapibus. Donec nisl justo, egestas at mattis ut, sagittis eu ipsum. A
liquam porttitor massa [email protected] in.
Lorem ipsum dolor sit amet, vasya.pupkin consectetur adipiscing elit. In posuere
, elit ut tristique condimentum, lectus est sodales nibh, sed adipiscing velit a
ddress lectus vel felis. Praesent id urna ut quam dapibus sollicitudin sit amet
et mi. Quisque in magna nisi, in scelerisque mi admin! Vestibulum suscipit lacin
ia tempor. Donec euismod massa sit amet tellus consectetur dapibus. Donec nisl j
usto, egestas at mattis ut, sagittis eu ipsum. Aliquam porttitor massa support i
n.
http://www.slideshare.net/IgorShkulipa 36
Лабораторная работа № 5. Строки и коллекции
• Создать словарь «ошибочных слов», например привет-првиет-пирвет...
• На основе этого словаря, исправить ошибки в текстовых файлах вуказанной директории.
• В этих же файлах, с помощью регулярных выражений, найти изаменить все номера мобильных телефоновс (012) 345-67-89 на +380 12 345 67 89.