Помощь в написании студенческих работ
Антистрессовый сервис

Разработка текстового фильтра-транслитератора

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

На практике транслитерация применяется ограниченно, большей частью в сфере формальной обработки данных (например, при составлении в единой письменности каталога библиотеки из книг на разных языках). Для воспроизведения же в русском тексте иностранных имен и названий предпочтение в большинстве случаев отдается так называемой практической транскрипции, учитывающей не только письменную форму… Читать ещё >

Разработка текстового фильтра-транслитератора (реферат, курсовая, диплом, контрольная)

Содержание Введение

1. Анализ задания

2. Проектирование пользовательского интерфейса

3. Разработка механизма транслитерации

4. Тестирование Заключение Литература Приложение

ВВЕДЕНИЕ

Транслитерация — передача одной письменности средствами другой письменности, конверсия систем письма, при которой каждый графический элемент (знак) одной системы письма представляется (заменяется) одним и тем же графическим элементом другой системы письма.

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

Транслитерация получила широкое распространение в SMS в эпоху нерусифицированных сотовых телефонов. Широко использутся вместо кириллицы при работе на нерусифицированных компьютерах. Очень небольшое количество программ и сайтов (например, Яндекс) предлагают виртуальную русскоязычную клавиатуру, которой удобно пользоваться только слепым методом.

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

Задача позволяет продемонстрировать владение разработкой процедур ассемблера, работой с массивами данных и стеком.

1. АНАЛИЗ ЗАДАНИЯ Текстовый фильтр-транслитератор. На входе — текстовый файл, на выходе — файл, в котором все русские символы заменены латиницей, символы табуляции — соответствующим количеством пробелов, псевдографика — соответствующими по начертанию текстовыми символами, прочие управляющие символы удалены.

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

При возникновении ошибок в работе программы следует выводить информацию на экран.

Необходимо предоставить пользователю возможность указывать местоположение исходного и выходного файлов.

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

2. ПРОЕКТИРОВАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА При запуске программы пользователь должен указать в строке запуска команды 2 параметра: адрес входного и выходного текстовых файлов. Параметры вводятся через символ пробела. Если параметры не были введены или были введены ошибочно, то программа завершится с ошибкой. В случае отсутствия выходного файла, этот файл будет создан.

В ходе работы программы на экран выводятся сообщения, описывающие результат выполнения приложения.

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

Программа транслитерирует все символы кириллицы, заменяет символы табуляции на соответствующее количество пробелов, псевдографические символы меняет на соответствующие текстовые символы. Остальные символы остаются неизменны.

Текст для транслитерации в файле input. txt должен записываться в кодировке CP866 — альтернативной кодировке DOS, так как в ней специфические европейские символы заменены на кириллицу и оставлены нетронутыми псевдографические символы. Эту запись можно производить либо в редакторах, работающих в режиме DOS, либо в текстовых редакторах Vim, Gvim, Notepad++.

3. РАЗРАБОТКА МЕХАНИЗМА ТРАНСЛИТЕРАЦИИ Главными задачами при разработке программы были организация чтения данных из файла неизвестной длины и сопоставление символов кириллицы и соответствующих им символов латиницы.

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

Для входных данных в памяти зарезервирован буфер размером 4 КБ. Если размеры входного текста больше размеров буфера, то сначала считаются и преобразуются первые 4КБ, затем следующие 4 КБ и так далее до полной обработки данных.

Так как некоторым символам кириллицы соответствует сочетание из двух латинских знаков, то для хранения выходных данных зарезервирован буфер размером 8 КБ, которого хватит для любых входных последовательностей.

Для сопоставления символов кириллицы и латиницы в программе организовано два массива. В первом хранятся символы, требующие замены в ходе транслитерации, во втором массиве хранятся их аналоги, причем индексы элементов совпадают. При обработке текущего символа в первом массиве ищется его индекс, после чего в выходной буфер из второго массива поступает элемент с соответствующим номером.

Символы, не требующие изменения, не записаны в данные массивы и записываются в выходной файл в прежнем состоянии.

В случае преждевременного заполнения выходного буфера, содержимое буфера будет выведено в файл, после чего заполнение буфера начнется с начала.

Для замены символов табуляции на соответствующее количество пробелов позиция символа табуляции делится на 4(количество пробелов, замещающих табуляцию). Полученное число инвертируется командой NEG, и мы получаем необходимое количество пробелов.

4. ТЕСТИРОВАНИЕ Целью тестирования являлось определение эффективности и отказоустойчивости программы, ограничений на количество вводимой информации программы. Также необходимо было убедиться в правильности перевода русскоязычного текста в его транслитированный вид.

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

Для определения правильности перевода использовались текстовые файлы с художественными произведениями.

Для определения правильности перевода символов табуляции брались файлы, содержащие текст с символами табуляции.

В процессе тестирования воссоздавались ситуации запуска программы с отсутствующими параметрами командной строки, с неправильно введенными параметрами командной строки. Программа запускалась с отсутствующими входными и выходными файлами.

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

ЗАКЛЮЧЕНИЕ

Целью работы являлось написание программы «фильтр-транслитератор текста».

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

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

транслитерация перевод кириллица латиница

1. Юров В. И. Assembler. — СПб.: Питер, 2003. — 624 с.

2. Питер Абель. Ассемблер. Язык и программирование для IMB PC. — К.: Век+, М.: ЭНТРОП, К.: НТИ, 2003. — 736 с.

3. Чернов С. А. Ассемблер процессора Intel 8086. Программирование с использованием Borland Tasm: учебное пособие — М.: Издательство МЭИ, 2005. — 93 с.

ПРИЛОЖЕНИЕ Листинг программы

;Хомик Кирилл

;16 вариант

.model small

.stack 100h

.data

input_file db 100 dup (6)

output_file db 100 dup (6)

russian dw 0,'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','ъ','ы','ь','э','ю','я','А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Ъ','Ы','Ь','Э','Ю','Я','¦','+','¦','¦','','','¦','¦','','-','-','-','','L','+','T','+','-','+','¦','¦','L','г','¦','T','¦','=','+','¦','¦','T','T','L','L','г','г','+','+','-','-'

english dw 0,'a','b','v','g','d','e','yo','zh','z','i','y','k','l','m','n','o','p','r','s','t','u','f','kh','ts','ch','sh','#','y','`','e','yu','ya','A','B','V','G','D','E','YO','Zh','Z','I','Y','K','L','M','N','O','P','R','S','T','U','F','Kh','Ts','Ch','Sh','#','Y','`','E','Yu','Ya','|','+','+','+','+','+','+','|','+','+','+','+','+','+','+','+','+','-','+','+','+','+','+','+','+','+','-','+','+','+','+','+','+','+','+','+','+','+','+','+'

shch_letter1 dw 'sh'

shch_letter2 dw 'ch'

big_shch_letter1 dw 'Sh'

big_shch_letter2 dw 'ch'

buffer_inp db 4000 dup (?)

buffer_out db 8000 dup (?)

input_buf_length dw 0

output_buf_length dw 0

handle_inp dw 0

handle_out dw 0

opening_error db 'Opening error'

reading_error db 'Reading error'

writing_error db 'Writing error'

zero_params db 'Enter parameteres'

not_enough db 'Not enough parameteres'

done_message db 'Done!'

.code

;—————————————————————————-;

;Процедура вывода сообщения

;в dx — начало строки

;в cx — длина строки

;—————————————————————————-;

set_video_mode proc

mov ah, 0 ;установка видео режима

mov al, 03h

int 10h

ret

set_video_mode endp

;—————————————————————————-;

;Процедура чтения параметров запуска программы

;—————————————————————————-;

read_params proc

push ax

push bx

push cx

push dx

mov bp, 80h

mov cl, ES:[bp] ;чтение длины введенных параметров

cmp cl, 0 ;вывести ошибку

jnz cont_read_params ;при нулевых параметрах

call set_video_mode ;установка видео режима

lea dx, zero_params

mov cx, 17

call print_message ;вывод сообщения об ошибке

call close_app

cont_read_params:

inc bp

mov di, 0

mov ch, 0

dec cx

read_outfile_name: ;чтение имены входного файла

inc di

inc bp

mov al, ES:[bp]

cmp al, 20h

jz input

mov input_file[di-1], al

cmp di, cx

jnz read_outfile_name

call set_video_mode ;если не введен второй параметр

lea dx, not_enough ;вывести сообщение

mov cx, 22

call print_message

call close_app

input: ;ввод имени выходного файла

mov input_file[di-1], 0

mov si, 0

read_inpfile_name:

inc di

inc si

inc bp

mov al, ES:[bp]

mov output_file[si-1], al

cmp di, cx

jnz read_inpfile_name

mov output_file[si], 0

pop dx

pop cx

pop bx

pop ax

ret

read_params endp

;—————————————————————————-;

;Процедура вывода сообщения

;в dx — начало строки

;в cx — длина строки

;—————————————————————————-;

print_message proc

mov ah, 40h ;40-я функция 21-го прерывания

mov bx, 1 ;Дескриптор устройства-Дисплей равен 1

int 21h; Вывод строки на экран

ret

print_message endp

;—————————————————————————-;

;Процедура завершения приложения

;—————————————————————————-;

close_app proc

mov ax, 4C00h

int 21h

ret

close_app endp

;—————————————————————————-;

;Процедура чтения из файла

;handle_inp ;

;—————————————————————————-;

readfile proc

mov ah, 3fh

mov bx, handle_inp

mov cx, 4000

lea dx, buffer_inp

int 21h

jc exit_app_readfile ;в случае ошибки завершить приложение

jmp exit_proc_readfile

exit_app_readfile:

mov dx, offset reading_error

mov cx, 13

call print_message

call close_app ;вызов завершения приложения

exit_proc_readfile:

mov input_buf_length, ax

ret

readfile endp

;—————————————————————————-;

;Процедура записи данных в файл

;—————————————————————————-;

writefile proc ;

mov ah, 40h ;запись в файл из buffer_out

mov bx, handle_out ;

mov cx, output_buf_length ;

lea dx, buffer_out ;

int 21h ;

jc exit_app_writefile ;в случае ошибки завершить приложение

jmp exit_proc_writefile

exit_app_writefile:

mov dx, offset writing_error

mov cx, 13

call print_message

call close_app ;вызов завершения приложения

exit_proc_writefile:

ret

writefile endp

;—————————————————————————-;

;Процедура открытия файла, в dx должен находиться

;указатель на файл (lea dx, file), на выходе в ax будет handle

;—————————————————————————-;

openfile proc

mov ah, 3dh

mov al, 2

lea dx, input_file

int 21h ;открытие файла с исходными данными

jc exit_app_openfile

mov handle_inp, ax

mov ah, 41h

lea dx, output_file

int 21h ;удаление файла

jc exit_app_openfile

mov ah, 3Ch ;создание чистого файла

mov cx, 00

lea dx, output_file

int 21h

jc exit_app_openfile

mov handle_out, ax

jmp exit_proc_openfile

exit_app_openfile:

mov dx, offset opening_error

mov cx, 13

call print_message

call close_app

exit_proc_openfile:

ret

openfile endp

;—————————————————————————-;

;Вывод спец. символов

;—————————————————————————-;

special_symbols proc

shch:

cmp al, 0F9h

jnz shch_big

;вывод транслита буквы щ

mov ax, shch_letter1

mov buffer_out[di], ah

inc di

mov buffer_out[di], al

inc di

mov ax, shch_letter2

mov buffer_out[di], ah

inc di

mov buffer_out[di], al

inc di

jmp end_spec

shch_big:

cmp al, 0D9h

jnz tab

;вывод транслита буквы Щ

mov ax, big_shch_letter1

mov buffer_out[di], ah

inc di

mov buffer_out[di], al

inc di

mov ax, big_shch_letter2

mov buffer_out[di], ah

inc di

mov buffer_out[di], al

inc di

jmp end_spec

tab: ;вывод символа табуляции

cmp al, 09h

jnz print_unchanged

push ax

push bx

push cx

mov ax, dx

mov bl, 4

div bl

sub ah, 4

neg ah

mov ch, 0

mov cl, ah

print_spaces: ;вывод нужного количества пробелов

mov buffer_out[di], 20h

inc di

loop print_spaces

pop cx

pop bx

pop ax

print_unchanged: ;если символ не требует замены, вывести его же

mov buffer_out[di], al

inc di

end_spec:

ret

special_symbols endp

;—————————————————————————-;

;Тело программы

;—————————————————————————-;

start:

mov ax, @data

mov ds, ax

call read_params

call set_video_mode

call openfile ;открытие файлов

reading:

call readfile ;чтение данных из файла (макс 4КБ)

mov si, 0 ;обнуление указателя si

mov di, 0

loading_next_symbol:

push di

mov ah, 0

mov al, buffer_inp[si] ;загрузка SI-го элемента в ax

inc si

cmp al, 0Ah

jnz not_new_str ;сбросить счетчик позиции табуляций

mov dx, 0 ;в начале новой строки

not_new_str:

inc dx ;если же нет новой строки, то inc

;mov cx, 222

mov cx, 210

comparing:

mov di, cx

mov bx, russian[di]

cmp ax, russian[di]

jz writing_analog

dec cx

loop comparing

pop di

call special_symbols

jmp print_exit

writing_analog:

mov ax, english[di] ;помещение в ax аналога русского символа

pop di

cmp ah, 0 ;проверка на размер символа транслита

jnz not_one_byte

mov buffer_out[di], al

inc di

jmp print_exit

not_one_byte:

;mov ax, si

mov buffer_out[di], ah

inc di

mov buffer_out[di], al

inc di

print_exit:

cmp di, 7996

jnb output_to_file

cmp si, input_buf_length ;повторять, пока не переведен весь буффер

jnz loading_next_symbol

output_to_file:

mov output_buf_length, di

call writefile

cmp si, input_buf_length ;если переведен не весь входной буфер,

jnz loading_next_symbol ;продолжить переводить

cmp input_buf_length, 4000

jz reading ;если прочтен не весь файл, то читать снова

exit_change:

mov dx, offset done_message

mov cx, 5

call print_message

call close_app

end start

Показать весь текст
Заполнить форму текущей работой