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'
- Comprobación con ficheros de solución
- Prueba automática del programa
- Revisión automática de programa
- Análisis
- Recomendaciones de mejora
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, genera1 3 5,1 3,1como se espera. -
Números pares: Fallo crítico. Si
xes 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 (comoi=1), donderange(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 4y2), 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,jno explican su propósito. Por ejemplo,xpodría sernumeroyipodría serlimite_superior. -
Lógica confusa: El uso del mismo rango (
range(x, 0, -2)) para ambos bucles (impares y pares) puede llevar a errores, especialmente cuandoxes 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
-
Ajustar el bucle de pares:
- En lugar de usar
range(x, 0, -2)para los pares, calcular el máximo par menor o igual axantes 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.
- En lugar de usar
-
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()
- Añadir una condición para verificar si hay números pares que imprimir antes de imprimir una línea. Por ejemplo:
-
Mejorar nombres de variables:
- Usar nombres como
numero,limite, ovaloren lugar dex,i,jpara clarificar su propósito.
- Usar nombres como
-
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()
- Añadir un mensaje claro si el usuario introduce algo que no sea un número entero. Por ejemplo:
-
Eliminar espacios redundantes:
- Simplificar
print(j, ' ' ,end='')aprint(j, end=' ').
- Simplificar