24.05.2012, 19:46. Просмотров 251. Ответов 0
//h-файл
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
#include <fstream>
using namespace std;
class znak //клас-описание
{
private:
char surname[80];
int number;
int arr[3];
friend class klass;
public:
znak(){number=0;}
~znak(){}
friend istream &operator>>(ifstream &ZORG,znak &NARF)
{
return ZORG>>NARF.surname>>NARF.number>>NARF.arr[0]>>NARF.arr[1]>>NARF.arr[2];
}
friend ostream &operator <<(ostream &out,znak &z)
{
return out<<z.surname<<" "<<z.number<<" "<<z.arr[0]<<" "<<z.arr[1]<<" "<<z.arr[2]<<"\n\n";
}
char* getSurname(){return surname;}
int getNumber(){return number;}
int getArr(int i){return arr[i];}
int* getA(){return arr;}
void setSurname(char* str) {strcpy(surname,str);}
void setNum(int n) {number=n;}
void setArr(int i, int n) {arr[i]=n;}
static bool Surname(znak& a,znak& b){return strcmp(a.surname,b.surname)<0;}
static bool Number(znak& a,znak& b){return a.number<b.number;}
static bool Age(znak& a,znak& b){return a.arr<b.arr;}
};
class klass //основной класс
{
public:
znak z[50];
struct hesh {int key[3]; int index;};
hesh table[100];
int count;
static void arrcopy(int* a,int* b) //копирование массива
{
a[0]=b[0];
a[1]=b[1];
a[2]=b[2];
}
static bool arrcmp(int* a,int* b) // сравнение массивов
{
return a[0]==b[0] && a[1]==b[1] && a[2]==b[2];
}
static int heshfunc(int* a) // сумма эл-ов массива
{
return a[0]+a[1]+a[2];
}
void createtable() // создаем таблицу
{
int i,j,i1=0;
for(i=0;i<100;i++)table[i].index=-1;
for(j=0;j<50 && z[j].number;j++)
{
i1=0;
while(1)
{
i=((i1*i1)+heshfunc(z[j].arr))%50;
if(table[i].index==-1) break;
i1++;
}
table[i].index=j;
arrcopy(table[i].key,z[j].arr);
}
}
int search (int* k) // поиск в таблице
{
int j,i1=0;
while(1)
{
j=(heshfunc(k)+i1*i1)%50;
if(arrcmp(table[j].key,k))break;
i1++;
if(i1>100000){cout<<"not found\n\n";return -1000;}
}
cout<<" "<<i1<<" \n";
return table[j].index;
}
friend istream &operator >>(ifstream &in,klass &k) // ввод
{
for(int i=0;i<50;i++)
{
in>>k.z[i];
if(!k.z[i].getNumber()){k.count=i;return in;}
}
k.count=50;
return in;
}
friend ostream &operator <<(ostream &out,klass &k) // вывод
{
for(int i=0;i<k.count;i++)
{
out<<k.z[i];
}
return out;
}
void binr()
{
fstream in("binka",ios::in|ios::out|ios::binary|ios::trunc);
in.write((char*) this,sizeof(klass));
in.flush();
}
void binee()
{
fstream in("binka",ios::in|ios::out|ios::binary);
in.read((char*) this,sizeof(klass));
}
znak extract(int i)
{
znak zn;
ifstream bin("binka",ios::binary|ios::in);
bin.seekg(sizeof(znak)*i,ios::beg);
bin.read((char*) zn,sizeof(znak)); // пишет, что нельзя преобразовать знак в чар.
}
};
0
|