Variables y estado

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.
El cartel de "lugares disponibles" en la entrada de un estacionamiento muestra un número distinto según el momento en que alguien lo mira: puede decir 12 a las nueve de la mañana y 3 al mediodía, sin que el cartel en sí haya cambiado de lugar ni de forma. Lo único que cambia es el valor que ese nombre -"lugares disponibles"- representa en cada instante, a medida que entran y salen autos. La capacidad total del estacionamiento, en cambio, es el mismo número todo el día: no depende de ningún auto que entre o salga.
Los algoritmos de esta serie ya usaron esta idea sin nombrarla: total en el algoritmo que sumaba los primeros números, contador en cada bucle, lugares disponibles en el ejemplo de este párrafo. Todos son nombres cuyo valor cambia mientras el algoritmo se ejecuta. Este post le pone nombre a eso.
Una variable es un nombre que puede guardar valores distintos en distintos momentos de la ejecución de un algoritmo. Que se llame igual en todo el algoritmo no significa que valga lo mismo en todo el algoritmo: lo que vale en un momento dado depende de qué pasó antes, en qué orden.
Lo opuesto a una variable, dentro del mismo algoritmo, es una constante: un valor que se mantiene igual desde que arranca la ejecución hasta que termina. La capacidad de un estacionamiento, el porcentaje de un descuento, el precio de un producto que no cambia mientras se calcula una compra: ninguno de esos valores se actualiza a medida que el algoritmo avanza, así que no son variables aunque tengan un nombre igual que cualquier otro.
Todos los algoritmos anteriores de esta serie ya actualizaban variables, con verbos concretos: "sumar X al total", "multiplicar el producto por contador", "restar el descuento al subtotal". Cada uno de esos verbos es, por debajo, la misma operación: tomar el valor que el nombre tiene en ese momento, calcular uno nuevo a partir de él, y que el nombre pase a valer eso de ahí en adelante. El verbo general para esa operación es asignar:
asignar un valor a un nombre"Sumar 3 al total" es asignarle a total el resultado de sumar su valor actual más 3. La diferencia con una asignación directa es que esta última no necesita el valor anterior para nada: asignar verdadero a hay_luz reemplaza por completo lo que hay_luz valía antes, sin usarlo en el cálculo.
El siguiente algoritmo sigue el cartel de disponibilidad de un estacionamiento a lo largo de una mañana con movimiento de autos.
algoritmo actualizar_disponibilidad(capacidad):
asignar capacidad a lugares_disponibles
restar 1 a lugares_disponibles
restar 1 a lugares_disponibles
sumar 1 a lugares_disponibles
restar 1 a lugares_disponibles
devolver lugares_disponiblesCon una capacidad de 40 lugares: arranca en 40 (un auto entra, resta 1: 39; otro auto entra, resta 1: 38; un auto sale, suma 1: 39; otro auto entra, resta 1: 38). El resultado final es 38. capacidad nunca vuelve a tocarse después de la primera línea: es la constante del algoritmo. lugares_disponibles cambia cuatro veces, y su valor final no depende solo de cuántos autos entraron y salieron en total, sino del orden exacto en que ocurrieron esos cuatro eventos -la misma idea de secuencia del post anterior, aplicada ahora a un valor que se actualiza paso a paso en vez de calcularse una sola vez.
Un termómetro digital registra la temperatura de una habitación a lo largo de la mañana: arranca en una temperatura inicial, sube 2 grados, baja 1 grado y sube 3 grados más. Calcular la temperatura al final de la mañana.
Pista: es la misma estructura del ejemplo anterior, cambiando qué representa el nombre que se actualiza. Antes de escribir nada, conviene identificar cuál de los datos del enunciado es la variable que va a cambiar varias veces, y cuál es apenas el valor de arranque.
algoritmo temperatura_final(temperatura_inicial):
asignar temperatura_inicial a temperatura
sumar 2 a temperatura
restar 1 a temperatura
sumar 3 a temperatura
devolver temperaturaCon una temperatura inicial de 18 grados: 18 + 2 = 20, 20 - 1 = 19, 19 + 3 = 22. El resultado es 22 grados. temperatura_inicial se usa una sola vez, al arrancar; de ahí en más, todo el trabajo lo hace temperatura, que es la que efectivamente cambia con cada paso.
Una caja registradora arranca el día con un monto fijo para dar vuelto. Durante la mañana se realizan tres ventas y se devuelve el importe completo de una compra que se canceló después de cobrada. Calcular cuánto dinero queda en la caja al mediodía.
Pista: el monto con el que arrancó el día no vuelve a usarse una vez que empiezan las operaciones -de ahí en más, lo único que importa es cómo cambia la caja con cada movimiento, en el orden en que ocurren-. Una devolución no es distinta, en su mecánica, de una venta: la única diferencia es si el monto se suma o se resta.
algoritmo caja_al_mediodia(monto_inicial, venta_1, venta_2, venta_3, devolucion):
asignar monto_inicial a caja
sumar venta_1 a caja
sumar venta_2 a caja
sumar venta_3 a caja
restar devolucion a caja
devolver cajaCon un monto inicial de $5000, ventas de $1200, $800 y $2500, y una devolución de $800: la caja pasa por 5000, 6200, 7000, 9500 y termina en 8700. Cambiar el orden en que se registran la tercera venta y la devolución no altera este resultado en particular -sumar y restar montos fijos da lo mismo en cualquier orden-, pero eso no es una propiedad de las cajas registradoras: es una casualidad de que estas operaciones puntuales son independientes entre sí, no una garantía general de cualquier secuencia de cambios sobre una variable.
Una variable es un nombre cuyo valor puede ser distinto en distintos momentos de la ejecución de un algoritmo; una constante es un nombre cuyo valor no cambia nunca dentro de esa misma ejecución. Todo lo que hasta ahora se escribió como "sumar", "restar" o "multiplicar" sobre un nombre es, por debajo, la misma operación: asignarle un valor nuevo, calculado a partir del que tenía. Reconocer cuáles de los datos de un problema son variables y cuáles son constantes es el primer paso antes de decidir qué hacer con cada uno.
El próximo paso de la serie entra en los tipos de datos que una variable puede guardar -números, texto, valores de verdadero o falso, y la idea de una colección en general- y por qué esa distinción existe, más allá de cualquier sintaxis puntual para declararla.