Apareo de 4 Archivos
Publicado por dargon (1 intervención) el 01/10/2007 15:14:06
Tengo estos 4 archivos ordenados cronologicamente, que contienen las infracciones de un año calendario:ZONA1.DAT, ZONA2.DAT, ZONA3.DAT, ZONA4.DAT
Cada registro de los archivos contiene:
Nro.patente Nro.reg.conductor Fecha infrac. Cód.destac. policial Cód.infrac.
Ej: B153 17452369 1(dd) 1(mm)97(aa) 1524 2374
Nro.ident.policial
ej: GNQWA
Se pide generar un único archivo a partir de esos .
Yo codifiqué esto, pero el proceso nunca termina, sigue sumando y haciendo màs grande el primer archivo auxiliar que utilizé (ZONAU). Creo que el error està en el apareo, el cual quize hacer con un único ciclo mientras (Que se abandone el ciclo cuando los dos archivos se hayan leido completante, es decir, se les haya asignado el valor más alto ficticio). No se pueden usar arreglos.
----------------------------
const
HV=13; {Una especie de HIGH_VALUE, es decir, el valor más alto}
Type
str4=string[4];
str5=string[5];
RegFecha=record
dd:byte;
mm:byte;
aa:byte;
end;
RegZona=record
NroPat:str4;
NroReg:longint;
Fecha:RegFecha;
CodDesPol,
CodInf:word;
NroIdPol:str5;
end;
ArcZona=file of RegZona;
procedure Abrir(var Zona1, Zona2, Zona3, Zona4, Zona, Aux1, Aux2:ArcZona);
begin
assign(Zona1,'Zona1.dat');
assign(Zona2,'Zona2.dat');
assign(Zona3,'Zona3.dat');
assign(Zona4,'Zona4.dat');
assign(Aux1,'ZonaU.tml');
assign(Aux2,'ZonaD.tml');
assign(Zona,'Zona.dat');
filemode:=0;
reset(zona1);
reset(zona2);
reset(zona3);
reset(zona4);
rewrite(Aux1);
rewrite(Aux2);
rewrite(zona)
end;
procedure LecEsp (var zona:ArcZona; rzona:RegZona);
begin
if not eof(zona) then begin
read(zona,rzona);
end
else
rzona.fecha.mm:= HV
end;
procedure Apareo(var ZonaA, ZonaB, Aux:ArcZona);
var
rZonaA,
rZonaB:RegZona;
begin
LecEsp(ZonaA,rZonaA);
LecEsp(ZonaB,rZonaB);
while (rZonaA.fecha.mm <> HV) or (rZonaB.fecha.mm <> HV) do begin
if rZonaA.fecha.mm = rZonaB.fecha.mm then
begin
if rZonaA.fecha.dd <= rZonaB.fecha.dd then begin
write(Aux,rZonaA);
LecEsp(ZonaA,rZonaA)
end
else begin
write(Aux,rZonaB);
LecEsp(ZonaB,rZonaB)
end
end
else begin
if rZonaA.fecha.mm < rZonaB.fecha.mm then begin
write(Aux,rZonaA);
LecEsp(ZonaA,rZonaA)
end
else begin
write(Aux,rZonaB);
LecEsp(ZonaB,rZonaB)
end
end
end;
seek(Aux,0)
end;
procedure CerrarElimAux(var Aux1,Aux2:ArcZona);
begin
close(Aux1);
close(Aux2);
erase(Aux1);
erase(Aux2)
end;
procedure Cerrar(var Zona1, Zona2, Zona3, Zona4, Zona:ArcZona);
begin
close(zona1);
close(zona2);
close(zona3);
close(zona4);
close(zona)
end;
var
Zona1, Zona2,
Zona3, Zona4,
Aux1,Aux2,
Zona :ArcZona;
begin {Bloque Principal}
Abrir(Zona1, Zona2, Zona3, Zona4, Zona, Aux1, Aux2);
Apareo(Zona1, Zona2, Aux1);
Apareo(Zona3, Zona4, Aux2);
Apareo(Aux1, Aux2, Zona);
CerrarElimAux(Aux1,Aux2);
Cerrar(Zona1,Zona2,Zona3,Zona4,Zona)
end.
Cada registro de los archivos contiene:
Nro.patente Nro.reg.conductor Fecha infrac. Cód.destac. policial Cód.infrac.
Ej: B153 17452369 1(dd) 1(mm)97(aa) 1524 2374
Nro.ident.policial
ej: GNQWA
Se pide generar un único archivo a partir de esos .
Yo codifiqué esto, pero el proceso nunca termina, sigue sumando y haciendo màs grande el primer archivo auxiliar que utilizé (ZONAU). Creo que el error està en el apareo, el cual quize hacer con un único ciclo mientras (Que se abandone el ciclo cuando los dos archivos se hayan leido completante, es decir, se les haya asignado el valor más alto ficticio). No se pueden usar arreglos.
----------------------------
const
HV=13; {Una especie de HIGH_VALUE, es decir, el valor más alto}
Type
str4=string[4];
str5=string[5];
RegFecha=record
dd:byte;
mm:byte;
aa:byte;
end;
RegZona=record
NroPat:str4;
NroReg:longint;
Fecha:RegFecha;
CodDesPol,
CodInf:word;
NroIdPol:str5;
end;
ArcZona=file of RegZona;
procedure Abrir(var Zona1, Zona2, Zona3, Zona4, Zona, Aux1, Aux2:ArcZona);
begin
assign(Zona1,'Zona1.dat');
assign(Zona2,'Zona2.dat');
assign(Zona3,'Zona3.dat');
assign(Zona4,'Zona4.dat');
assign(Aux1,'ZonaU.tml');
assign(Aux2,'ZonaD.tml');
assign(Zona,'Zona.dat');
filemode:=0;
reset(zona1);
reset(zona2);
reset(zona3);
reset(zona4);
rewrite(Aux1);
rewrite(Aux2);
rewrite(zona)
end;
procedure LecEsp (var zona:ArcZona; rzona:RegZona);
begin
if not eof(zona) then begin
read(zona,rzona);
end
else
rzona.fecha.mm:= HV
end;
procedure Apareo(var ZonaA, ZonaB, Aux:ArcZona);
var
rZonaA,
rZonaB:RegZona;
begin
LecEsp(ZonaA,rZonaA);
LecEsp(ZonaB,rZonaB);
while (rZonaA.fecha.mm <> HV) or (rZonaB.fecha.mm <> HV) do begin
if rZonaA.fecha.mm = rZonaB.fecha.mm then
begin
if rZonaA.fecha.dd <= rZonaB.fecha.dd then begin
write(Aux,rZonaA);
LecEsp(ZonaA,rZonaA)
end
else begin
write(Aux,rZonaB);
LecEsp(ZonaB,rZonaB)
end
end
else begin
if rZonaA.fecha.mm < rZonaB.fecha.mm then begin
write(Aux,rZonaA);
LecEsp(ZonaA,rZonaA)
end
else begin
write(Aux,rZonaB);
LecEsp(ZonaB,rZonaB)
end
end
end;
seek(Aux,0)
end;
procedure CerrarElimAux(var Aux1,Aux2:ArcZona);
begin
close(Aux1);
close(Aux2);
erase(Aux1);
erase(Aux2)
end;
procedure Cerrar(var Zona1, Zona2, Zona3, Zona4, Zona:ArcZona);
begin
close(zona1);
close(zona2);
close(zona3);
close(zona4);
close(zona)
end;
var
Zona1, Zona2,
Zona3, Zona4,
Aux1,Aux2,
Zona :ArcZona;
begin {Bloque Principal}
Abrir(Zona1, Zona2, Zona3, Zona4, Zona, Aux1, Aux2);
Apareo(Zona1, Zona2, Aux1);
Apareo(Zona3, Zona4, Aux2);
Apareo(Aux1, Aux2, Zona);
CerrarElimAux(Aux1,Aux2);
Cerrar(Zona1,Zona2,Zona3,Zona4,Zona)
end.
Valora esta pregunta


0