Pascal/Turbo Pascal - Problema con invertir vector

 
Vista:

Problema con invertir vector

Publicado por Vero (9 intervenciones) el 06/02/2010 14:43:18
¡Hola! He estado leyendo todas las cuestiones sobre invertir vectores para evitar molestar a nadie, pero por más que pruebo no me sale. Debo implementar un procedimiento que reciba como único argumento un vector de nº enteros e invierta su contenido. El 1er elemento pasaría a ser el último, y el último el primero, el 2º pasaría a ser el penúltimo, etc... Esto es lo que llevo hecho del procedimiento, les agradezco la ayuda de antemano.

procedure invertir(var vector: array of real);
var
i, j, n: integer;
inv: array of real;
begin
for i:= low(vector) to (high(vector)/2) do
begin
inv:= vector[n-i+1];
vector[n-i+1]:= vector[i];
vector[i]:= inv;
end;
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:Problema con invertir vector

Publicado por Diego Romero (996 intervenciones) el 06/02/2010 16:04:40
Pufff!, tienes tantos problemas que no sé por dónde comenzar.

Asumo que no estás usando Turbo Pascal porque el parámetro vector es un open array, algo que no existe en TP.

En el for, esta parte está mal: (high(vector)/2)
El resultado de esa división es un número real, los índices de los for deben ser de tipo ordinal y un real no lo es. Lo correcto sería (high(vector) div 2). Por otro lado como estás usando un array que podría no estar basado en 1, el cálculo para determinar la mitad (es decir la posición que está a la mitad del array) es más complicado que eso.

Por ejemplo si el array va desde la posición 15 a la 20 (5 elementos), 20 div 2 da 10, lo que cae fuera del array. Entonces lo correcto sería (20-15 div 2)+5=17, o, usando tu ejemplo:

for i:=low(vector) to ((high(vector)-low(vector)) div 2)+length(vector) do

Ya dentro del for, la variable n no tiene ningún valor definido y lo que hace la fórmula para determinar el índice actual es incomprensible.

inv es a su vez otro open array que tampoco está inicializado. Y la asignación que haces es inválida, estás asignando un tipo real a un tipo array of real, creo que lo que has querido hacer es asignar la posición actual de vector, que es un real, a un real. Por lo tanto inv debería estar declarado como

inv: real;

Entonces mi versión de este procedimiento es:

procedure invertir(var vector: array of real);
var
i, j: integer;
inv: real;
begin
j:=high(vector);
for i:=low(vector) to ((high(vector)-low(vector)) div 2)+length(vector) do
begin
inv:= vector[i];
vector[j]:= vector[i];
vector[j]:= inv;
dec(j); // o bien j:=j-1;
end; // for
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