- •Национальный исследовательский университет «Московский энергетический институт» Институт автоматики и вычислительной техники Кафедра математического моделирования
- •Оглавление
- •Void Prints(rez &r)
- •Void __fastcall tForm1::BitBtn1Click(tObject *Sender)
- •LeksBlok.H
- •Void Strcpy(char mas[], int n, char *txt, int m);
- •Void LeksichBlok(Ident &I, char *txt);
- •LeksBlok.Cpp
- •Void LeksichBlok(Ident &I, char *txt)
- •Sintaksis.H
- •Void Sint(Ident &I, rez &r);
- •Sintaksis.Cpp
- •Void Sint(Ident &I, rez &r)
- •Interpretator.H
- •Void Inter(Ident &I, rez &r);
- •Interpretator.Cpp
- •Void Inter(Ident &I, rez &r)
- •Data.Cpp
- •Ident::Ident()
- •Void Ident::Delete(elem el)
- •Stack_mass.H
Data.Cpp
#pragma hdrstop
#include "DataBase.h"
#include "string.h"
#define CONST 0.6180339887498948482
#define MAX 1000
//------------------------------------------------------------------------------------------------------------------------------------------------------
Ident::Ident()
{
size = 0;
end = MAX;
mas = new elem[MAX];
ABC = new int[MAX];
for (int i = 0; i < MAX; ++i)
mas[i].name[0] = '\0';
}
//------------------------------------------------------------------------------------------------------------------------------------------------------
Ident::~Ident()
{
delete [] mas;
delete [] ABC;
}
//------------------------------------------------------------------------------------------------------------------------------------------------------
int Hesh (int d, char *c, char name[] = 0)
{
int k = 0;
for (int i = 0; c[i] != '\0'; ++i)
k += c[i];
if (name != 0)
for (int i = 0; name[i] != '\0'; ++i)
k += name[i];
int m = k * CONST;
return d * (k * CONST - m);
}
//------------------------------------------------------------------------------------------------------------------------------------------------------
int Ident::Add(elem z)//возвр. -1, вставляя запись, или -2 при переполн.
{
z.link = -1; //пустая ссылка
int ind;
if (size == 0)
ind = Hesh (MAX, z.name); //позиция ind отображения
else
ind = Hesh (MAX, z.name, mas[ABC[size-1]].name);
if (mas[ind].name[0] == '\0') //позиция свободна
{
//AddABC(z, ind);
ABC[size] = ind;
mas[ind] = z;
size++;
return -1; //вставка
}
int k;
for (;ind >= 0; k = ind, ind = mas[ind].link)
{}//if (!strcmp(mas[ind].name, z.name))
//return 0; //запись уже есть
/*Описание второго рипита-антила: r идет от конца массива к началу,
занятые позиции отмечены T[r].key == MAXINT,
когда находит первую незанятую, записывает туда z.*/
for (--end; mas[end].name[0] != '\0'; --end)
if (end < 0) throw(ErrOverFlow()); // переполнение
//AddABC(z, end);
ABC[size] = end;
mas[end] = z;
mas[k].link = end;
size++;
return -1; //вставка в конец
}
//------------------------------------------------------------------------------------------------------------------------------------------------------
int Ident::Search (elem el) //возвращает номер найденной записи
{
for(int i = 0; i < size; ++i)
{
if (!strcmp(mas[ABC[i]].name, el.name)) return i;
}
throw ErrSearch();
}
//------------------------------------------------------------------------------------------------------------------------------------------------------
Void Ident::Delete(elem el)
{
int nom = Search(el);
//mas[ABC[nom]].name[0] = MAXINT;
mas[ABC[nom]].link = -1;
mas[ABC[nom]].name[0] = '\0';
for (int i = nom; i < size; ++i)
{
ABC[i] = ABC[i + 1];
}
--size;
}
#pragma package(smart_init)