16 ago 2012

Arreglos.

Bueno, pasó mucho tiempo desde que publiqué lo último, llegué a cansarme pero quiero retomar este blog por que estoy aburrido en el trabajo sin nada para hacer.

Hay algo que es importante conocer, y son los arreglos!

Un arreglo es una variable que representa un conjunto de variables del mismo tipo. Mas que eso no hay para decir, y si te pones a pensar esto te sirve mucho cuando tenes una cantidad elevada de datos a procesar, si volvemos a los ejemplos que use en las estructuras repetitivas podes darte cuenta que están muy limitados. ¿Por qué? bueno, tenemos lo siguiente:
Quiero un algoritmo para un programa que me pida ingresar el sueldo de 1000 operarios, tal y como en los ejemplos citados, sería así:

Proceso ejemplo_ciclo
contador<-0;
      Escribir "Ingrese sueldos";
      Mientras contador<1000 Hacer
              Leer sueldos;
              contador<-contador+1;
      FinMientras
FinProceso

Bueno, ahora quiero que luego de ingresar todos los sueldos, los muestre por pantalla... Ahh y ¿cómo haces ahí? ¿así?


Proceso ejemplo_ciclo
contador<-0;
      Escribir "Ingrese sueldos";
      Mientras contador<1000 Hacer
              Leer sueldos;
              contador<-contador+1;
      FinMientras
      Escribir sueldos;
FinProceso


Lamento decirles que esto no muestra todos los sueldos ingresados por pantalla, y si creyeron que si es que no leyeron bien las guías anteriores :P. Por cada ciclo, cada vez que se lea el sueldo será reemplazado su valor anterior, entonces una vez que termina el mientras el valor de sueldo es el último que se ingresó.

Lo que hay que hacer es guardar cada sueldo en una variable diferente. ¿Cómo?, podríamos escribir 10 variables diferentes pero acá tenemos 1000 y ya no es negocio (escribir 10 tampoco es negocio ¬¬).
Es acá donde aparecen los arreglos, vos le pasas una coima a los pibes que desarrollaron el Pseint y ellos te escriben las 1000 variables 8-]... NO, con arreglo me refiero a esa dichosa variable que representa un conjunto de variables. Este tipo de variable contiene posiciones, y cada posición tiene un valor diferente, imagínenselo como muchas variables en una. Entonces mi arreglo en la posición 1 puede contener "hola", en la 2 contiene "chau", en la 3 contiene "hola de nuevo" y así hasta N posiciones.
Y ahora, ¿cómo definimos en pseudocódigo un arreglo?

Dimension arreglo(tamaño);

De mas está decir que el nombre del arreglo debe cumplir las mismas características que una variable común (alfanumérico empezando con un carácter y puede contener guión bajo).
Y de esta manera estaríamos definiendo un arreglo con una cierta cantidad de índices (tamaño).
¿Cómo accedemos a cada uno de esos indices?

Proceso ejemplo_arreglo
Dimension arreglo(10); //defino un arreglo de 10 posiciones
arreglo(2) <- 10; //accedo a la posición 2 y le asigno a la misma el valor 10
Leer arreglo(5); //accedo a la posición 5 y le asigno a la misma el ingreso del usuario
Escribir arreglo(2), " ", arreglo(5); //accedo a las posiciones 2 y 5 y las muestro
FinProceso

De esta manera, accedimos y asignamos valores a las posiciones 2 y 5 del arreglo, simplemente escribiendo la posición (en el rango del tamaño) a la que queremos acceder entre los paréntesis y las demás posiciones quedan con el valor nulo.
Cabe aclarar que las posiciones del arreglo empiezan desde 1 y no desde 0, es decir que la primer posición es: arreglo(1) y no: arreglo(0), esto último lanza un error.

Ahora, volviendo al ejemplo de los operarios, podemos hacer lo siguiente:


Proceso ejemplo_arreglo
contador<-1; //esta vez, usamos el contador para acceder a cada posición del arreglo, por lo que el valor inicial debe ser 1 y no 0.
Dimension sueldos(1000); //declaro un arreglo de 1000 posiciones
      Escribir "Ingrese sueldos";
      Mientras contador<=1000 Hacer //la condición debe ser menor o igual a 1000, por que si no la posición 1000 quedaría vacía y solo cargaríamos 999 posiciones
              Leer sueldos(contador); //el contador se va a ir sumando, entonces por cada mientras va a acceder primero a la posición 1, luego a la 2, hasta llegar a la 1000
              contador<-contador+1;
      FinMientras
//en este momento, el arreglo sueldos tendrá cargados todos los sueldos en cada una de las 1000 posiciones
contador<-1; //re-inicializo el contador para volver a recorrer el arreglo
//Vuelvo a recorrer el arreglo pero esta vez muestro cada una de sus posiciones
      Escribir "Lista de sueldos";


      Mientras contador<=1000 Hacer
              Escribir sueldos(contador);
              contador<-contador+1;
      FinMientras

FinProceso

Este ejemplo da solución efectiva al problema. Lo que hice fue recorrer dos veces cada una de las posiciones (índices) del arreglo sueldos, en la primer recorrido cargo los sueldos, en la segunda los muestro. Sin embargo, usar la estructura mientras para recorrer arreglos no es lo mas "cómodo", por que como vieron tuve que volver a inicializar el contador, determinar la condición correcta, y hacer la suma del contador dentro del bucle ademas de que "contador" no es un buen nombre para una variable que vamos a usar para acceder a indices. Todo esto se soluciona usando el bucle Para, de la siguiente manera:

Proceso ejemplo_arreglo
Dimension sueldos(1000);
Escribir "Ingrese sueldos";
Para i<-1 Hasta 1000 Con Paso 1 Hacer //Para i (indice) valiendo 1 hasta 1000 sumando de a 1
        Leer sueldos(i);
FinPara
Escribir "Lista de sueldos";
Para i<-1 Hasta 1000 Con Paso 1 Hacer
        Escribir sueldos(i);
FinPara


FinProceso

De esta manera evitamos escribir varias lineas de código innecesarias, si bien en la estructura Para, inicializamos la variable que se suma (i) e implícitamente la misma se va sumando, todo esto queda en una sola línea y mas comprensible. Podrán notar que nombré a la variable 'i' para indicar que la usaremos como indice, por convención y costumbre la mayoría de los programadores suelen llamar a estas variables 'i' o 'j', pero podes llamarlas como quieras.

Bueno, todo esto no es nada de lo que se puede exprimir sobre arreglos, es simplemente lo mínimo que creo que hay que saber, y en general todo lo que hay en el blog sobre pseudocódigo es lo mínimo... seguramente valla agregando mas cosas con el tiempo.. Saludos!

No hay comentarios:

Publicar un comentario