Вход

Латинизация кириллицы

Реферат по радиоэлектронике
Дата добавления: 22 мая 2006
Язык реферата: Русский
Word, rtf, 355 кб (архив zip, 38 кб)
Реферат можно скачать бесплатно
Скачать






МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

УРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ–УПИ

Кафедра автоматики и информационных технологий





Оценка_____________


Члены комиссии:

___________________

___________________





ЛАТИНИЗАЦИЯ КИРИЛЛИЦЫ

Курсовой проект по дисциплине ПЯВУ












Студент: Мальцев

Группа Р-328A

Преподаватель: Трофимов С.П.





Екатеринбург 2004

ОГЛАВЛЕНИЕ


ПОСТАНОВКА ЗАДАЧИ 3

Теоретическая часть 4

Инструкция пользователя 6

Инструкция программиста 8

“Menu.cpp” 8

“Translit cpp” 9

“Test.сpp” 12

ТЕСТИРОВАНИЕ 14

ЗАКЛЮЧЕНИЕ 15

Библиографический список 16

ПРИЛОЖЕНИЕ 1. ТЕКСТ ПРОГРАММЫ 17

ПРИЛОЖЕНИЕ 2. Экранные формы 24




ПОСТАНОВКА ЗАДАЧИ

Написать программу, соответственно следующим требованиям:

  • программа работает с командной строкой, получающей входной файл и словарь;

  • программа преобразует русские буквосочетания в английские;

  • предусмотреть корректность словаря;

  • реализовать тестирование программы.










































Теоретическая часть

Транслит – замещение букв одного языка другими на основании фонетического созвучия. Например, русское словосочетание "РТФ" пишется так – “RTF”. Почему же возникло это явление и зачем оно используется?

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

Был предложен еще один вариант замены – на основании визуального подобия. Например, русское словосочетание "РТФ" пишется так “PTOP”, причем оно написано полностью английскими буквами. В этом виде транслита допустима еще и замена цифрами (ч-4,з-3). Название этому явлению – мегатранслит (или псевдотранслит), т.к. это нечто большее, чем простой транслит.

Если же взглянуть на все это с точки зрения банальной эрудиции, то сейчас транслит можно было бы забыть. Но он нашел свое применение в сфере общения. Например, когда разговариваешь в чате, то чего же не писать транслитом? Вообще, точек зрения на вопрос каким должен быть стандарт кодировки у русской Сети существует несколько:

  1. кодировка КОИ8

  2. кодировка CP1251

  3. cтандартом русской Сети - равно как и мировой - является и должен оставаться translit, то есть верхняя половина символьной таблицы

  4. у русской Сети не может и не должно быть единого стандарта.

Приверженцы транслита на замечают, что если русским стандартом ДОСа является CP866, в клонах UNIX распространена поддержка КОИ8, а в виндозных системах принято поддерживать CP1251, то существует лишь одна кодировка, на основании которой пользователи всех этих операционных систем могут договориться, - транслит.

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

Но также следует отметить, что у операционных систем, установленных примерно на 90% компьютеров в мире, не существует средств поддержки КОИ8, будь то в режиме чтения или письма. Кодировка CP1251 не поддерживается в довольно большом числе не последних по значимости операционных систем - включая ДОС, UNIX, Макинтош. Делать стандартом кодировку, которую пользователи этих систем не могут прочитать в принципе, означает изначальную установку на отсечение от русского киберпространства всех пользователей, которые не являются клиентами Билла Х. Гейтса.

Транслит очень нравится всякого рода злоумышленникам (хакерам). Они пишут слово так, чтобы оно было похоже на оригинал. Допустим, в адресcе электронной почты хакер вместо буквы О может написать цифру 0. Мало кто смотрит на адреcс отправителя, и заметить "подвох", оставленный хакером, удается не сразу. Таким образом, этот простейший прием можно использовать для дополнительной защиты своего почтового ящика.

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

Следует отметить, что писать вручную на транслите – для рядового обывателя дело очень утомительное из-за своей необычности и непривычности. Данное приложение призвано помочь вам в этом!























Инструкция пользователя

Данное приложение предназначено для латинизации (транслитерации) кириллицы. Включает в себя проект Translit.prj, содержащий три файла menu.cpp, translit.cpp, test.сpp, два словаря tdict.txt и pdict.txt (содержат транслит и псевдотранслит соответственно), а также для осуществления тестирования программы- файлы tsource.txt, tresult.txt, tcorrect.txt.

Файлы словари составлены разработчиком проекта, представляют собой обычные текстовые файлы. Каждая строка в словаре записана в следующем формате:

key-value

где key – русское буквосочетание, value – словосочетание, на которое заменяется rus при переводе.

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

Существует три способа указания файлов:

1.Непосредственно в командной строке Dos, где прописываются через пробел имя исполняемого файла и имена остальных необходимых файлов. П

2.Меню оболочки RUNArguments, где прописываются просто имена необходимых файлов(при наличии их в текущей директории) или полный путь к файлам(при отсутствии их в текущей директории).

3. Меню оболочки FILEDOS shell(указание аргументов командной строки производится аналогично).

Если при запуске программы появляется сообщение

Используйте: Translit.exe словарь файл_для_перевода [переведенный файл]

это означает, что пользователь ввел недопустимое число аргументов. Следует повторить запуск программы с правильно указанными аргументами.

Если файл-словарь пуст, то выдается сообщение:

Словарь слишком мал!

Если пуст файл, указанный для перевода, то на экране появляется сообщение:

Невозможно открыть файл для перевода!

При запуске программы на экране появляется меню, в котором пользователю предлагается на выбор пять пунктов:

  • About;

  • Help;

  • Translit;

  • Test;

  • Exit

Передвижение по пунктам меню осуществляется при нажатии клавиш “стрелка вверх” или ”стрелка вниз”. Для входа в какой-либо пункт меню используйте клавишу “ENTER”.

При выборе “About” вы увидите на экране несколько строк об разработчике и предназначении программы:

Программа Translit осуществляет транслитерацию.

Автор: Пашкова Ольга, группа Р-220б"

Пункт “Help” поможет вам разобраться в использовании программы.

При выборе “Translit” осуществляется транслитерация указанного файла и полученный текст выводится на экран(если не был отмечен в командной строке файл для перевода) или в файл.

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

При выборе “ Test ” осуществляется тестирование данной программы за счет сравнения файла полученного с помощью Translitа с файлом, произведенным вручную (оба файла содержатся в приложении: tresult.txt, tcorrect.txt, соответственно). На экран может быть выведено одно из сообщений:

"Тест удачно пройден." или "Тест не пройден.",

а также при отсутствии одного или двух файлов

Ошибка при открытии файла(ов).

Для выхода пользуетесь “Exit” или просто нажмите “esc”.

Программа осуществляет проверку выбранного словаря на корректность записанной в нем информации: в каждой строке словаря должен имеется символ '-', не допускается отсутствие в какой-либо из строк словаря словосочетания(ий) key и (или)value.

При обнаружении некорректной записи в словаре программа выдает сообщение с указанием номера неправильной строки и саму строку:


Предупреждение! (7) строчка словаря 'вv' записана некорректно!


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

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

Нет памяти для хранения словаря


рекомендуется перезагрузить компьютер и попытаться снова запустить программу.


В случае невозможность устранения неполадок самим пользователем обращаться к разработчику по адресу, указанному в пункте меню “About”.

Инструкция программиста

Данная программа предназначена для латинизации (транслитерации) кириллицы. Программа представляет собой проект, состоящий из трех файлов: menu.cpp, translit.cpp, test.сpp.

Причем для ее работы необходимы следующие файлы: один из файлов словарей (DictT.txt или DictP.txt), входной файл с текстом для перевода (source.txt), файл для вывода (result.txt), которые задаются в командной строке (последний файл является не обязательным аргументом командной строки).

“Menu.cpp”

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

  • void translit (char *, char *, char *);

  • int test ( );

  • void usage (char * name);

  • void main(int argc, char *argv[]).


-void translit (char *, char *, char *)

Функция, реализующая латинизацию кириллицы, находится в файле translit.cpp(см. ниже). Ее аргументами являются указатели на имена файлов, имеющиеся в командной строке. Ничего не возвращает.


-int test ( ) (пдробное описание данной функции приведено ниже)

Функция, осуществляющая тестирование транслитерации путем сравнивания двух файлов: один содержит текст латинизации данного приложения, второй создавался в ручную.

Функция ничего не получает, возвращает результат сравнения двух файлов:

1-файлы одинаковы;

0-файлы различны.

-void usage (char * name)

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

Если в командной строке не указан хотя бы один из параметров, функция выдает сообщение об ошибке:


Используйте: Translit.exe словарь файл_для_перевода [переведенный файл]





- void main(int argc, char *argv[])

Функция использует аргументы командной строки.

Параметры функции: argc – переменная, содержащая количество аргументов командной строки, включая исполнительный файл; argv – массив указателей, на аргументы командной строки. Ничего не возвращает.

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

Функция проверяет все ли обязательные аргументы указаны в командной строке, если нет, то выдается сообщение об ошибке, описанной выше(usage). При наличии всех необходимых файлов проверяется присутствие файла для вывода. Если его имя написано в командной строке, то он открывается для записи выходного потока.

Выделяются окна для каждого из пунктов меню с заданием цвета текста(WHITE) и местонахождения на экране. Причем при активизации какого-либо пункта меню цвет текста меняется(RED)(данная часть функции осуществляется с помощью переключателя).

Производится очистка буфера ввода-вывода с клавиатуры, так как при нажатии некоторых клавиш в буфер записываются два числа: 0 и расширенный код, совпадающий, как правило, со scan-кодом клавиши. Далее определяется какая клавиша была нажата, посредством этого осуществляется перемещение по пунктам меню по кругу, если были нажаты “стрелки вверх, вниз”; выход из программы-“ESC”; вход в пункт меню-“ENTER”. Причем при нажатии последней клавиши на экране выделяется окно для вывода информации:

About Программа Translit, осуществляет транслитерацию.

Автор: Пашкова Ольга, группа Р-220б.

Help Пользуйтесь клавишами стрелки 'вверх','вниз',

а также 'Enter', для входа в пункт меню.

Translitвыполняется функция translit, описанная выше.

Test выполняется функция test, описанная выше.

Exitосуществляется выход из программы.


“Translit cpp”

- модуль, непосредственно осуществляющий транслитерацию.


Имеет макроопределение

define chunk 10 для минимального количества структур, используется в функции bukvosoch*divide_dick (char *d, int *count)..

Содержит структуру bukvosoch, элементами которой являются подстрока слева от “-” (русские буквы) в словаре, подстрока справа от “-” (латинские буквы) в словаре и длина key (в байтах).

Содержит следующие функции:

  • char * read_dick (char *filename);

  • bukvosoch *divide_dick (char *d, int *count);

  • int sortf (const void *a, const void *b);

  • void prepare_dick(bukvosoch *w, int count);

  • void translit(char *dict,char *text, char *output).


-char * read_dick (char *filename)

Получает указатель на имя файла – словаря. Возвращает указатель на область памяти, куда был считан словарь. Если произошла одна из ошибок, описанных ниже, функция возвращает значение NULL.

Функция открывает имеющийся словарь (с атрибутом «только для чтения»), определяет его размер. Если файл оказался пустым, программа выдает сообщение:

Словарь слишком мал!

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

Нет памяти для хранения словаря.

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

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


-bukvosoch *divide_dick (char *d, int *count)

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

Выделяется память, размером в chunk структур bukvosoch, так как изначально неизвестно какой обьем памяти понадобится. Если нет свободной памяти, то выдается сообщение об ошибке:

Нет памяти!

При удачном выделении памяти определяется длина файла. В цикле for проверяется каждый символ строки. При обнаружении ‘\n’(asci-кода “ENTER”) заменяется на нуль, причем каждая такая замена учитывается счетчиком k. Если их количество превысило (chunk-1)(получающийся массив структур начинается с нулевого элемента), то производится изменение размера ранее выделенной памяти (перевыделение памяти ) до размера n*chunk, где n- число перевыделений.В случае отсутствии памяти появляется сообщение об ошибке, указанной выше, и освобождается ранее выделенный блок динамически распределяемой памяти, функция возвращает NULL. Данная функция представляет каждую структуру виде строки русских символов (key), остальные ее элементы приравнивает к нулю. Определение числа получившихся структур осуществляется так: k+1.




-int sortf (const void *a, const void *b)

Является аргументом функции qsort.Получает два указателя с квалификатором типа-const, т.е. имеющих постоянное значение (доступны только для чтения). Осуществляет сравнение элементов key структур по длине и возвращает результат сравнения (положительное число, 0, отрицательное число).


-void prepare_dick(bukvosoch *w, int count)

Получаем массив структур и число структур в массиве (число элементов массива). Функция ничего не возвращает.

Циклом for осуществляется проверка словаря на корректность. При обнаружении следующих ошибок: хотя бы одна структура не имеет ’-’, в структуре отсутствует элемент key или value программа выдает сообщение, указывая ошибочную запись с номером соответствующей строки:

Предупреждение! (7) строчка словаря 'вv' записана некорректно!

Структура с ошибкой обнуляется. Подстрока после найденного ‘-’ обозначается элементом структуры value, определяется и значение keylen.

После этого производится сортировка структур по длине key при использовании функции сравнения, определенной выше, описание функции qsort производится в пункте “Некоторые функции из HELPa”.


-void translit(char *dict,char *text, char *output)

Получает указатели на имена файлов, указанных в командной строке. Ничего не возвращает.

Функция проверяет наличие всех обязательных аргументов в командной строке и существование указанных файлов. При обнаружении ошибки заканчивает свою работу(соответствующее сообщение выдает функция usage, содержащаяся в модульном файле “Menu.cpp”).

Если пользователь указал файл для вывода, то он открывается для записи, при неудачном выполнении операции выдается сообщение:

Ошибка при открытии файла для выходного потока!

Осуществляется считывание словаря в память (read_dick), производится разделение полученной строки в памяти на подстроки-структуры(divide_dick), затем каждая строка представляется в виде элементов структуры(prepare_dick). При выполнении этих трех шагов возможны сообщения:

Ошибка при чтении словаря!

Ошибка при разбиении словаря (нет памяти).

при этом функция завершает свою работу.

При удачном результате определяется длина key нулевого элемента массива структур и выделяется память для “окошка” этой длины. В случае отсутствия свободной памяти на экране появляется сообщение:

Нет свободной памяти для window.

производится очистка динамической памяти, завершение работы функции.

В противном случае производится открытие файла с текстом для чтения. При неудаче программа выдает ошибку:

Невозможно открыть файл для перевода!

При удачном открытии файла “окошко” заполняется нулями с целью предохраниться от “мусора”, затем в него считывается строка из файла такой же длины и по всем структурам осуществляется поиск key, входящего в эту строку(cравнение осуществляется с начала “окошка”). Если key был найден, то соответствующий элемент структуры value записывается в output файл и (или) выводится на экран, а “окошко” будет передвинуто на число равное keylen (транслитерация происходит в бесконечном цикле). Если “окошко” снова заполнилось нулями, то выходим из цикла. Производится закрытие файлов и очистка динамической памяти.


“Test.сpp”

- модуль, осуществляющий тестирование транслитерации.

  • void translit(char *,char *, char *);

  • int test ( ).

Включает в себя прототип функции translit, описанной выше. Причем имена файлов прописываются в функции, обязательно наличие всех файлов.


Функция ничего не получает, возвращает результат сравнения двух файлов:

1-файлы одинаковы;

0-файлы различны.

Открываются для чтения файлы, записанные в функции fopen: tresult.txt, tcorrect.txt.При невозможности открытия на экран выводится сообщение об ошибке:

Ошибка при открытии файла(ов).

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


Некоторые функции из HELPa

- FILE f open (const char *filename, const char *mode) открывает файл, на имя которого указывает filename, в режиме зазываемом mode и связывает его с протоколом. Указатель на поток является значением, возвращаемым функцией.

- char *strchr (const char *str, intc) ищет в строке str первое вхождение символа с.

-void*memset (void *s, int c, unsigned n) записывает во все байты области памяти s значение с. Длина области s равна n байт.

- fread (void *buf, size_t size, sizet sizebl, FILE *fp) считывает sizet sizebl количество блоков из fp в buf, размером size_t size. Возвращает количество считанных блоков, даже если считалась половина блока.

-int strncmp (const char *str1, const char *str2, int kol) сравнивает части строк str1 и str2, причем рассматривая str1str2.

- void *memmove (roid *dest, const void *src, int n) копирует блок длиной n байтов из src в dest, возвращает указатель dest.

-void qsort(void base,size_t nelem, size_t width, int(*fcmp)(const void *p1,const void *p2)) – функция быстрой сортировки массива. Параметры: base- указатель на начало массива сортируемых элементов (адрес нулевого элемента массива), nelem-количество сортируемых элементов в массиве, width -размер элемента массива в (байтах), fcmp -указатель на функцию сравнения.Функция ничего не возвращает.


-int feof (FILE *stream) проверяет, достигнут ли конец файла, связан с потоком stream.
































ТЕСТИРОВАНИЕ

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

Тест удачно пройден.

Также для тестирования были смоделирована ситуация(модификация в функции translit), при которой не верно была произведена транслитерация.При этом программа выдало сообщение:

Тест не пройден.








































ЗАКЛЮЧЕНИЕ

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

Словари программы созданы в вольной интерпретации разработчика.

Достоинством программы является ее простота.

Реализация поставленной задачи была осуществлена при создании проекта, содержащего три файла, с использованием текстого диалога с пользователем путем выбора пунктов меню. Следует отметить, что разработчику пришлось столкнуться со следующей проблемой: ”выигрываем в памяти- проигрываем в скорости”(например, при использовании консольных функций ввода-вывода, при выполнении функции divide_dick в модуле Translit.cpp).

Программа написана в соответствии с правилами хорошего стиля:

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

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

Программа была протестирована в соответствии с пунктом ТЕСТИРОВАНИЕ данного курсового проекта.

























Библиографический список


  1. Подбельский В.В., Фомин С.С. Программирование на языке Си: Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 1999. – 576 с.

  2. Программирование в языке СИ. Организация ввода-вывода: Методические указания к лабораторным занятиям / С.П.Трофимов. Екатеринбург. Изд-во УГТУ,1998.22c.

  3. Керниган Б.,Ритчи Д.Язык программирования СИ / Пер. с англ. –СПб.: “Невский Диалект”, 2001. – 351 с.











































ПРИЛОЖЕНИЕ 1. ТЕКСТ ПРОГРАММЫ

Menu.cpp

#include

#include

#include

#include

#include

#include


void translit(char *, char*,char*);

int test();

//#####################################

void usage(char *name)

{

printf("Используйте: %s словарь файл_для_перевода [переведенный файл]",name);

}

//#####################################

void main(int argc,char *argv[])

{

clrscr();

if (argc<3>

{

usage(argv[0]);

return;

}

else if(argc==4)

freopen(argv[3],"wt",stdout);

else clrscr();

int k=0,z=0;

while(1)

{

window(3,3,30,11);

textcolor(WHITE);

gotoxy(1,1);

cprintf("About\n\r");

cprintf("Help\n\r");

cprintf("Translit\n\r");

cprintf("Test\n\r");

cprintf("Exit\n\r");

switch(k)

{

case 0: gotoxy(1,1);

textcolor(RED);

cprintf("About");

break;

case 1: gotoxy(1,2);

textcolor(RED);

cprintf("Help");

break;

case 2: gotoxy(1,3);

textcolor(RED);

cprintf("Translit");

break;

case 3: gotoxy(1,4);

textcolor(RED);

cprintf("Test");

break;

case 4: gotoxy(1,5);

textcolor(RED);

cprintf("Exit");

break;

}

textcolor(WHITE);

if(!(z=getch()))

z=getch();

if(z==80)

{k=k==4?0:k+1;}

else if(z==72)

{k=k==0?4:k-1;}

else if(z==27)

return ;

else if(z==13)

{

window(15,3,80,20);

clrscr();

switch(k)

{

case 0:cprintf("Программа Translit осуществляет транслитерацию."

"Автор: Пашкова Ольга, группа Р-220б");

break;

case 1:cprintf("Пользуйтесь клавишами стрелки 'вверх','вниз', "

"а также 'Enter', для входа в пункт меню");

break;

case 2:translit(argv[1],argv[2],argc==4?argv[3]:NULL);

break;

case 3:cprintf(test()?"Тест удачно пройден":"Тест не пройден");

break;

case 4:exit(0);

break;

}

}

}

}


Translit cpp”

include

include

include //для filelength

include

include

include


define chunk 10


struct bukvosoch

{

char *key; // строка в словаре, стоящая слева от '-'

char *value; // строка в словаре, стоящая слева от '-'

unsigned keylen; //длина key в байтах

};

/#####################################

/выделение памяти и чтение файла-словаря в выделенную область памяти

char *read_dick(char *filename)

{

FILE *dic=NULL;

dic=fopen(filename,"rt");

if (!dic)

{

cprintf("\nОшибка при открытии файла-словаря!");

return NULL;

}

long len=filelength(dic->fd);

if (len==0)

{

cprintf("\nСловарь слишком мал!");

fclose(dic);

return NULL;

}

unsigned l=(unsigned)(++len);

char *dick=(char *)malloc(l);

if(dick==NULL)

{

cprintf("\nНет памяти для хранения словаря");

fclose(dic);

return NULL;

}

fread(dick,l,1,dic); //считывание словаря в память

dick[l-1]=0;

fclose(dic);

return dick;

}

/#####################################

/разбиение считанной 'строки' на строки

bukvosoch* divide_dick(char *d, int *count)

{

int ps=chunk;

bukvosoch *items=(bukvosoch*)malloc(ps*sizeof(bukvosoch));

if (items==NULL)

{

cprintf("\nНет памяти!");

return NULL;

} //нет памяти

unsigned l=strlen(d);

char *start=NULL;

start=d;

int k=-1;

for (unsigned i=0; i

if (d[i]=='\n')

{

d[i]=0;

k++;

if (k>ps-1)

{

ps+=chunk;

bukvosoch *qwe=(bukvosoch*)realloc(items,ps*sizeof(bukvosoch));

if(qwe==NULL)

{

free(items);

cprintf("\nНет памяти!");

return NULL;

}

else items=qwe;

}

items[k].key=start;

items[k].value=NULL;

items[k].keylen=0;

start=d+i+1;

}

*count=k+1;

return items;

}

/#############################################

/функция для сравнения длин key в элементах массива структур

int sortf(const void *a, const void *b)

{

return ((bukvosoch*)b)->keylen-((bukvosoch*)a)->keylen;

}

/#####################################

/представление строк в виде "key-value",сортировка их по длине key

void prepare_dick(bukvosoch* w, int count)

{

for(int i=0; i

{

char *e=strchr(w[i].key,'-');

if (e==NULL || e==w[i].key || e==w[i].key+w[i].keylen-1)

{

cprintf("\nПредупреждение! (%d) строчка словаря '%s' записана некорректно!\n",i,w[i].key);

w[i].key=NULL;

w[i].value=NULL;

w[i].keylen=0;

continue;

}

*e=0;

w[i].value=e+1;

w[i].keylen=(e-w[i].key);

}

qsort(w,count,sizeof(bukvosoch),sortf);

}

//#############################################

void translit(char*dict,char*text,char *output)

{

if (!dict || !*dict || !text || !*text) return;

FILE*ou=NULL;

if (output)

{

ou=fopen(output,"wt");

if (!ou)

{

cprintf("Ошибка при открытии файла для выходного потока!");

return;

return;

}

}


clrscr();

char *d=read_dick(dict);

if (!d)

{

cprintf("Ошибка при чтении словаря!");

return;

}

int num=0;

bukvosoch *qwe=divide_dick(d,&num);

if (!qwe)

{

cprintf("Ошибка при разбиении словаря (нет памяти)");

return;

}

prepare_dick(qwe,num);

int wl=strlen(qwe[0].key);

char *window=(char*)malloc(wl+1);


if (window==NULL)

{

free(qwe);

free(d);

cprintf("Нет свободной памяти для window");

return;

}

window[wl]=0;

char found=0;

int i;

//поиск key в источнике

char *where=window;

char count=wl;

int a=0,exit=0;

FILE *source=fopen(text,"rt");

if (source==NULL)

{

free(qwe);

free(d);

cprintf("Невозможно открыть файл для перевода!");

return;

}

while(1)

{

memset(where,0,count);

a=fread(where,count,1,source);

if (a==0) //нет больше информации для чтения-window пусто

{

exit=1;

for(int i=0; i

if (window[i])

{

exit=0;

break;

}

if (exit) break;

}

found=0;

for (i=0; i

{

if(strncmp(qwe[i].key,window,qwe[i].keylen)==0)

{

found=1;

break;

}


}

if (found)

{

if (output)

fprintf(ou,qwe[i].value);

else

cprintf("%c",qwe[i].value);

count=qwe[i].keylen;

}

else

{

if (output)

fprintf(ou, "%c", window[0]);

else

cprintf("%c", window[0]);

count=1;

}

where=window+wl-count;

memmove(window,window+count,wl-count);

}//конец while

free(window);

fclose(source);

if (output)

fclose(ou);

free(qwe);

free(d);

}


Test.сpp”

#include

#include

#include


void translit(char *,char*,char*);

//#####################################

int test()

{

translit("tdict.txt","tsource.txt", "tresult.txt");

FILE *f1=fopen("tcorrect.txt","rt");

FILE *f2=fopen("tresult.txt","rt");

if (!f1 || !f2)

{

printf("Ошибка при открытии файла(ов).");

return 0;

}

char buf1[11],buf2[11];

buf1[10]=0;buf2[10]=0;

char equal=1;

while(1)

{

fread(buf1,10,1,f1);

fread(buf2,10,1,f2);

if (memcmp(buf1,buf2,10))

{

equal=0;

break;

}

if (feof(f1) || feof(f2))

break;

}

return equal;

}












ПРИЛОЖЕНИЕ 2. Экранные формы


About Программа Translit осуществляет транслитерацию.

Help Автор: Пашкова Ольга, группа Р-220б.

Translit

Test

Exit


About Пользуйтесь клавишами стрелки 'вверх','вниз', а также 'ENTER' дл

Help входа в пункт меню.

Translit

Test

Exit


About

Help Ошибка при открытии файла-словаря!Ошибка при чтении словаря!

Translit

Test

Exit


About РТФ-chempion!

Help

Translit

Test

Exit


About РТФ-4eMn|/|oH!

Help

Translit

Test

Exit


About Тест удачно пройден.

Help

Translit

Test

Exit












© Рефератбанк, 2002 - 2017