hagan un algoritmo
y mi nieve de limón ;)
el otro día mi hermano menor —que anda en la prepa— vino a pedirme una mano con su clase de computación. están empezando a ver programación y le dejaron una práctica que me dejó pensando.
el escenario era este:
- lenguaje de la clase: C (con la consigna de no usar lenguajes de más alto nivel como Python para que entiendan las bases desde abajo).
- la profesora les dio un código inicial para leer dos enteros con
scanfy sumarlos conprintf("%d", a + b);. - la tarea: escribir «un algoritmo» en C que ahora calcule la suma, resta, multiplicación, división y la potencia de dos números.
a primera vista suena a la clásica calculadora de principiante, pero cuando te detienes a ver lo que implica en C, el salto conceptual es enorme para alguien que apenas está conociendo una terminal.
el detalle del operador que no es potencia
en matemáticas o en calculadoras comunes, la secuencia mental es natural: +, -, *, / y ^.
pero en C, el operador ^ no es potencia: es un XOR a nivel de bits.
si alguien que va empezando escribe confiado 2 ^ 3, esperando un 8, el programa le va a entregar un 1. sin una explicación previa sobre operaciones binarias, es desconcertante ver que una operación tan básica entregue un resultado que parece no tener sentido.
la división entre enteros
con la división pasa algo parecido:
si las variables son enteros (int a, b;), al dividir 5 / 2 el resultado es 2.
para un estudiante de prepa que espera 2.5, esto abre de golpe temas que no son tan triviales al inicio: la diferencia entre tipos de datos enteros y de punto flotante (float/double), el formato de impresión (%f) y el casteo de variables. y claro, el caso especial de qué pasa cuando el divisor es cero.
el reto de la potencia
y luego está la potencia, que en C no tiene un operador nativo. para resolverla hay principalmente dos caminos:
-
usar la biblioteca matemática: incluir
<math.h>y llamar apow(a, b). pero esto ya involucra entender quepowopera con flotantes, lidiar con posibles detalles de redondeo y, si se compila en un sistema GNU por línea de comandos congcc, recordar enlazar la biblioteca con la bandera-lm. -
hacerlo con un bucle: construir la lógica con un ciclo (
forowhile) multiplicando sucesivamente. conceptualmente es un ejercicio muy formativo para entender algoritmos, pero requiere haber visto antes estructuras de control, condiciones iniciales y pensar qué pasa con exponentes negativos o iguales a cero.
pedir todo eso en una sola sentada bajo la etiqueta de “hagan un algoritmo” brinca varios peldaños de golpe.
me dio nostalgia porque en 2010 escribí en este mismo blog un post muy sencillo: Código para sumar dos números.
sentarme con mi hermano a resolver la práctica y platicar sobre por qué C funciona así me dejó pensando. de por sí él no se halla mucho en este mundo de las computadoras; sus intereses van por otro lado. si a alguien que de entrada no le apasiona el tema le presentas las cosas de una forma tan oscura y apresurada, lo único que consigues es alejarlo. ¿qué sigue para la próxima semana, pedirle que arme un sistema de punto de venta sin haber consolidado lo elemental?
aprender a programar no debería ser una carrera de obstáculos innecesarios ni una prueba de resistencia a la frustración, sino un proceso paciente para aprender a pensar y descomponer problemas paso a paso, sin perder a la gente en el camino.