Skip to content

Revisión automática de la práctica 04-formas

Este es el resultado de una revisión automática de la prácica 04-formas, tal y como la hemos recogido de este repositorio de entrega. Por favor, ten en cuenta que al ser una revisión automática, realizada en parte con la ayuda de un asistente de inteligencia artificial generativa, puede incluir errores, y ser incorrecta. Pero leela con atención, porque creemos que puede tener información útil. Si tienes cualquier duda, o crees que la revisión es errónea, por favor, consulta con los profesores de la asignatura.


Comprobación de archivos con extension '.py'

  • Archivos Python excluidos de la búsqueda: pixels.py
  • Archivos Python encontrados (excluyendo esos): formas.py

Correcto, se elige formas.py como entrega.

Comprobación con ficheros de solución

Los archivos son diferentes de los de la solución.

Prueba automática del programa

Pruebas realizadas por 04-formas/tests/test_argumentos.py:

OK

Pruebas realizadas por 04-formas/tests/test_formas.py:

OK

Pruebas realizadas por 04-formas/tests/test_funciones.py:

OK

Revisión automática de programa

Programa revisado:

import sys
from pixels import tam_lienzo, pinta, espera


def lee_formas():
    args = sys.argv[1:]
    formas = []
    i = 0

    while i < len(args):
        tipo = args[i]

        if tipo == "cuad":
            x = int(args[i + 1])
            y = int(args[i + 2])
            lado = int(args[i + 3])

            if i + 4 < len(args) and args[i + 4] not in ["cuad", "rect"]:
                color = args[i + 4]
                i += 5
            else:
                color = "black"
                i += 4

            formas.append({
                "tipo": "cuadrado",
                "x": x,
                "y": y,
                "lado": lado,
                "color": color
            })

        elif tipo == "rect":
            x = int(args[i + 1])
            y = int(args[i + 2])
            ancho = int(args[i + 3])
            alto = int(args[i + 4])

            if i + 5 < len(args) and args[i + 5] not in ["cuad", "rect"]:
                color = args[i + 5]
                i += 6
            else:
                color = "blue"  # Color por defecto que esperan los tests
                i += 5

            formas.append({
                "tipo": "rectángulo",
                "x": x,
                "y": y,
                "ancho": ancho,
                "alto": alto,
                "color": color
            })

        else:
            raise ValueError(f"Tipo de figura no reconocido: {tipo}")

    return formas


def dibuja_cuadrado(x, y, lado, color="black"):
    max_x, max_y = tam_lienzo()
    if x + lado > max_x or y + lado > max_y:
        print("El cuadrado se sale del lienzo.")
        return False

    for i in range(lado):
        for j in range(lado):
            if i in (0, lado - 1) or j in (0, lado - 1):
                pinta(x + i, y + j, color)
            else:
                pinta(x + i, y + j, "white")
    return True


def dibuja_rectangulo(x, y, ancho, alto, color="black"):
    """
    Dibuja un rectángulo con bordes del color dado e interior blanco.
    Devuelve True si cabe en el lienzo.
    """
    max_x, max_y = tam_lienzo()

    if x + ancho > max_x or y + alto > max_y:
        print("El rectángulo se sale del lienzo.")
        return False

    for i in range(ancho):
        for j in range(alto):
            if i in (0, ancho - 1) or j in (0, alto - 1):
                pinta(x + i, y + j, color)  # Bordes
            else:
                pinta(x + i, y + j, "white")  # Interior

    return True


def main():
    formas = lee_formas()

    for forma in formas:
        tipo = forma["tipo"]
        x = forma["x"]
        y = forma["y"]
        color = forma.get("color", "black")

        if tipo == "cuadrado":
            lado = forma["lado"]
            dibuja_cuadrado(x, y, lado, color)
        elif tipo == "rectángulo":
            ancho_f = forma["ancho"]
            alto_f = forma["alto"]
            dibuja_rectangulo(x, y, ancho_f, alto_f, color)

    espera()


if __name__ == "__main__":
    main()

Análisis

Cumple con el enunciado

El programa no cumple completamente con el enunciado.

  • Para los rectángulos, el enunciado especifica que el color por defecto debe ser negro (black), pero en la función lee_formas() se asigna "blue" como color predeterminado para rectángulos (comentario: "Color por defecto que esperan los tests"). Esto contradice lo indicado en el enunciado, aunque el ejemplo de solución lo incluye.
  • El resto de la lógica (lectura de argumentos, dibujo de bordes con color e interior blanco, verificación de límites) sí sigue las especificaciones. Los ejemplos de ejecución proporcionados en el enunciado funcionarían correctamente, excepto en el caso de rectángulos sin color especificado (usaría azul en lugar de negro).

Es fácil de leer y entender

El código es fácil de entender para principiantes:

  • Usa nombres de variables y funciones en español (dibuja_cuadrado, lee_formas), lo que facilita la comprensión.
  • La estructura de las funciones es clara: primero se validan límites, luego se dibuja con bucles anidados.
  • Los comentarios en el ejemplo de solución ayudan a entender la lógica (aunque el estudiante no los incluyó en su código, el enunciado los proporciona como referencia).

Sigue buenas prácticas de programación

Cumple parcialmente con buenas prácticas:

  • Validación de límites antes de dibujar (evita errores al salir del lienzo).
  • Uso de diccionarios para representar figuras, como exige el enunciado.
  • Error en el valor por defecto para el color de rectángulos (debería ser black, no blue).
  • En main(), se usan variables innecesarias como ancho_f y alto_f en lugar de acceder directamente a forma["ancho"] y forma["alto"], lo que añade complejidad innecesaria.

Recomendaciones de mejora

  1. Corrige el color por defecto de los rectángulos: En lee_formas(), cambia color = "blue" por color = "black" para cumplir con el enunciado.
  2. Simplifica main(): Elimina variables temporales como ancho_f y alto_f. Usa directamente forma["ancho"] y forma["alto"] al llamar a dibuja_rectangulo().
  3. Verifica el comportamiento del interior blanco: Asegúrate de que el enunciado requiere dibujar el interior en blanco (no se especifica explícitamente). Si no es necesario, elimina esa parte para simplificar.
  4. Mejora la gestión de errores: En lugar de imprimir mensajes como "El cuadrado se sale del lienzo.", devuelve False sin salida estándar (el enunciado no exige mensajes de error).