Listas y arreglos

Enterate del próximo post
Un mail cuando publico algo nuevo. Sin spam y te podés dar de baja cuando quieras.

Un mail cuando publico algo nuevo. Sin spam y te podés dar de baja cuando quieras.
Una lista de reproducción guarda las canciones en el orden exacto en que se agregaron: hay una primera canción, una segunda, y la que se acaba de sumar queda al final. Cambiar el orden -mover una canción dos lugares más arriba- cambia la lista, aunque las canciones sigan siendo exactamente las mismas. Y contar cuántas canciones tiene la lista es una pregunta aparte de cuáles son esas canciones.
El post anterior nombró la colección como una categoría, sin ninguna forma concreta todavía: solo "varios valores agrupados bajo un mismo nombre". Este post le da su primera forma real: una lista, donde cada valor ocupa una posición fija y se puede leer o cambiar por esa posición, sin tocar el resto.
Una lista (también llamada arreglo, el mismo concepto con otro nombre) es una colección ordenada de valores. Dos cosas la distinguen de "varios valores sueltos": el orden es parte del dato -no es lo mismo la lista con 10, 20 y 30 que la lista con 30, 20 y 10, aunque contengan los mismos tres números-, y cada valor ocupa una posición: primero, segundo, tercero, y así.
Este post cuenta las posiciones empezando en 1, porque es la forma en que ya se cuenta en cualquier situación cotidiana -el primer día del mes, la segunda persona de una fila-. Vale la pena anticipar algo para más adelante: varios lenguajes reales cuentan las posiciones empezando en 0, una convención propia de esos lenguajes y no del concepto en sí, de la misma forma en que 212 y 212.0 eran dos formas distintas de mostrar el mismo resultado en el primer post de esta serie.
La notación de esta serie escribe una lista entre corchetes, separando los valores con comas: [7, 9, 6, 8, 10] es una lista de cinco elementos, y [] es una lista vacía, sin ningún valor todavía.
Sobre una lista ya armada se puede: leer el valor de una posición (el elemento en la posición N de lista), reemplazar el valor de una posición sin tocar las demás (asignar valor al elemento en la posición N de lista), preguntar cuántos elementos tiene (la cantidad de elementos de lista), y agregar un valor nuevo al final (agregar valor al final de lista). Ninguna de estas operaciones necesita revisar el resto de la lista: cambiar la tercera posición no obliga a mirar la primera ni la quinta.
El siguiente algoritmo corrige una nota cargada por error, reemplazando el valor de una posición puntual sin tocar las demás.
algoritmo corregir_nota(notas, posicion, nota_correcta):
asignar nota_correcta al elemento en la posición posicion de notas
devolver notasCon notas en [7, 9, 6, 8, 10], posicion en 3 y nota_correcta en 8: la tercera posición, que tenía un 6 cargado por error, pasa a valer 8. El resto de la lista no cambia, y el resultado es [7, 9, 8, 8, 10].
El segundo ejemplo recorre una lista completa con un bucle definido, la misma herramienta del post anterior, para calcular el promedio de esas cinco notas ya corregidas.
algoritmo promedio_notas(notas):
asignar 0 a total
repetir contador desde 1 hasta la cantidad de elementos de notas:
sumar el elemento en la posición contador de notas a total
dividir total por la cantidad de elementos de notas
devolver totalCon notas en [7, 9, 8, 8, 10]: el bucle recorre las cinco posiciones, sumando cada elemento a total en el orden en que aparece -7, después 16, después 24, después 32, después 42-. La cantidad de elementos de notas es 5, así que 42 dividido 5 da 8,4, el promedio final. El contador que recorre las posiciones y el total que acumula la suma son dos valores distintos que avanzan juntos, uno marcando dónde está el bucle y el otro guardando el resultado.
Una lista guarda los pedidos ya confirmados de un restaurante, en el orden en que llegaron. Escribir el algoritmo que agrega un pedido nuevo al final de la lista y devuelve cuántos pedidos hay en total después de agregarlo.
Pista: agregar un valor al final de una lista no reemplaza ninguna posición existente, suma una posición nueva. La cantidad de elementos, después de agregar, tiene que reflejar ese cambio.
algoritmo registrar_pedido(pedidos, pedido_nuevo):
agregar pedido_nuevo al final de pedidos
devolver la cantidad de elementos de pedidosCon pedidos en ["milanesa", "pizza", "ensalada"] y pedido_nuevo en "pastas": después de agregarlo, la lista pasa a tener cuatro posiciones -["milanesa", "pizza", "ensalada", "pastas"]-, y el algoritmo devuelve 4. Una lista no está limitada a guardar números: estos elementos son textos, y las mismas cuatro operaciones -leer, reemplazar, contar, agregar- funcionan igual, sin importar de qué tipo sea cada valor.
Un local de indumentaria registra el precio de cada venta del día, en el orden en que se hicieron. Al cerrar, quiere saber cuál fue el precio de venta más bajo, para decidir si conviene ajustar el precio mínimo del local.
Pista: conviene empezar suponiendo que el primer valor de la lista ya es el más bajo, y después comparar el resto contra esa suposición, cambiándola cada vez que aparece un valor todavía más bajo.
algoritmo venta_mas_baja(ventas):
asignar el elemento en la posición 1 de ventas a minima
repetir contador desde 2 hasta la cantidad de elementos de ventas:
si el elemento en la posición contador de ventas es menor a minima:
asignar el elemento en la posición contador de ventas a minima
devolver minimaCon ventas en [4500, 3200, 6000, 2800, 5100]: minima arranca en 4500, la primera venta. La segunda posición (3200) es menor, así que minima pasa a 3200. La tercera (6000) no es menor a 3200, no cambia nada. La cuarta (2800) sí es menor, minima pasa a 2800. La quinta (5100) ya no es menor a 2800. El resultado final es 2800, sin que el algoritmo haya necesitado ordenar la lista ni mirar más de una vez cada posición.
Una lista agrega dos cosas que "varios valores agrupados" todavía no tenía: un orden fijo y una posición para cada valor, la forma de pedir uno sin mencionar a los demás. Leer, reemplazar, contar y agregar son las cuatro operaciones básicas, y ninguna depende de saber qué hay guardado en el resto de las posiciones.
El próximo paso de la serie sigue dentro de las colecciones, pero cambia la forma de identificar cada valor: en vez de una posición numérica fija por el orden de llegada, un nombre propio elegido para cada uno.