BASICOS DE LA PROGRAMACION V


Después de muchísimo tiempo, he vuelto a esta sección, que es tan necesaria para quienes quieren aprender a programar. Como primera medida, vamos a seguir un poco más con vectores.


Pensemos ahora en el hecho de tener que sacar un máximo de un vector, pensandolo un poco, una vez ingresados todos los elementos vamos a necesitar un primer valor que haga de máximo, este para uestra comodidad va a ser el primer elemento del vector, y después lo podremos comparar con todos los valores restantes del vector.

COMIENZO
vec(30)
PARA i=1 A 30
     INGRESAR "Ingrese nro.: ",vec(i)
PROXIMO
maximo=vec(1)
PARA i=2 A 30
     SI vec(i)> maximo ENTONCES
          maximo=vec(i)
     FIN SI
PROXIMO
IMPRIMIR "Valor máximo: ",maximo
FIN

Si lo que queremos es conseguir un mínimo, lo único que hay que hacer es invertir el mayor por un menor.

Ordenamiento de vectores

Para ordenar un vector (o cualquier otra cosa, llamese matriz, lista, lo que quieran) existen muchos métodos. El que voy a explicar es el método del burbujeo, un método más que sencillo y eficaz.

La idea de este método es ir tomando los elementos de a 2 e ir comparandolos e intercambiandolos de ser necesario, hasta que todos los elementos sean comparados. Pero mejor veamos el código y después voy explicando.

COMIENZO
vec(10)
cota=10
k=1
HACER MIENTRAS k<gt;0
     k=0
     PARA i=1 A cota-1
          SI vec(i)>vec(i+1) ENTONCES
               aux=vec(i)
               vec(i)=vec(i+1)
               vec(i+1)=aux
               k=i
          FIN SI
     PROXIMO
     cota=k
REPETIR
FIN

Lo primero que hacemos en este ordenamiento es poner una cota cuyo valor es la cantidad de elementos del vector. Creamos también una variable (en este caso la llamé k) que puede tener 2 valores, 0 si el vector está ordenado y otro nro. distinto de 0 para decir que el vector está desordenado.
Ponemos k en un valor distinto de 0 para que entre en el ciclo HACER MIENTRAS, y lo primero que hacemos dentro de este ciclo es poner a k=0, suponiendo entonces que después de cumplir con el ciclo HACER MIENTRAS, el vector estará ordenado.
Lo que sigue es un ciclo PARA que va a ir desde 1 hasta cota-1, y dentro de este ciclo se haran las comparaciones de valores dentro del vector.
Ahora bien, lo que queremos es ordenar todos los valores, asi que aca está lo principal del asunto. Si vec(i) > vec(i+1) entonces habrá que intercambiar sus elementos. Si no lo entendieron, dense cuenta que lo que hace el programa aca es comparar un elemento del vector con el siguiente. Para intercambiar los valores de lugar necesitaremos una variable auxiliar, donde prondremos el valor del primer elemento. Luego ponemos el valor de vec(i+1) en vec(i) y por último el valor de aux en vec(i+1).
Algo importante a observar aca es que queda explicadas en estas lineas el porque de que el ciclo vaya de 1 a cota-1. Pasa que si fuera hasta cota, al hacer i+1 en la posición i=cota, lo compararíamos con la posición inexistente vec(cota+1). Coomo se ve en el código que puse, cuando i llegue a cota, i valdrá 10 y al compararlo con i+1 compararía vec(10) con el inexistente vec(11).
k=i significa que le asignamos a k el valor de los últimos elementos comparados. Esto tiene 2 significados, el primero es que si k=0, va a salir del ciclo HACER MIENTRAS ya que significaría que el vector finalmente está ordenado. Esto viene conectado al segundo significado, que tiene que ver con la linea cota=k, para que cota cada vez valga 1 menos que antes, porque no tiene sentido comparar algo con la últioma posición después de la primer pasada, ya que se supone que por las comparaciones, siempre el elemento + grande pasa al fondo del vector.
El programa va a hacer cota-1 pasadas por el ciclo PARA enviando siempre el elemento más grande de los comparados a vec(cota), haciendo con esto que esas posiciones no deban volver a ser comparadas.
Voy a mostrar como va ordenando de una manera + práctica (esto medio choreado pero sirve de ejemplo). Pido que si pueden vayan siguiendo el pseudo-código para ver que si se cumple lo que voy escribiendo.

Supongamos que un vector de 10 elementos tiene estos valores:

9 7 6 5 4 3 11 8 10 2

En la primera pasada por el ciclo PARA nos quedaría esto:

7 6 5 4 3 8 9 10 2 11

Como dije, en la segunda pasada no hará falta comparar hasta el último elemento, ya que como se ve, el valor + grande pasa al último lugar.

6 5 4 3 7 8 9 2 10 11

Y así van las sucesivas pasadas:

5 4 3 6 7 8 2 9 10 11 tercera pasada

4 3 5 6 7 2 8 9 10 11 cuarta pasada

3 4 5 6 2 7 8 9 10 11 quinta pasada

3 4 5 2 6 7 8 9 10 11 sexta pasada

3 4 2 5 6 7 8 9 10 11 séptima pasada

3 2 4 5 6 7 8 9 10 11 octava pasada

2 3 4 5 6 7 8 9 10 11 novena pasada

2 3 4 5 6 7 8 9 10 11 décima pasada

Lo que se `puede ver es que quizá la falencia de este método es que como si o si va a hacer cota - 1 pasadas, muchas veces puede hacer pasadas inclusive con el vector ya ordenado.

Si queremos ordenar el vector descendente cambiamos el signo en la instrucción del SI por vec(i)<vec(i+1).

Entiendo que a la primer lectura esto puede resultar algo complicado de entender, pero siguiendo con el código el ordenamiento de nrs. que puse después se puede ir comprendiendo bien.

Cualquier duda comuniquense conmigo. Hasta la próxima

Ingwe