Программа для перевода текстов с транслита

Федеральное агентство по образованию РоссийскойФедерации.
Южно-Уральский Государственный Университет.
Кафедра «Информационно – аналитическое обеспечениеуправления в социальных и экономических системах»

Курсовая работа по дисциплине Программирование наязыке высокого уровня
«Программа для перевода текстов с транслита»

Выполнил:
Студент группы ПC-ххх
_______  Студент
“___” ____________ 2005
Проверил:
_______ Препод
“___”____________2005

Челябинск
2005
План
Описание применения
1.  Постановказадачи
2.  Актуальностьзадачи
3.  Методрешения
4.  Входныеи выходные данные
Описание программы
1.  Общиеданные и типы.
2.  Списокпроцедур и функций
3.  Структурапрограммы.
4.  Главнаяформа
5.  Форма«Редактор алфавита»
6.  Форма«О программе»
7.  Основныеалгоритмы
8.  Работас программой, входные и выходные данные
9.  Описаниетестовых заданий
Приложение
Описаниеприменения/>/>/> 1.   Постановка задачи
Программадля перевода текстов с транслита на русский и обратно. Поддерживаетсяформатирование текста, наиболее популярные системы транслитерации ГОСТ16876-71, русско-английскую, а также таблицы, задаваемые пользователем.Программа должна иметь функцию перевода символов текста к верхнему и нижнемурегистру, функцию подсчета количества символов в тексте. Загрузка текста избуфера обмена может осуществляться по быстрой кнопке./>2.   Актуальность задачи
Переводтекста из кириллицы в транслит используется очень часто. От простейшегосоздания nickname до разговоров вIRC-каналах. Многие программы неподдерживают кириллицу и приходится вводить какие-либо комментарии натранслите. Также некоторые mp3-плеерыне поддерживают кириллицу и теги приходится писать также на транслите. Этотспособ кодировки русских букв давно устоялся и есть чёткие правила (хотя есть иварианты) набора букв. Поэтому в данной программе необходимо реализоватьзагрузки словаря./>/>/>3.  Метод решения
Таккак программа должна иметь графический и интуитивно понятный интерфейс, то длярешения очень подходит DELPHI.Была выбрана версия 7.0. Вся программа была разбита на 3 формы: главная, формаработы со словарями и форма «О программе». Весь интерфейс был разработан  настандартных компонентах и обработчиках событий.
/>/>/>4.  Входные ивыходные данные
Входныеи выходные параметры могут быть двух типов: словарь и текст для перевода.Словарь – типизированный файл (shortstring). Возможно сохранение и загрузкасловаря. Текст – обычный текстовый файл на кириллице или транслите (возможенперевод в обе стороны). Результат также можно сохранять в текстовый файл. Такжетекст можно вводить с клавиатуры в соответствующие текстовые поля.
/>/>/>Описаниепрограммы/>/>/>1.  Общие данныеи типы
Алфавитперевода представляет из себя массив переменных типа shortstringс индексами от «А» до «Я». Элементами массива являются символы в транслитесоответствующей букве в кириллице.
Array [‘А’..‘Я’]of shortstring.
Такжесоздано множество больших и маленьких букв кириллицы:
al_set       : set of char = [‘А’..’Я’,’Й’,’Ё’];
small_al     : set of char = [‘а’..’я’,’й’,’ё’];/>/>/>2.  Списокпроцедур и функций
ФункцияUpCase_R(constch_in:char):charвозвращает символ в верхнем регистре:
Листинг1. Функция UpCase_R
function UpCase_R(const ch_in:char):char;
var
   res:char;
begin
  case ch_inof  //проверяет является ли параметр ch_inрусской буквой и если да
    ‘й’: res:= ‘Й’;  //то заменяетеё на аналогичную, но в верхнем регистре.
    ‘ц’:res:= ‘Ц’;
     ‘у’:res:= ‘У’;
     ‘к’:res:= ‘К’;
     ‘е’:res:= ‘Е’;
     ‘н’:res:= ‘Н’;
     ‘г’:res:= ‘Г’;
     ‘ш’:res:= ‘Ш’;
     ‘щ’:res:= ‘Щ’;
     ‘з’:res:= ‘З’;
     ‘х’:res:= ‘Х’;
     ‘ъ’:res:= ‘Ъ’;
     ‘ф’:res:= ‘Ф’;
     ‘ы’:res:= ‘Ы’;
     ‘в’:res:= ‘В’;
     ‘а’:res:= ‘А’;
     ‘п’: res:= ‘П’;
     ‘р’:res:= ‘Р’;
     ‘о’:res:= ‘О’;
     ‘л’:res:= ‘Л’;
     ‘д’:res:= ‘Д’;
     ‘ж’:res:= ‘Ж’;
     ‘э’:res:= ‘Э’;
     ‘я’:res:= ‘Я’;
     ‘ч’:res:= ‘Ч’;
     ‘с’:res:= ‘С’;
     ‘м’:res:= ‘М’;
     ‘и’:res:= ‘И’;
     ‘т’:res:= ‘Т’;
     ‘ь’:res:= ‘Ь’;
     ‘б’:res:= ‘Б’;
     ‘ю’:res:= ‘Ю’;
     ‘ё’:res:= ‘Ё’;
   else
     begin
        if not(ch_in in al_set) then
          res:= UpCase(ch_in)
        else
          res:= ch_in;
     end;
   end;
   UpCase_R:= res;
end;
Функцияdowncase (constch_in:char):charвозвращает символ в нижнем регистре:
Листинг2.Функцияdowncase.
function downcase(ch_in:char):char;
var
   res:char;
Begin
  case ch_inof  // проверяет является ли параметрch_inрусской или латинской
    ‘Й’: res:= ‘й’;  // буквой иесли да, то возвращает соответствующую букву
    ‘Ц’: res:= ‘ц’;  // но вверхнем регистре.
    ‘У’:res:= ‘у’;
     ‘К’:res:= ‘к’;
     ‘Е’:res:= ‘е’;
     ‘Н’:res:= ‘н’;
     ‘Г’:res:= ‘г’;
     ‘Ш’:res:= ‘ш’;
     ‘Щ’:res:= ‘щ’;
     ‘З’:res:= ‘з’;
     ‘Х’:res:= ‘х’;
     ‘Ъ’:res:= ‘ъ’;
     ‘Ф’:res:= ‘ф’;
     ‘Ы’:res:= ‘ы’;
     ‘В’:res:= ‘в’;
     ‘А’:res:= ‘а’;
     ‘П’:res:= ‘п’;
     ‘Р’:res:= ‘р’;
     ‘О’:res:= ‘о’;
     ‘Л’:res:= ‘л’;
     ‘Д’:res:= ‘д’;
     ‘Ж’:res:= ‘ж’;
     ‘Э’:res:= ‘э’;
     ‘Я’:res:= ‘я’;
     ‘Ч’:res:= ‘ч’;
     ‘С’:res:= ‘с’;
     ‘М’:res:= ‘м’;
     ‘И’:res:= ‘и’;
     ‘Т’:res:= ‘т’;
     ‘Ь’:res:= ‘ь’;
     ‘Б’:res:= ‘б’;
     ‘Ю’:res:= ‘ю’;
     ‘Ё’:res:= ‘ё’;
     ‘Q’: res:= ‘q’;
     ‘W’: res:= ‘w’;
     ‘E’: res:= ‘e’;
     ‘R’: res:= ‘r’;
     ‘T’: res:= ‘t’;
     ‘Y’: res:= ‘y’;
     ‘U’: res:= ‘u’;
     ‘I’: res:= ‘i’;
     ‘O’: res:= ‘o’;
     ‘P’: res:= ‘p’;
     ‘A’: res:= ‘a’;
     ‘S’: res:= ‘s’;
     ‘D’: res:= ‘d’;
     ‘F’: res:= ‘f’;
     ‘G’: res:= ‘g’;
     ‘H’: res:= ‘h’;
     ‘J’: res:= ‘j’;
     ‘K’: res:= ‘k’;
     ‘L’: res:= ‘l’;
     ‘Z’: res:= ‘z’;
     ‘X’: res:= ‘x’;
     ‘C’: res:= ‘c’;
     ‘V’: res:= ‘v’;
     ‘B’: res:= ‘b’;
     ‘N’: res:= ‘n’;
     ‘M’: res:= ‘m’;
   else
     res:= ch_in;
   end;
  Downcase:= res;
End;/>/>/>3.  Структурапрограммы
Программасостоит из трех частей:
·    Главнойформы (модуль unit_main)

/>
Рис1. Главная форма
·    Формы«О программе» (модуль unit_about)
/>
рис2. Форма «О программе»
·    Формыработы со словарями (модуль unit_slov)

/>
рис3. Форма «Редактор алфавита»
Главнаяформа загружается автоматически и другие формы вызываются из нее. При выбоременю «Перевод -> Редактор алфавита» вызывается форма работы с алфавитом, апри выборе «Справка -> О программе» вызывается форма «О программе»./>/>/>4.  Главная форма
Предназначенадля загрузки, сохранения, редактирования и перевода текстов.
Содержитследующие компоненты:
·        TMemo– 2шт
·        TPanel– 2 шт.;
·        TMainMenu;
·        TStatusBar;
·        TLabel– 4 шт.
·        TOpenDialog
·        TSaveDialog
·        TmainMenu
·        TimageList
·        TactionList
·        TtoolBar (ToolButton –7 шт.)
Всёрасположено так, как указано на рисунке 1.
ДваTLabel указывают нанаправление перевода в полях, ещё два – на количество символов в областях вводаданных. Два диалога (TOpenDialogи TSaveDialog) для сохранения изагрузки исходного или итогового текста. TMemoдля ввода (и отображения) текущих данных для перевода. TMainMenuдля главного меню и кнопки (ToolButton)для управления программой (для управления полями ввода и словарём).
Главноеменю основной формы:
·    Меню«Файл»
/>
рис.4. Главное меню. Пункт «Файл»
·    Меню«Правка»

/>
рис.5. Главное меню. Пункт «Правка»
·    Меню«Перевод»
/>
рис.6. Главное меню. Пункт «Перевод»
·    Меню«Справка»
/>
рис.7. Главное меню. Пункт «Справка»

Длякаждого пункта меню используются клавиши быстрого доступа (свойство ShortCut)и пиктограммы(элементы ImageList).Обработка выбора каждого пункта меню производится в Action’ахкомпонента ActionList.
Обработчикисобытий главной формы:
Присоздании формы загружается стандартный ГОСТ’овский словарь перевода изкириллицы в транслит и обнуляется текст выводящий количество символов в полях.
Листинг3. «Обработчик события создания главной формы»
procedure TMainForm.FormCreate(Sender: TObject);
begin
   Count_1.Caption:= ‘Символов: 0’;
   Count_2.Caption:= ‘Символов: 0’;
   b_jo:= ‘jo’;
   alph[‘А’]:= ‘a’;
   alph[‘Б’]:= ‘b’;
   alph[‘В’]:= ‘v’;
   alph[‘Г’]:= ‘g’;
   alph[‘Д’]:= ‘d’;
   alph[‘Е’]:= ‘e’;
   alph[‘Ж’]:= ‘zh’;
   alph[‘З’]:= ‘z’;
   alph[‘И’]:= ‘i’;
   alph[‘Й’]:= ‘jj’;
   alph[‘К’]:= ‘k’;
   alph[‘Л’]:= ‘l’;
   alph[‘М’]:= ‘m’;
   alph[‘Н’]:= ‘n’;
   alph[‘О’]:= ‘o’;
   alph[‘П’]:= ‘p’;
   alph[‘Р’]:= ‘r’;
   alph[‘С’]:= ‘s’;
   alph[‘Т’]:= ‘t’;
   alph[‘У’]:= ‘u’;
   alph[‘Ф’]:= ‘f’;
   alph[‘Х’]:= ‘kh’;
   alph[‘Ц’]:= ‘c’;
   alph[‘Ч’]:= ‘ch’;
   alph[‘Ш’]:= ‘sh’;
   alph[‘Щ’]:= ‘shh’;
   alph[‘Ъ’]:= ”””;
   alph[‘Ы’]:= ‘y’;
   alph[‘Ь’]:= ””;
   alph[‘Э’]:= ‘eh’;
   alph[‘Ю’]:= ‘ju’;
   alph[‘Я’]:= ‘ja’;
end;
Обработчикисобытий для кнопок:
·    Кнопка/> (редактироватьалфавит), событие acAlphEdit
Листинг4. «Обработчик события нажатия на кнопку Редактировать алфавит»
procedure TMainForm.acAlphEditExecute(Sender:TObject);
begin
   SlovarForm.show;
end;
·    Кнопка/> (Открытьфаил в окно кириллици) acCyrOpen
Выполняетдиалог OpenDialog и загружает вполе memCyr содержимоефайла используя при этом обработчик исключений.
Листинг5. «Обработчиксобытия нажатия на кнопку Открыть»
procedure TMainForm.acCyrOpenExecute(Sender:TObject);
begin
   if openDialog.execute then
     try
       memCyr.lines.LoadFromFile(OpenDialog.FileName);
     except
       showmessage(‘Неверный формат фаила!!!’);
     end;
end;
·    Кнопка/> (Сохранитьтекст из окна кириллици) acSaveCyr
Выполняетдиалог SaveDialog и сохраняетполе memCyr в файл.
Листинг6. «Обработчик события нажатия на кнопку Сохранить»
procedure TMainForm.acSaveCyrExecute(Sender:TObject);
begin
   if openDialog.execute then
     memCyr.lines.SaveToFile(OpenDialog.FileName);
end;
·    Кнопка/> (перевестис кириллици в латиницу) acCyrToLat
Очищаетполе memLat и заносит внего текст переведенный в транслит. Данный алгоритм будет рассмотрен в части«Основные алгоритмы»
Кодыобработки событий нажатия кнопок сохранения и загрузки для memLat(поле ввода латиници) идентичны приведенным выша, за исключением входного ивыходного полей (memLat)
Процедурыобработки событий главного меню:
·    Меню«Файл»
o  «Открытьфаил в окно кириллици» />
acCyrOpen
o  «Открытьфаил в окно латиници» />
acLatOpen
o  «Сохранитьтекст из окна кириллици» />
acSaveCyr
o  «Сохранитьтекст из окна латиници» />
acSaveLat
o  «Выход»
Закрываетглавную форму.
Листинг8. «Обработчик главного меню Файл -> Выход»
procedure TMainForm.N4Click(Sender: TObject);
begin
  MainForm.Close;
end;
·    Меню«Правка»
Содержитстандартные функции управления буфером обмена и редактирования текста.
o  «ОтменитьCTRL+Z»  /> acUndo
Отменяетизменения в текущем (активном) поле для ввода
Листинг9. «Обработчик главного меню Правка -> Отменить»
procedure TMainForm. acUndoExecute(Sender: TObject);
begin
   if memCyr.Focused then memCyr.Undo;
   if memLat.Focused then memLat.Undo;
end;
o  «ВырезатьCTRL+X»  />  acCut
Вырезаетвыделенный текст в текущем (активном) поле для ввода.
Листинг10. «Обработчик главного меню Правка -> Вырезать»
procedure TMainForm.acCutExecute(Sender: TObject);
begin
   if memCyr.Focused then memCyr.CutToClipboard;
   if memLat.Focused then memLat.CutToClipboard;
end;
o  «КопироватьCTRL+С»  /> acCopy
Копируетвыделенный текст в текущем (активном) поле для ввода.
Листинг11. «Обработчик главного меню Правка -> Копировать»
procedure TMainForm.acCopyExecute(Sender: TObject);
begin
   if memCyr.Focused then memCyr.CopyToClipboard;
   if memLat.Focused then memLat.CopyToClipboard;
end;
o  «ВставитьCTRL+V»  />  acPaste
Вставляеттекст из буфера в текущее (активное) поле для ввода.
Листинг12. «Обработчик главного меню Правка -> Вставить»
procedure TMainForm.acPasteExecute(Sender: TObject);
begin
   if memCyr.Focused then memCyr.PasteFromClipboard;
   if memLat.Focused then memLat.PasteFromClipboard;
end;
o  «УдалитьCTRL+Del»  />  acDelete
Удаляетвыделенный текст из текущего (активного) поля для ввода.
Листинг13. «Обработчик главного меню Правка -> Удалить»
procedure TMainForm.acDeleteExecute(Sender:TObject);
begin
   if MemCyr.Focused then memCyr.ClearSelection;
   if MemLat.Focused then memLat.ClearSelection;
end;
o  «Выделитьвсё CTRL+A»  
Выделяетвесь текст в текущем (активном) поле для ввода.
Листинг14. «Обработчик главного меню Правка -> Выделить всё»
procedure TMainForm.N18Click(Sender: TObject);
begin
   if memo1.Focused then memo1.SelectAll;
   if memo2.Focused then memo2.SelectAll;
end;
·    Меню«Перевод»
o  «перевестис кириллици в латиницу»   /> acCyrToLat
Переводиттекст из кириллицы в транслит. Текст данной процедуры будет рассмотрен ниже.
o  «перевестис латиници в кириллицу»   /> acLatToCyr
Переводиттекст из транслита в кириллицу. Текст данной процедуры будет рассмотрен ниже.
o  «Редактироватьалфавит»   /> acAlphEdit
Отображаетформу редактирования словаря.
·    Меню«Справка»
o  «Опрограмме»
Отображаетформу«Опрограмме»
Листинг15.«Обработчик главного меню Справка -> О программе»
procedure TMainForm.N7Click(Sender: TObject);
begin
  AboutForm.show;
end;/>/>/>5.  Форма«Редактор алфавита»
Даннаяформа предназначена для загрузки, сохранения и редактиро-вания словарейперевода кириллицы в транслит.

/>
рис.8. Форма «Редактора»
Наформе расположены следующие компоненты:
·        TStringGrid;
·        TPanel;
·        TBitBtn(2 шт.);
·        TOpenDialog;
·        TSaveDialog;
·        TButton;
КомпонентTStringGrid предназначен для вводаи просмотра таблицы перевода. На TPanelрасположены все кнопки. TBitBtn– позволяют сохранять и загружать словари. Диалоги TOpenDialogи TSaveDialog предназначены длявыбора файлов словарей. TButton– применяет текущие настройки к глобальному словарю (он расположен в Unit_main).
Обработчикисобытий.
Присоздании формы происходит заполнение таблицы (SlovGrid):
Листинг16. «Созание формы Редактировать алфавит»
procedure TSlovarForm.FormCreate(Sender: TObject);
var
   i1                                  :integer;
begin
   SlovGrid.Cells[0,0]:= ‘Русский’;
   SlovGrid.Cells[1,0]:= ‘Перевод’;
   for i1:= 1 to 33 do
     begin
        SlovGrid.Cells[0,i1]:= alph_r[i1];
        if i1 = 7 then SlovGrid.Cells[1,i1]:= b_jo
        else SlovGrid.Cells[1,i1]:=alph[alph_r[i1]];
     end;
  f_name:= ”;
end;
Обработчикнажатия на кнопку «Сохранить». Если пользователь выбрал файл, куда сохранитьновый словарь, то происходит перезапись этого файла. В него (как втипизированный файл) записывается последовательность переменных типа ShortString.Эти данные (и их количество) берутся из таблицы SlovGrid:
Листинг17. «Нажатия на кнопку Сохранить»
procedure TSlovarForm.SveButtClick(Sender: TObject);
var
   f      :file of shortstring;
   i1     :integer;
   str    :shortstring;
begin
   if savefile.execute then
     begin
        assignfile(f,SaveFile.FileName);
        f_name:= SaveFile.FileName;
        rewrite(f);
        for i1:= 1 to SlovGrid.RowCount-1 do
          begin
             str:= SlovGrid.Cells[1,i1];
             write(f,str);
          end;
         closefile(f);
    end;
end;
Обработчикнажатия на кнопку «Загрузить». Если пользователь выбрал файл, откуда загрузитьновый словарь, то происходит чтение этого файла. Из него (как из типизированногофайла) загружаютчя последовательность переменных типа ShortString.Эти данные записываются в таблицу SlovGrid:
Листинг18. «Нажатия на кнопку Загрузить»
procedure TSlovarForm.OpenButtClick(Sender:TObject);
var
   f                        :file of shortstring;
   str                      :shortstring;
   i1                       :integer;
begin
   if openfile.execute then
     try
       assignfile(f,OpenFile.FileName);
       reset(f);
       for i1:= 1 to 33 do
         begin
            read(f,str);
            SlovGrid.Cells[1,i1]:= str;
         end;
       closefile(f);
       F_name:= OpenFile.FileName;
     except
       showmessage(‘Неверный формат фаила!!!’);
     end;
end;
Обработчикнажатия на кнопку «Применить». Изменяет текущий словарь (  alph: array[‘А’..’Я’] ofshortstring из unit_main)в соответствии с текущими данными из таблицы SlovGridи пишет название словаря в StatusBarглавной формы.
Листинг19. «Нажатие на кнопку Применить»
procedure TSlovarForm.ApplButtClick(Sender:TObject);
var
   i1     :integer;
   str    :string;
begin
   for i1:= 1 to SlovGrid.RowCount-1 do
     begin
        str:= SlovGrid.Cells[1,i1];
        if i1 = 7 then b_jo:= str
        else alph[alph_r[i1]]:= str;
     end;
    if f_name ” then
      MainForm.StatusBar.Panels[1].Text:= f_name
    else
      MainForm.StatusBar.Panels[1].Text:= ‘Измененопользователем’;
    SlovarForm.Close;
end;
/>/>/>6.  Форма «Опрограмме»
Наформе расположено несколько Labelс изменённым свойством Caption.Никаких обработчиков событий нет./>7.   Основные алгоритмы
Переводиз кириллицы в транслит:
Построчнодля каждой строки поля MemCyrи посимвольно для каждого символа этой строки, программа проверяет её вхождениев множество больших или маленьких символов русского алфавита. Если вхождениедействительно то программа добавляет к строке str2соответствующие символы из словаря перевода.
Листинг20. «Перевод кириллица -> транслит»
procedure TMainForm.acCyrToLatExecute(Sender:TObject);
var
   i1,j1,i3                               :integer;
   str,str1,str2,st2                      :string;
   ch,ch2                                 :char;
   ok1                                    :boolean;
begin
  MainForm.MemCyr.Clear;//чистимто, куда будем писать переведенный текст
  for i1:=0 to MainForm.MemCyr.Lines.Count-1do  //проходим по всем строкам впервом окошке
    begin
       str:= MainForm.MemCyr.Lines[i1];//считываем данные и обнуляем переменные
       str2:= ”;
       for j1:=1 to length(str)do     //проходим по всем символам встроке
         begin
             ch:= str[j1];              
             if ch in al_set then        //если ch — заглавная русская буква
               begin
                  if UpCase_R(ch) = ‘Ё’ then str1:=b_jo  //Ё проверяем отдельно
                 elsestr1:= alph[UpCase_R(ch)]; //А все остальные берем из alph
if str1 ” then      //Этот блокделает заглавным то,
                   begin                 //чтодолжно быть заглавным.
                      if (length(str)> j1)and(str[j1+1] in al_set)or
                          (j1 > 1)and(str[j1-1]in al_set)then
                        for i3:=1 to length(str1)do   //тут либо поднимается вся буква
                                (несколько символов, например SH)
                          begin
                              str1[i3]:=UpCase_R(str1[i3]);
                           end
                      else                  //либо толькопервый символ в букве (Sh)
                        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;    //Будем работать с локальной переменной, чтоб не испортить исходную строку
  for j2:=1 to length(st_mod)do  //уменьшаем регистр у символов встроке
    st_mod[j2]:= downcase(st_mod[j2]);
  find:= false; //Присваиваем начальное значение результату функции
  if b_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;
  for i2:=’А’ 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);//запоминаем длинну самой длинной буквы в алфавите
  for ch:=’А’ 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:= ”;
       while str ” do  //пока строка непустая (обработанные символы будем удалять)
         begin
            f_ok:=false;
            for j1:=max_ldownto 1 do //пытаемся собрать букву разной длины
              begin
                  st2:= ”;
                  for i3:= 1 to j1 do
                    begin
                       if (str[i3] inlat_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
                      else break;
                   end;
                 len:= length(st2);//запомним длину полученной строки
                 if find(st2)then   //и если окажется, что онасоответствует русской букве
                   begin
                      delete(str,1,len);//удалим ее из исходной строки
                      f_ok:= true;       //обработали
                       break;
                    end;
              end;
            str1:= str1+ st2;  //добавляем к строке срезультатом полученную букву
            if notf_okthen
              delete(str,1,1); //если по какой-то причине еще не удалили из исходной, то удаляем сейчас
         end;
       MainForm.MemCyr.Lines.Add(str1);//и заноси строку в окно с переводом
    end;
end;/>/>/>8.  Работа спрограммой, входные и выходные данные
Дляработы программы достаточно исполняемого файла. Если необходимы дополнительныесловари, то они могут, как прилагаться к  программе, так и создаваться вручнуюв самом приложении. Текст для перевода может загружаться из файла или вводитьсяс клавиатуры, а результат работы — сохраняться в файл. Это позволяет удобнейвводить данные и обрабатывать результат./>9.   Описание тестовых заданий
Длятестов использовались два отрывка текста, написанных на кириллице. Первый изних – отрывок из первой главы книги «Библия Delphi»Михаила Флёнова:
«Преждечем программировать компьютер, мы должны понять, как он работает.Как говорилкакой-то полководец: «Нужно хорошо изучить своего врага!!!».Возможно, этоговорил и не полководец, но это не важно :). Кодинг – это постоянная борьба смашиной. Нужно заставлять её делать то, что тебе нужно. Поэтому любойпрограммист просто обязан знать его внутренности. Компьютер состоит изследующих основных компонентов: процессор, память, видеокарта, винчестер(жёсткий диск) и различные разъёмы для подключения дополнительных устройств.Все эти компоненты связаны между собой с помощью шлейфов и шин.»
Припереводе этого текста на транслит получился следующий текст:
«Prezhde chem programmirovat’ komp’juter, my dolzhnyponjat’, kak on rabotaet.Kak govoril kakojj-to polkovodec: «Nuzhno khoroshoizuchit’ svoego vraga!!!». Vozmozhno, ehto govoril i ne polkovodec, no ehto nevazhno :). Koding – ehto postojannaja bor’ba s mashinojj. Nuzhno zastavljat’ejo delat’ to, chto tebe nuzhno. Poehtomu ljubojj programmist prosto objazanznat’ ego vnutrennosti. Komp’juter sostoit iz sledujushhikh osnovnykhkomponentov: processor, pamjat’, videokarta, vinchester (zhjostkijj disk) irazlichnye raz”jomy dlja podkljuchenija dopolnitel’nykh ustrojjstv. Vse ehtikomponenty svjazany mezhdu sobojj s pomoshh’ju shlejjfov i shin.».
Припереводе этого текста обратно на кириллицу, получаем текст идентичныйпервоначальному, что свидетельствует о правильной работе программы.
Второйтекст для теста был взят из книги Фрэнка Херберта «Бог — император Дюны», главапервая:
«Яне только с огромным удовольствием сообщаю вам сегодня об открытии чудесногосодержимого тайного хранилища с его значительной коллекцией рукописей,запечатленных на Редуланской хрустальной бумаге, но также горда привести вамдоводы в защиту подлинности наших открытий, сообщить вам, почему мы считаем,что открыли подлинные дневники Лито II, Бога Императора.»
Результатперевода:
«Jane tol’ko s ogromnym udovol’stviem soobshhaju vam segodnja ob otkrytiichudesnogo soderzhimogo tajjnogo khranilishha s ego znachitel’nojj kollekciejjrukopisejj, zapechatlennykh na Redulanskojj khrustal’nojj bumage, no takzhe gordaprivesti vam dovody v zashhitu podlinnosti nashikh otkrytijj, soobshhit’ vam,pochemu my schitaem, chto otkryli podlinnye dnevniki Lito II, Boga Imperatora.»
Припереводе данного текста в кириллицу был обнаружен недочёт, не связанный салгоритмом программы – римские цифры. IIпреобразуется в ИИ, VV – в ВВ и т.д.

/>/>Приложение
/>

/>

/>