Revisión automática de la práctica 02-enumera

Este es el resultado de una revisión automática de la prácica 02-enumera, 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:
  • Archivos Python encontrados (excluyendo esos): enumera.py

Correcto, se elige enumera.py para el análisis

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 02-enumera/tests/test_enumeraciones.py:

***ERROR:***
 Error 1
Mensaje de error:
FF..FF
======================================================================
FAIL: test_enumeraciones_1 (test_enumeraciones.TestEnumeraciones.test_enumeraciones_1)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/_tempttjd0p_3/test_enumeraciones.py", line 43, in test_enumeraciones_1
    self.run_enumeraciones(input, expected)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/tmp/_tempttjd0p_3/test_enumeraciones.py", line 36, in run_enumeraciones
    self.assertEqual(normalized_result, normalized_expected,
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     f"Para {input}, se esperaba:\n{expected}\n"
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     + f"Pero se obtuvo:\n{result}")
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: '1  3  5\n1  3\n1\n2  4\n2' != '1 3 5\n1 3\n1\n2 4\n2'
- 1  3  5
?   - -
+ 1 3 5
- 1  3
?  -
+ 1 3
  1
- 2  4
?  -
+ 2 4
  2
 : Para 5
, se esperaba:
1 3 5
1 3
1
2 4
2
Pero se obtuvo:
1  3  5  
1  3  
1  
2  4  
2  



======================================================================
FAIL: test_enumeraciones_2 (test_enumeraciones.TestEnumeraciones.test_enumeraciones_2)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/_tempttjd0p_3/test_enumeraciones.py", line 48, in test_enumeraciones_2
    self.run_enumeraciones(input, expected)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/tmp/_tempttjd0p_3/test_enumeraciones.py", line 36, in run_enumeraciones
    self.assertEqual(normalized_result, normalized_expected,
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     f"Para {input}, se esperaba:\n{expected}\n"
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     + f"Pero se obtuvo:\n{result}")
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: '1  3  5\n1  3\n1\n2  4  6\n2  4\n2' != '1 3 5\n1 3\n1\n2 4 6\n2 4\n2'
- 1  3  5
?   - -
+ 1 3 5
- 1  3
?  -
+ 1 3
  1
- 2  4  6
?   - -
+ 2 4 6
- 2  4
?  -
+ 2 4
  2
 : Para 6
, se esperaba:
1 3 5
1 3
1
2 4 6
2 4
2
Pero se obtuvo:
1  3  5  
1  3  
1  
2  4  6  
2  4  
2  


======================================================================
FAIL: test_enumeraciones_5 (test_enumeraciones.TestEnumeraciones.test_enumeraciones_5)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/_tempttjd0p_3/test_enumeraciones.py", line 63, in test_enumeraciones_5
    self.run_enumeraciones(input, expected)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/tmp/_tempttjd0p_3/test_enumeraciones.py", line 36, in run_enumeraciones
    self.assertEqual(normalized_result, normalized_expected,
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     f"Para {input}, se esperaba:\n{expected}\n"
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     + f"Pero se obtuvo:\n{result}")
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: '1  3\n1\n2' != '1 3\n1\n2'
- 1  3
?  -
+ 1 3
  1
  2
 : Para 3
, se esperaba:
1 3
1
2
Pero se obtuvo:
1  3  
1  
2  



======================================================================
FAIL: test_enumeraciones_8 (test_enumeraciones.TestEnumeraciones.test_enumeraciones_8)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/_tempttjd0p_3/test_enumeraciones.py", line 68, in test_enumeraciones_8
    self.run_enumeraciones(input, expected)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/tmp/_tempttjd0p_3/test_enumeraciones.py", line 36, in run_enumeraciones
    self.assertEqual(normalized_result, normalized_expected,
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     f"Para {input}, se esperaba:\n{expected}\n"
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     + f"Pero se obtuvo:\n{result}")
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: '1  3  5  7\n1  3  5\n1  3\n1\n2  4  6  8\n2  4  6\n2  4\n2' != '1 3 5 7\n1 3 5\n1 3\n1\n2 4 6 8\n2 4 6\n2 4\n2'
- 1  3  5  7
?   -  - -
+ 1 3 5 7
- 1  3  5
?   - -
+ 1 3 5
- 1  3
?  -
+ 1 3
  1
- 2  4  6  8
?   -  - -
+ 2 4 6 8
- 2  4  6
?   - -
+ 2 4 6
- 2  4
?  -
+ 2 4
  2
 : Para 8
, se esperaba:
1 3 5 7
1 3 5
1 3
1
2 4 6 8
2 4 6
2 4
2
Pero se obtuvo:
1  3  5  7  
1  3  5  
1  3  
1  
2  4  6  8  
2  4  6  
2  4  
2  


----------------------------------------------------------------------
Ran 6 tests in 6.059s

FAILED (failures=4)



Revisión automática de programa

Programa revisado:

x= int(input('Dime un numero entero mayor que 0: '))
if x<= 0:
    print("El número ha de ser mayor que cero")
else:
    for i in range(x, 0, -2):
        for j in range (1, i+1, 2):
            print(j, ' ' ,end='')
        print()
    for i in range(x, 0, -2):
        for j in range(2, i+1, 2):
            print(j,' ', end='')
        print()

Análisis

Cumple con el enunciado

El programa no cumple completamente con el enunciado.

  • Números impares: Funciona correctamente. Para x=5, genera 1 3 5, 1 3, 1 como se espera.
  • Números pares: Fallo crítico. Si x es impar (ej. x=5), el bucle para pares imprime una línea adicional vacía al final. Esto ocurre porque el bucle externo (for i in range(x, 0, -2)) incluye valores impares (como i=1), donde range(2, i+1, 2) no genera ningún número, pero aún así se imprime una línea vacía.
  • Ejemplo de fallo: Para x=5, el enunciado espera 2 líneas para los pares (2 4 y 2), pero el programa imprime 3 líneas (la última vacía).

Es fácil de leer y entender

El programa es parcialmente legible, pero tiene áreas de mejora:

  • Variables poco descriptivas: x, i, j no explican su propósito. Por ejemplo, x podría ser numero y i podría ser limite_superior.
  • Lógica confusa: El uso del mismo rango (range(x, 0, -2)) para ambos bucles (impares y pares) puede llevar a errores, especialmente cuando x es impar.
  • Anidamiento de bucles: El código no está comentado, lo que dificulta entender por qué se usan esos rangos.

Sigue buenas prácticas de programación

El programa no sigue completamente buenas prácticas:

  • Repetición de código: Los bucles para impares y pares son muy similares, pero no se reutiliza lógica.
  • Manejo de errores: Se valida que x > 0, pero no se capturan errores si el usuario introduce un valor no entero.
  • Espaciado innecesario: En print(j, ' ' ,end=''), el espacio en ' ' es redundante y puede eliminarse.

Recomendaciones de mejora

  1. Ajustar el bucle de pares:

    • En lugar de usar range(x, 0, -2) para los pares, calcular el máximo par menor o igual a x antes del bucle. Por ejemplo:
      max_par = x if x % 2 == 0 else x - 1
      for i in range(max_par, 0, -2):
    • Esto evita incluir valores impares en el bucle de pares.
  2. Evitar líneas vacías:

    • Añadir una condición para verificar si hay números pares que imprimir antes de imprimir una línea. Por ejemplo:
      for i in range(x, 0, -2):
          hay_pares = False
          for j in range(2, i+1, 2):
              print(j, end=' ')
              hay_pares = True
          if hay_pares:
              print()
  3. Mejorar nombres de variables:

    • Usar nombres como numero, limite, o valor en lugar de x, i, j para clarificar su propósito.
  4. Validar entrada de usuario:

    • Añadir un mensaje claro si el usuario introduce algo que no sea un número entero. Por ejemplo:
      try:
          numero = int(input('Dame un número entero mayor que 0: '))
      except ValueError:
          print('Debes introducir un número entero.')
          exit()
  5. Eliminar espacios redundantes:

    • Simplificar print(j, ' ' ,end='') a print(j, end=' ').