, который передается через командную строку (пример: tr.exe -t). Замечание: тест возможен, если присутствует файл test.txt.
Перед тем как производить модификацию или изменение словаря необходимо сохранить оригинальный файл на жестком диске. При изменении файла необходимо соблюдать такое же расположение английского и русского алфавита. Кроме того, после запуска программы с модифицированным словарем, программа может выдать предупреждение об изменение структуры алфавита для транслитераций, но на ход работы это не повлияет, если были учтены правила модификаций.
ИНСТРУКЦИЯ ПРОГРАММИСТА
В программе определена структура, содержащая в себе массивы для алфавита.
Функция void hello(); отвечает за приветствие. Ничего не получает и не возвращает никаких данных.
Функция void test(); необходима для теста. Ничего не получает и не возвращает.
Функция char *trans(char *t_rus); отвечает за транслитерацию. Получает указатель на русский текст и возвращает переведенный.
Функция void readsl(char *namesl); для чтения данных из словаря. Получает имя исходного файла и ничего не возвращает.
Функция char *read_tr(char *inputf); для чтения данных из файла с русским текстом. Возвращает *read_tr.
Функция void savetext(char *text); получает данные для сохраняемого текста. Ничего не возвращает.
Функция void add(char *ins_s, char **str, int n); отвечает за добавление подстроки. Получает указатель на eng,двойной на строку и данные о позиции, где осуществляется добавление. Ничего не возвращает.
Функция void delet(char **str, int n, int N); отвечает за удаление подстроки. Получает строку, позицию и strlen(rus). Ничего не возвращает.
Функция void change(char *rus, char *eng, char **et); осуществляет замену символов с использованием функций add и delet. Получает значения из структуры, а также данные о тексте, где необходимо произвести замену. Ничего не возвращает.
Функция long file_size(FILE *stream); необходима для вычисления размеров входного файла.
ТЕСТИРОВАНИЕ
В файле input.txt:
Однажды, в студеную зимнюю пору,
Я из лесу вышел; был сильный мороз.
Гляжу, поднимается медленно в гору
Лошадка, везущая хворосту воз.
И, шествуя важно, в спокойствии чинном,
Лошадку ведет под уздцы мужичок
В больших сапогах, в полушубке овчинном,
В больших рукавицах... а сам с ноготок!
В файле trans.txt:
Odnazhdy, v studenuyu zimnyuyu poru,
Ya iz lesu vyshel; byl sil'nyjj moroz., podnimaetsya medlenno v goru, vezusсhaya khvorostu voz.
, shestvuya vazhno, v spokojjstvii chinnom,vedet pod uzdcy muzhichokbol'shikh sapogakh, v polushubke ovchinnom,bol'shikh rukavicakh... a sam s nogotok!
ЗАКЛЮЧЕНИЕ
Работа была выполнена согласно всем требованиям, поставленным по данной теме.
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
Керниган Б.В., Ричи Д. Язык программирования Си М.: Санкт-Петербург 2004, 351с
Громов Ю.Ю.,Татаренко С.И. Программирование на языке СИ: Учебное пособие. -Тамбов,1995.- 169 с.
#"justify">ПРИЛОЖЕНИЕ
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
#include <dos.h>
#include <stdlib.h>
#define stop while(!kbhit())slov_elem //Структура словаря
{rus[100],eng[100];
};_elem *slov; //Массив элементов(словарь) numword=0; //Количество элементов словаря
void hello();
void test();*trans(char *t_rus);readsl(char *namesl);*read_tr(char *inputf);savetext(char *text);add(char *ins_s, char **str, int n);delet(char **str, int n, int N);change(char *rus, char *eng, char **et);file_size(FILE *stream); hello()
{
printf("Программа для транслитераций.\nВозможные действия:\n\
. Запустить через командную строку, и ввести название файла.\n\
. Параметр в консоле '-t' запускает тест программы.");
}test()
{*slname="slovar.txt";*test=NULL;= "test.txt";*test_rus=read_tr(test);(test_rus==NULL)
{();("Ошибка теста 1: не найден или поврежден файл test.txt.");
stop;;
}(slname);*englt=trans(test_rus);(strcmp(englt,"shiroko"))
{
printf("Ошибка теста 2: поврежден словарь или задан пользовательский.");
stop;;
}
/* for(int i=0; i<numword; i++)
{(slov[i].rus);
(*slov).rus[i]=NULL;(slov[i].eng);
(*slov).eng[i]=NULL;
} */(slov);(englt);(test_rus);
}savetext(char *text)
{* file;=fopen("trans.txt","wb");(file)(file,text);
}add(char *ins_s, char **str, int n)
{*a=NULL, *ostat=NULL;len1=strlen(*str);(n>len1);len2=strlen(ins_s);
*str=(char *)realloc(*str, len1+len2+1);//удлинение строки=*str+n;=(char *)malloc(strlen(a)+1);(ostat==NULL)
{("Недостаточно памяти");;
exit(1);
}
strcpy(ostat, a);//сохранение остатка строки
strcpy(a,ins_s);//добавили ins_s(*str, ostat);//приписали остаток(ostat);
}delet(char **str, int n, int N)
{*ostat=NULL, *a=NULL;len=strlen(*str);(n>len)(len<n+N)=len-n;=*str+n; //настраиваем указатель "а" на удаляемую подстроку
ostat=(char *)malloc(strlen(a)+1);//выделяем под остаток память
if(ostat==NULL)
{
printf("Недостаточно памяти");
stop;(1);
}(ostat,a+N);
/*Записываем в остаток все, что после удаляемой подстроки.
"а" указывает на начало удаляемой строки, она содержит count символов, тогда
а+N указывает на конец удаляемой строки */
strcpy(a,ostat);
/*Пишем остаток текста поверх исходного текста с того места, где когда-то начиналась подстрока.
В итоге в тексте сохраняется все, кроме подстроки */
*str=(char *)realloc(*str,len-N+1);
//строка укоротилась, следовательно можно укоротить под неё память
free(ostat);
}change(char *rus, char *eng, char **et)
{
char *buf=strstr(*et,rus); //возвращает указатель на первое вхождение rus в et.
//настраиваем указатель buf на первое вхождение подстроки, которую надо заменить в исходной строке.
int position=buf-*et; //была ошибка:Conversion may lose significant digits
//вычисляем позицию подстроки относительно начала строки
//если подстрока в строке не найдена, то получаем отрицательное число,
//так как buf будет равен NULL
while(position>=0)
(et,position,strlen(rus));
//удаляем подстpоку
add(eng,et,position);//вставляем на её место новую подстроку.
buf=strstr(*et,rus);=buf-*et;
}
}*trans(char *t_rus)
{*englt=strdup(t_rus); //копирование текста в englt(int i=0; i<numword; i++)
{(slov[i].rus, slov[i].eng, &englt);
}englt;
}readsl(char *namesl)
{* fp;=fopen(namesl, "rt");(fp==NULL)
{();("Словарь не найден.");;;
}=0;(!feof(fp))//обнаруживает конец файла
{(fp,"%s", (*slov).rus);(fp,"%s", (*slov).eng);++;=(slov_elem *)realloc(slov, sizeof(slov_elem)*numword);(slov[numword-1].rus,(*slov).rus);(slov[numword-1].eng,(*slov).eng);
}(fp);
}file_size(FILE *stream)
{
//была ошибка:Conversion may lose significant digits curpos, length;
//сохраняет текущее положение указателя
curpos=ftell(stream); //Возвращает положение указателя текущей позиций файла
//перейти в конец файла(stream,0L,SEEK_END);
//получит текущее положение указателя
length=ftell(stream);//возвращает размер файла
//восстановит старое положение
fseek(stream,curpos,SEEK_SET);
return length;
}*read_tr(char *inputf)
{*buf=NULL;* fp=fopen(inputf, "rb");(fp==NULL)
{NULL;
}fsize=file_size(fp);=(char *)malloc(fsize+1);(buf==NULL)
{
printf("Недостаточно памяти");
stop;
exit(1);
}
fread(buf,1,fsize,fp);//fread(сюда считывает, длина элемента,количество эл., откуда считает)
buf[fsize]='\0';(fp);buf;
}main(int argc, char *argv[])
{();blocknum=0;hi;.ptr=NULL;(heapwalk(&hi)==_HEAPOK)(hi.in_use)
++blocknum;*namesl=NULL;(argc<2)
{();;;
}(argc<3)
{(argv[1][0]=='-'&&argv[1][1]=='t')
{();("Тест закончен.");;;
}
}
{("Ошибка при вводе в консоль.");;;
}(strlen(argv[1])>10)
{
printf("Имя входного файла слишком длинное.");
stop;;
}*t_rus=read_tr(argv[1]);(t_rus==NULL)
{();("Файл не найден.");
stop;
return;
}("Входной файл: %s\n",argv[1]);="slovar.txt";(namesl);*englt=trans(t_rus);(englt);(englt);
/* for(int i=0; i<numword; i++)
{(slov[i].rus);
(*slov).rus[i]=NULL;(slov[i].eng);
(*slov).eng[i]=NULL;
} */(slov);(t_rus);(heapcheck()==_HEAPCORRUPT)
{("Куча повреждена.\n");
}.ptr=NULL;(heapwalk(&hi)==_HEAPOK)(hi.in_use)
-blocknum; (blocknum)
printf("В куче есть занятые блоки.\n");
printf("Перевод сохранен в trans.txt");
stop;
}
1.