ARCHIVOS DE ACCESO DIRECTO POR TRANSFORMACIÓN DE CLAVES.

Se asigna mediante una función HASH una posición a unas claves determinadas.

{por ejemplo, una función HASH sería dividir el número de clave entrew el número de elementos totales, y tomar el resto como resultado}

El problema con que nos vamos a encontrar son las Colisiones (elementos con claves distintas producen el mismo resultado en la función HASH).

Los elementos que colisionan se pueden llevar a :

     ·       Otro fichero (Fichero de Colisiones).
·      
Al mismo fichero a partir de la íltima posición.

Si llegamos a una posición y la clave no es igual, se va a buscar a la zona de colisiones (secuencialmente).

{por ejemplo, si tengo 100 elementos, el número primo más próximo a 100 dará menos colisiones, y ese será el número de zona (de colisiones)) }

Type

            Reg=RECORD
                       
clave :integer ; {suele ser string
à transformarlo a número}
                       
c1 : ------- ;
                       
c2 : ------- ;
                       
ocupado : boolean ; { también podemos usar un Char}

                       
end ;
           

            Archivo=file of Reg ;
Var

           
r :Reg ;

           
f :Arch;
           
i :integer ;

{--------------HASH------------------------------------------------------------------------------------}

Function Hash (clave :string) :integer ; {por ejemplo si la clave fuese ‘1234R’}

Var
           
suma :integer ;

           
i :byte ;
Begin
           
suma :=0 ;
           
For i :=1 to Length(clave) do          
                       
suma :=suma+Ord(clave[i]) ;
           
Hash :=suma MOD 100 ;
End ;

BEGIN
           
Assign(f,’nombre.dat’) ;

           
Rewrite(f) ; {creación}
           
r.ocupado :=’’ ;

           
For i :=0 to 99 do
           
begin
                       
Seek(f,i) ;
                       
Write(f,r) ;
           
end ;
END.

{--------------------------------------------------------------------------------------------------------------------------}

Program Altas ;

Type... 

Variable
           
r :Reg ;

           
f :Archivo ;
           
Clave :integer ;
           
encontrado :boolean ;
           
p :integer ;

Begin

           
Reset(f) ;

           
WriteLn(‘Deme clave’) ;
           
ReadLn(clave) ;

           
While Clave<>0 do
           
begin
                       
p :=Hash(clave) ;
                       
Seek(f,p) ;
                       
Read(f,r) ;
                       
If r.ocupado=’’ then
                                  
encontrado :=true ; {el sitio}
                       
Else
                       
begin
                                  
p :=99 ;
                                  
encontrado :=false ;
                                  
While (p<124) AND NOT encontrado do
                                  
begin
                                              
p :=p+1 ;
                                              
Seek(f,p) ;
                                              
Read(f,r) ;
                                              
If r.ocupado=’’ then
                                                          
encontrado :=true ;
                                  
end ;
                       
end ;
                       
If encontrado then
                       
begin
                                  
Seek(f,p) ;

                                  
Write(‘Deme campos) ;
                                  
ReadLn(c1,c2,.... ) ;
                                  
r.ocupado :=’*’ ;
                                  
r.Clave :=Clave ;

                                  
Write(f,r) ;
                       
end ;
                       
Write(‘Deme tora clave o 0 para fin ‘) ;

           
end ;
           
Close(f) ;
End.

{--------------------------------------------------------------------------------------------------------------------------}

f :text ; {obligatorio}
ReadLn(f,r,...) ;
While NOT EOF(f) do
begin
           
Write(...) ;
           
Read(...) ;

end ; {último no se escribe}
WriteLn(....) ;
<<<Arreglado>>>{aquí no hay que escribir cuando sale}

fin :=false ;
If NOT EOF(f) then
           
ReadLn(f,....) ;
Else
           
fin :=true ;
While NOT fin do
begin
           
Write(f,r,...) ;
           
If NOT EOF(f) then
                       
ReadLn(f,r,...) ;
           
Else
                       
fin :=true ;
end ;

 

{--------------------------------------------------------------------------------------------------------------------------}

Program Ordenacion_Mezcla_Natural ;

Type
           
Reg=RECORD
                       
cod :byte ;

                       
cantidad :integer ;
                       
descuento :real ;

                       
end ;
           
Archivo =text ;
Variable
           
f1,f2,f :Archivo ;
           
r1,r2,r :Reg ;
           
ant1,ant2,ant :byte ; {cod}

           
ordenado,crece :boolean ;
           
fin1,fin2,fin :boolean ;

           
numsec :integer ;
Begin
           
Assign(f,’inicial.dat’) ;
           
Assign(f1,’auxi1.dat’) ;
           
Assign(f2,’auxi2.dat’) ;
           
ordenado :=false ;
           
While NOT ordenado do
           
begin
                       
Reset(f) ;
                       
Rewrite(f1) ;
                       
Rewrite(f2) ;
                       
fin :=false ;
                       
If NOT EOF(f) then

                                  
ReadLn(f,r.cod,r.cantidad,r.descuento) ;
                       
Else
                                  
fin :=true ;
                       
While NOT fin do
                       
begin
                        &nb
1