Pascal/Turbo Pascal - ayuda con metodo de ordenacion

 
Vista:

ayuda con metodo de ordenacion

Publicado por David (1 intervención) el 13/09/2005 19:29:25
El problema es el siguiente tengo que realizar una practica que lea un texto lo pase a muysculas y elimine comas puntos etc y mediante la mezcla equilibrada multiple lo ordene e realizado el siguiente programa siguendo un ejemplo del libro pero me falla si alguien pudiera indicarme donde falla y como corregirlo.
creo que falla en el read del inspeccionar ya que intenta leer cuando ya a acabado el fichero.

CODIGO FUENTE
PROGRAM mezclaequilibrada;

uses crt;

CONST
N=6;

TYPE
palabr= string[21];
tipofich = file of palabr;
Tclave=string[21];
Tinfo=RECORD
Clave:Tclave;
END;
Tfichero= file of Tinfo;
Tnfichero=1..N;
Ttemporales=array[Tnfichero] of Tfichero;
Tindicesfichero=array [Tnfichero] of Tnfichero;

Var
pala : char;
punt : file of char;
punt_a : file of char;
aux : palabr;
pu : tipofich;
i:integer;
Finicial:Tfichero;
Ftemporales:Ttemporales;

Function obtenerClave (buffer:Tinfo):Tclave;
BEGIN
obtenerClave:=buffer.clave;
END;

Procedure insertarClave (var info:Tinfo; c1:Tclave);
BEGIN
Info.clave:=c1;
END;

Function inspeccionar(var x:Tfichero):Tclave;
Var
Buffer:Tinfo;
Pos: integer;
BEGIN
Pos:=FILEPOS(x);
if not EOF(X) then
begin
READ(x,Buffer);
SEEK(x,pos);
Inspeccionar:=buffer.clave;
end;
END;

Procedure Asignartemporales(var ftemporales:Ttemporales);
VAR
Ind:integer;
Nombre:string[21];
BEGIN
For ind:=1 to N do
begin
Nombre:='';
Nombre:=Nombre+'c:\';
IF(ind<10) then
Begin
Nombre:=Nombre+(CHR( ord('0')+ind));
End
ELSE
begin
Nombre:=nombre+( CHR( ord('0')+(ind div 10)));
Nombre:=nombre+( CHR( ord('0')+(ind mod 10)));
End;
Nombre:=nombre+'.dat';
Assign(ftemporales[ind],Nombre);
End;
End;

Procedure CerrarFicheros(var f:Ttemporales);
Var
Ind:integer;
Begin
For ind:=1 to N do
Close(f[ind]);
End;

Procedure copiartramo(var finicial:Tfichero; var ftemporal:Ttemporales;indiceSalida:Tnfichero);
Var
Buf:Tinfo;
Begin
Repeat
Read(finicial,buf);
Write(ftemporales[indicesalida],buf);
Until (EOF (finicial) or (obtenerclave(buf)>inspeccionar(finicial)));
End;

Procedure Creartemporales (var ftemporales:Ttemporales);
Var
Fentrada:Tnfichero;
Begin
For fentrada:=1 to n do
Rewrite(ftemporales[fentrada]);
End;

Procedure Distribucioninicial(var finicial:Tfichero; var ftemporales:Ttemporales; var tramos: integer; var indicesalida:tnfichero);
Begin
Reset(finicial);
Indicesalida:=(n div 2);
Tramos:=0;
Repeat
If (indicesalida< (n div 2)) then
Indicesalida:=indicesalida+1
Else
Indicesalida:=1;
Tramos:=tramos+1;
Copiartramo(finicial,ftemporales,indicesalida);
Until (EOF(finicial));
Close (finicial);
End;

Procedure inicializartablaindices (var indicef:Tindicesfichero);
Var
Fentrada:Tnfichero;
Begin
For fentrada:=1 to n do
Indicef[fentrada]:=fentrada;
End;

Procedure inicializarfichentrada(indicef:Tindicesfichero; var indicefabiertos:Tindicesfichero; tramos:integer;var ind1:integer);
Var
Fentrada:Tnfichero;
Begin
If(tramos<(N div 2)) then
Ind1:=tramos
Else
Ind1:=(n div 2);
For fentrada:=1 to ind1 do
Begin
Reset(ftemporales[indicef[fentrada]]);
Indicefabiertos[fentrada]:=indicef[fentrada];
End;
End;

Procedure eliminarfichero(var ftemporales:Ttemporales; var indicefabiertos:Tindicesfichero;fminimo:Tnfichero;var ind1,ind2:integer);
Begin
Rewrite(ftemporales[indicefabiertos[fminimo]]);
Indicefabiertos[ind2]:=Indicefabiertos[ind1];
Ind1:=ind1-1;
Ind2:=ind2-1;
End;

Procedure Cerrartramo(var ftemporales:Ttemporales; var indicefabiertos:tindicesfichero;fminimo:Tnfichero; var ind2:integer);
Var
Fauxiliar:Tnfichero;
Begin
Fauxiliar:=indicefabiertos[fminimo];
indicefabiertos[fminimo]:= indicefabiertos[ind2];
indicefabiertos[ind2]:=fauxiliar;
ind2:=ind2-1;
end;

function compara(minimo,aux:string):boolean;
var
len:integer;
begin
if (length(aux)<length(minimo)) then
compara:=true
else
if (length(aux)=length(minimo)) then
begin
for len:=1 to length(aux) do
begin
if (ord(aux[len])<ord(minimo[len])) then
compara:=true;
end;
end
else
compara:=false;
end;

Procedure Mezclaruntramoporfichero(var ftemporales:ttemporales;var indicef,indicefabiertos:tindicesfichero;var ind1,ind2:integer;indiceSalida:Tnfichero);
Var
Fentrada,fminimo:tnfichero;
Minimo,aux:string[21];
Buf:tinfo;
Fdf:boolean;
Begin
Repeat
Fentrada:=1;
Fminimo:=1;
Minimo:=inspeccionar(ftemporales[indicefabiertos[1]]);
While (fentrada<ind2) do
Begin
fentrada:=fentrada+1;
aux:=inspeccionar(ftemporales[indicefabiertos[fentrada]]);
If (compara(minimo,aux)=true) then
Begin
Minimo:=aux;
Fminimo:=fentrada;
End;
End;
Read(ftemporales[indicefabiertos[fminimo]],buf);
Fdf:=EOF(ftemporales[indicefabiertos[fminimo]]);
Write(ftemporales[indicef[indicesalida]],buf);
If (fdf) then
Eliminarfichero(ftemporales,indicefabiertos,fminimo,ind1,ind2)
Else
If (length(obtenerclave(buf)) >length(inspeccionar(ftemporales[indicefabiertos[fminimo]]))) then
Cerrartramo(ftemporales,indicefabiertos,fminimo,ind2);
Until (ind2=0);
End;

Procedure mezclartramosfentradafsalida (var ftemporales:ttemporales;var indicef,indicefabiertos:tindicesfichero;var ind1:integer; var tramos:integer ;indiceSalida:Tnfichero);
Var
Ind2:integer;
Begin
Repeat
Ind2:=ind1;
Tramos:=tramos+1;
Mezclaruntramoporfichero(ftemporales,indicef,indicefabiertos,ind1,ind2,indicesalida);
If (indicesalida<N) then
Indicesalida:=indicesalida+1
Else
Indicesalida:=(n div 2)+1;
Until (ind1=0);
End;

Procedure Cambiarfuncionficheros (var indicef:tindicesfichero);
Var
Fentrada,fauxiliar:Tnfichero;
Begin
For fentrada:=1 to (n div 2) do
Begin
Fauxiliar:=indicef[fentrada];
Indicef[fentrada]:=indicef[(n div 2) + fentrada];
Indicef[(n div 2)+fentrada]:=fauxiliar;
End;
End;

Procedure Mezclaequilibradamultiple (var finicial:tfichero; var ftemporales:ttemporales);
Var
Fdf:boolean;
Indicesalida:Tnfichero;
Ind1:integer;
Tramos:integer;
Indicef,indicefabiertos:Tindicesfichero;
Begin
Creartemporales(ftemporales);
Distribucioninicial (finicial,ftemporales,tramos,indicesalida);
Inicializartablaindices(indicef);
Repeat
Inicializarfichentrada(indicef,indicefabiertos,tramos,ind1);
Tramos:=0;
Indicesalida:=(n div 2)+1;
Mezclartramosfentradafsalida(ftemporales,indicef,indicefabiertos,ind1,tramos, indicesalida);
Cambiarfuncionficheros(indicef);
Until (tramos=1);
End;

procedure mayusculas();
begin
Assign(punt,'C:\Documents and Settings\David Iglesias\Mis documentos\cap12.txt');
assign(punt_a,'C:\ejemplo.txt');
assign(pu,'C:\ejem.txt');
reset(punt);
rewrite(punt_a);
while not EOF(punt) do
begin
read(punt,pala);
if (pala='á') or (pala='Á') then
pala:='A'
else if (pala='é') or (pala='É')then
pala:='E'
else if (pala='í') or (pala='Í') then
pala:='I'
else if (pala='ó') or (pala='Ó') then
pala:='O'
else if (pala='ú') or (pala='ü') or (pala='Ú') then
pala:='U'
else if (pala='ñ') then
pala:='Ñ'
else
pala:=upcase(pala);
write(punt_a,pala);
end;
close(punt_a);
close(punt);
rewrite(pu);
reset(punt_a);
i:=1;
while not eof(punt_a) do
begin
read(punt_a,pala);
if (pala>=#65) and (pala<=#90) or (pala='Ñ') then
begin
aux:=aux+pala;
end
else if( (pala<#65) or (pala>#90) )and (length(aux)<>0) then
begin
write(pu,aux);
for i:=1 to length(aux) do
aux[i]:=' ';
delete(aux,1,length(aux));
end
end;
close(punt_a);
close(pu);
end;


Begin
mayusculas;
assign(finicial,'C:\ejem.txt');
Asignartemporales(ftemporales);
Mezclaequilibradamultiple(finicial,ftemporales);
Cerrarficheros(ftemporales);
End.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder