Pascal/Turbo Pascal - SE ME CAE EL PELO!!!

 
Vista:

SE ME CAE EL PELO!!!

Publicado por Juan (83 intervenciones) el 01/09/2007 00:28:36
Que tal tengo el siguiente problema

El negocio ABC tiene un Archivo desordenado con la siguiente información de cada uno de los 90 articulos que vende:

nro de articulo(3 digitos) precio(real)

Se solicita emitir un listado con la información contenida en el archivo ordenado de menor a mayor

por nro de artículo.

El problema es que no se si me equivoqué con la lógica o que pero lo que quize hacer es:

primero paso el campo Nro de Articulo a un vector, luego ordeno ese vector, y después uso ese

vector indice para listar el archivo como ordenado(cosa que no se hacer bien, no termino de

entender el tema de archivos/vectores índices), acá esta el código Saint Romero, un saludo

De paso te muestro el contenido del archivo Abc:

Nro de socio precio
03 19.50
02 15
05 18
04 17
01 12

Debería Salir

01 12
02 15
03 19.50
04 17
05 18

y el código:

Program ej12S1;

const

LimiteInferior=0;

LimiteSuperior=89;

Type

Rabc=record

Nart:word;

Precio:real

end;

ArchAbc=file of Rabc;

VecArt=array[LimiteInferior..LimiteSuperior] of word;



Procedure Abrir(var Art:ArchAbc);

Begin

assign(Art,'Abc.dat');

reset(Art);

end;

Procedure CargarVector(var Art:ArchAbc;Var Vart:VecArt);

var

Rart:Rabc;

i:Byte;

Begin

i:=0;

while not eof(Art) do

begin

read(art,rart);

Vart[i]:=Rart.Nart;

i:=i+1

end

end;

Procedure Intercambio(var Entidad1,Entidad2:word);

Var Aux:word;

Begin

Aux:=Entidad1;

Entidad1:=Entidad2;

Entidad2:=Aux

end;

Procedure OrdenarVector(var Vart:VecArt;LimiteInferior,LimiteSuperior:word);

Var i:byte;

Fin:word;

Begin

while LimiteInferior<LimiteSuperior do

begin

Fin:=LimiteSuperior-1;

LimiteSuperior:=0;

for i:=LimiteInferior to Fin do

begin

if VArt[i]>VArt[i+1] then

begin

Intercambio(VArt[i],VArt[i+1]);

limiteSuperior:=i

end

end

end

end;

Procedure MostrarOrdenado(Var Art:ArchAbc;Var Vart:VecArt;Card:byte);

var Rart:Rabc;

i:byte;

begin

for i:=1 to card do

begin

seek(art,Vart[i]);

read(art,rart);

writeln('Nro de Articulo es:',rart.Nart);

writeln('Precio: ',rart.Precio:5:2)

end

end;

Var
abc:ArchAbc;

regAbc:Rabc;

Vart:Vecart;

Begin

Abrir(Abc);

CargarVector(Abc,Vart);

OrdenarVector(Vart,LimiteInferior,LimiteSuperior);

MostrarOrdenado(Abc,Vart,LimiteSuperior);

close(abc)

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

RE:SE ME CAE EL PELO!!!

Publicado por Diego Romero (996 intervenciones) el 01/09/2007 01:04:14
De la forma que lo haces pierdes la relación Numero de Articulo->Precio, estás ordenando solo esa columna pero la de precio permanece en el mismo orden.

Por qué no mejor declaras un arrar de registros Rabc, cargas ese array con los datos del archivo (son del mismo tipo) en orden secuencial, ordenas el array, y reescribes el archivo secuencialmente. Por último muestras el archivo y ya está.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SE ME CAE EL PELO!!!

Publicado por Juan (83 intervenciones) el 02/09/2007 20:21:57
Hice lo que me dijiste pero ahora no compila porque hay un error creo cuando asigno un vector de registros a otro vector de registros, no se puede hacer eso? o se tiene que hacer Vector[i].campo:=Vector[i+1].campo, campo por campo o todo junto Vart[i]:=Vart[i+1]????, bueno, decime a ver como puedo hacer o en que me estoy equivocando, porque en la linea "intercambio(Vart[i],Vart[i+1])" me tira el error "parameters have to match exactly:got Rabc exected Vart", pero yo le estoy mandando parametros vart, y coinciden, no se porque me dice que le estoy mandando parametros de tipo registro.
Acá dejo el código a ver si podemos matar al bicho este de una vez por todas, ya esta cobrando vida:

Program ej12S1;

const

LimiteInferior=0;

LimiteSuperior=89;

Type

Rabc=record

Nart:word;

Precio:real

end;

ArchAbc=file of Rabc;

VecArt=array[LimiteInferior..LimiteSuperior] of Rabc;



Procedure Abrir(var Art:ArchAbc);

Begin

assign(Art,'Abc.dat');

reset(Art);

end;

Procedure CargarVector(var Art:ArchAbc;Var Vart:VecArt);

var

i:Byte;

rart:rabc;

Begin

i:=0;

while not eof(Art) do

begin

read(art,rart);

Vart[i].Nart:=Rart.Nart;

Vart[i].Precio:=Rart.Precio;

i:=i+1

end

end;

Procedure Intercambio(var Entidad1,Entidad2:VecArt);

Var Aux:VecArt;

Begin

Aux:=Entidad1;

Entidad1:=Entidad2;

Entidad2:=Aux

end;

Procedure OrdenarVector(var Vart:VecArt;LimiteInferior,LimiteSuperior:word);

Var i:byte;

Fin:word;

Begin

while LimiteInferior<LimiteSuperior do

begin

Fin:=LimiteSuperior-1;

LimiteSuperior:=0;

for i:=LimiteInferior to Fin do

begin

if VArt[i].Nart>VArt[i+1].Nart then

begin

Intercambio(VArt[i],VArt[i+1]);

limiteSuperior:=i

end

end

end

end;

Procedure MostrarOrdenado(Var Art:ArchAbc;Var Vart:VecArt;Card:byte);

var

i:byte;

begin

for i:=1 to card do

begin

writeln('Nro de Articulo es:',VArt[i].Nart);

writeln('Precio: ',Vart[i].Precio:5:2)

end

end;

Var
abc:ArchAbc;

Vart:Vecart;

Begin

Abrir(Abc);

CargarVector(Abc,Vart);

OrdenarVector(Vart,LimiteInferior,LimiteSuperior);

MostrarOrdenado(Abc,Vart,LimiteSuperior);

close(abc)

end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SE ME CAE EL PELO!!!

Publicado por Diego Romero (996 intervenciones) el 02/09/2007 22:23:57
El procedimiento Intercambio(); tal como lo tienes declarado espera dos vectores de tipo VecArt, tú le estás pasando dos posiciones de vector.

Lo que quieres hacer con ese procedimiento es intercambiar dos posiciones del mismo vector, cada posición del vector es de tipo Rabc, por lo tanto, lo que quieres es intercambiar los valores de dos registros de Rabc.

Entonces Intercambio debe recibir dos tipo Rabc y no dos vectores VecArt.

Procedure Intercambio(var Entidad1,Entidad2:Rabc);

Finalmente la variable local Aux también debe ser de tipo Rabc.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SE ME CAE EL PELO!!!

Publicado por juan (83 intervenciones) el 03/09/2007 03:00:07
Esta todo barbaro ahora. El problema es este, cuando imprimo me imprime todo en 0, mira te dejo el código, sospecho que hice algo mal al momento de la carga, volvi a hacer el archivo abc.dat con los datos que te habia dicho antes solo par aestar seguro, pero no, sigue imprimiendo todo en 0.

Program ej12S1;

const

LimiteInferior=0;

LimiteSuperior=89;

Type

Rabc=record

Nart:word;

Precio:real

end;

ArchAbc=file of Rabc;

VecArt=array[LimiteInferior..LimiteSuperior] of Rabc;



Procedure Abrir(var Art:ArchAbc);

Begin

assign(Art,'Abc.dat');

reset(Art)

end;

Procedure CargarVector(var Art:ArchAbc;Var Vart:VecArt);

var

i:Byte;

rart:rabc;

Begin

i:=0;

while not eof(Art) do

begin

read(art,rart);

Vart[i].Nart:=Rart.Nart;

Vart[i].Precio:=Rart.Precio;

i:=i+1

end

end;

Procedure Intercambio(var Entidad1,Entidad2:Rabc);

Var Aux:Rabc;

Begin

Aux:=Entidad1;

Entidad1:=Entidad2;

Entidad2:=Aux

end;

Procedure OrdenarVector(var Vart:VecArt;LimiteInferior,LimiteSuperior:word);

Var i:byte;

Fin:word;

Begin

while LimiteInferior<LimiteSuperior do

begin

Fin:=LimiteSuperior-1;

LimiteSuperior:=0;

for i:=LimiteInferior to Fin do

begin

if VArt[i].Nart>VArt[i+1].Nart then

begin

Intercambio(VArt[i],VArt[i+1]);

limiteSuperior:=i

end

end

end

end;

Procedure MostrarOrdenado(Var Art:ArchAbc;Var Vart:VecArt);

var

i:byte;

begin

reset(Art);

for i:=0 to filesize(Art)-1 do

begin

writeln('Nro de Articulo es:',VArt[i].Nart);

writeln('Precio: ',Vart[i].Precio:5:2);

end

end;

Var
abc:ArchAbc;

regAbc:Rabc;

Vart:Vecart;

Begin

Abrir(Abc);

CargarVector(Abc,Vart);

OrdenarVector(Vart,LimiteInferior,LimiteSuperior);

MostrarOrdenado(Abc,Vart);

close(abc);

readln

end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SE ME CAE EL PELO!!!

Publicado por Diego Romero (996 intervenciones) el 03/09/2007 05:41:38
¿No será que los registros que cargas del archio están al principio del array y tú ves en la pantalla los lugares vacíos al final del array?. Pon un readkey dentro del for que está en MostrarOrdenado...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SE ME CAE EL PELO!!!

Publicado por juan (83 intervenciones) el 03/09/2007 22:04:52
asi quedo el codigo con el readkey, pero sigue imprimiendo en cero, por favor ayudame a ver cual es el problema, te agradezco la dedicacion

Program ej12S1;

Uses Dos,crt;

const

LimiteInferior=0;

LimiteSuperior=89;

Type

Rabc=record

Nart:word;

Precio:real

end;

ArchAbc=file of Rabc;

VecArt=array[LimiteInferior..LimiteSuperior] of Rabc;



Procedure Abrir(var Art:ArchAbc);

Begin

assign(Art,'Abc.dat');

reset(Art)

end;

Procedure CargarVector(var Art:ArchAbc;Var Vart:VecArt);

var

i:Byte;

rart:rabc;

Begin

i:=0;

while not eof(Art) do

begin

read(art,rart);

Vart[i].Nart:=Rart.Nart;

Vart[i].Precio:=Rart.Precio;

i:=i+1

end

end;

Procedure Intercambio(var Entidad1,Entidad2:Rabc);

Var Aux:Rabc;

Begin

Aux:=Entidad1;

Entidad1:=Entidad2;

Entidad2:=Aux

end;

Procedure OrdenarVector(var Vart:VecArt;LimiteInferior,LimiteSuperior:word);

Var i:byte;

Fin:word;

Begin

while LimiteInferior<LimiteSuperior do

begin

Fin:=LimiteSuperior-1;

LimiteSuperior:=0;

for i:=LimiteInferior to Fin do

begin

if VArt[i].Nart>VArt[i+1].Nart then

begin

Intercambio(VArt[i],VArt[i+1]);

limiteSuperior:=i

end

end

end

end;

Procedure MostrarOrdenado(Var Vart:VecArt);

var

i:byte;

begin

for i:=0 to i do

begin

writeln('Nro de Articulo es:',VArt[i].Nart);

writeln('Precio: ',Vart[i].Precio:5:2);

readkey

end

end;

Var
abc:ArchAbc;

regAbc:Rabc;

Vart:Vecart;

Begin

Abrir(Abc);

CargarVector(Abc,Vart);

OrdenarVector(Vart,LimiteInferior,LimiteSuperior);

MostrarOrdenado(Vart);

close(abc);

readln

end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SE ME CAE EL PELO!!!

Publicado por juan (83 intervenciones) el 03/09/2007 22:08:44
asi quedo el codigo con el readkey, pero sigue imprimiendo en cero, por favor ayudame a ver cual es el problema, te agradezco la dedicacion

Program ej12S1;

Uses Dos,crt;

const

LimiteInferior=0;

LimiteSuperior=89;

Type

Rabc=record

Nart:word;

Precio:real

end;

ArchAbc=file of Rabc;

VecArt=array[LimiteInferior..LimiteSuperior] of Rabc;



Procedure Abrir(var Art:ArchAbc);

Begin

assign(Art,'Abc.dat');

reset(Art)

end;

Procedure CargarVector(var Art:ArchAbc;Var Vart:VecArt);

var

i:Byte;

rart:rabc;

Begin

i:=0;

while not eof(Art) do

begin

read(art,rart);

Vart[i].Nart:=Rart.Nart;

Vart[i].Precio:=Rart.Precio;

i:=i+1

end

end;

Procedure Intercambio(var Entidad1,Entidad2:Rabc);

Var Aux:Rabc;

Begin

Aux:=Entidad1;

Entidad1:=Entidad2;

Entidad2:=Aux

end;

Procedure OrdenarVector(var Vart:VecArt;LimiteInferior,LimiteSuperior:word);

Var i:byte;

Fin:word;

Begin

while LimiteInferior<LimiteSuperior do

begin

Fin:=LimiteSuperior-1;

LimiteSuperior:=0;

for i:=LimiteInferior to Fin do

begin

if VArt[i].Nart>VArt[i+1].Nart then

begin

Intercambio(VArt[i],VArt[i+1]);

limiteSuperior:=i

end

end

end

end;

Procedure MostrarOrdenado(Var Vart:VecArt);

var

i:byte;

begin

for i:=0 to i do

begin

writeln('Nro de Articulo es:',VArt[i].Nart);

writeln('Precio: ',Vart[i].Precio:5:2);

readkey

end

end;

Var
abc:ArchAbc;

regAbc:Rabc;

Vart:Vecart;

Begin

Abrir(Abc);

CargarVector(Abc,Vart);

OrdenarVector(Vart,LimiteInferior,LimiteSuperior);

MostrarOrdenado(Vart);

close(abc);

readln

end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar