Программирование >>  Рекурсивные объекты и фрактальные узоры 

1 ... 32 33 34 [ 35 ] 36 37 38 ... 43


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

Прямая транслитерация - это запись русскоязычного документа с помощью латинских букв ( Иван ушел домой -> Ivan ushel domoy ). Обратите внимание, что большинству русских букв обычгю соответствует одна буква латинского алфавита ( р -> г , д -> d ), но некоторым буквам может соответствовать несколько латинских символов ( ш -♦ sh , ю -> уи ), а иным и ни одного (твёрдый знак).

Обратная транслитерация - это перевод транслитерированного текста в обычную запись юфиллическим шрифтом. Здесь есть свои сложности.

По идее, конечно, последовательная транслитерация и обратная транслитерация некоторого текста не должна вносить в него никаких изменений ( Иван -> Ivan -> Иван ), но на практике достичь этого результата непросто. Например, слово шкаф будет записано латиницей как shkaf*, а слово схема - как shema .

Как теперь процедура обратной транслитерации может догадаться, что в первом случае сочетание sh требуется преобразовать в ш , а во втором - в сх ? Можно попытаться выкрутиться, кодируя X не буквой h, а сочетанием kh , но по существу это ничего не меняет.

В кириллическом алфавите букв больше, чем в латинском, поэтому какие-то различные русские буквы неизбежно будут переданы одними и еми же латинскими символами. Не забывайте, к тому же, что результирующий текст должен быть ещё и читабельным.

8.5. АББРЕВИАТОР, ИЛИ КАК ПРАВИЛЬНО ПРОИЗНЕСТИ КД-ПЗУ ?

В мире уже давно ведутся разработки систем синтеза речи (text-to-speech engines). Хотя существуют и коммерческие продукты, на мой взгляд, они ещё далеки от идеала (особенно если речь идёт о русском языке). Аббреви-атор - это один из модулей такой системы.

Чтобы произнести любое слово, надо уметь определять его транскрипцию, то есть переводить буквы и буквосочетания в звуки, которые можно записать, например, с помощью символов транскрипции IPA (International Phonetic Alphabet).

Если для обычных слов эта процедура как-то работает, то для аббревиатур требуется отдельный подход. В частности, аббревиатура может произноситься по буквам (МГУ, СПбГУ), чего никогда не требуется для слов, не являющихся аббревиатурами.

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

МИФИ - мифи СПбГУ эспэбэгэу

Для преобразования аббревиатур в произносимые слова и предназначен модуль аббревиатора.

Так, ссылка http: myserver. ru/banner/bannerl. jpg соответствует третьему элементу списка и, следовательно, распознаётся как баннер.

Работа с символами подстановки не так проста, как кажется на первый взгляд. Полноценный механизм распознавания соответствия строки шаблону требует использования перебора с возвратами.

Рассмотрим простой (хотя и несколько искусстве1П1ЫЙ) пример. Требуется определить, соответствует ли строка аа Ыаа Ы Ь2 аа пшблону *Ы?Ь2*.

Соответствие, конечно, существует, но как его определить? Простейший жадный апоритм найдёт сначала подстроку Ы, затем пропустит символ подчёркивания, соответствующий подстановочному знаку ?. Теперь в строке ожидается подстрока Ь2, но на входе окажется другая последовательность - аа Ы Ь2 аа. Чтобы соответствие всё-таки было найдено, алгоритму придётся начать поиск со второй подстроки Ы. Таким образом, мы приходим к перебору с возвратами.

В этой задаче достаточно ограничиться жадной реализацией механизма распознавания символов подстановки (без возвратов).

8.4. ТРАНСЛИТЕРАЦИЯ DLYATEH, КТО NE MOZHET PISAT PO-RUSSKi



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

Задача заключается в разработке такого аббревиатора.

Попробуйте выявить правила, определяющие способ произношения аббревиатуры: как обычное слово или по буквам. I Гапримср, известно такое наблюдение: если первые две буквы аббревиатуры являются согласными, слово с высокой вероят!1остью произносится по буквам. Чем больше правил вы найдёте, тем лучше; хотя без списка исключений, наверное, всё равно пе обойтись.

8.6. ВЫРАВНИВАНИЕ ПО ШИРИНЕ. КРАСИВОЕ ФОРМАТИРОВАНИЕ ТЕКСТА

Следующая задача относится к разряду классических. Её решение вы видите каждый раз, когда работаете с любым современным текстовым редактором.

Дан текстовый файл с обычным для таких файлов форматированием: символ возврата каретки/перевода строки разделяет отдельные абзацы, в пределах же одного абзаца слова разделены пробелами.

Для заданного числа N требуется сформировать выходной текстовый файл, в котором каждая строка будет содержать не более N символов, после чего записывается символ перевода строки (предполагается, что значите N достаточно велико, чтобы вместить хотя бы одно слово). Текст в итоговом файле должен быть выровнен по ширине.

Пример входного файла:

Мы постарались сделать наш продукт по возможности простым и удобным в использовании. При возникновении каких-либо затруднений обратитесь к справочной системе. Если же её содержимое Вас не удовлетворит, обратитесь в службу поддержки. Наши специалисты будут рады Вам помочь. *

Пример выходного файла для N = 40:

Мы постарались сделать наш продукт по возможности простым и удобным в использовании. При возникновении

каких-либо затруднений обратитесь к справочной системе. Если же её содержимое Вас не удовлетворит,

обратитесь в службу поддержки. Наши специалисты будут рады Вам помочь.

Программа должна расставлять дополнительные пробелы между словами равномерно, но не совершенно одинаковым образом в каждой строке. К примеру, если в две подряд идущие строки требуется добавить по одному пробелу, не стоит производить добавление после первого слова каждой из строк. Равномерность должна сочетаться с некоторой случайностью при выборе позиций вставляемых пробелов, чтобы готовый текст выглядел красивее.

8.7. РАССТАНОВКА ПЕРЕНОСОВ

Экскурс в правила русского языка

Мы изучали перенос. Вот как слова я перенёс: <fEdea* я перенёс е-два . И получил за это Эво . Укол я перенёс 41у-кол И получил за это кол . Опяты> я перенёс <о-пять*. Теперь, наверно, будет - пять ?!

А. Шибаев

Расстановка переносов ~ ещё одна задача, возникающая при работе с текстами. Задача заключается в том, чтобы разработать алгоритм, автоматически расставляющий переносы в русских словах. С клавиатуры вводится слово, а компьютер выдаёт все возможные переносы в нём.

Пример: телевизор -♦ те-ле-ви-зор. Подсказка

При решении задачи следует руководствоваться правилами русской орфографии, официально утверждёнными ещё в 1956 году (их можно найти, например, на странице http: www. primavista. ru/pravila). Здесь я приведу то71ЬКо самые простые нормы, касающиеся расстановки переносов. Их реализация не должна вызвать у вас особых затруднений.

§ 117. При переносе слов нельзя ни оставлять в конце строки, ни переносить на другую строку часть слова, не составляющую слога; например, нельзя переносить просмо-тр, ст-рах.

§ 118. Нельзя отделять согласную от следующей за ней гласной. Неправильно: люб-овь, дяд-енька, реб-ята, паст-ух.



ГЛАВА 9. РАЗЛИЧНЫЕ АЛГОРИТМЫ

Правильно: лю-бовь, дя-денька и дядень-ка, па-стух и пас-тух.

Примечание. Если после приставки стоит буква ы, то переносить часть слова, начинающуюся с ы, не разрешается.

Неправильно: раз-ыскать.

Правильно: ра-зыскать, разыс-кать.

§ 119. Кроме правил, изложенных в §§ 117 и 118, необходимо руководствоваться ещё следующими правилами:

Нельзя отрывать буквы ь и ь от предшествующей согласной.

Неправильно: под-ъезд, бол-ьшой, бул-ьон.

Правильно: подъ-езд, боль-гиой, буль-он и бу-льон.

Нельзя отрывать букву й от предшествующей гласной.

Неправильно: во-йна, сто-йкий, фе-йерверк, ма-йор.

Правильно: вой-на, стой-кий, фей-ерверк и фейер-верк, май-ор.

Нельзя оставлять в конце строки или переносить на другую строку одну букву.

Неправильно: а-кация, акаци-я. Правильно: ака-ция.

Нельзя оставлять в конце строки или переносить в начало следующей две одинаковые согласные, стоящие между гласными.

Неправильно: жу-жжать, ма-сса, ко-нный.

Правильно: жуж-жать, мас-са, кон-ный.



1 ... 32 33 34 [ 35 ] 36 37 38 ... 43

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика