|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
22.01.2012, 15:05 | #1 |
Пользователь
Регистрация: 12.04.2011
Сообщений: 74
|
не могу наладить поиск с хешированием
Здравствуйте такое от учителя получил задание... создать в файле хранение данных в виде структуры: фамилия, дата, время. чтоб если человек посещал допустим здание не сколько раз в день то выводилось при поиске фамилия человека и день тот же но время другое и писалось число его посещений в этот день. Поиск должен быть с хешированием, тоесть с использованием хеш функции. Поиск не должен перебирать весь массив, функция хеширования возвращает индекс в котором хранится информация о человеке.проблема в том что функция хеширования возвращает хеш от фамилии и когда один и тот же человек то хеш у него одинаковый и один на другого наслаивается потому что индекс хранения у них один и тот же, как устранить эту проблему??? вот код посмотрите
struct man |
22.01.2012, 15:06 | #2 |
Пользователь
Регистрация: 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 } } |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Немогу наладить модуль.. курсовой!!! | Илья Галушка | Паскаль, 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 |