[ Foro de Pascal ]

dudas en realizar este programa

22-Oct-2009 13:02
oscar gomez
4 Respuestas

Hola profesor Nacho, mira tengo el siguiente problema y quisiera pedir tu valiosa ayuda.
se tiene un vector de enteros cualesquiera.obtener otro de forma que el contenido de cada elemento del nuevo vector sea un indice que nos indique de menor a mayor los valores de la tabla de enteros.
ejemplo:

vector dado 10 6 -7 0 12

vector resultante 3 4 2 1 6

bien profesor no se si debiera primero hacer el ordenamiento del vector dado de manera secuencial e ir guardando como temporal el indice que contiene cada valor ordenado de menor a mayor algo asi:

for i:=1 ti n-1 do
for j:=i+1 to n do
if a[i] < a[j] then
begin
temp:=a[i];
a[i]:=a[j];
a[j]:=temp;
indice:= j;
nuevovector[i]:=indice;
end;

for i:=1 to n do
write(nuevovector[i]);

profesor me gustaria su opinion de si esta podria ser una forma de solucionar el ejercicio o si estoy mal en algo o si debiera hacerlo de otra forma que sea la correcta?

Otra pregunta profesor como podria hacer para hacer el programa recursivo pues, se me ocurre y no se si pueda que podria encontrar inicialmente el elemento menor de todo el vector dado y almacenar su indice y luego excluyendo dicho elemento ,buscar el menor elemento del resto del vector y asi sucesivamente, es decir porejemplo:
en la primera vez buscaria que el menor elemento es -7 y su indice seria el 3, luego buscaria el nuevo menor que seria entre los elementos que quedaron el 0 y almacenar su indice como 4, luego buscar el menor entre los elementos que quedan que seria el 6 y su indice... no se profesor si puedes orientarme en esta parte tambien te lo agradeceria. mil gracias por tu generosa ayuda


22-Oct-2009 22:10
oscar gomez

Profesor mira pude realizar el ejercicio anterior que te expuse a traves de una copia del vector original dado, sin embargo como podria hacerlo sin necesidad de hacer una copia del vector original ni modificarlo??
24-Oct-2009 10:50
oscar gomez

se tiene un vector de enteros cualesquiera.Obtener otro de forma que el contenido de cada elemento del nuevo vector sea un indice que nos indique de menor a mayor los valores del array de enteros.
ejemplo:

1
2
3
4
5
10
5
-7
0
12
valor




1
2
3
4
5
3
4
2
1
5
indice

NOTA: el vector original (valor) no se podra modificar ni se puede hacer una copia del mismo.

Como veis profesor la idea es obtener a partir del vector valor,el vector indice que si os fijais como elementos contiene los indices del vector valor que corresponden, en su orden de menor a mayor valor ,al contenido de sus elementos.
Lo de ordenamiento fue lo que te pase en la primera pregunta de este ejercicio y en lo cual no tengo problemas, lo que no se es como hacerlo teniendo en cuenta la NOTA que da el ejercicio. espero con ello darte ahora si una vision de mi pregunta, que se basa basicamente en como hacer el ejercicio teniendo en cuenta la NOTA del ejercicio yo hago esto:

for i:=1 ti n-1 do
for j:=i+1 to n do
if a[i] < a[j] then
begin
temp:=a[i];
a[i]:=a[j];
a[j]:=temp;
indice:= j;
nuevovector[i]:=indice;
end;

pero al ejecutarlo no me va bien del todo por tu ayuda mil gracias

24-Oct-2009 11:31
Nacho Cabanes (+32)

No entiendo bien la pregunta, porque los dos vectores que muestras no son un vector original y el mismo vector ordenado, que sería algo como

vector dado 10 6 -7 0 12

vector resultante -7 0 6 10 12

Si lo que quieres realmente es ordenar, hay varios métodos de ordenación. Uno de los más sencillos es el "burbuja", pero también hay uno de "inserción directa" y un de "intercambio directo" que son fáciles de entender.

La idea general (con pequeños cambios en cada método concreto) sería algo como

para i = 1 hasta numeroDatos
 para j = i+1 hasta numeroDatos
   si dato[j]<dato[i] intercambiar (i,j)

de forma que en la primera pasada dejas colocado el dato más pequeño, en la segunda pasada dejas colocado el segundo, y así sucesivamente.


24-Oct-2009 11:58
Nacho Cabanes (+32)

Entendido, Oscar.

En tu fuente hay una cosa prohibida, según los requisitos que te piden: cuando haces

temp:=a[i];
a[i]:=a[j];
a[j]:=temp;

estás modificando el vector original.

Aun así, eso de que tampoco te dejen hacer una copia de él, es una restricción bastante fuerte, porque la mayoría de métodos de ordenación sencillos se basan en poder recolocar los elementos, de modo que obtienes el menor elemento, lo colocas al principio y ya "te olvidas de él" y te centras en los demás, para que en cada "pasada" descartes uno.

Si ordenas sobre otro vector, puedes encontrar correctamente el primer elemento, pero como lo colocas en la primera posición, volvería a aparecerte como un dato más para la segunda pasada, no puedes "olvidarte de él" con tanta facilidad.

Una forma de conseguir saber cuales has colocado ya, sin poder copiar ni modificar el vector original, sería usar un segundo vector en el que apuntaras cuáles ya están colocados (un vector de "boolean": true para indicar si ya está ordenado, o false para indicar que todavía no lo está).

Yo lo que haría es algo basado en el método de ordenación de "inserción directa": buscas el menor en cada pasada, y al final de la pasada lo colocas en su sitio correcto. El método original es algo como

para i = 1 hasta numeroDatos
 posicionMenor = i
 para j = i+1 hasta numeroDatos  
   si dato[j]<dato[i] entonces posicionMenor = j
 finpara
 intercambiar (i,posicionMenor)
finpara

En tu caso, podría ser algo como

para i = 1 hasta numeroDatos
 posicionMenor = i
 para j = i hasta numeroDatos
   si ordenado[j] = false entonces  
     si dato[j]<dato[i] entonces posicionMenor = j
 finpara
 nuevoVector[j] = i
 ordenado[j] = true;
finpara
 
Es decir, en cada pasada vuelves a comparar desde el primer valor (no desde el "i", porque no has recolocado nada), y comparas sólo los que todavía no has ordenado.

Suerte con ello!  ;-)






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)