Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по строкам.pdf
Скачиваний:
29
Добавлен:
15.04.2015
Размер:
372.89 Кб
Скачать

Лекция

Строки языка С# и алгоритмы обработки текстов

Оглавление

 

1

Тип данных char и символьные константы в UNICODE кодировке

...............................................3

2

Массивы типа char и строки языка С#..............................................................................................

7

3

Обработка естественноязыковых текстов.......................................................................................

12

4

Массивы строк в языке С#...............................................................................................................

16

2

Строки в С#

1 Тип данных char и символьные константы в UNICODE кодировке

Как мы знаем, для представления одиночных символов естественных языков в языке С предназначен тип данных char (см. разд. 4.1 из книги [1]). В языке С# тоже есть тип char и применяется он с той же целью. Только тип char в языке С# кодирует символы в так называемой кодировке UNICODE (2 байта на один символ, вместо 1 байта по стандартным для языка С кодировкам ASCII/ANSI). Это сразу и радикально решает все проблемы с национальными языками, отличными от английского (и от западноевропейских языков). Нас в первую очередь интересует русский язык. Так вот, кодировка UNICODE позволяет нам программно работать с русским языком без проблем, и поэтому в данной главе мы для подчеркивания этого факта (и для привыкания к нему) будем использовать в качестве примераобрабатываемыхсимволов только символы русскогоязыка.

В языке С#, как ив языке С, символьные константы представляют из себя запись символав окружениииз апострофов (одиночных кавычек).

Знать и помнить наизусть числовые значения UNICODE-кодов для тех или иных конкретных символов не нужно, ведь для этого можно воспользоваться следующей простейшей программой, которая выведет всю необходимую нам информацию в свое консольноеокно:

Листинг 1.

1.namespace string_app

2.{

3.class Program

4.{

5.static void Main(string[] args)

6.{

7.char[] chAr = {'A','/','Ф','Ж'};

8.int[] iCode = new int[chAr.Length];

9.for( int i = 0; i < chAr.Length; ++i )

10.{

11.iCode[i] = (int)chAr[i];

12.Console.WriteLine( "Для {0} код равен {1}",chAr[i], iCode[i] ) ;

13.}

14.}

15.}

16.}

Здесь в массив chAr типа char [ ] помещены два русских символа - 'Ф' и 'Ж', английский символ 'А', а также символ обратной наклонной черты. С последним символом в языке С# ситуация та же самая, что и в языке С - он выполняет роль маркера начала управляющих символов (\п -перевод строки, \t - табуляция и т. д.), так что его самого приходится изображать в виденабораиздвухсимволов наклоннойчерты.

Символы из массива chAr [ ] легко преобразуются в обычные целочисленные значения типа int с помощью операцииявногоприведения типов:

iCode[i] = (int)chAr[i];

МетодWriteLine () выводит в консольноеокно элементы массива chAr в формесимволов, а

3

Строки в С#

элементы массива iCode[i] - в формечисловых кодов этих символов.

Запускаем программу с Листинга 1 на выполнение и видим нужную нам информацию по

UNICODE-кодам (см. рис. 1).

Рисунок 1: Результат работы программы Листинг 1

Из рис. 1 видно, что в UNICODE-кодировке английскому символу А соответствует числовой код 65, символу обратной наклонной чертой - код 92, русской букве Ф - числовой код1060, русскойбукве Ж - код1046.

Ясно, что UNOCODE-коды английских букв, цифр, знаков препинания и тому подобных символов те же самые, что и в ASCII-кодировке. Следующая программа показывает коды управляющихсимволов \n и \t:

Листинг 2.

1.class Program

2.{

3.static void Main(string[] args)

4.{

5. char x = '\n', y = '\t' ;

6. int ix = (int)x, iy = (int)y;

7. Console.WriteLine( "Символ \\n имеет код {0}", ix ); 8. Console.WriteLine( "Символ \\t имеет код {0}", iy ); 9. Console.ReadLine();

10.}

11.}

Компилируем программу, запускаем ее на выполнение и получаем ответ на наш вопрос

(см. рис. 2).

4

Строки в С#

Рисунок 2: Результат работы программы Листинг 2

Рис. 2 показывает, что управляющему символу \п соответствует числовой UNICODE-код 10 (в десятичной записи), а управляющему символу табуляции \t соответствует числовой код

9.

Другое дело, это коды символов некоторых национальных языков. Из рис. 1 видно, что русским буквам соответствует совсем иной диапазон значений UNI-CODE-кодов (больше 1000), для нагляднойдемонстрациикоторогопредназначенаследующая программа:

Листинг 3.

1.namespace string_app

2.{

3.class Program

4.{

5.static void Main(string[] args)

6.{

7.char x = (char)1040;

8.Console.WriteLine("UNICODE\t\tSymbol");

9.Console.WriteLine("----------------------------");

10.for (int i = 0; i < 66; ++i, ++x)

11.{

12.Console.WriteLine("{0}\t\t{1}", x, 1040 + i);

13.}

14.}

15.}

16.}

Данная программа, используя управляющие символы табуляции, порождает наглядный табличный вывод в консольное окно информации о UNICODE-кодах русских букв (см. рис.

3).

5

Строки в С#

Рисунок 3: Результат работы программы Листинг 3

Заметим, что в языке С#, в отличие от языков C/C++, переменной типа char нельзя напрямую присвоить числовое значение, так как возникает ошибка компиляции. Поэтому в Листинге 3 мы используемоперациюявногоприведения типовданных:

char х = (char)1040;

То же самое присваивание можно выполнить, используя апострофы и шестнадцатеричную форму записи для десятичногочисла 1040:

char х = '\u0410';

И, наконец, самое большое отличие типа char языка С# от одноименного типа данных языков C/C++ заключается в том, что этот встроенный тип данных строится на базе библиотечного класса с именем Char (определен в пространстве имен System). Ранее мы столкнулись с подобным явлением на примере массивов языка С# и здесь все то же самое (маленькое отличие - данный класс, то есть абстрактный тип данных Char, определяется не ключевым словом class, а другим ключевым словом - struct, что влечет за собой определенныеотличия, ноонив нашемпособиидля простоты нерассматриваются).

Тип Char содержит набор чрезвычайно практически полезных статических методов, позволяющих запросить тип символа - буква или нет, большая буква (заглавная) или строчная, знак лиэто пунктуацииитак далее. Вот иллюстрирующий примернаэту тему:

Листинг 4.

1.namespace string_app

2.{

3.class Program

4.{

5.static void Main(string[] args)

6.{

7. char xl = '\n', x2 = 'ж', x3 = '7'; 8. if( Char.IsWhiteSpace( xl ) )

9. Console.WriteLine( "\\п - управляющий символ" );

10. if( Char.IsLetter( x2 ) )

6