Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Курсовой проект2 / Coursework_CBuilder6 / Main
.cpp#include <vcl.h>
#include <stdio.h>
#include <math.h>
#pragma hdrstop
#include "Main.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
String input_line[256];
String stack[256];
String terminal[32];
String rules[32];
String input_rules[256];
int index_rule;
int **mega_matrix;
int all_rules=0;
int comment=0;
int node_count = 0;
int root_index = 0;
class TfrmMain::Identificator{
private:
int iHash;
public:
char *Name;
int Right;
int Left;
int HashERROR;
Identificator (){
Name = new char[32];
Right=0;
Left=0;
iHash=0;
HashERROR=0;
strcpy(Name,"");
}
int GetCollisionCount(){
return iHash-1;
}
int Hash(int N){
iHash++;
int t =((Name[0]|Name[strlen(Name)-1])+iHash);
t = fmod(t,N);
return t;
}
};
void TfrmMain::AddToTree(int IDindex,Identificator *IDTable){
if (node_count==0){
root_index = IDindex;
node_count++;
}else{
int fl=0;
int current_node = root_index;
do{
if (strcmp(IDTable[current_node].Name,IDTable[IDindex].Name)<0){
if(IDTable[current_node].Right!=0){
current_node = IDTable[current_node].Right;
}else{
IDTable[current_node].Right=IDindex;
node_count++;
fl=1;
}
}
if (strcmp(IDTable[current_node].Name,IDTable[IDindex].Name)>0){
if(IDTable[current_node].Left!=0){
current_node = IDTable[current_node].Left;
}else{
IDTable[current_node].Left=IDindex;
node_count++;
fl=1;
}
}
if (strcmp(IDTable[current_node].Name,IDTable[IDindex].Name)==0){
fl = 1;
}
}while(!fl);
}
}
void TfrmMain::ShowTree(Identificator *Table, int Length, TStringGrid *sgGrid){
sgGrid->Rows[0]->Add("№");
sgGrid->Rows[0]->Add("идентификатор");
sgGrid->Rows[0]->Add("Right");
sgGrid->Rows[0]->Add("Left");
int j = 0;
for (int i=0;i<=Length;i++)
if (strlen(Table[i].Name)>0){
j++;
sgGrid->RowCount++;
sgGrid->Rows[j]->Add(i);
sgGrid->Rows[j]->Add(Table[i].Name);
sgGrid->Rows[j]->Add(IntToStr(Table[i].Right));
sgGrid->Rows[j]->Add(IntToStr(Table[i].Left));
}
}
int TfrmMain:: A(char ch){
if(ch=='r') return 2;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: B(char ch){
if(ch=='o') return 3;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: C(char ch){
if(ch=='g') return 4;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: D(char ch){
if(ch=='\0') return 999;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: E(char ch){
if(ch=='n') return 6;
if(ch=='l') return 11;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: H(char ch){
if(ch=='d') return 7;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: G(char ch){
if(ch=='.') return 8;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: K(char ch){
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: L(char ch){
if(ch=='=') return 10;
else return 666;
}
int TfrmMain:: M(char ch){
if(ch=='\0') return 999;
else return 666;
}
int TfrmMain:: R(char ch){
if(ch=='s') return 23;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: N(char ch){
if(ch=='f') return 13;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: O(char ch){
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: P(char ch){
if(ch=='h') return 15;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: I(char ch){
if(ch=='e') return 16;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: J(char ch){
if(ch=='n') return 17;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: Q(char ch){
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: V(char ch){
if(ch=='e') return 19;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: W(char ch){
if(ch=='g') return 20;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: X(char ch){
if(ch=='i') return 21;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: Y(char ch){
if(ch=='n') return 22;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: Z(char ch){
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: T(char ch){
if(ch=='e') return 24;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: U(char ch){
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: F(char ch){
if(ch=='\0') return 999;
else return 666;
}
int TfrmMain:: AA(char ch){
if(ch=='\0') return 999;
else return 666;
}
int TfrmMain:: AM(char ch){
if(ch=='\0') return 999;
else return 666;
}
int TfrmMain:: AB(char ch){
if(ch=='n') return 29;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AC(char ch){
if(ch=='d') return 30;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AD(char ch){
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AG(char ch){
if(ch=='r') return 32;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AF(char ch){
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AH(char ch){
if(ch=='o') return 34;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AI(char ch){
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AE(char ch){
if(ch=='o') return 36;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AK(char ch){
if(ch=='t') return 37;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AL(char ch){
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AJ(char ch){
if(ch=='h') return 39;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AN(char ch){
if(ch=='i') return 40;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AO(char ch){
if(ch=='l') return 41;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AP(char ch){
if(ch=='e') return 42;
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AQ(char ch){
if(ch=='\0') return 999;
else return 777;
}
int TfrmMain:: AR(char ch){
comment=1;
if(ch=='/') return 45;
else return 666;
}
int TfrmMain:: AT(char ch){
comment = 0;
return 999;
}
int TfrmMain:: FF(char ch){
if(ch=='+') return 26;
if(ch=='\0') return 999;
else return 666;
}
int TfrmMain:: AW(char ch){
if((ch=='0')||(ch=='1')) return 48;
if(ch=='\0') return 999;
else return 666;
}
int TfrmMain::h(char ch){
if(ch=='p') return 1;
if(ch=='e') return 5;
if(ch==':') return 9;
if(ch=='i') return 12;
if(ch=='t') return 14;
if(ch=='b') return 18;
if(ch=='a') return 28;
if(ch=='o') return 31;
if(ch=='('||ch==')') return 27;
if(ch=='+') return 50;
if(ch=='<'||ch=='>'||ch=='='||ch=='-') return 25;
if(ch=='d') return 33;
if(ch=='n') return 35;
if(ch=='/') return 43;
if(ch==';') return 51;
if(ch=='w') return 38;
if((ch=='0')||(ch=='1')) return 48;
if((ch>='2')&&(ch<='9')) return 666;
else return 777;
}
int TfrmMain:: IDF(char ch){
if((ch>='0')&&(ch<='9')) return 777;
if((ch>='a')&&(ch<='z')) return 777;
if(ch=='\0') return 999;
else return 666;
}
int TfrmMain:: RR(char ch){
if(ch=='\0') return 999;
else return 666;
}
String TfrmMain::GetState(int st){
String res;
switch(st) {
case 0: res = "h"; break;
case 1: res = "A"; break;
case 2: res = "B"; break;
case 3: res = "C"; break;
case 4: res = "D"; break;
case 5: res = "E"; break;
case 6: res = "H"; break;
case 7: res = "G"; break;
case 8: res = "K"; break;
case 9: res = "L"; break;
case 10: res = "M"; break;
case 11: res = "R"; break;
case 12: res = "N"; break;
case 13: res = "O"; break;
case 14: res = "P"; break;
case 15: res = "I"; break;
case 16: res = "J"; break;
case 17: res = "Q"; break;
case 18: res = "V"; break;
case 19: res = "W"; break;
case 20: res = "X"; break;
case 21: res = "Y"; break;
case 22: res = "Z"; break;
case 23: res = "T"; break;
case 24: res = "U"; break;
case 25: res = "F"; break;
case 26: res = "AA"; break;
case 27: res = "AM"; break;
case 28: res = "AB"; break;
case 29: res = "AC"; break;
case 30: res = "AD"; break;
case 31: res = "AG"; break;
case 32: res = "AF"; break;
case 33: res = "AH"; break;
case 34: res = "AI"; break;
case 35: res = "AE"; break;
case 36: res = "AK"; break;
case 37: res = "AL"; break;
case 38: res = "AJ"; break;
case 39: res = "AN"; break;
case 40: res = "AO"; break;
case 41: res = "AP"; break;
case 42: res = "AQ"; break;
case 43: res = "AR"; break;
case 45: res = "AT"; break;
case 46: res = "AU"; break;
case 47: res = "AV"; break;
case 48: res = "AW"; break;
case 49: res = "AX"; break;
case 50: res = "FF"; break;
case 51: res = "RR"; break;
case 777: res = "IDF"; break;
case 666 :res="Err"; break;
case 999 :res="S"; break;
}
return res;
}
__fastcall TfrmMain::TfrmMain(TComponent* Owner): TForm(Owner){
sgrTable->Rows[0]->Add("Лексема");
sgrTable->Rows[0]->Add("Тип лексемы");
sgrTable->Rows[0]->Add("Лексема");
index_rule = 0;
}
void TfrmMain::AddTerminal(String filename){
FILE *input;
char *temp;
temp = new char[32];
input = fopen(filename.c_str(),"r");
int i=0;
while (strcmp(temp,"over")) {
fscanf(input,"%s",temp);
terminal[i]=temp;
i++;
}
terminal[i]="#";
for(int j=0;j<i;j++){
sgMatrix->Cols[j+1]->Add(terminal[j]);
if(terminal[j]=="over") sgMatrix->Rows[j+1]->Add("bgn");
else sgMatrix->Rows[j+1]->Add(terminal[j]);
}
sgMatrix->ColCount = i+1;
sgMatrix->RowCount = i+1;
AddMatrix(input,i);
fclose(input);
}
void TfrmMain::AddMatrix(FILE *input,int n){
int i=0;
char *temp;
temp = new char [32];
mega_matrix = new int *[n];
for (int i = 0; i < n; i++)
mega_matrix[i] =new int[n];
while(!feof(input)){
fscanf(input,"%s",temp);
for(int j=0;j<n;j++) {
fscanf(input,"%s",temp);
if(temp[0]=='<') mega_matrix[i][j] = 1;
if(temp[0]=='>') mega_matrix[i][j] = 2;
if(temp[0]=='=') mega_matrix[i][j] = 0;
if(temp[0]=='-') mega_matrix[i][j] = -1;
sgMatrix->Cells[j+1][i+1] = temp;
}
i++;
}
}
int TfrmMain:: index_terminal(String trm){
int count=0;
if(trm=="bgn") trm = "over";
while(terminal[count]!="#"){
if(trm==terminal[count]) return count;
count++;
}
return -1;
}
int TfrmMain::first_terminal(int count){
for(int i=count;i!=0;i--){
if(index_terminal(stack[i])!=-1) return i;
}
}
int TfrmMain::cmp_substr(String sub1, String sub2){
if(index_terminal(sub1)>=0&&index_terminal(sub2)>=0)
return mega_matrix[index_terminal(sub1)][index_terminal(sub2)];
else return -1;
}
void TfrmMain::sdvig(int count_s,int count_l){
stack[count_s+1]=input_line[count_l];
}
int TfrmMain::AddRules(){
char *temp = new char [32];
FILE *input = fopen("Rules.txt","r");
int i=0;
while(!feof(input)){
fgets(temp,256, input);
rules[i] = String(temp);
rules[i].SetLength(rules[i].Length()-1);
while(rules[i].Pos(" ")) {rules[i].Delete(rules[i].Pos(" "),1);}
i++;
}
return i;
}
int TfrmMain::cmp_rules(String rls,int n){
for(int i=0;i<n;i++){
if(rls==rules[i]) return i;
}
return -1;
}
int TfrmMain::package(int count_st,int n){
String trm,tV,Vt,VVt,V;
int ftrm = first_terminal(count_st);
trm = stack[ftrm];
tV = trm + stack[ftrm+1];
Vt = stack[ftrm-1] + trm;
V = stack[ftrm-1] + trm + stack[ftrm+1];
VVt = stack[ftrm-2]+ stack[ftrm-1]+trm;
if(cmp_rules(trm,n)>=0){
int rez = cmp_rules(trm,n);
stack[ftrm]="S";
input_rules[index_rule]=IntToStr(rez);
index_rule++;
return 0;
}
if(cmp_rules(V,n)>=0){
int rez = cmp_rules(V,n);
String right_empty = stack[ftrm+1];
stack[ftrm-1]="S";
stack[ftrm]="";
stack[ftrm+1]="";
input_rules[index_rule]=IntToStr(rez);
index_rule++;
if(right_empty=="") return 1; else return 2;
}
if(cmp_rules(Vt,n)>=0){
int rez = cmp_rules(Vt,n);
stack[ftrm-1]="S";
stack[ftrm]="";
input_rules[index_rule]=IntToStr(rez);
index_rule++;
return 1;
}
if(cmp_rules(tV,n)>=0){
int rez = cmp_rules(tV,n);
stack[ftrm]="S";
stack[ftrm+1]="";
input_rules[index_rule]=IntToStr(rez);
index_rule++;
return 1;
}
if(cmp_rules(VVt,n)>=0){
int rez = cmp_rules(VVt,n);
stack[ftrm-2]="S";
stack[ftrm-1]="";
stack[ftrm]="";
input_rules[index_rule]=IntToStr(rez);
index_rule++;
return 2;
}
return -1;
}
String TfrmMain::Conclude(String X,char *temp,int i){
if(X=="AM"){
input_line[i]=AnsiString(temp);
return("Круглая скобка");
}
if(X=="RR"){
input_line[i]=AnsiString(temp);
return("Разделительный символ");
}
if(X=="AX"){
input_line[i]="g";
return("Константа");
}
if(X=="F" || X=="FF" || X=="AA"){
input_line[i]=AnsiString(temp);
return("Знак операции");
}
if(X=="AD" || X=="AL" || X=="AF"){
input_line[i]=AnsiString(temp);
return("Логическая операция");
}
if(X=="G" || X=="M" || X=="O" || X=="Q"|| X=="U"|| X=="Z"||X=="AI"||X=="AQ"){
input_line[i]=AnsiString(temp);
return("Оператор");
}
if(X=="AT"||X=="AR"){
input_line[i]="comment";
return("Комментарий");
}
if(X=="D" || X=="K"){
input_line[i]=AnsiString(temp);
return("Слово начала/конца программы");
}
if(X=="AW"){
input_line[i]="g";
return("Число");
}
if(X=="Err") return("Ошибка");
else{
input_line[i]="c";
return("Идентификатор");
}
}
String TfrmMain::Analiz(char *wInput,FILE *inp){
int i = 0;
int State=0;
String Way="h";
String last="";
do {
switch (State) {
case 0: State = h(wInput[i]); break;
case 1: State = A(wInput[i]); break;
case 2: State = B(wInput[i]); break;
case 3: State = C(wInput[i]); break;
case 4: State = D(wInput[i]); break;
case 5: State = E(wInput[i]); break;
case 6: State = H(wInput[i]); break;
case 7: State = G(wInput[i]); break;
case 8: State = K(wInput[i]); break;
case 9: State = L(wInput[i]); break;
case 10: State = M(wInput[i]); break;
case 11: State = R(wInput[i]); break;
case 12: State = N(wInput[i]); break;
case 13: State = O(wInput[i]); break;
case 14: State = P(wInput[i]); break;
case 15: State = I(wInput[i]); break;
case 16: State = J(wInput[i]); break;
case 17: State = Q(wInput[i]); break;
case 18: State = V(wInput[i]); break;
case 19: State = W(wInput[i]); break;
case 20: State = X(wInput[i]); break;
case 21: State = Y(wInput[i]); break;
case 22: State = Z(wInput[i]); break;
case 23: State = T(wInput[i]); break;
case 24: State = U(wInput[i]); break;
case 25: State = F(wInput[i]); break;
case 26: State = AA(wInput[i]); break;
case 27: State = AM(wInput[i]); break;
case 28: State = AB(wInput[i]); break;
case 29: State = AC(wInput[i]); break;
case 30: State = AD(wInput[i]); break;
case 31: State = AG(wInput[i]); break;
case 32: State = AF(wInput[i]); break;
case 33: State = AH(wInput[i]); break;
case 34: State = AI(wInput[i]); break;
case 35: State = AE(wInput[i]); break;
case 36: State = AK(wInput[i]); break;
case 37: State = AL(wInput[i]); break;
case 38: State = AJ(wInput[i]); break;
case 39: State = AN(wInput[i]); break;
case 40: State = AO(wInput[i]); break;
case 41: State = AP(wInput[i]); break;
case 42: State = AQ(wInput[i]); break;
case 43: State = AR(wInput[i]); break;
case 45: State = AT(wInput[i]); break;
case 48: State = AW(wInput[i]); break;
case 51: State = RR(wInput[i]); break;
case 777: State = IDF(wInput[i]); break;
case 999: State = IDF(wInput[i]); break;
case 666 : break;
}
Way=Way +"-"+GetState(State);
if(GetState(State)!="S") last = GetState(State);
if(last == "AT"){
String cmt;
fgets(cmt.c_str(),256,inp);
break;
}
}while (wInput[i++]!='\0');
return last;
}
int TfrmMain::Exists(Identificator *Idents, int IdentsLength, Identificator Lexem){
int t = 0;
for (int i=0;i<=IdentsLength;i++){
if (strcmp(Idents[i].Name,Lexem.Name)==0)
t = 1;
}
return t;
}
void __fastcall TfrmMain::Button1Click(TObject *Sender){
int i=1;
char *temp;
temp = new char[32];
Lexems = new Identificator[256];
Identificator *Idents;
Idents = new Identificator[256];
FILE *inFile;
inFile=fopen("input.txt","r");
int j=0;
while (!feof(inFile)){
fscanf(inFile, "%s", temp);
strcpy(Lexems[i].Name,temp);
String last = Analiz(temp,inFile);
sgrTable->Rows[i]->Add(temp);
sgrTable->Rows[i]->Add(Conclude(last,temp,i-1));
sgrTable->Rows[i]->Add(input_line[i-1]);
if ((input_line[i-1]=="c")&&(!Exists(Idents,255,Lexems[i]))){
strcpy(Idents[j].Name,Lexems[i].Name);
AddToTree(j,Idents);
j++;
}
i++;
input_line[i-1]="over";
sgrTable->RowCount = i;
}
ShowTree (Idents, i, sgBinTreeView);
fclose(inFile);
String Way;
mSource->Lines->LoadFromFile("input.txt");
mSource2->Lines->LoadFromFile("input.txt");
mRules->Lines->LoadFromFile("Rules.txt");
AddTerminal("hyper_matrix.txt");
all_rules = AddRules();
int count_stack;
stack[0] = "bgn";
Button3->Enabled = true;
}
void __fastcall TfrmMain::btnSearchClick(TObject *Sender){
cmp_count_tree=0;
cmp_count_rehash=0;
mResReHash->Clear();
mResTree->Clear();
int temp=SearchId(edSearch->Text.c_str(),TreeIdentTable);
if(temp>0){
mResTree->Lines->Add("Идентификатор найден:");
mResTree->Lines->Add("адрес в таблице символов ");
mResTree->Text=mResTree->Text+ IntToStr(temp);
mResTree->Lines->Add("Количество сравнений:");
mResTree->Text=mResTree->Text+ IntToStr(cmp_count_tree);
}
else mResTree->Lines->Add("Идентификатор не найден");
int id = HashIdSearch(HashIdentTable,HashTable, HashTableLen, edSearch->Text);
if(id>0){
mResReHash->Lines->Add("Идентификатор найден:");
mResReHash->Lines->Add("адрес в таблице символов ");
mResReHash->Text=mResReHash->Text + IntToStr(id);
mResReHash->Lines->Add("Количество сравнений:");
mResReHash->Text=mResReHash->Text+ IntToStr(cmp_count_rehash-1);
}
else mResReHash->Lines->Add("Идентификатор не найден");
}
void __fastcall TfrmMain::Button3Click(TObject *Sender){
int stack_index = 0;
int lines_index = 0;
stack[0]="bgn";
String temp;
int cmp_rez;
int left;
int fl = 0;
while(1){
if(input_line[lines_index]!="comment"){
if((input_line[lines_index]=="over") && (stack[1]=="S") && (stack[2]=="")) break;
cmp_rez = cmp_substr(stack[first_terminal(stack_index)],input_line[lines_index]);
if(cmp_rez==1 || cmp_rez==0){
sdvig(stack_index,lines_index);
lines_index++;
stack_index++;
}
if(cmp_rez==2){
left = package(stack_index,all_rules);
if(left == -1) {fl=1; break; }
else stack_index= stack_index - left;
}
if(cmp_rez==-1) {fl=1; break;}
}else
lines_index++;
}
if (fl==1){
Edit1->Text= "Неправильная конструкция";
} // далее можно поставить нужный разделительный символ (сейчас пробел " ")
else for(int k = 0; k< index_rule; k++) temp += IntToStr(StrToInt(input_rules[k])+1) + " ";
Edit1->Text=temp;
Button4->Enabled = true;
}
void TfrmMain::AddChild(String child,int ind_item){
int lenght = child.Length();
char *rezult_child;
String temp_string="";
rezult_child = new char [lenght];
TTreeNode *Node1;
Node1 = tree->Items->Item[ind_item];
strcpy(rezult_child,child.c_str());
for(int i=0;i<lenght;i++){
temp_string = temp_string + rezult_child[i];
if(temp_string=="S"){
tree->Items->AddChild(Node1,temp_string);
temp_string="";
}
if(rezult_child[i+1]!='.')
if(index_terminal(temp_string)>=0){
tree->Items->AddChild(Node1,temp_string);
temp_string="";
}
}
}
void __fastcall TfrmMain::Button4Click(TObject *Sender){
TTreeNode *Node1;
tree->Items->Clear();
tree->Items->Add(NULL, "S");
Node1 = tree->Items->Item[0];
for(int j = index_rule; j>0 ;j--){
int n = tree->Items->Count;
for (int i=n-1;i>=0 ;i--){
if(tree->Items->Item[i]->HasChildren == false)
if(tree->Items->Item[i]->Text =="S"){
AddChild(rules[StrToInt(input_rules[j-1])],i);
break;
}
}
}
}
int TfrmMain::SearchId(char *ID,Identificator *IDTable){
// int fl=0;
int current_node = root_index;
do{
cmp_count_tree++;
if(strcmp(IDTable[current_node].Name,ID)==0) return(current_node);
if(IDTable[current_node].Left==0 && IDTable[current_node].Right==0) return -1;
else{
if (strcmp(IDTable[current_node].Name,ID)<0)
current_node = IDTable[current_node].Right;
else{
current_node = IDTable[current_node].Left;
}
}
}while(1);
}
int TfrmMain::NextHash(Identificator *ident, int *hashTable, int HashTableLength){
int t = ident->Hash(HashTableLength);
if (t>HashTableLength) return -1;
if (hashTable[t]==0) return t;
else NextHash(ident,hashTable,HashTableLength);
};
int *TfrmMain::MakeHashTable(Identificator *IdentTable, int IdentTableLength, int HashTableLength){
int *Hash;
Hash = new int[HashTableLength+1];
for (int i=0;i<=HashTableLength;i++) Hash[i] = 0;
for (int i=1;i<=IdentTableLength;i++){
int tmp = NextHash(&IdentTable[i],Hash,HashTableLength);
if (tmp==-1)
IdentTable[i].HashERROR = 1;
else
Hash[tmp] = i;
}
return Hash;
}
void TfrmMain::ShowTable(TStringGrid *sgGrid, int *hashTable, int HashTableLength){
sgGrid->Rows[0]->Add("Хэш-функция");
sgGrid->Rows[0]->Add("Адрес в табл. ид.");
int j=0;
for (int i=1;i<=HashTableLength;i++){
if (hashTable[i]!=0){
j++;
sgGrid->RowCount++;
sgGrid->Rows[j]->Add(i);
sgGrid->Rows[j]->Add(hashTable[i]);
}
}
}
int TfrmMain::HashIdSearch(Identificator *IdentTable, int *hashTable, int HashTableLength, AnsiString Name){
Identificator ID;
ID.Name = Name.c_str();
int tmp=0;
while (tmp <= HashTableLength){
tmp = ID.Hash(HashTableLength);
if (hashTable[tmp]!=0){
cmp_count_rehash++;
if (strcmp(IdentTable[hashTable[tmp]].Name,ID.Name)==0) {
cmp_count_rehash++;
return hashTable[tmp];
}
}
}
return 0;
}
void __fastcall TfrmMain::FormShow(TObject *Sender)
{
int IdentsCount=0;
char *temp;
temp = new char[32];
mInputFile->Lines->LoadFromFile("compare_input.txt");
HashTableLen = 255;
TreeIdentTable = new Identificator[256];
HashIdentTable = new Identificator[HashTableLen+1];
FILE *inFile;
inFile=fopen("compare_input.txt","r");
while (!feof(inFile)){
fscanf(inFile, "%s", temp);
strcpy(TreeIdentTable[IdentsCount].Name,temp);
strcpy(HashIdentTable[IdentsCount].Name,temp);
AddToTree(IdentsCount,TreeIdentTable);
IdentsCount++;
}
ShowTree (TreeIdentTable, IdentsCount-1, sgBinTreeViewCompare);
HashTable = MakeHashTable(HashIdentTable,IdentsCount,HashTableLen+1);
ShowTable(sgHashTable,HashTable,255);
collision_rehash = 0;
for (int i=1;i<=IdentsCount;i++){
if(HashIdentTable[i].GetCollisionCount()!=0)
collision_rehash++;
}
edCollision->Text = IntToStr(collision_rehash-1);
fclose(inFile);
node_count = 0;
root_index = 0;
}
//---------------------------------------------------------------------------
Соседние файлы в папке Coursework_CBuilder6