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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2014, 08:38   #1
F1nt
Пользователь
 
Регистрация: 11.09.2011
Сообщений: 41
По умолчанию Хеш функция и хет таблица

Есть рабочий код, всё работает и записывает в файл. Задача такова! Есть некий список сотрудников, фам, оклад ,таб номер, инд номер получаем с помощью функции хеширования.
6256 Mihin 4560
4322 Muhin 4500
7756 Kuzin 1900
4622 Komarov 9000
3322 kyznec 4000
Так выглядит в файле. Защита от коллизии стоит. Кто может подскажите, как сделать и куда засунуть проверку на наличии уже существующего таб номера? Я пробовал варианты и не получилось, и ещё препод говорит засунуть защиту от коллизий в функцию поиска, чтобы функция удаления знала точно что удалять, хотя я не понимаю зачем эту защиту ставить в поиск, если будет предусмотрено, что при вводе таб номера, программа дальше не даст ввести такой же номер, если уже есть в файле.
Код:
#include <stdlib.h>
#include <fstream.h>
#include <conio.h>
#include <stdio.h>
#define N 103

struct info
	{
	 int tab;
	 char fam[20];
	 float oklad;
	 info()
	 {
	  tab=0; oklad=0;
	 }
	}; info T[N];

int hesh(int key){ return key % N;}
void forms(char fl[]);//formiruet hesh tabl T iz faila fl
void vivod();//vivod mas T na ekran
int poisk(int p);//funkc vozvrash index zapisi s tab nomerom=p ili -1
void add (info g);//dobavl zapic g v tabl T
void del (info g);

void main()
	{
	 int z,k;
	 info m,n;
	 clrscr();
	 forms("1.txt");
	 cout<<endl;
	 vivod();
	 cout<<"Vvedidet tab fam oklad novogo sotr:"<<endl;
	 cin>>m.tab>>m.fam>>m.oklad;
	 if (T[k].tab==m.tab) cout<<"error"; else add(m);
	 ofstream f("1.txt",ios::app);
	 f<<m.tab<<'\t'<<m.fam<<'\t'<<'\t'<<m.oklad<<endl;
	 vivod();
	 for (int i=0; i<3; i++)
	 {
	 cout<<"\n\nVvedite tab nom poiska:";
	 cin>>z;
	 k=poisk(z);
	 if (k==-1) cout<<"Ne naiden"; else
	 cout<<T[k].tab<<'\t'<<T[k].fam<<'\t'<<T[k].oklad<<'\n';
	 }
	 cout<<endl<<"Vvedidet tab nomer del:"<<endl;
	 cin>>n.tab;
	 del(n);
	 vivod();
	 getch();
	}
/////////////////////////////////////////////////////////////////////////////
void add (info g)
	{
	 int j=0;
	 int i=hesh(g.tab);
	 while (T[i].tab!=0 && j<N)
		{
		 i=hesh(i+1);
		 j++;
		}
	 if (j==N){ cout<<"Tabl perepolnena";getch(); exit (0);}
		else T[i]=g;
	}
/////////////////////////////////////////////////////////////////////////////
void forms(char fl[])
	{
	 ifstream F(fl);
	 info x;
	 while (F>>x.tab>>x.fam>>x.oklad)
	 add(x);
	}
/////////////////////////////////////////////////////////////////////////////
void vivod()
      {
       cout<<"index	tab	fam	oklad	"<<endl;
       for (int i=0; i<N; i++)
       if (T[i].tab!=0)
       cout<<i<<'\t'<<T[i].tab<<'\t'<<T[i].fam<<'\t'<<T[i].oklad<<'\n';
      }
/////////////////////////////////////////////////////////////////////////////
int poisk(int p)
      {
       int i=hesh(p);
       if (T[i].tab==p) return i; else return -1;
      }
/////////////////////////////////////////////////////////////////////////////
void del (info g)
	  {
	   int i=hesh(g.tab);
	   if (poisk) T[i].tab=NULL;
	  }
F1nt вне форума Ответить с цитированием
Старый 23.01.2014, 10:37   #2
F1nt
Пользователь
 
Регистрация: 11.09.2011
Сообщений: 41
По умолчанию

Функцию проверки на совпадение табельных номеров сделал, теперь мне нужно всего лишь правильно её засунуть, чтобы если совпадения есть, ввести заново данные иначе всё нормально
Код:
int prov (info r)
	{
	 int i=hesh(r.tab);
	 if (T[i].tab==r.tab) cout<<"Takou tab nomer cuwectByet"<<endl;
	 return 0;
	}
F1nt вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хеш таблица C++ Jirogirg Общие вопросы C/C++ 19 24.08.2012 22:15
[C++/Delphi] Бесконфликтная хеш-таблица koshkarjov Помощь студентам 1 21.08.2012 09:47
Хеш-таблица на основе стеков. Dephi Satevg Помощь студентам 1 17.04.2011 23:48
хеш-таблица CHUCKe Помощь студентам 2 17.11.2010 23:30
ХЕШ-таблица iceman2112 Общие вопросы C/C++ 0 09.05.2010 13:07