Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2012, 15:05   #1
lexflax
Пользователь
 
Регистрация: 12.04.2011
Сообщений: 74
Сообщение не могу наладить поиск с хешированием

Здравствуйте такое от учителя получил задание... создать в файле хранение данных в виде структуры: фамилия, дата, время. чтоб если человек посещал допустим здание не сколько раз в день то выводилось при поиске фамилия человека и день тот же но время другое и писалось число его посещений в этот день. Поиск должен быть с хешированием, тоесть с использованием хеш функции. Поиск не должен перебирать весь массив, функция хеширования возвращает индекс в котором хранится информация о человеке.проблема в том что функция хеширования возвращает хеш от фамилии и когда один и тот же человек то хеш у него одинаковый и один на другого наслаивается потому что индекс хранения у них один и тот же, как устранить эту проблему??? вот код посмотрите
struct man
lexflax вне форума Ответить с цитированием
Старый 22.01.2012, 15:06   #2
lexflax
Пользователь
 
Регистрация: 12.04.2011
Сообщений: 74
По умолчанию

struct man
{
AnsiString fio; // фамилия
AnsiString date; // дата
AnsiString time; // время
int HECH; // шифр

} m[1000];
AnsiString FAM[100];//массив строк в котором значение хеш функции это индекс массива куда записывается инфа о человеке
int C = 0;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}

//---------------------------------------------------------------------------
int __fastcall TForm1::HF(char *key) // функция хеширование возвращает значение типа int
{
int len = strlen(key), hashf = 0;

// если длина ключа равна 0 или 1, возвратить key[0].
// иначе сложить первый и последний символ
if (len <= 1)
hashf = key[0];
else
hashf = key[0] + key[1]+ key[len-1]; //складывает первый второй и последний символ

return hashf % 101;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender) // функция загрузки файла во время запуска
{
MkDir("List");//
if ((access("List\\db.txt",0)) == 0) //
{
db->Lines->LoadFromFile("List\\db.txt");// загрузка в db из файла db.txt
Rec->Caption = db->Lines->Count/5; // определение количества записей
for (int i=0,j=0; j < db->Lines->Count;i++,j+=5)// цикл по строкам
{
m[i].fio = db->Lines->Strings[j]; //запись в элемент структуры из db
m[i].date = db->Lines->Strings[j+1];// запись в элемент даты из db
m[i].time = db->Lines->Strings[j+2];// запись в элемент тиме из db
m[i].HECH= StrToInt(db->Lines->Strings[j+3]);// запись в элемент шифра из db
FAM[m[i].HECH]=db->Lines->Strings[j+4]; // запись в индекс массива строк фам+дата+время из db
Spisok->Lines->Add("Ф.И.О: " + m[i].fio); // вывод фамилии в список
Spisok->Lines->Add("Дата: " + m[i].date);// вывод даты в список
Spisok->Lines->Add("Время: " + m[i].time);// вывод в список времени
Spisok->Lines->Add("============================= ====");
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)// функция добавление нового человека
{
if (FIO1->Text == "")
ShowMessage("Введите Ф.И.О!");
else
{
C = (db->Lines->Count/5);
AnsiString Temp;
m[C].fio = FIO1->Text;// запись в структуру фамилии
m[C].date = DateTimePicker1->Date.DateString(); // запись в структуру даты
m[C].time = DateTimePicker2->Time.TimeString();// запись в структуру время
Temp =m[C].fio;//присвоить фамилию
char *exp = Temp.c_str();
m[C].HECH=HF(exp); // присвоить хеш по фамилии
FAM[m[C].HECH]= m[C].fio +" " + m[C].date+ " " + m[C].time;//запись в елемент массива фам+дата+время
Spisok->Lines->Add("Ф.И.О: " + m[C].fio); // вывод в список фамилии
Spisok->Lines->Add("Дата: " + m[C].date); // вывод в список даты
Spisok->Lines->Add("Время: " + m[C].time); // вывод в список времени
Spisok->Lines->Add("============================= ====");
db->Lines->Add(m[C].fio);// добавление в db ифну из фио
db->Lines->Add(m[C].date);// добавление в db инфу из date
db->Lines->Add(m[C].time);// добавление в db инфу из time
db->Lines->Add (IntToStr(m[C].HECH)); // добавление в db инфу из шифра
db->Lines->Add (FAM[m[C].HECH]);// добавление в db инфу строкового массива в котором фам+дата+время
// добавление в db шифра
Rec->Caption = db->Lines->Count/5;//подчет количества записей
db->Lines->SaveToFile("List\\db.txt");//сохранение информации db в файл db.txt

FIO1->Clear();// очистка поля FIO1
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ int k=0;
Button3->Hide();//скрыть кнопку
Count->Caption = 0;
Search->Clear();
if (FIO2->Text == "")
ShowMessage("Введите Ф.И.О!");
else
{db->Lines->LoadFromFile("List\\db.txt"); // загрузка информации из файла
AnsiString Tem;
Tem =(FIO2->Text); // фио2 это поля для ввода , присваивавем его значение в тем
char *exx = Tem.c_str();
int ZZ;
ZZ=HF(exx); // в значение зз хранится результат перевода фамилии в хеш код
Button3->Show(); // показать кнопку
k++; //счетчик записей
Search->Lines->Add(FAM[ZZ]);//вывести в поле значение которое совпадает с индексом фамилии это фам+дата+время
Count->Caption = k; // присвоить значение счестчика полю типа label
}
}
lexflax вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Немогу наладить модуль.. курсовой!!! Илья Галушка Паскаль, Turbo Pascal, PascalABC.NET 7 01.06.2011 08:34
наладить связь пк с магнитолой авто для... dema129 Свободное общение 2 24.10.2010 12:53
Как наладить работу макросов? ХочуЗнать Microsoft Office Excel 17 05.11.2009 11:08
Не удается наладить соединение ( MFC , CSocket ) DPRO Visual C++ 4 30.08.2008 09:29