Hola y bienvenidos. El tema de esta lección es arreglos en una dimensión y las operaciones algorítmicas que podemos hacer sobre ellos Y para ayudarnos a entender estos conceptos usaremos a un grupo de voluntarios muy animados. Como bien sabemos, en programación orientada a objetos podemos manejar fácilmente asociaciones en tres clases. Pensemos, por ejemplo, en un estudiante dentro de un curso siendo curso y estudiante, clases de nuestro programa. En este caso la clase curso tendría una asociación con la clase estudiante ¿Pero qué sucede cuando tenemos dos estudiantes en el curso? Bueno, podemos interactuar con ambas instancias de manera relativamente simple cada uno de estos estudiantes sería una asociación entre la clase curso y la clase estudiante. Con cinco estudiantes las cosas se comienzan a complicar, porque necesitaríamos cinco asociaciones diferentes, una para cada estudiante. Y con 10 estudiantes empezamos a tener problemas. 20 estudiantes, 50 estudiantes o 100 estudiantes son una cantidad demasiado grande para manejarlos individualmente como asociaciones Es aquí donde entra en juego uno de los conceptos fundamentales de la programación. los arreglos de objetos. Para efectos prácticos imaginemos que tenemos 10 estudiantes en el curso. Para evitarnos tener una asociación o atributo independiente para cada uno de ellos dentro de la clase curso. vamos a ponerlos a todos dentro de una estructura contenedora o arreglo. Cada uno en una casilla separada, numerada desde cero hasta nueve. De esta forma necesitamos una única asociación entre la clase curso y la estructura que contiene todos los estudiantes. A partir de ahora podemos interactuar con esta estructura contenedora para obtener información de nuestro conjunto de estudiantes. Empecemos por interactuar con un estudiante en particular. basta con decir que queremos al estudiante en una posición determinada del arreglo. la posición cuatro en este caso, por ejemplo, y vamos a esa posición del arreglo y podemos obtener al estudiante para usar los métodos de esta instancia particular que los provee la clase de estudiante. Pero vamos un poco más allá, obtengamos información del conjunto. supongamos que queremos obtener el promedio general de todos los estudiantes del curso. Bien, vamos a recorrer nuestro arreglo preguntándole a cada estudiante por su nota para calcular el promedio final. Esto es lo que denominamos un patrón de recorrido total, cuando debemos recorrer todos los elementos del arreglo para operar de alguna manera sobre estos. La complejidad en tiempo de este patrón de recorrido es de ODN en el peor de los casos y omega N en el mejor. En cualquier caso, siempre debemos recorrer todo el arreglo. Veremos ahora otra necesidad diferente, supongamos que queremos saber si al menos un estudiante del curso obtuvo una nota superior a cuatro. En este caso comenzamos recorriendo en orden el arreglo desde la posición cero preguntando a cada estudiante su nota y en cuanto encontráramos uno con una nota superior a cuatro, como en este caso en la quinta posición, dejamos de busca hemos cumplido con nuestro propósito. Esta búsqueda es ligeramente diferente, este es un patrón de recorrido parcial. En cuanto encontramos lo que buscamos detenemos la búsqueda sin tener que recorrer todo el arreglo innecesariamente. La complejidad de este patrón de recorrido es de ODN en el peor de los pasos y de omega uno en el mejor. En el peor escenario el elemento que buscamos no está en el arreglo y en el mejor, en la primera posición en la que buscamos. Veamos el pseudocódigo para los dos patrones de recorrido que hemos ilustrado durante esta lección sobre los arreglos en una dimensión El patrón de recorrido total y el patrón de recorrido parcial. Empecemos por el patrón de recorrido total y tomemos como ejemplo, supongamos que queramos contar los elementos de un arreglo que cumplen con una condición en particular, que vamos a llamar "X". Esto obviamente se puede generalizar y podemos hacer el conteo de todos los elementos en general o cualquier otra función que se nos pueda ocurrir. Veamos entonces, sea "A" nuestro arreglo de elementos, sea "N" igual a "cero". "N" va a ser la variable que nos permitirá ir por cada una de las posiciones, y que vamos a ir incrementando a medida que avanzamos en el ciclo para recorrer nuestro arreglo. Y sea contador igual a cero. Contador es la variable que nos va a permitir contar el número de elementos Y la vamos a incrementar siempre que encontremos un elemento que cumpla con "X". Entonces declaramos el ciclo mientras "N" sea mayor al tamaño del arreglo, es decir, tamaño "A". y ponemos esta condición bastante simple Si el elemento en la posición "N de "A" cumple con "X", aumentamos el valor de contador en una unidad. Si no, pues obviamente no hacemos nada, no tenemos que escribirlo. Y finalmente al final de la iteración incrementamos el valor de N en 1. Y como vemos, este ciclo va a iterar hasta el final, hasta que "N" sea igual al tamaño del arreglo "A". Y por último, al final del método retornamos la variable contador, porque lo que queremos saber en último es cuántos elementos cumplen con "X". Pasemos entonces ahora a el patrón de recorrido parcial En este caso queremos buscar un elemento, el primer elemento que cumpla con la característica "X". Y vamos a retornar su posición. Una vez lo encontremos, es evidente que no queremos seguir iterando, porque solo queremos el primer elemento que cumpla con esa condición Comencemos, sea A nuestro arreglo, sea "N=0" y su función va a ser idéntica a la del ejemplo anterior, y sea posición de elemento buscado igual a "-1". Vamos a tomar como convención que "-1" significa que el elemento no fue encontrado dentro del arreglo. Así al final de nuestro método, si retornamos "-1", es decir, si no encontramos ningún elemento que cumpliese con "X". Sabremos que no había elementos que cumpliesen con "X" justamente. Y finalmente una variable booleana "encontrado" que vamos inicialmente a declarar como falso. ¿Por qué? Bueno, porque no hemos encontrado todavía el elemento. Y vamos a hacer nuestro ciclo, el ciclo se parece o la condición se parece mucho a la anterior, pero tiene un elemento adicional. Mientras encontrado sea igual a "falso", es decir, mientras no hayamos encontrado el elemento Y mientras "N" sea menor que el tamaño del arreglo, que ya lo vimos. Los ponemos en este orden, y es importante ponerlos en este orden, por ser un poco más eficientes. Como se van a evaluar las condiciones, primero se evalúa la condición que está a la izquierda, y luego la condición que está a la derecha en este caso. Si las pusiéramos al revés existe la posibilidad de que "N" menor que tamaño de "A", es decir, que estemos todavía dentro del arreglo. Pero que ya hayamos encontrado el elemento, en este caso estaremos desperdiciando una evaluación de una de las condiciones. no es demasiado, pero es importante como buena práctica de programación. Así que siempre que lo encontremos, nuestro método sabrá que tendremos que detener la iteración. Bien, luego ponemos un condicional simple, si el elemento en la posición "N" de nuestro arreglo "A" cumple con "X" Hacemos lo siguiente, la posición del elemento buscado va a cambiar a "N". Porque nos va a indicar justamente "N" en qué posición del arreglo vamos o estamos revisando. Y cambiamos nuestra variable booleana "encontrado" de falso a verdadero. Y fuera del condicional pues como siempre el incremento "N = N + 1". Así para la siguiente iteración, si se entra al condicional no se va a seguir iterando. Porque el valor de "encontrado" ya no es igual a falso, sino es verdadero. Y al final de nuestro algoritmo retornamos la posición del elemento buscado. Vemos que es entonces un patrón de recorrido parcial, porque en lugar de recorrer todos los elementos del arreglo hasta el final, los recorremos hasta que encontremos el elemento que estábamos buscando. Obviamente en el peor de los casos si el elemento no existe, tendremos igual que recorrer a todos los elementos del arreglo, pero si tenemos buena suerte. El mejor de los casos será igual a uno. Es decir, el elemento que buscamos coincidirá con el elemento que está en la primera posición. Esperamos que los conceptos fundamentales de arreglo en una dimensión y patrones de recorrido hayan quedado claros. Los invitamos para poner en práctica estos nuevos conocimientos en los ejercicios, y los esperamos en la próxima lección.