EL FAMOSO «FIZZ BUZZ»

El reto FizzBuzz es uno de los ejercicios clásicos de programación. A primera vista parece simple, pero en realidad es una excelente herramienta para evaluar lógica, estructura condicional y claridad de pensamiento.

En esta entrada lo resolvemos en Structured Text (ST), aplicándolo al entorno PLC.

El reto

El objetivo es recorrer los números del 1 al 100 y aplicar las siguientes reglas:

  • Sustituir los múltiplos de 3 por "Fizz".
  • Sustituir los múltiplos de 5 por "Buzz".
  • Sustituir los múltiplos de 3 y 5 a la vez por "FizzBuzz".
  • En cualquier otro caso, mostrar el número.

Declaración de variables


FOR i:= 1 TO 100 DO

tempString := '';

IF (i MOD 3 = 0) AND (i MOD 5 = 0) THEN

    tempString := 'Fizzbuzz';

ELSIF (i MOD 3 = 0) THEN
    tempString := 'Fizz';

ELSIF (i MOD 5 = 0) THEN
    tempString := 'buzz';

ELSE        
    // Numero resultante
    tempString := INT_TO_STRING(i);

END_IF

Results[i] := tempString;

END_FOR;

 

Aunque en esta versión no utilizamos directamente Mult3, Mult5 y Multi3And5, declararlos es interesante desde un punto de vista arquitectónico: permite separar condiciones, mejorar legibilidad y facilitar futuras ampliaciones.

El array Results almacenará el resultado final de cada iteración.

Lógica principal

FOR i:= 1 TO 100 DO

tempString := '';

IF (i MOD 3 = 0) AND (i MOD 5 = 0) THEN

    tempString := 'Fizzbuzz';

ELSIF (i MOD 3 = 0) THEN
    tempString := 'Fizz';

ELSIF (i MOD 5 = 0) THEN
    tempString := 'buzz';

ELSE        
    // Numero resultante
    tempString := INT_TO_STRING(i);

END_IF

Results[i] := tempString;

END_FOR

Análisis técnico

Uso del operador MOD

La clave del reto está en detectar múltiplos.
En PLC, esto se hace utilizando el operador MOD:

i MOD 3 = 0

Si el resto es cero, el número es múltiplo.


Orden de las condiciones

Es fundamental evaluar primero:

(i MOD 3 = 0) AND (i MOD 5 = 0)

¿Por qué?

Porque si evaluamos primero el múltiplo de 3 o de 5 por separado, nunca llegaríamos al caso combinado.
Este pequeño detalle demuestra la importancia del orden lógico en estructuras condicionales.


Conversión de tipo

Cuando el número no cumple ninguna condición especial:

tempString := INT_TO_STRING(i);

En PLC no existe conversión implícita automática entre tipos numéricos y cadenas, por lo que debemos hacerlo explícitamente.

Este tipo de detalles son importantes cuando trabajamos con HMI, logging o sistemas de trazabilidad.


Reflexión

Aunque FizzBuzz es un ejercicio básico, permite practicar:

  • Estructuras de control
  • Orden lógico de evaluación
  • Gestión de tipos
  • Claridad y legibilidad del código
  • Separación de responsabilidades (si evolucionamos el diseño)

En un entorno industrial real, este mismo patrón lógico podría formar parte de:

  • Generadores de eventos
  • Sistemas de clasificación
  • Evaluadores de condiciones complejas
  • Secuencias basadas en reglas

La diferencia entre un ejercicio simple y un sistema industrial complejo no es el concepto base, sino la escala y la arquitectura.


Posible mejora

Una versión más estructurada podría:

  • Separar el cálculo de múltiplos en variables booleanas (Mult3, Mult5)
  • Encapsular la lógica en una función
  • Parametrizar el rango (no fijarlo a 1..100)
  • Implementar testing unitario (en TwinCAT, por ejemplo, con TcUnit)

Tags:

No responses yet

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *