Академический Документы
Профессиональный Документы
Культура Документы
ARCHIVOS EN C++
Práctica 6:
Dispersión o Hashing:
Reducción de colisiones:
Algoritmos de dispersión:
1
Procesamiento de Datos I Lic: Juan Espinoza
2) Desglosar y sumar.
Ejm:
2
Procesamiento de Datos I Lic: Juan Espinoza
return h;
}
return h;
}
Dispersión por elección de dígitos en campo clave: Si el archivo
tiene M registros físicos, entonces tomaremos los M-1 dígitos
intercalados del inverso del campo de dispersión. Es decir, tomaremos
las posiciones 0, 2, 4, ... digitos de derecha a izquierda del campo
clave. En C++ la función sería:
3
Procesamiento de Datos I Lic: Juan Espinoza
aux=M-1;
itoa(aux,c,10); //Convierte un entero en una cadena
t=strlen(c); //Devuelve el número de caracteres
strcpy(k2,k1);
strrev(k2); //Invierte la cadena de caracteres
for (i=0; i<t; i++)
{
d[i]=k2[j];
j=j+2;
}
x=atoi(d); //Convierte la cadena de caracteres en entero
h=x%M;
return h;
}
strcpy(k2,k);
strrev(k2); //Función para invertir una cadena
c1=strlen(k)/2.0;
c1=ceil(c1);//Redondea c1 al entero mayor o igual más próximo
h=(x+y)%M;
return h;
}
4
Procesamiento de Datos I Lic: Juan Espinoza
return h;
}
5
Procesamiento de Datos I Lic: Juan Espinoza
6) Otras operaciones:
_ Al leer, verificar la inexistencia de registros en la dirección.
_ La dirección está fuera del límite establecido.
6
Procesamiento de Datos I Lic: Juan Espinoza
7
Procesamiento de Datos I Lic: Juan Espinoza
#include <fstream.h>
#include <conio.h>
#include <iomanip.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct tipo
{
int marca;
long codigo;
char nombre[20];
};
int main()
{
int M=131, opc;
fstream f;
f.open("nomarch.dat", ios::in| ios::out| ios::binary);
if(f.good()!=1)
{
cerr<<"Error al abrir el archivo";
getch();
return 1;
}
do
{
clrscr();
cout<<"\n[1] Crear";
cout<<"\n[2] Cargar";
cout<<"\n[3] Actualizar";
cout<<"\n[4] Eliminar";
cout<<"\n[5] Listar";
cout<<"\n[6] Salir\n";
cin>>opc;
switch(opc)
{
8
Procesamiento de Datos I Lic: Juan Espinoza
case 1:
crear(f,M);
clrscr();
cout<<"El archivo se inicializo correctamente";
getch();
break;
case 2:
cargar(f,M);
break;
case 3:
actualizar(f,M);
break;
case 4:
eliminar(f,M);
break;
case 5:
listar(f);
break;
case 6:
break;
default:
clrscr();
cout<<"Opcion no valida";
break;
}
}while(opc!=6);
getch();
return 0;
}
h=k%M;
return h;
}
9
Procesamiento de Datos I Lic: Juan Espinoza
clrscr();
cout<<"\nIntroduzca el codigo: ";
cin>>k;
h=dispersion(k,M);
f.seekg((h)*sizeof(tipo), ios::beg);
f.read((char *)&b, sizeof(tipo));
if(b.marca==0)
{
b.marca=1;
b.codigo=k;
cout<<"\nIntroduzca el nombre: ";
gets(b.nombre);
f.seekp((h)*sizeof(tipo), ios::beg);
f.write((char *)&b, sizeof(tipo));
}
else
{
clrscr();
cout<<"La direccion "<<h<<" esta ocupada";
getch();
}
}
clrscr();
cout<<"\nIntroduzca el codigo: ";
cin>>k;
h=dispersion(k,M);
f.seekg((h)*sizeof(tipo), ios::beg);
f.read((char *)&b, sizeof(tipo));
if(b.marca!=0)
{
10
Procesamiento de Datos I Lic: Juan Espinoza
do
{
clrscr();
mostrar(b);
cout<<"\n\nOperaciones disponibles:";
cout<<"\n[1] Modificar nombre";
cout<<"\n[2] Volver al menu principal";
cin>>opc;
switch(opc)
{
case 1:
cout<<"\nIntroduzca el nuevo nombre: ";
gets(b.nombre);
f.seekp((h)*sizeof(tipo), ios::beg);
f.write((char *)&b, sizeof(tipo));
break;
case 2:
break;
default:
break;
}
}while(opc!=2);
}
else
{
clrscr();
cout<<"La direccion "<<h<<" esta vacia";
getch();
}
}
clrscr();
cout<<"\nIntroduzca el codigo: ";
cin>>k;
11
Procesamiento de Datos I Lic: Juan Espinoza
h=dispersion(k,M);
f.seekg((h)*sizeof(tipo), ios::beg);
f.read((char *)&b, sizeof(tipo));
if(b.marca!=0)
{
clrscr();
f.seekp((h)*sizeof(tipo), ios::beg);
f.write((char *)&a, sizeof(tipo));
cout<<"El codigo "<<k<<" fue eliminado";
getch();
}
else
{
clrscr();
cout<<"La direccion "<<h<<" esta vacia";
getch();
}
}
clrscr();
cout<<setiosflags(ios::left)<<setw(15)<<"Codigo"<<setw(20)<<"Nombre"<
<endl;
f.seekg(0, ios::beg);
f.read((char *)&b, sizeof(tipo));
while (f.eof()!=1)
{
if(b.marca==1)
{
cout<<setiosflags(ios::left)<<setw(15)<<
b.codigo<<setw(20)<<b.nombre<<endl;
}
f.read((char *)&b, sizeof(tipo));
}
f.clear();
getch();
12
Procesamiento de Datos I Lic: Juan Espinoza
13
Procesamiento de Datos I Lic: Juan Espinoza
Ejemplo:
Ejemplo:
Ejemplo:
14
Procesamiento de Datos I Lic: Juan Espinoza
h=dispersion1(k);
c=dispersion2(k);
h=h+c;
Ejemplo:
15