Создание программы-переводчика текстов с английского на русский язык
Министерство образования и науки Республики Казахстан
Карагандинский Государственный Технический Университет
Курсовая работа
По дисциплине:
«Лингвистическое обеспечение»
Тема:
«Создание программы-переводчика текстов с английского на русский язык»
2009
Содержание
Введение
1. Предпроектные исследования
2. Работа на тему «Бинарные деревья»
2.1 Техническое задание на разработку программы
2.2 Описание программы
2.3 Выводы по работе
2.4 Результаты работы программы
3. Работа на тему «Польская запись»
3.1 Техническое задание на разработку программы
3.2 Описание программы
3.3 Выводы по работе
3.4 Результаты работы программы
4. Работа на тему «Переводчик»
4.1 Техническое задание на разработку программы
4.2 Описание программы
4.3 Выводы по работе
4.4 Результаты работы программы
Заключение
Список использованных источников
Приложения
Введение
Целью выполнения данного курсового проекта является приобретение практических навыков в построении переводчиков; в разработке диалога САПР; в структурировании языков САПР; в области использования языков программирования и создания языков проектирования.
В задачи курсового проекта по дисциплине «Лингвистическое обеспечение» входит:
получение знаний в области лингвистического обеспечения;
изучение классификации языков САПР, структуры трансляторов, структуры диалога в САПР;
развитие навыков программирования, полученных на предыдущих курсах;
развитие системное мышление;
написание программы, соответственно варианту задания.
В настоящее время все большее распространение приобретает английский язык, как язык международного значения. Поэтому ставится задача создания более совершенных переводчиков. Разработанный проект демонстрирует переводчик, работа с которым очень удобна для пользователя. Программа является очень актуальной на сегодняшний день, она способствует быстрому переводу различных текстовых документов и обработку большого количества информации, а также предоставляет возможность добавления новых слов в словарь.
1. Предпроектные исследования
Лингвистическое обеспечение – это совокупность всех языковых средств используемых в САПР, включая термины и определения, правил формализации естественного языка, методы сжатия и развертывания текстов, необходимых для выполнения автоматизированного проектирования.
Лингвистическое обеспечение автоматизированной системы – совокупность языковых средств, используемых в автоматизированных системах, а также правил формализации естественного языка в целях повышения эффективности машинной обработки информации.
Практика показала, что мощность и комфортность конкретной системы автоматизированного проектирования прямо и весьма существенно зависит от мощности ее лингвистического обеспечения. Возрастающая практическая значимость лингвистического обеспечения определяется такими причинами, как:
огромные объемы текстов на естественном языке, циркулирующих в информационных системах;
необходимость использования новых стратегий обработки информации с учетом семантических законов обыденного языка;
потребность в гибком и тесном симбиозе человека и компьютерной системы;
вовлечение в обработку многообразных скрытых знаний, экспликация которых возможна только на естественном языке.
В настоящее время искусственные языки, использующие для описания предметной области текстовое представление, широко применяются не только в программировании, но и в других областях. С их помощью описывается структура всевозможных документов, трехмерных виртуальных миров, графических интерфейсов пользователя и многих других объектов, используемых в моделях и в реальном мире. Для того, чтобы эти текстовые описания были корректно составлены, а затем правильно распознаны и интерпретированы, используются специальные методы их анализа и преобразования. В основе методов лежит теория языков и формальных грамматик, а также теория автоматов.
Несмотря на то, что к настоящему времени разработаны тысячи различных языков и их трансляторов, процесс создания новых приложений в этой области не прекращается. Это связано как с развитием технологии производства вычислительных систем, так и с необходимостью решения все более сложных прикладных задач. Элементы теории языков и формальных грамматик применимы и в других разнообразных областях, например, при описании структур данных, файлов, изображений, представленных не в текстовом, а двоичном формате.
Лингвистическое обеспечение состоит из совокупности трёх языков: входного, внутреннего и выходного.
2. Работа на тему «Бинарные деревья»
2.1 Техническое задание на разработку программы
Дана числовая последовательность. Отсортировать ее, используя обратный обход бинарного дерева в порядке возрастания.
2.2 Описание программы
Входной язык
Входной язык является средством взаимодействия пользователя с данной программой в ходе обработки исходных данных и формулировки проблемы.
Для данной программы исходными данными являются, числовая последовательность, необходимая для сортировки, которую пользователь вводит с клавиатуры.
Форма ввода для исходных данных приведены ниже (рисунок 1).
Рисунок 1 – Форма ввода данных для программы «Бинарные деревья»
Внутренний язык
Внутренний язык обычно скрыт от рядового пользователя, служит для представления и обработки информации, которая передаётся между различными подсистемами информационных систем. В качестве внутреннего языка был выбран Паскаль.
Это структурированный язык высокого уровня, который можно использовать для написания программ любого типа и размера. Разработка программ на Паскале включает в себя следующие действия: ввод и редактирование текста на языке программирования, трансляция и отладка программы. Для каждого этапа требуются специальные средства: редактор текстов, компилятор, включающий в себя компоновщик – для построения исполняемого компьютером программного модуля и отладчик – для отладки программы. Систему программирования Турбо Паскаль называют еще интегрированной средой программирования, так как она объединяет в себе все ранее разрозненные средства, используемые при разработке программ.
Широкой популярности Паскаля способствовали следующие причины:
Благодаря компактности, удачному первоначальному описанию язык оказался достаточно легким для изучения.
Он отражает фундаментальные концепции алгоритмов в легко воспринимаемой форме.
Паскаль позволяет четко реализовывать идеи структурного программирования и осуществлять переход к объектно-ориентированному программированию (язык Турбо Паскаль предоставляет программисту все средства ООП: высокую степень структурированности, модульность, абстрактность и возможность повторного использования, которые встроены непосредственно в язык).
Язык программирования позволил перейти к системам автоматической проверки правильности программ.
Паскаль – язык структурного программирования.
Для данной программы этот язык подходит больше всего, так как имеет возможность работы с динамическими структурами данных, т.е. с такими структурами данных, размер и конфигурация которых изменяются во времени исполнения программ. Для них выделение и очистка памяти происходит не на этапе трансляции, а в ходе выполнения самой программы. Для работы с динамическими величинами в Паскале предусмотрен специальный тип значений – ссылочный. Этот тип не относится ни к простым, ни к составным. Переменные ссылочного типа, или указатели, являются статическими переменными. Значением переменной ссылочного типа является адрес ячейки – места в памяти соответствующей динамической величины. Своё значение ссылочная переменная получает в процессе выполнения программы, в момент появления соответствующей динамической величины.
Выходной язык
Выходной язык обеспечивает оформление результатов программы в текстовом виде.
Для данной программы выходными данными является последовательность чисел, отсортированная в порядке возрастания, используя обратный обход бинарного дерева. Форма выходной информации приведена ниже (рисунок 2).
Рисунок 2 – Форма выходных данных для программы «Бинарные деревья»
2.3 Выводы по работе
В данной работе были изучены алгоритмы сортировки методом прохождения бинарного дерева.
Деревом называется орграф для которого:
1. Существует узел, в который не входит ни одной дуги. Этот узел называется корнем.
2. В каждую вершину, кроме корня, входит одна дуга.
С точки зрения представления в памяти важно различать два типа деревьев: бинарные и сильноветвящиеся. В бинарном дереве из каждой вершины выходит не более двух дуг. В сильноветвящемся дереве количество дуг может быть произвольным.
Бинарное дерево
является рекурсивной структурой,
поскольку каждое его поддерево само
является бинарным деревом и, следовательно,
каждый его узел в свою очередь является
корнем дерева.
Узел дерева, не имеющий
потомков, называется листом.
Я считаю, что этот метод сортировки для данной работы является очень удобным и быстрым. Он позволяет значительно ускорить время поиска любого элемента. Программа позволяет сортировать с помощью бинарных деревьев последовательность чисел в порядке возрастания методом обратного обхода.
2.4 Результаты работы программы
Результаты работы программы представлены на рисунке 3. Листинг программы приведен в приложении А.
Рисунок 3 – Результаты работы программы «Бинарные деревья»
3. Работа на тему «Польская запись»
3.1 Техническое задание на разработку программы
Перевести входную строку в инфиксной форме в постфиксную.
3.2 Описание программы
Входной язык
Лексемами входного языка в данной работе являются буквы или цифры, т.е. операнды, и связывающие их арифметические действия.
Входными данными являются арифметические выражения.
Форма исходной информации приведена на рисунке 4.
Рисунок 4 – Форма ввода данных для программы «Польская запись»
Внутренний язык
В качестве внутреннего языка для данной работы был выбран Паскаль.
Описание данного языка программирования приведено в первой работе на тему «Бинарные деревья».
Выходной язык
Выходной язык обеспечивает оформление результатов программы в текстовом виде.
Для данной программы выходными данными является строка символов в постфиксной форме записи. Форма выходной информации приведена ниже (рисунок 5).
Рисунок 5 – Форма выходных данных для программы «Польская запись»
3.3 Выводы по работе
В данной работе были изучены алгоритмы перевода выражений в форму, удобную для машинной обработки в виде польской записи, а также был осуществлен на практике алгоритм перевода выражения из инфиксной формы в постфиксную.
Обратная польская запись обладает pядом замечательных свойств, котоpые пpевpащают ее в идеальный пpомежуточный язык пpи тpансляции. Во-пеpвых, вычисление выpажения, записанного в обpатной польской записи, может пpоводиться путем однокpатного пpосмотpа, что является весьма удобным пpи генеpации объектного кода пpогpамм.
Во-втоpых, получение обpатной польской записи из исходного выpажения может осуществляться весьма пpосто на основе пpостого алгоpитма, пpедложенного Дейкстpой, – метод стеков с приоритетами.
Этот метод основан на использовании стека с приоритетами, позволяющего изменить порядок следования знаков операций в выражении так, что получается обратная польская запись. В данной работе был использован именно этот метод, так как он является более удобным для реализации щаной программы.
3.4 Результаты работы программы
Результаты работы программы представлены на рисунке 6. Листинг программы приведен в приложении В.
Рисунок 6 – Результаты работы программы «Польская запись»
4. Работа на тему «Переводчик»
4.1 Техническое задание на разработку программы
Написать программу, при помощи которой можно переводить несложные тексты с английского языка. Программа должна загружать файлы с текстом и словарем из оболочки или путем передачи имен файлов как параметров командной сроки и выдавать файл с переводом.
4.2 Описание программы
Входной язык
Входной язык является диалоговым языком, который позволяет в форме диалога пользователю ввести данные.
Входной язык характеризуется большим разнообразием, изменчивостью, узкой проблемной ориентацией. Недостатки входных языков это необходимость существенной перестройки программной системы при изменении каких-то условий.
Лексемами входного языка в данной работе являются слова английского алфавита, т.е. входными данными является текст на английском языке. Текст может как загружаться из текстового файла, так и вводиться пользователем с клавиатуры. Форма входных данных приведена на рис. 7.
Рисунок 7 – Форма входных данных для программы «Переводчик»
Внутренний язык
В качестве внутреннего языка для данной работы был выбран ObjectPascal, который используется в среде программирования Delphi. Этот язык использует принципы объектно-ориентированного и визуального программирования.
Язык ObjectPascal является одним из высокоразвитых языков объектно-ориентированного программирования. И среди других, например, таких как Visual Basic или Visual C++, отличается простотой программного кода, достаточным количеством литературы по этому языку.
Объектно-ориентированное программирование (ООП) – это методика разработки программ, в основе которой лежит понятие объект. Объект – это некоторая структура, соответствующая объекту реального мира, его поведению. Задача, решаемая с использованием методики ООП, описывается в терминах объектов и операций над ними, а программа при таком подходе представляет собой набор объектов и связей между ними.
По сравнению с традиционными способами программирования ООП обладает рядом преимуществ. Главное из них заключается в том, что эта концепция в наибольшей степени соответствует внутренней логике функционирования операционной системы (ОС) Windows. Программа, состоящая из отдельных объектов, отлично приспособлена к реагированию на события, происходящие в ОС. К другим преимуществам ООП можно отнести большую надежность кода и возможность повторного использования отработанных объектов.
Delphi – это комбинация нескольких важнейших технологий:
Высокопроизводительный компилятор в машинный код
Объектно-ориентированная модель компонент
Визуальное (а, следовательно, и скоростное) построение приложений из программных прототипов
Масштабируемые средства для построения баз данных
Программирование в Delphi строится на тесном взаимодействии двух процессов:
• процесса конструирования визуального проявления программы (т.е. ее Windows-окна),
• процесса написания кода, придающего элементам этого окна и программе в целом необходимую функциональность.
Основные преимущества среды программирования Delphi:
– Простота языка позволяет быстро его освоить и создавать сложные программы;
– Развитые средства представления структур данных обеспечивают удобство работы, как с числовой, так и с символьной и битовой информацией;
– Объектно-ориентированное программирование (ООП) в визуальной среде.
В процессе построения приложения разработчик выбирает из палитры компонент готовые компоненты как художник, делающий крупные мазки кистью. Еще до компиляции он видит результаты своей работы – после подключения к источнику данных их можно видеть отображенными на форме, можно перемещаться по данным, представлять их в том или ином виде. В этом смысле проектирование в Delphi мало чем отличается от проектирования в интерпретирующей среде, однако после выполнения компиляции мы получаем код, который исполняется в 10–20 раз быстрее, чем тоже самое, сделанное при помощи интерпретатора. Кроме того, компилятор компилятору рознь, в Delphi компиляция производится непосредственно в родной машинный код, в то время как существуют компиляторы, превращающие программу в так называемый p-код, который затем интерпретируется виртуальной p-машиной. Это не может не сказаться на фактическом быстродействии готового приложения.
Основной упор этой модели в Delphi делается на максимальном реиспользовании кода. Это позволяет разработчикам строить приложения весьма быстро из заранее подготовленных объектов, а также дает им возможность создавать свои собственные объекты для среды Delphi. Никаких ограничений по типам объектов, которые могут создавать разработчики, не существует.
Выходной язык
Выходной язык обеспечивает оформление результатов программы в текстовом виде.
Лексемами выходного языка являются слова на русском языке, т.е. для данной программы выходными данными является текст на русском языке. Форма выходных данных приведена ниже (рисунок 8).
Рисунок 8 – Форма выходных данных для программы «Переводчик»
4.3 Выводы по работе
В данной работе были изучены некоторые аспекты конструирования и построения переводчика с английского языка на русский язык.
4.4 Результаты работы программы
В представленной работе был разработан переводчик с английского языка на русский язык. В нем присутствуют функции сохранения перевода и добавления новых слов в словарь.
Результаты работы программы представлены на рисунках 9 и 10. Листинг программы приведен в приложении С.
Рисунок 9 – Главное окно программы «Переводчик»
Рисунок 10 – Окно просмотра словаря программы «Переводчик»
Заключение
Разработанный в ходе выполнения курсового проекта переводчик текстов с английского языка на русский язык является актуальным на сегодняшний день, так как многие пользователи нуждаются в автоматизированном простом и быстром средстве перевода. Нами были приобретение практических навыков в построении переводчиков.
Также были решены задачи, поставленные перед нами. Мы научились разрабатывать собственные алгоритмы для решения этих задач, овладели методами и средствами отладки и тестирования программ.
Разработанная нами программа устойчиво выполняет все свои функции, что делает ее применимой к многим областям деятельности. Но теперь перед нами стоит задача сделать переводчик еще более совершенным и более расширенным.
Список использованных источников
Гриз Д. Теория конструирования цифровых компиляторов. М.: Мир, 1980.
Ахо А., Ульман Дж. Теория синтаксического анализа перевода и компиляции. М.: Мир, 1978
Хантер Р. Проектирование и конструирование компиляторов. М.: Радио, 1984.
Молчанов, А.Ю. Системное программное обеспечение. – М.; СПб.; Нижний Новгород: Питер, 2003. – 395 с.
Гордеев, А.В. Системное программное обеспечение. – СПб.; М.; Харьков: Питер, 2002. – 736 с.
Приложение А
Листинг программы «Бинарные деревья»
Program Bin_tree;
Uses Crt;
Type Point = ^ Item; {тип – указатель на список}
Item = Record {запись в составе:}
Key: Integer; {корень-целое число}
Next: Point; {указатель на список}
end;
Link = ^Derevo; {тип – указатель на дерево}
Derevo = Record {дерево в составе:}
Key: Integer; {корень}
Left, Right: Link; {указатели на левое и правое поддерево}
End;
Var A: Point; {указатели на запись-список}
Tree: Link; {указатель на дерево}
Procedure Vvod (var P: Point); {процедура ввода списка}
Var i: integer;
Q: Point; {указатель на список}
Begin
P:= Nil; {пустой список}
Writeln ('Введите числовую последовательность');
i:=1;
While i<=10 do begin
New(Q); {формирование нового элемента списка}
Write ('Число', i, ':');
Read (Q^.Key); {присваиваем элементу key введенное значение}
Q^.Next:= P; {включение нового элемента в список}
P:= Q; {указатель списка – на начало списка}
i:=i+1;
end;
End;
Procedure TreeBild (var T: Link; P: Point); {процедура построения дерева}
Var x: Integer;
Procedure Find_Ins (var Q: Link; x: Integer);
var Q1:link;
Procedure Ins (var S: Link);
Begin {процедуры вставки элемента}
New(S);
S^.Key:= x;
S^.Left:= Nil; S^.Right:= Nil;
End;
Begin {процедуры поиска и вставки элемента}
x:= P^.Key;
If Q = Nil
then Ins(Q)
else
if x<Q^.key then
Find_Ins (Q^.Left, x)
else if x=Q^.key then Find_Ins (Q^.right, x) else
begin
new(Q1);
Q1^.left:=Q;
Q1^.key:=x;
Q:=Q1;
end;
End;
Begin {процедуры построения дерева из списка}
If P <> Nil
then
begin
Find_Ins (T, P^.Key);
TreeBild (T, P^.Next)
end;
End;
{процедура обхода дерева}
Procedure OutTree (var T: Link);
Begin
If T <> Nil
then
begin
OutTree (T^.Left); {левое поддерево}
OutTree (T^.Right); {правое поддерево}
Write (T^.Key, ' '); {корень дерева}
end;
End;
Begin {основная программа}
ClrScr;
Vvod(A); {процедура ввода списка}
Tree:= Nil;
TreeBild (Tree, A); {процедура построения дерева Tree из списка A}
OutTree(Tree); {процедура обхода дерева}
dispose(Tree); {освобождение ОП}
ReadKey;
End. {конец программы}
Приложение В
Листинг программы «Польская запись»
Program Polskaya;
uses crt;
var
i, n:integer;
st1, st2, st3:string;
label 1;
begin
clrscr;
st2:='';
write ('Stroka v infiksnoi forme: '); {Вводим строку}
Readln(st1);
for i:=1 to length(st1) do
begin
1:
if st1 [i]=' (' then st3:=st3+st1 [i]
else
if st1 [i]='^'then
begin
n:=Length(st3);
if st3 [n]='^' then
begin
st2:=st2+st3 [n];
Delete (st3, n, 1);
st3:=st3+st1 [i];
end
else
if (n=0) or (st3 [n]='(') or (st3 [n]='+') or (st3 [n]='-')
or (st3 [n]='*') or (st3 [n]='/') then
st3:=st3+st1 [i];
end
else
if (st1 [i]='*') or (st1 [i]='/') then
begin
n:=Length(st3);
if st3 [n]='^' then
begin
st2:=st2+st3 [n];
Delete (st3, n, 1);
Goto 1;
Goto 1;
end;
if (st3 [n]='*') or (st3 [n]='/') then
begin
st2:=st2+st3 [n];
Delete (st3, n, 1);
st3:=st3+st1 [i];
end
else
if (n=0) or (st3 [n]='(') or (st3 [n]='+') or (st3 [n]='-') then
st3:=st3+st1 [i];
end
else
if (st1 [i]='+') or (st1 [i]='-') then
begin
n:=Length(st3);
if (st3 [n]='(') or (n=0) then
st3:=st3+st1 [i]
else
if (st3 [n]='^') or (st3 [n]='*') or (st3 [n]='/') then
begin
st2:=st2+st3 [n];
Delete (st3, n, 1);
Goto 1;
end
else
begin
st2:=st2+st3 [n];
Delete (st3, n, 1);
st3:=st3+st1 [i];
end;
end
else
if st1 [i]= ')'then
begin
n:=Length(st3);
if n=0 then
Break;
if (st3 [n]='(') then
Delete (st3, n, 1)
else
begin
st2:=st2+st3 [n];
Delete (st3, n, 1);
Goto 1;
end;
end
else st2:=st2+st1 [i];
end;
n:=Length(st3);
for i:=n downto 1 do
st2:=st2+st3 [i];
WriteLn ('Stroka v postfiksnoi forme: ', st2);
readkey;
end.
Приложение С
Листинг программы «Переводчик»
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, ComCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
OpenDialog1: TOpenDialog;
Memo2: TMemo;
Memo3: TMemo;
N3: TMenuItem;
N6: TMenuItem;
SaveDialog1: TSaveDialog;
N7: TMenuItem;
Button1: TButton;
RichEdit1: TRichEdit;
RichEdit2: TRichEdit;
Memo1: TMemo;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
BitBtn1: TBitBtn;
Bevel1: TBevel;
Bevel2: TBevel;
N13: TMenuItem;
ColorDialog1: TColorDialog;
N14: TMenuItem;
N15: TMenuItem;
FontDialog1: TFontDialog;
N16: TMenuItem;
Button2: TButton;
Image1: TImage;
Image2: TImage;
procedure N2Click (Sender: TObject);
procedure N3Click (Sender: TObject);
procedure N5Click (Sender: TObject);
procedure FormCreate (Sender: TObject);
procedure N6Click (Sender: TObject);
procedure N7Click (Sender: TObject);
procedure Button1Click (Sender: TObject);
procedure registr;
procedure zamena;
procedure N9Click (Sender: TObject);
procedure N10Click (Sender: TObject);
procedure N11Click (Sender: TObject);
procedure N12Click (Sender: TObject);
procedure N13Click (Sender: TObject);
procedure N15Click (Sender: TObject);
procedure N16Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
private
{Private declarations}
public
rus:string;
s1, s2, s3, a, st1:string;
i, j, k, g, l, h, t, n, p, dl, count:integer;
{Public declarations}
end;
var
Form1: TForm1;
EdFile:string; s1, s2, s3, a, st1, rus:string;
i, j, k, g, l, h, t, n, p, dl, count:integer;
implementation
{$R *.dfm}
procedure TForm1.N2Click (Sender: TObject);
var
i:integer;
begin
if OpenDialog1. Execute then
begin
EdFile:=OpenDialog1. FileName; {в переменную присваиваем
имя и полный путь к файлу}
RichEdit1. Lines. LoadFromFile(EdFile);
memo1. Lines. LoadFromFile(EdFile);
end;
end;
procedure tform1.zamena;
label 1;
label 2;
var
i, j, k:integer; t:string;
a: char;
begin
for i:=0 to richedit2. Lines. Count-1 do
begin
t:= richedit2. Lines[i];
for j:=1 to length(t) do
begin
if (j=1) and (i=0) then
begin
t[j]:= chr (ord(t[j]) – 32); // замена строчных букв после '.' на прописные
end;
if t[j]='.' then
begin
for k:=j+1 to length(t) do
begin
if t[k]<>' ' then
begin
a:=chr (ord(t[k]) – 32);
delete (t, k, 1);
insert (a, t, k);
goto 2;
end;
end;
2: richedit2. Lines[i]:= t;
end;
end;
end;
end;
procedure tform1.registr;
label 1;
var i, x, j, k, g:integer; f:string;
begin
for x:=0 to memo2. Lines. Count-1 do
begin
memo2. Lines[x]:=''; // очистка memo2
end;
if richedit1.text<>memo1. Text
then
for x:=0 to memo1. Lines. Count-1 do
memo1. Lines[x]:=''; // очистка memo1
if richedit1.text<>'' then
for i:=0 to richedit1. Lines. Count-1 do
if memo1. Lines[i]='' then
if richedit1. Lines[i]<>'' then
for j:=0 to memo1. Lines. Count-1 do
begin
memo1. Lines[j]:= richedit1. Lines[i]; // заполняем memo1
end;
for j:=0 to memo1. Lines. Count-1 do
memo1. Lines[j]:=lowercase (memo1. Lines[j]); // переводим текст memo1 в нижний регистр
if memo1. Text<>'' then
begin
for g:=0 to memo1. Lines. Count-1 do
memo1. Lines[g]:=lowercase (memo1. Lines[g]); // переводим текст memo1 в нижний регистр
goto 1;
end;
1: end;
procedure TForm1.N3Click (Sender: TObject);
begin
if saveDialog1. Execute then
begin
EdFile:=SaveDialog1. FileName; // сохранение перевода
memo2. Lines. SaveToFile(EdFile);
if richedit2. Modified then memo2. Modified:=False;
end;
end.