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

 

Содержание


Введение

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

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

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

. Тестирование

Заключение

Литература

Приложение


ВВЕДЕНИЕ


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

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

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


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 с.

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


ПРИЛОЖЕНИЕ


Листинг программы


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

;16 вариант


.model small

.stack 100h

.data_file db100 dup(6)_filedb100 dup (6)dw0,'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','ъ','ы','ь','э','ю','я','А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Ъ','Ы','Ь','Э','Ю','Я','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?','?'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','|','+','+','+','+','+','+','|','+','+','+','+','+','+','+','+','+','-','+','+','+','+','+','+','+','+','-','+','+','+','+','+','+','+','+','+','+','+','+','+'_letter1dw'sh'_letter2dw'ch'_shch_letter1dw'Sh'_shch_letter2dw'ch'_inp db 4000 dup (?)_outdb8000 dup (?)_buf_lengthdw0_buf_lengthdw0_inp dw 0_outdw0_errordb'Opening error'_errordb'Reading error'_errordb'Writing error'_paramsdb'Enter parameteres'_enoughdb'Not enough parameteres'_messagedb'Done!'


.code


;----------------------------------------------------

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

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

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

;----------------------------------------------------


set_video_mode proc

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

moval,03h10h

_video_mode endp


;----------------------------------------------------

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

;----------------------------------------------------_params procaxbxcxdx

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

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

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

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

leadx, zero_paramscx, 17print_message;вывод сообщения об ошибке

call close_app_read_params:bpdi, 0ch, 0 cx

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

incdibpal, ES:[bp]al, 20hinputinput_file[di-1], aldi, cxread_outfile_name

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

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

movcx, 22print_messageclose_app

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

mov input_file[di-1], 0si, 0_inpfile_name:disibpal, ES:[bp]output_file[si-1], aldi, cxread_inpfile_nameoutput_file[si], 0

dxcxbxax

read_params endp


;----------------------------------------------------

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

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

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

;----------------------------------------------------

print_message proc

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

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

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


ret

print_message endp



;----------------------------------------------------

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

;----------------------------------------------------

_app procax,4C00h21h_app endp


;----------------------------------------------------

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

;handle_inp -

;----------------------------------------------------procah, 3fhbx, handle_inpcx, 4000dx, buffer_inp 21h

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

jmp exit_proc_readfile_app_readfile:dx, offset reading_errorcx, 13print_messageclose_app;вызов завершения приложения_proc_readfile:input_buf_length, ax

readfile endp


;----------------------------------------------------

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

;----------------------------------------------------proc;ah, 40h;запись в файл из buffer_outbx, handle_out;cx, output_buf_length;dx, buffer_out;21h;exit_app_writefile;в случае ошибки завершить приложение

jmp exit_proc_writefile_app_writefile:dx, offsetwriting_errorcx, 13print_messageclose_app;вызов завершения приложения_proc_writefile:endp

;----------------------------------------------------

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

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

;----------------------------------------------------procah, 3dhal, 2dx,input_file

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

jcexit_app_openfilehandle_inp, ax

ah, 41hdx,output_file21h;удаление файлаexit_app_openfile

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

movcx, 00dx, output_file21hexit_app_openfilehandle_out, axexit_proc_openfile

_app_openfile:dx, offset opening_errorcx, 13print_messageclose_app_proc_openfile:endp


;----------------------------------------------------

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

;----------------------------------------------------_symbols proc:al,0F9hshch_big

;вывод транслита буквы щax, shch_letter1buffer_out[di],ahdibuffer_out[di],aldiax, shch_letter2buffer_out[di],ahdibuffer_out[di],aldiend_spec

_big:al, 0D9htab

;вывод транслита буквы Щax, big_shch_letter1buffer_out[di],ahdibuffer_out[di],aldiax, big_shch_letter2buffer_out[di],ahdibuffer_out[di],aldiend_spec

:;вывод символа табуляцииal, 09hprint_unchanged

axbxcx

ax, dxbl, 4blah, 4ahch, 0

movcl, ah

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

movbuffer_out[di], 20hdiprint_spacescxbxax


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

movbuffer_out[di], aldi

_spec:_symbols endp


;----------------------------------------------------

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

;----------------------------------------------------

start:


movax, @data

mov ds, ax

read_params

set_video_mode

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

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


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

movdi, 0

loading_next_symbol:diah, 0al, buffer_inp[si];загрузка SI-го элемента в axsi

al, 0Ahnot_new_str;сбросить счетчик позиции табуляций

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

not_new_str:

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

;movcx, 222cx, 210:di, cxbx, russian[di]ax, russian[di]writing_analogcxcomparingdispecial_symbolsprint_exit_analog:ax, english[di];помещение в ax аналога русского символа


popdi

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

jnznot_one_bytebuffer_out[di], aldiprint_exit_one_byte:

;movax, sibuffer_out[di], ahdibuffer_out[di], aldi_exit:di, 7996output_to_filesi, input_buf_length ;повторять, пока не переведен весь буффер

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

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

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


exit_change:dx, offsetdone_messagecx, 5print_messageclose_appstart


Содержание Введение . Анализ задания . Проектирование пользовательского интерфейса . Разработка механизма транслитерации . Тестирование За

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ