Docsity
Docsity

Подготовься к экзаменам
Подготовься к экзаменам

Учись благодаря многочисленным ресурсам, которые есть на Docsity


Получи баллы для скачивания
Получи баллы для скачивания

Заработай баллы, помогая другим студентам, или приобретай их по тарифом Премиум


Руководства и советы
Руководства и советы

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

Создание системы идентификации табличных данных курсовая по программированию и компьютерам

Вид: Дипломная

2016/2017

Загружен 11.04.2017

refbank15174
refbank15174 🇷🇺

5

(2)

10 документы

1 / 43

Toggle sidebar

Сопутствующие документы


Частичный предварительный просмотр текста

Скачай Создание системы идентификации табличных данных курсовая по программированию и компьютерам и еще Дипломная в формате PDF Программирование только на Docsity! Томский Государственный Университет Факультет прикладной математики и кибернетики Кафедра программирования Создание исследовательского прототипа системы идентификации табличных данных Курсовая работа студента IV-го курса А.И. Кобылкина Научный руководитель Томск-2002 г. Содержание 1. Введение. 2. Постановка задачи. 3. Структура системы идентификации. 3.1. Блок предварительной обработки. 3.2. Блок идентификации. 4. Алгоритм сравнения двух слов. 5. Представление данных в иерархической структуре. 6. Программная реализация. 6.1. Объекты программирования. 6.2. Описание интерфейса. 7. Заключение. 8. Список литературы. 9. Приложение. 3. Стр укт ура системы идентификации. При наст рой ке сист емы для пред мет ной области формируется справочник признаков и справочник единиц измерения числовых признаков. Каждый элемент справочника признаков содержит кроме уникального кода и названия содержит информацию о типе признака («строковый», «числовой») и для числового признака ссылку на соответствующий элемент в справочнике единиц измерения. Справочник единиц измерения содержит уникальный код, название единицы измерения и возможно специальную аббревиатуру. В некоторых ситуациях невозможно или трудно обеспечить полностью автоматическую идентификацию. Выходом из положения может явиться участие человека на отдельных этапах. Работа над программой продолжается, но пока требуется участие пользователя. На этапе диалога с пользователем требуется сопоставить столбцам таблицы элементы справочника признаков, в каждом столбце может быть несколько числовых признаков и один текстовый. Для некоторых столбцов может не быть соответствующего элемента в справочнике признаков. Эти столбцы сразу исключаются из дальнейшего рассмотрения. В каждой позиции данные из разных столбцов по отдельности поступают на вход блока предварительной обработки. Теперь данные представляются в виде дерева (об этом будет сказано ниже). Записывается два файла: файл-заголовок, содержащий информацию о соответствии столбцам признаков и файл данных в виде дерева, где узлам соответствуют группы объектов, а листьям - объекты. 3.1 Блок Предварительной обработки. Блок предварительной обработки производит фильтрацию данных, исправление некоторых ошибок и выполняет разбиение на потенциальные признаки. Он включает в себя фильтр неинформативных символов, и символов несущих неоднозначный смысл. Это все символы кроме кириллицы, латиницы, цифр и в некоторых случаях точки или запятой (разделитель десятичной части, разделитель дней, месяцев, лет в дате), а также кроме символов определяемых экспертом предметной области (например – «%»). Слова вида XxxXxxxx разбиваются на пару слов. Здесь же осуществляется перевод строки в нижний регистр. Далее проверка на ошибки раскладки клавиатуры. Если в слове встречаются и латинские и кириллические символы, то те, которых меньше заменяются по таблице соответствия. В таблице соответствия латинский символ соответствует символу кириллицы, если они схожи по написанию или звучанию, например («k» и «к»). Такого рода ошибки, оказывается, могут возникать при наборе документов. Транскрипция латинских слов. Если в родном языке встречаются иностранные слова, то чаще всего это слова которые либо непереводятся, либо их перевод неуместен (имена собственные, названия, торговые марки и т.д.). В другом описании объекта эти же Идея сравнения двух строковых признаков следующая. Каждый строковый признак может быть представлен списком слов, разделителем слов считаетя пробел. Слова сравниваются друг с другом поочередно 4. Алгоритм сравнения двух слов. Даже в достаточно формализованных предметных областях часто невозможно прямое сравнение слов строковых признаков только из-за различных морфологических конструкций и принятых сокращений. В ситуации, когда во многих базах данных средства ввода информации не имеют орфрграфического контроля, когда некоторые иностранные слова (например, торговые марки) имеют свободную неустоявшуюся транскрипцию в родном языке возможны ошибки и разнописания. Сравнивние начала двух слов также может не давать полного эффекта в некоторых случаях. Поэтому отчасти оттого, что сравнение строковых данных одно из слабых звеньев системы, отчасти из-за неизбежных погрешностей транскриптора решено было уделить алгоритму сравнивания слов больше внимания и построить алгоритм, который бы учитывал многие факторы. Идея сравнения двух слов такая. Возьмем алфавит, из которого состоят два сравниваемых слова, и выделим буквы, которые есть и в том и в другом слове. Для примера рассмотрим два слова «алпенгольд» и «альпиенгольд». Их общий алфавит «алпенгоьд». Построим для каждого слова матрицу, в которой столбцам соответствуют номер буквы в алфавите, а строкам позиция буквы в слове. Элемент матрицы (i,j) равен «ИСТИНА», если буква с номером j в алфавите находится в позиции i в слове. Если теперь сдвигать матрицы друг относительно друга по вертикали на k элементов, то синий участок единиц совпадет при k=0, красный и зеленый при k=2. Программная реализация этого алгоритма может быть очень простой. Если составить массив 6. Программная реализация. 6.1 Основные объекты программирования. В листингах приложения идентификаторы соответствуют следующим обозначениям : Описание основных классов приложения class TPositions{ void SaveTo(FILE *f); void LoadFrom(FILE *f); int LastIn(AnsiString SourceString,AnsiString SubStr); AnsiString Replace(AnsiString SourceString,AnsiString Replacer,AnsiString Displacer); AnsiString TransCrypt(AnsiString LatString); AnsiString MisPrint(AnsiString MisPrinted); AnsiString GoodString(AnsiString BadString); void Init(AnsiString Sentence); AnsiString Sentence(int fl=-1); void Clear(); }; TMDIBaseClass = class(TMDIChild) procedure SetGraphParms; procedure draw; // функция рисования procedure AddMinMax( first: boolean;//определяет экстремумы value : real);//функции function toy(yy: real): integer;//Функции переводят объектные function tox(xx: real): integer;// координаты в экранные function tox1(x: integer): real;//и наоборот function toy1(y: integer): real; TMDITimeFunc = class(TMDIBaseClass) // обеспечивают изменение опорных точек спроса procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure GetSplineParms; procedure SelectedPoint(var no,side:Integer;X, Y: Integer); TSpline = class procedure InitHorizont(aSDPoints:integer; aDPoints:integer;aSDLevelDef:real); procedure Interpolation;//интерполяция на всем временном интервале Интерполяция сплайна со свободными границами procedure InterpolationSplineFree( var startNo:integer; SDLeft:integer; SDRight:integer); Интерполяция сплайна первого порядка procedure InterpolationLinear( var startNo:integer; SDLeft:integer; SDRight:integer); Интерполяция сплайна с фиксированными границами procedure InterpolationSplineFixed( var startNo:integer; RightBorder:boolean; SDLeft:integer; SDRight:integer); function SetPoint(point: integer; side: integer; xx: double; yy: double): boolean; function Invert( A:Tmatr; k:integer; var A1:Tmatr ):double; Аа ПСО ух | Далее добавление — | нового документа осуществляется путем выбора из меню “ЕПе” пункта “Ааа Вазе”. Открывается окно мастера импорта текстового документа, в котором разделителем полей является | ИМвол табуляции. Коньяк Хеннесси ХО 0.7я п/к Коньяк Хеннесси 0 0,7+2 бокала Коньяк Хеннесси ХО 0.35 пик, Коньяк Хеннесси УЗОР 1 л п/к Франция Коньяк Хеннесси УЗОР 0 7л + 2 бокала [Франция] Конь Хеннесси УЗОР [Зи] п/к Коньяк Хеннесси УЗОР [0,35] п/к. Коньяк Хеннесси У За г/к. Коньяк Хеннесси У$ 1.5л Коньяк Хеннесси 5 0.бл Коньяк Хеннесси\/5 0.7л г/к Франция Коньяк Хеннесси У5 0,36л Коньяк Реми Мартин УЗОР [0 7и| ж/б. Коньяк Реми Мартин УЗОР [0.5] п/к. е можно использовать следующее окно. “Вазе\Еаи”. Оце нить резу льта т иде нти фик аци и двух пози ций из разн ых документов, можно используя следующее окно. Заключение. В данной работе были решены следующие задачи. Первое, что было сделано – это изучена и проанализирована предметная область - торговые предприятия, продуктов питания. Реализована возможность представления данных в иерархической структуре. Был построен алгоритм, вычисляющий меру похожести двух табличных позиций. Изучена среда разработки приложений C++ Builder 5 и создан проект. На данном этапе разработка приложения не остановлена, она продолжается. Следующим ее этапом будет реализация иерархического идентификатора, улучшение блока транскрипции, возможно, если будет необходимо, перевода с одного языка в другой. Также будет перенесен окончательный выбор признаков в блок предварительной обработки. И, наконец, построение механизма анализа идентифицированных документов. Список литературы 1. К. Верхаген Р. Дейн Ф. Грун «Распознавание образов. Состояние и перспективы» - Москва: Издательство «Радио и связь» 1985г. 2. for(int i=91;i<=96;i++) DelSyms=DelSyms+AnsiString(char(i)); for (int i=123;i<=191;i++) DelSyms=DelSyms+AnsiString(char(i)); Errors[0][0]=char(241); Errors[0][1]=char(99); Errors[1][0]=char(226); Errors[1][1]=char(98); Errors[2][0]=char(224); Errors[2][1]=char(97); Errors[3][0]=char(234); Errors[3][1]=char(107); Errors[4][0]=char(236); Errors[4][1]=char(109); Errors[5][0]=char(229); Errors[5][1]=char(101); Errors[6][0]=char(242); Errors[6][1]=char(116); Errors[7][0]=char(238); Errors[7][1]=char(111); Errors[8][0]=char(240); Errors[8][1]=char(112); Errors[9][0]=char(245); Errors[9][1]=char(120); Errors[10][0]=char(237); Errors[10][1]=char(104); //Transcrypt Control[0][0]=AnsiString("ght");Control[0][1]=AnsiString("т"); Control[1][0]=AnsiString("ld");Control[1][1]=AnsiString("лд"); Control[2][0]=AnsiString("e");Control[2][1]=AnsiString("е"); Control[3][0]=AnsiString("er");Control[3][1]=AnsiString("ер"); Complex[0][0]=AnsiString("tch");Complex[0][1]=AnsiString("ч"); Complex[1][0]=AnsiString("ch");Complex[1][1]=AnsiString("ч"); Complex[2][0]=AnsiString("zsh");Complex[2][1]=AnsiString("ж"); Complex[3][0]=AnsiString("sh");Complex[3][1]=AnsiString("ш"); Complex[4][0]=AnsiString("th");Complex[4][1]=AnsiString("д"); Complex[5][0]=AnsiString("ou");Complex[5][1]=AnsiString("ау"); Complex[6][0]=AnsiString("ea");Complex[6][1]=AnsiString("и"); Complex[7][0]=AnsiString("ow");Complex[7][1]=AnsiString("ау"); Complex[8][0]=AnsiString("ee");Complex[8][1]=AnsiString("и"); Complex[9][0]=AnsiString("oo");Complex[9][1]=AnsiString("у"); Complex[10][0]=AnsiString("ph");Complex[10][1]=AnsiString("ф"); Complex[11][0]=AnsiString("ui");Complex[11][1]=AnsiString("у"); Complex[12][0]=AnsiString("aw");Complex[12][1]=AnsiString("о"); Sim[0][0]=AnsiString("a");Sim[0][1]=AnsiString("а");Sim[0][2]=AnsiString ("эй"); Sim[1][0]=AnsiString("e");Sim[1][1]=AnsiString("е");Sim[1][2]=AnsiString ("и"); Sim[2][0]=AnsiString("i");Sim[2][1]=AnsiString("и");Sim[2][2]=AnsiString ("ай"); Sim[3][0]=AnsiString("o");Sim[3][1]=AnsiString("о");Sim[3][2]=AnsiString ("о"); Sim[4][0]=AnsiString("u");Sim[4][1]=AnsiString("а");Sim[4][2]=AnsiString ("у"); Sim[5][0]=AnsiString("y");Sim[5][1]=AnsiString("и");Sim[5][2]=AnsiString (""); Sim[6][0]=AnsiString("b");Sim[6][1]=AnsiString("б");Sim[6][2]=AnsiString (); Sim[7][0]=AnsiString("c");Sim[7][1]=AnsiString("к");Sim[7][2]=AnsiString ("с"); Sim[8][0]=AnsiString("g");Sim[8][1]=AnsiString("г");Sim[8][2]=AnsiString ("дж"); Sim[9][0]=AnsiString("k");Sim[9][1]=AnsiString("к");Sim[9][2]=AnsiString ("к"); Sim[10][0]=AnsiString("l");Sim[10][1]=AnsiString("л");Sim[10] [2]=AnsiString("л"); Sim[11][0]=AnsiString("q");Sim[11][1]=AnsiString("кв");Sim[11] [2]=AnsiString("ку"); Sim[12][0]=AnsiString("t");Sim[12][1]=AnsiString("т");Sim[12] [2]=AnsiString(); Sim[13][0]=AnsiString("d");Sim[13][1]=AnsiString("д");Sim[13] [2]=AnsiString(); Sim[14][0]=AnsiString("f");Sim[14][1]=AnsiString("ф");Sim[14] [2]=AnsiString(); Sim[15][0]=AnsiString("h");Sim[15][1]=AnsiString("х");Sim[15] [2]=AnsiString(); Sim[16][0]=AnsiString("j");Sim[16][1]=AnsiString("дж");Sim[16] [2]=AnsiString(); Sim[17][0]=AnsiString("m");Sim[17][1]=AnsiString("м");Sim[17] [2]=AnsiString(); Sim[18][0]=AnsiString("n");Sim[18][1]=AnsiString("н");Sim[18] [2]=AnsiString(); Sim[19][0]=AnsiString("p");Sim[19][1]=AnsiString("п");Sim[19] [2]=AnsiString(); Sim[20][0]=AnsiString("r");Sim[20][1]=AnsiString("р");Sim[20] [2]=AnsiString(); Sim[21][0]=AnsiString("s");Sim[21][1]=AnsiString("с");Sim[21] [2]=AnsiString("з"); Sim[22][0]=AnsiString("v");Sim[22][1]=AnsiString("в");Sim[22] [2]=AnsiString(); Sim[23][0]=AnsiString("w");Sim[23][1]=AnsiString("в");Sim[23] [2]=AnsiString("у"); Sim[24][0]=AnsiString("x");Sim[24][1]=AnsiString("кс");Sim[24] [2]=AnsiString(); Sim[25][0]=AnsiString("z");Sim[25][1]=AnsiString("з");Sim[25] [2]=AnsiString(); } TSettings::~TSettings(){} void TPositions::SaveTo(FILE *f){ TStringList *SL=new TStringList(); for(int fl=0;fl<FlowNum;fl++){ SL->Add(ABC[fl]); for(int i=0;i<WordsNum;i++) SL->Add(Words[i][fl]); for(int i=0;i<NumbersNum;i++){ SL->Add(StrNumbers[i][fl]); SL->Add(Numbers[i][fl]); } fputs(SL->CommaText.c_str(),f); fputs("\n",f); SL->Clear(); } delete SL; } void TPositions::LoadFrom(FILE *f){ TStringList *SL=new TStringList(); char str[600]; for(int fl=0;fl<FlowNum;fl++){ fgets(str,600,f); SL->CommaText=AnsiString(str); ABC[fl]=SL->Strings[0]; for(int i=0;i<WordsNum;i++){ Words[i][fl]=SL->Strings[i+1]; if(!Words[i][fl].IsEmpty()) WC[fl]++; } for(int i=0;i<NumbersNum;i++){ StrNumbers[i][fl]=SL->Strings[2*i+WordsNum+1]; Numbers[i][fl]=SL->Strings[2*i+2+WordsNum].ToDouble(); if(Numbers[i][fl]!=0) NC[fl]++; } SL->Clear(); if(NC[fl]+WC[fl]) FlowCount++; } delete SL; } AnsiString TPositions::Replace(AnsiString SourceString,AnsiString Replacer,AnsiString Displacer) { SourceString.Insert(Replacer,LastIn(SourceString,Displacer)); SourceString.Delete(LastIn(SourceString,Displacer),Displacer.Length()); return(SourceString); } int TPositions::LastIn(AnsiString SourceString,AnsiString SubStr) {int k=0; while (SourceString.AnsiPos(SubStr)) {k=SourceString.AnsiPos(SubStr); SourceString.Insert(AnsiString("_"),k); SourceString.Delete(k+1,1); } return(k); } AnsiString TPositions::TransCrypt(AnsiString LatString) { AnsiString CheckString; int Opened=0,s=0; if (LatString.SubString(1,1).AnsiCompare(AnsiString("e"))==0) LatString[1]='э'; if(LatString.SubString(1,2).AnsiCompare(AnsiString("ja"))==0) {LatString.Delete(1,1);LatString[1]='я';} if (LatString.SubString(1,1).AnsiCompare(AnsiString("y"))==0){ LatString.Delete(1,1); if(LatString.SubString(1,1).AnsiCompare(AnsiString("e"))==0) LatString[1]='е'; if(LatString.SubString(1,1).AnsiCompare(AnsiString("a"))==0) LatString[1]='я'; if(LatString.SubString(1,1).AnsiCompare(AnsiString("o"))==0) LatString[1]='е'; } int SSLen=0; if (LatString.SubString(LatString.Length(),1).AnsiCompare(AnsiString ("s"))==0) s=1; } BadString.Insert(DecimalSeparator,lin); } int p; for(int j=0;j<ChangeSymbolsNum;j++) while((p=BadString.Pos(T.ChangeSyms[j][0]))!=0){ BadString.Delete(p,1); BadString.Insert(T.ChangeSyms[j][1],p); } lin=0; while(lin<BadString.Length()){ lin++; if(T.SpecSyms.Pos(BadString[lin])!=0){ if(lin!=BadString.Length()) BadString.Insert(' ',lin+1); continue; } if(T.NumSyms.Pos(BadString[lin])!=0){ if(lin==1) continue; if(T.NumNDelim.Pos(BadString[lin-1])!=0) continue; if(BadString[lin-1]==' ') continue; BadString.Insert(' ',lin); } if(T.NumNDelim.Pos(BadString[lin])!=0) continue; if(T.DelSyms.Pos(BadString[lin])==0) continue; BadString.Delete(lin,1); BadString.Insert(' ',lin); } //Удалить двойные пробелы. while (BadString.Pos(" ")!=0) BadString.Delete(BadString.Pos(" "),1); //Удалить остальные спец знаки BadString=BadString.LowerCase(); return(MisPrint(BadString)); } TPositions::TPositions(){ FlowCount=0; for(int i=0;i<FlowNum;i++){ WC[i]=0; NC[i]=0; ABC[i]=AnsiString(); for(int j=0;j<NumbersNum;j++){ Numbers[j][i]=0; StrNumbers[j][i]=AnsiString(); } for(int j=0;j<WordsNum;j++){ Words[j][i]=AnsiString(); } } } void TPositions::Init(AnsiString Sentence){ if(FlowCount==FlowNum) return; Sentence=GoodString(Sentence); AnsiString Piece; int SpacePos; while(!Sentence.IsEmpty()){ Sentence=Sentence.Trim(); if((SpacePos=Sentence.Pos(' '))!=0){ Piece=Sentence.SubString(1,SpacePos-1).Trim(); Sentence=Sentence.Delete(1,SpacePos-1).Trim(); }else{ Piece=Sentence.Trim(); Sentence=AnsiString(); } if(Piece.IsEmpty()) continue; if(IsQuantity(Piece)){ StrNumbers[NC[FlowCount]][FlowCount]=Piece; NC[FlowCount]++; }else{ Words[WC[FlowCount]][FlowCount]=Piece; WC[FlowCount]++; } } int p; for(int i=0;i<NC[FlowCount];i++){ for(p=1;p<=StrNumbers[i][FlowCount].Length();p++) if(!T.NumNDelim.Pos(StrNumbers[i][FlowCount][p])) break; Numbers[i][FlowCount]=(StrNumbers[i][FlowCount].SubString (1,p-1).Trim()).ToDouble(); StrNumbers[i][FlowCount]=StrNumbers[i][FlowCount].Delete(1,p-1); } for(int i=0;i<WC[FlowCount];i++) for(int j=1;j<=Words[i][FlowCount].Length();j++) if(ABC[FlowCount].Pos(Words[i][FlowCount].SubString(j,1).Trim ())==0) ABC[FlowCount]+=AnsiString(Words[i][FlowCount][j]); if(NC[FlowCount]+WC[FlowCount]) FlowCount++; } void TPositions::Clear(){ FlowCount=0; for(int fl=0;fl<FlowNum;fl++){ WC[fl]=0; NC[fl]=0; ABC[fl]=AnsiString(); for(int i=0;i<NumbersNum;i++){ StrNumbers[i][fl]=AnsiString(); Numbers[i][fl]=0; } for(int i=0;i<WordsNum;i++) Words[i][fl]=AnsiString(); } } AnsiString TPositions::Sentence(int fl){ AnsiString Sent=AnsiString(); if(fl==-1) for(int f=0;f<FlowCount;f++) for(int i=0;i<WC[f];i++) Sent=Sent+Words[i][f]+AnsiString(' '); else for(int i=0;i<WC[fl];i++) Sent=Sent+Words[i][fl]+AnsiString(' '); return(Sent); } //-------------------------------------------------------------------------- - #ifndef PositionTreeH #define PositionTreeH #include <stdio.h> #include "Position.h" //-------------------------------------------------------------------------- - typedef enum {aInit=0,aFind=1,aToList=2} WalkAction ; class TPositionTree{ public: int Code; bool IsGroup; int Depth; AnsiString OutPres[FlowNum]; TPositionTree *Next; TPositionTree *Down; TPositionTree *Prev; TPositions IP; void *Data; TPositionTree(); ~TPositionTree(); void Add(TPositionTree *Node); void AddChild(TPositionTree *Node); TPositionTree *Add(int sCode,AnsiString sName); TPositionTree *AddChild(int Code,AnsiString sName); void Move(TTreeView *tv,TPositionTree *NewParent); void Delete(); void DeleteAll(); void DeleteChildren(); void ToTree(TTreeView *tv,TTreeNode *Node); void ToTreeIts(TTreeView *tv,TTreeNode *Node); void ToList(TListView *lv); void SavePositionTo(FILE *f); bool Save(AnsiString FileName,TProgressBar *ind); void SaveToFile(FILE *f,TProgressBar *ind); AnsiString OP(); bool Action(WalkAction ActionIndex,void *Data); TPositionTree *TreeWalk(WalkAction ActionIndex,void *Data); TPositionTree *LoadPositionFrom(FILE *f); void LoadFromFile(FILE *f,TProgressBar *ind); //void FromFile(AnsiString FileName); } Next->ToTreeIts(tv,tn); } } void TPositionTree::ToTree(TTreeView *tv,TTreeNode *Node){ if(IsGroup){ if(Node) Node=tv->Items->AddChild(Node,OutPres[0]); else Node=tv->Items->Add(Node,OutPres[0]); Node->Data=this; Data=Node; if(Down!=NULL){ if(Down->IsGroup){ Node=tv->Items->AddChild(Node,Down->OutPres[0]); Node->Data=Down; Down->Data=Node; } Down->ToTreeIts(tv,Node); } } } void TPositionTree::ToList(TListView *lv){ TListItem *li; if(!lv->Items->Count){ li=lv->Items->Add(); li->Caption=AnsiString(">>...<<"); li->Data=Prev; li->ImageIndex=IsGroup; li->SubItems->Add("-"); } li=lv->Items->Add(); li->Caption=IntToStr(Code); li->Data=this; li->ImageIndex=IsGroup; // li->ImageIndex=IsGroup; // li->SubItems->Add(IntToStr(Code)); for(int i=0;i<IP.FlowCount;i++){ li->SubItems->Add(OutPres[i]); } if(Next!=NULL) Next->ToList(lv); } void TPositionTree::Move(TTreeView *tv,TPositionTree *NewParent){ if(this==NewParent) return; TPositionTree *Parent; TTreeNode *tn; if(IsGroup&&tv){ tn=((TTreeNode *)Data); tn->Delete(); } Parent=Prev; Data=NULL; if(Next!=NULL) Next->Prev=Parent; if(Parent->Next==this) Parent->Next=Next; else if(Parent->Down==this) Parent->Down=Next; NewParent->AddChild(this); if(IsGroup&&tv){ tn=(TTreeNode *)(NewParent->Data); ToTree(tv,tn); } } void TPositionTree::SaveToFile(FILE *f,TProgressBar *ind){ if(ind) ind->Position=ind->Position+1; if(Down){ Down->SavePositionTo(f); Down->SaveToFile(f,ind); }else{ fputs("!enddown!",f); fputs("\n",f); } if(Next){ Next->SavePositionTo(f); Next->SaveToFile(f,ind); }else{ fputs("!endnext!",f); fputs("\n",f); } } void TPositionTree::SavePositionTo(FILE *f){ TStringList *SL=new TStringList(); for(int i=0;i<FlowNum;i++){ SL->Add(OutPres[i]); } SL->Add(Code); SL->Add(int(IsGroup)); SL->Add(Depth); fputs(SL->CommaText.c_str(),f); delete SL; fputs("\n",f); IP.SaveTo(f); } bool TPositionTree::Save(AnsiString FileName,TProgressBar *ind){ FILE *f; f=fopen(FileName.c_str(),"w"); if(!f) return(false); SaveToFile(f,ind); fclose(f); ind->Position=0; return(true); } TPositionTree *TPositionTree::LoadPositionFrom(FILE *f){ char str[600]; fgets(str,600,f); if(AnsiString(str).Trim().AnsiCompare("!endnext!")==0 ||AnsiString(str).Trim().AnsiCompare("!enddown!")==0) return(NULL); TPositionTree *Node=new TPositionTree(); TStringList *SL=new TStringList(); SL->CommaText=AnsiString(str); for(int i=0;i<FlowNum;i++) Node->OutPres[i]=SL->Strings[i]; Node->Code=SL->Strings[FlowNum].ToInt(); Node->IsGroup=SL->Strings[FlowNum+1].ToInt(); Node->Depth=SL->Strings[FlowNum+2].ToInt(); delete SL; /* Node->OutPres[0]=AnsiString(str).Trim(); fgets(str,600,f); Node->Code=AnsiString(str).Trim().ToInt(); fgets(str,600,f); Node->IsGroup=AnsiString(str).Trim().ToInt(); fgets(str,600,f); Node->Depth=AnsiString(str).Trim().ToInt(); */ Node->IP.LoadFrom(f); return(Node); } void TPositionTree::LoadFromFile(FILE *f,TProgressBar *ind){ if(ind) ind->Position=ind->Position+1; TPositionTree *Result=NULL; if((Result=LoadPositionFrom(f))!=NULL){ AddChild(Result); Result->LoadFromFile(f,ind); } if((Result=LoadPositionFrom(f))!=NULL){ Add(Result); Result->LoadFromFile(f,ind); } } TPositionTree *Load(AnsiString FileName,TProgressBar *ind){ FILE *f; f=fopen(FileName.c_str(),"r"); if(!f) return(NULL); TPositionTree *Root=new TPositionTree(); Root->OutPres[0]=ChangeFileExt(ExtractFileName(FileName),AnsiString()); Root->IsGroup=true; Root->Depth=0; Root->LoadFromFile(f,ind); fclose(f); ind->Position=0; return(Root); } TPositionTree *ImportFromFile(AnsiString FileName){ FILE *f; f=fopen(FileName.c_str(),"r"); if(f==NULL) return(NULL); TPositionTree *Drive=new TPositionTree(); TPositionTree *Root; Drive->Code=0; if(Next) if((Result=Next->TreeWalk(ActionIndex,Data))!=NULL) return(Result); return(NULL); } AnsiString TPositionTree::OP(){ AnsiString Returned=AnsiString(); for(int i=0;i<IP.FlowCount;i++){ Returned=Returned+OutPres[i]; } return(Returned); } //-------------------------------------------------------------------------- - #ifndef NodeH #define NodeH //-------------------------------------------------------------------------- - #endif class Node {public: Node *Rgt; Node *Lft; char Letter; long int Statistics; Node(); ~Node(); Node *JumpRight(char FindLet); Node *RightPaste(char NewLet); Node *LeftPaste(char NewLet); Node *JumpLeft(char FindLet); Node *AddWord(AnsiString Word); Node *AddWordToEmptyTree(AnsiString Word); void GetWords(TStrings *List,AnsiString Word=AnsiString()); }; #include <vcl.h> #pragma hdrstop #include "Node.h" //-------------------------------------------------------------------------- - #pragma package(smart_init) //------------------------------- //Êîíñòðóêòîð Node::Node() { Rgt=NULL; Lft=NULL; Letter='@'; Statistics=0; } //------------------------------------ Node::~Node() {if (Rgt!=NULL) Rgt->~Node(); if (Lft!=NULL) Lft->~Node(); } //------------------------------------- //Ñîçäàòü óçåë ñïðàâà è âåðíóòü íà íåãî ññûëêó Node *Node::RightPaste(char NewLet) {Node *N=new Node; N->Letter=NewLet; N->Rgt=this->Rgt; this->Rgt=N; return(N); } //------------------------------------- //Ñîçäàòü óçåë ñëåâà è âåðíóòü íà íåãî ññûëêó Node *Node::LeftPaste(char NewLet) {Node *N=new Node; N->Letter=NewLet; N->Rgt=this->Lft; this->Lft=N; return(N); } //------------------------------------- //Äâèãàÿñü âïðàâî íàéòè áóêâó è âåðíóòü íà íå¸ ññûëêó Node *Node::JumpRight(char FindLet) {Node *N; N=this; while(N->Rgt!=NULL) {if(N->Rgt->Letter<FindLet) N=N->Rgt; else if(N->Rgt->Letter>FindLet)return(N->RightPaste(FindLet));// ñîçäàòü áóêâó è //âåðíóòü íà íå¸ ññûëêó else return(N->Rgt);}; //ñîçäàòü áóêâó è âåðíóòü íà íå¸ ññûëêó return(N->RightPaste(FindLet)); } //------------------------------------- //Äâèãàÿñü âëåâî íàéòè áóêâó è âåðíóòü íà íå¸ ññûëêó Node *Node::JumpLeft(char FindLet) { if (this->Lft==NULL) return(this->LeftPaste(FindLet)); if (this->Lft->Letter>FindLet) return(this->LeftPaste(FindLet)); else return(this->Lft); } //---------------- //Çàïîëíÿåì ïóñòîå ïîääåðåâî Node *Node::AddWordToEmptyTree(AnsiString Word) {char CurrentLet; Node *N; N=this; while(!Word.IsEmpty()){CurrentLet=*Word.SubString(1,1).c_str(); Word=Word.SubString(2,Word.Length()); N=N->JumpLeft(CurrentLet); }; N->Statistics++; return(N); } //---------------- //Äîáàâèòü ñëîâî â äåðåâî Node *Node::AddWord(AnsiString Word) {char CurrentLet; Node *Drive; if (this->Lft==NULL){ return(AddWordToEmptyTree(Word));}; Drive=this; while(!Word.IsEmpty()){ do {CurrentLet=*Word.SubString(1,1).c_str(); Word=Word.SubString(2,Word.Length()); Drive=Drive->JumpLeft(CurrentLet);} while(Drive->Letter==CurrentLet&&!Word.IsEmpty()); if (Drive->Letter!=CurrentLet) Drive=Drive- >JumpRight(CurrentLet); } Drive->Statistics++; return(Drive); } //--------------------------------------- void Node::GetWords(TStrings *List,AnsiString Word) {Node *N; N=this; if (N->Statistics>0) List->Add(Word+AnsiString(N->Letter)); if (N->Lft!=NULL) N->Lft->GetWords(List,Word+AnsiString(N->Letter)); if (N->Rgt!=NULL) N->Rgt->GetWords(List,Word); } //-------------------------------------------------------------------------- - #ifndef CompareH #define CompareH //-------------------------------------------------------------------------- - #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> #include <Grids.hpp> #include <Dialogs.hpp> #include "PositionTree.h" #include <ComCtrls.hpp> //-------------------------------------------------------------------------- - const int MUPNum=3; const int MaxID=5; class TfCompare : public TForm { __published: // IDE-managed Components TPanel *Panel1; TPanel *Panel2; TPanel *Panel3; TPanel *Panel4; TStringGrid *sg; TButton *Button2; TOpenDialog *od; TButton *Button3; TButton *Button4; TProgressBar *ProgressBar1; TEdit *Edit1; int MaxMov=(min(d1,d2)*X)/100; int MinSumIm=MaxMov; int MinPay=MaxPayLet/(MaxMov+1); int Oc[N]; for(int i=MaxMov;i>=0;i--) Oc[i]=MinPay*(MaxMov+1-i); Oc[0]=MaxPayLet; AnsiString abc=AnsiString(); for(int i=1;i<=d1;i++) if(E2.Pos(E1[i])!=0&&abc.Pos(E1[i])==0) abc+=E1[i]; da=abc.Length(); if(da<MaxMov) return(0); int A[N]; for (int i=1;i<=d1;i++) M1[i-1][abc.Pos(E1[i])]=1; for (int i=1;i<=d2;i++) M2[i-1][abc.Pos(E2[i])]=1; for(int sd=-MaxMov;sd<=MaxMov;sd++){ for(int j=1;j<=da;j++) for(int i=max(0,sd);i<min(N,N+sd);i++) if (M1[i][j]!=0&&M2[i-sd][j]!=0) { if(sd>=0) Mc1 [sd][i]++; if(sd<0) Mc2[-sd][i-sd]++; } } int Mac[N];int Sz1,Sz2; for(int i=0;i<=MaxMov;i++) {Mac[i]=0;Sz1=0;Sz2=0; for(int j=0;j<N;j++) {if(Mc1[i][j]!=0) Sz1++; else {Mac[i]+=(Sz1*(Sz1>=MinIm));Sz1=0;} if(Mc2[i][j]!=0) Sz2++; else {Mac[i]+=(Sz2*(Sz2>=MinIm));Sz2=0;} } } int Res=0; for(int i=0;i<=MaxMov;i++) Res=Res+Mac[i]; if(Res<MinSumIm) return(0); Res=0; for(int i=0;i<=MaxMov;i++) Res=Res+Mac[i]*Oc[i]; return(Res); } bool TfCompare::IsQuantity(AnsiString Word) {AnsiString Numbers=AnsiString("0527413689"); for(int i=1;i<=Word.Length();i++) if(Numbers.Pos(Word[i])!=0) return(true); return(false); } int TfCompare::IsWordInString(AnsiString Word,AnsiString Str,int MaxPayLet) { int Sum=0; int SpaceInd=0; int BestSum=0; AnsiString Pie; while(!Str.IsEmpty()){ Str.TrimLeft(); SpaceInd=Str.Pos(' '); if(SpaceInd!=0){ Pie=Str.SubString(1,Str.Pos(' ')); Str.Delete(1,SpaceInd); }else{ Pie=Str.Trim(); Str=AnsiString(); } if(Pie.Trim().IsEmpty()) continue; Sum=CheckSum(Word,Pie,MaxPayLet); if(Sum>BestSum) BestSum=Sum; } return(BestSum); } int TfCompare::String1Compare(AnsiString Str1,AnsiString Str2) { AnsiString Pie; int SpaceInd=0; int Sum=0; Str1.Trim(); Str2.Trim(); int Len1=Str1.Length(); int Len2=Str2.Length(); int Base=min(Len1,Len2); int MaxPayLet=1000/Base; while(!Str1.IsEmpty()){ Str1.TrimLeft(); SpaceInd=Str1.Pos(' '); if(SpaceInd!=0){ Pie=Str1.SubString(1,Str1.Pos(' ')); Str1.Delete(1,SpaceInd); }else{ Pie=Str1.Trim(); Str1=AnsiString(); } if(Pie.Trim().IsEmpty()) continue; Sum=Sum+IsWordInString(Pie,Str2,MaxPayLet); } return(Sum); } int FileSize(AnsiString FileName){ if(!FileExists(ChangeFileExt(FileName,".hdr"))) return(0); TStringList * Y=new TStringList(); Y->LoadFromFile(ChangeFileExt(FileName,".hdr")); Y->CommaText=Y->Strings[0]; int R=Y->Strings[1].ToInt(); delete Y; return(R); } void TfCompare::ToLists(){ ProgressBar1->Max=FileSize(DocF); if(!Base||!Doc) return; BaseL->Clear(); DocL->Clear(); Base->TreeWalk(aToList,BaseL); Doc->TreeWalk(aToList,DocL); for(int i=0;i<DocL->Count;i++){ ProgressBar1->Position++; sg->Cells[0][sg->RowCount-1]=((TPositionTree *)DocL->Items[i])->OP (); sg->RowCount++; } ProgressBar1->Position=0; } void __fastcall TfCompare::Button3Click(TObject *Sender) { ToLists(); } //-------------------------------------------------------------------------- - void __fastcall TfCompare::FormCreate(TObject *Sender) { BaseL =new TList(); DocL = new TList(); } //-------------------------------------------------------------------------- - void __fastcall TfCompare::FormDestroy(TObject *Sender) { delete DocL,BaseL,Doc,Base; } //-------------------------------------------------------------------------- - bool TfCompare::GetInfo(){ for(int i=0;i<FlowNum;i++) for(int j=0;j<FlowNum;j++){ B[i][j]=-1; D[i][j]=-1; Unind[i][j]=-1; FromBaseToDoc[i][0]=-1; FromBaseToDoc[i][1]=-1; for(int k=0;k<MaxID;k++) United[i][j][k]=-1; if(i<3){ Ids[i][j]=-1; MUs[i][j]=AnsiString(); } } if(!FileExists(ChangeFileExt(BaseF,".hdr"))) return(false); if(!FileExists(ChangeFileExt(DocF,".hdr"))) return(false); if(!FileExists("InternalSigns.lst")) return(false); if(!FileExists("MeterUnits.lst")) return(false); TStringList *X=new TStringList(); TStringList *Y=new TStringList(); //Íàñòðîéêè delete DMU,BMU; } return(true); } //-------------------------------------------------------------------- int TfCompare::StringCompare(int f1,int f2,TPositions Fst,TPositions Snd){ AnsiString ABC; for(int i=1;i<=Fst.ABC[f1].Length();i++) if(Snd.ABC[f2].Pos(Fst.ABC[f1][i])&&!ABC.Pos(Fst.ABC[f1][i])) ABC+=Fst.ABC[f1][i]; int minLengthABC=min(Fst.ABC[f1].Length(),Snd.ABC[f2].Length()); if(!minLengthABC) return(0); int rABC=ABC.Length()*2; if(rABC<minLengthABC) return(0); int minLength=min(Fst.Sentence(f1).Length(),Snd.Sentence(f2).Length()); int MaxLPayMent=(1000/(minLength)); int AccumPayMent=0; int MaxCurPayMent; int CurPayMent; for(int i=0;i<Fst.WC[f1];i++){ MaxCurPayMent=0; for(int j=0;j<Snd.WC[f2];j++){ CurPayMent=CheckSum(Fst.Words[i][f1],Snd.Words[j] [f2],MaxLPayMent); if(CurPayMent>MaxCurPayMent) MaxCurPayMent=CurPayMent; } AccumPayMent+=MaxCurPayMent; } return(AccumPayMent); } int TfCompare::AnalizeUnitWithMU(AnsiString Unit,int MUIndex,int&Multiplier) { /* if(Unit.IsEmpty()) if(MUIndex==FlowNum) return(2); else return(0);*/ int CP; int MP=0; int MI=0; int MaxPay=1; int UnitLength=Unit.Length(); for(int i=1;i<4/*2*MUPNum+2*/;i+=2){ if(Unit.AnsiCompare(FMU[MUIndex][i][0])==0) CP=MaxPay*UnitLength; else CP=CheckSum(Unit,FMU[MUIndex][i][0],MaxPay); if(CP>MP){ MP=CP; MI=i; } if(CP==MaxPay*UnitLength) break; } Multiplier=pow(10,(FMU[MUIndex][MI][1].ToInt())); return(MP); } int TfCompare::AnalizePosWithMU(TPositions Fst,int Flow,int MUindex,int &PosIndex,int &Multiplier){ int MP=0; int CP; int CurMultiplier=0; for(int i=0;i<Fst.NC[Flow];i++){ CP=AnalizeUnitWithMU(Fst.StrNumbers[i][Flow],MUindex,CurMultiplier); if(CP>MP){ Multiplier=CurMultiplier; MP=CP; PosIndex=i; } } return(MP); } int TfCompare::NumberCompare(int f1,int f2,TPositions Fst,TPositions Snd){ if(!Unind[f1][f2]) return(0); int AccumPay=0; int FMpr; int SMpr; int FI,SI; double E1,E2,E; // bool MatrixOfUse[MaxID][2]; for(int i=0;i<Unind[f1][f2];i++){ FI=-1;SI=-1; if(AnalizePosWithMU(Fst,f1,United[f1][f2][i],FI,FMpr)) if(AnalizePosWithMU(Snd,f2,United[f1][f2][i],SI,SMpr)){ E1=(Fst.Numbers[FI][f1]*FMpr); E2=(Snd.Numbers[SI][f2]*SMpr); E=fabs(E1-E2)/E1; if (E<0.011){ AccumPay+=1; } else return(-1); } } return(AccumPay); } int TfCompare::PositionsCompare(TPositions Fst,TPositions Snd,int &Numbers){ int Accum=0; int N=0; for(int f=0;f<max(Fst.FlowCount,Snd.FlowCount);f++){ if(FromBaseToDoc[f][1]!=-1){ N=NumberCompare(f,FromBaseToDoc[f][1],Fst,Snd); if(N==-1) return(0); Numbers+=N; } if(FromBaseToDoc[f][0]!=-1) Accum+=StringCompare(f,FromBaseToDoc[f][0],Fst,Snd); } return(Accum); } bool TfCompare::Compare(){ if(!GetInfo()) return(false); nFind(0); return(true); } void TfCompare::nFind(int Index){ ProgressBar1->Max=FileSize(BaseF); TPositionTree *BaseNode,*BaseDriveNode,*DocNode; BaseNode=NULL; int PayMent=-1; int CurPayMent; int Num=0; int AcNumbers; DocNode=((TPositionTree *)DocL->Items[Index]); for(int i=0;i<BaseL->Count;i++){ Num=0; ProgressBar1->Position++; BaseDriveNode=((TPositionTree *)BaseL->Items[i]); CurPayMent=PositionsCompare(DocNode->IP,BaseDriveNode->IP,Num); if(CurPayMent<Edit1->Text.ToInt()) continue; if(Num<AcNumbers) continue; if(CurPayMent>PayMent){ PayMent=CurPayMent; BaseNode=BaseDriveNode; AcNumbers=Num; } } /* TRect x,y;*/ if(BaseNode!=NULL) sg->Cells[1][Index]=BaseNode->OP()+AnsiString(" ")+ IntToStr(PayMent)+AnsiString(" ")+IntToStr(AcNumbers); else sg->Cells[1][Index]="---------"; /* double delitel=2000/PayMent; sg->Canvas->Brush->Color=(clBlue-clRed)/delitel+clRed; y=sg->CellRect(1,Index); sg->Canvas->FillRect(y); //sg->Canvas->Lock(); */ ProgressBar1->Position=0; } void __fastcall TfCompare::Button4Click(TObject *Sender) { GetInfo(); }
Docsity logo