Смекни!
smekni.com

Программа для перевода текстов с транслита (стр. 3 из 3)

str1[1]:= UpCase_R(str1[1]);

end;

str2:= str2+str1;

end

else if ch in small_al then //если маленькая русская буква

begin

if UpCase_R(ch) = 'Ё' then str1:= b_jo

else str1:= alph[UpCase_R(ch)];

str2:= str2+str1;

end

else //если не является символом русского алфавита

str2:= str2+ch;

end;

MainForm.MemLat.Lines.Add(str2); //добавляем переведенную строку в окошко

с переводом

end; //и все с начала (след. строка)

end;

В приложении №1 приводится блок-схема этого алгоритма.

Обратный перевод осуществляется аналогично прямому за исключением того, что из строки с транслитом сначала выбирается подстрока с длинной равной наибольшей длинне буквы в словаре транслита (для правильной обработки символов типа «ъ» - «’ ’» и «ь» - «’ ’»):

procedure TMainForm.acLatTuCyrExecute(Sender: TObject);

const

lat_small : set of char = ['a'..'z',''''];

lat_up : set of char = ['A'..'Z'];

var

i1,j1,i3,max_l,tek_l,len :integer;

str,str1,st2 :string;

ch :char;

ok1,f_ok :boolean;

function find(var st_in:string):boolean; //Эта функция ищет в alph['А'..'Я'] заданную строку

var //т.е. пытается определить какой букве русского алфавита соответствует введенная строка

i2 :char;

j2,i3 :integer;

st_mod :string;

ok :boolean;

begin

st_mod:= st_in; //Будем работать с локальной переменной, чтоб не испортить исходную строку

forj2:= 1 tolength(st_mod) do //уменьшаем регистр у символов в строке

st_mod[j2]:= downcase(st_mod[j2]);

find:= false; //Присваиваем начальное значение результату функции

ifb_jo = st_modthen //буква определяется Ё отдельно

begin

st_mod:= 'Ё';

if st_in[1] in lat_small then st_mod:= 'ё'; //проверяем должна ли буква быть маленькой

st_in:= st_mod; //меняем исходную на переведенную

find:= true; //да, мы нашли соответствие возвращаем true

exit; //досрочныйвыход.

end;

fori2:= 'А' to 'Я' do //а если не Ё, то проверяем все буквы по алгоритму приведенному выше

begin

if alph[i2] = st_mod then

begin

st_mod:= i2;

if (st_in[1] in lat_up) then st_in:= st_mod;

else st_in:= DownCase(st_mod);

find:= true;

exit;

end;

end;

end;

begin

MainForm.MemCyr.Clear; //очищаем поле для результата

max_l:= length(b_jo); //запоминаем длинну самой длинной буквы в алфавите

forch:= 'А' to 'Я' do //цикл по всем буквам

begin

tek_l:= length(alph[ch]);

if tek_l > max_l then max_l:= tek_l;

end;

for i1:= 0 to MainForm.MemLat.Lines.Count-1 do //цикл построчно

begin

str:= MainForm.MemLat.Lines[i1];

st2:= '';

str1:= '';

whilestr <> '' do //пока строка не пустая (обработанные символы будем удалять)

begin

f_ok:= false;

forj1:= max_ldownto 1 do //пытаемся собрать букву разной длины

begin

st2:= '';

for i3:= 1 to j1 do

begin

if (str[i3] in lat_small)or(str[i3] in lat_up)then

st2:= st2+str[i3] //если латинская буква тогда заносим её в st2!

else if j1 = 1 then

begin

st2:= str[i3]; //это символ не кириллицы, заносим в строку с результатом (st2)

delete(str,1,1); //удаляем из исходной

f_ok:= true; //обработали

break;

end

elsebreak;

end;

len:= length(st2); //запомним длину полученной строки

iffind(st2) then //и если окажется, что она соответствует русской букве

begin

delete(str,1,len); //удалим ее из исходной строки

f_ok:= true; //обработали

break;

end;

end;

str1:= str1 + st2; //добавляем к строке с результатом полученную букву

ifnotf_okthen

delete(str,1,1); //если по какой-то причине еще не удалили из исходной, то удаляем сейчас

end;

MainForm.MemCyr.Lines.Add(str1); //и заноси строку в окно с переводом

end;

end;

8. Работа с программой, входные и выходные данные

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

9. Описание тестовых заданий

Для тестов использовались два отрывка текста, написанных на кириллице. Первый из них – отрывок из первой главы книги «Библия Delphi» Михаила Флёнова:

«Прежде чем программировать компьютер, мы должны понять, как он работает.Как говорил какой-то полководец: «Нужно хорошо изучить своего врага!!!».Возможно, это говорил и не полководец, но это не важно :). Кодинг – это постоянная борьба с машиной. Нужно заставлять её делать то, что тебе нужно. Поэтому любой программист просто обязан знать его внутренности. Компьютер состоит из следующих основных компонентов: процессор, память, видеокарта, винчестер (жёсткий диск) и различные разъёмы для подключения дополнительных устройств. Все эти компоненты связаны между собой с помощью шлейфов и шин.»

При переводе этого текста на транслит получился следующий текст:

«Prezhde chem programmirovat' komp'juter, my dolzhny ponjat', kak on rabotaet.Kak govoril kakojj-to polkovodec: «Nuzhno khorosho izuchit' svoego vraga!!!». Vozmozhno, ehto govoril i ne polkovodec, no ehto ne vazhno :). Koding – ehto postojannaja bor'ba s mashinojj. Nuzhno zastavljat' ejo delat' to, chto tebe nuzhno. Poehtomu ljubojj programmist prosto objazan znat' ego vnutrennosti. Komp'juter sostoit iz sledujushhikh osnovnykh komponentov: processor, pamjat', videokarta, vinchester (zhjostkijj disk) i razlichnye raz''jomy dlja podkljuchenija dopolnitel'nykh ustrojjstv. Vse ehti komponenty svjazany mezhdu sobojj s pomoshh'ju shlejjfov i shin.».

При переводе этого текста обратно на кириллицу, получаем текст идентичный первоначальному, что свидетельствует о правильной работе программы.

Второй текст для теста был взят из книги Фрэнка Херберта «Бог - император Дюны», глава первая:

«Я не только с огромным удовольствием сообщаю вам сегодня об открытии чудесного содержимого тайного хранилища с его значительной коллекцией рукописей, запечатленных на Редуланской хрустальной бумаге, но также горда привести вам доводы в защиту подлинности наших открытий, сообщить вам, почему мы считаем, что открыли подлинные дневники Лито II, Бога Императора.»

Результат перевода:

«Ja ne tol'ko s ogromnym udovol'stviem soobshhaju vam segodnja ob otkrytii chudesnogo soderzhimogo tajjnogo khranilishha s ego znachitel'nojj kollekciejj rukopisejj, zapechatlennykh na Redulanskojj khrustal'nojj bumage, no takzhe gorda privesti vam dovody v zashhitu podlinnosti nashikh otkrytijj, soobshhit' vam, pochemu my schitaem, chto otkryli podlinnye dnevniki Lito II, Boga Imperatora.»

При переводе данного текста в кириллицу был обнаружен недочёт, не связанный с алгоритмом программы – римские цифры. II преобразуется в ИИ, VV – в ВВ и т.д.


Приложение