Skip to content

Commit

Permalink
Práctica U2 - 1 con tests
Browse files Browse the repository at this point in the history
  • Loading branch information
dcsibon committed Oct 15, 2024
1 parent 3b92501 commit 9031c62
Show file tree
Hide file tree
Showing 3 changed files with 528 additions and 0 deletions.
209 changes: 209 additions & 0 deletions src/practicau2_1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@

COMANDOS = ["compra", "venta", "saldo", "reset", "deshacer", "fin"]
MENSAJE_ERROR = "*ERROR* Entrada inválida"


def comprobar_importe(valor: str) -> bool:
"""
Verifica si el importe proporcionado es un número válido.
Args:
valor (str): Cadena que representa el importe a verificar.
Returns:
bool: True si el valor es un número válido (positivo, negativo o con punto decimal), False en caso contrario.
"""
if valor.startswith("-"):
valor = valor[1:]

if valor.count(".") > 1:
return False

valor = valor.replace(".", "")
return valor.isdigit()


def comprobar_comando(comando: str) -> bool:
"""
Verifica si el comando está dentro de la lista de comandos válidos.
Args:
comando (str): Cadena que representa el comando ingresado por el usuario.
Returns:
bool: True si el comando está en la lista de comandos válidos, False en caso contrario.
"""
return comando in COMANDOS


def mostrar_mensaje_error():
"""
Muestra el mensaje de error por entrada inválida.
"""
print(MENSAJE_ERROR)


def procesar_compra(saldo: float, importe: float) -> float:
"""
Procesa una operación de compra y actualiza el saldo restando el importe.
Args:
saldo (float): El saldo actual.
importe (float): El importe a restar por la compra.
Returns:
float: El saldo actualizado después de realizar la compra.
"""
return saldo - importe


def procesar_venta(saldo: float, importe: float) -> float:
"""
Procesa una operación de venta y actualiza el saldo sumando el importe.
Args:
saldo (float): El saldo actual.
importe (float): El importe a sumar por la venta.
Returns:
float: El saldo actualizado después de realizar la venta.
"""
return saldo + importe


def mostrar_saldo(saldo: float, cont_compras: int, cont_ventas: int):
"""
Muestra el saldo actual junto con el número de compras y ventas.
Args:
saldo (float): El saldo actual.
cont_compras (int): Número total de compras realizadas.
cont_ventas (int): Número total de ventas realizadas.
"""
print(f"Saldo actual = {saldo:.2f} ({cont_compras} compras y {cont_ventas} ventas)")


def resetear_saldo(saldo: float, cont_compras: int, cont_ventas: int) -> tuple[float, int, int]:
"""
Resetea el saldo y las operaciones realizadas, mostrando los valores anteriores.
Args:
saldo (float): El saldo actual.
cont_compras (int): Número total de compras realizadas.
cont_ventas (int): Número total de ventas realizadas.
Returns:
tuple[float, int, int]: El nuevo saldo (0), número de compras (0) y número de ventas (0) después del reinicio.
"""
print(f"Saldo anterior = {saldo:.2f} ({cont_compras} compras y {cont_ventas} ventas)")
return 0, 0, 0


def recuperar_comando_e_importe(linea: str) -> tuple[str, str]:
"""
Recupera el comando y, si lo hay, el importe de una línea de entrada.
Args:
linea (str): Línea de texto introducida por el usuario.
Returns:
tuple: El comando (str o None) y el importe (str o None).
Ejemplos:
>>> recuperar_comando_e_importe("compra 100")
('compra', '100')
>>> recuperar_comando_e_importe("saldo")
('saldo', None)
>>> recuperar_comando_e_importe("")
(None, None)
"""
lista_palabras = linea.split()

if len(lista_palabras) == 1:
return lista_palabras[0], None
elif len(lista_palabras) == 2:
return lista_palabras[0], lista_palabras[1]
else:
return None, None


def main():
"""
Función principal que gestiona el flujo del programa. El programa permite al usuario realizar
operaciones de compra y venta, consultar el saldo, restablecer las operaciones y finalizar.
Funciona a través de un bucle que sigue las instrucciones del usuario hasta que el comando "fin" es ingresado.
El saldo y las transacciones se actualizan según los comandos introducidos.
Comandos disponibles:
- compra [importe]: Resta el importe del saldo.
- venta [importe]: Suma el importe al saldo.
- saldo: Muestra el saldo actual junto con el número de compras y ventas.
- reset: Restablece el saldo y las transacciones a cero.
- fin: Termina el programa.
Ejemplos:
> compra 100
> venta 50
> saldo
Saldo actual = -50.00 (1 compras y 1 ventas)
> venta 200
> reset
Saldo anterior = 150.00 (1 compras y 2 ventas)
>
Saldo actual = 0.00 (0 compras y 0 ventas)
> fin
"""
encuentra_fin = False
cont_compras = 0
cont_ventas = 0
saldo = 0

# Guardar los valores previos para deshacer
ultimo_saldo = 0
ultimo_cont_compras = 0
ultimo_cont_ventas = 0

while not encuentra_fin:
linea = input("> ").strip().lower()
comando, importe = recuperar_comando_e_importe(linea)

if comando is None or not comprobar_comando(comando):
mostrar_mensaje_error()
elif comando in ("saldo", "reset", "fin") and importe is not None:
mostrar_mensaje_error()
elif comando == "saldo":
mostrar_saldo(saldo, cont_compras, cont_ventas)
elif comando == "reset":
saldo, cont_compras, cont_ventas = resetear_saldo(saldo, cont_compras, cont_ventas)
elif comando == "fin":
encuentra_fin = True
elif comando == "deshacer":
# Deshacer la última operación
saldo = ultimo_saldo
cont_compras = ultimo_cont_compras
cont_ventas = ultimo_cont_ventas
print("Última operación deshecha.")
elif importe is None or not comprobar_importe(importe):
mostrar_mensaje_error()
else:
importe = float(importe)

# Guardar el estado previo para deshacer
ultimo_saldo = saldo
ultimo_cont_compras = cont_compras
ultimo_cont_ventas = cont_ventas

if comando == "compra":
saldo = procesar_compra(saldo, importe)
cont_compras += 1
elif comando == "venta":
saldo = procesar_venta(saldo, importe)
cont_ventas += 1



if __name__ == "__main__":
main()
181 changes: 181 additions & 0 deletions src/practicau2_1_alumnos.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@

COMANDOS = ["compra", "venta", "saldo", "reset", "fin"]
MENSAJE_ERROR = "*ERROR* Entrada inválida"


def comprobar_importe(valor: str) -> bool:
"""
Verifica si el importe proporcionado es un número válido.
Args:
valor (str): Cadena que representa el importe a verificar.
Returns:
bool: True si el valor es un número válido (positivo, negativo o con punto decimal), False en caso contrario.
"""


def comprobar_comando(comando: str) -> bool:
"""
Verifica si el comando está dentro de la lista de comandos válidos.
Args:
comando (str): Cadena que representa el comando ingresado por el usuario.
Returns:
bool: True si el comando está en la lista de comandos válidos, False en caso contrario.
"""


def mostrar_mensaje_error():
"""
Muestra el mensaje de error por entrada inválida.
"""


def procesar_compra(saldo: float, importe: float) -> float:
"""
Procesa una operación de compra y actualiza el saldo restando el importe.
Args:
saldo (float): El saldo actual.
importe (float): El importe a restar por la compra.
Returns:
float: El saldo actualizado después de realizar la compra.
"""


def procesar_venta(saldo: float, importe: float) -> float:
"""
Procesa una operación de venta y actualiza el saldo sumando el importe.
Args:
saldo (float): El saldo actual.
importe (float): El importe a sumar por la venta.
Returns:
float: El saldo actualizado después de realizar la venta.
"""


def mostrar_saldo(saldo: float, cont_compras: int, cont_ventas: int):
"""
Muestra el saldo actual junto con el número de compras y ventas.
Args:
saldo (float): El saldo actual.
cont_compras (int): Número total de compras realizadas.
cont_ventas (int): Número total de ventas realizadas.
"""


def resetear_saldo(saldo: float, cont_compras: int, cont_ventas: int) -> tuple[float, int, int]:
"""
Resetea el saldo y las operaciones realizadas, mostrando antes el saldo anterior.
Args:
saldo (float): El saldo actual.
cont_compras (int): Número total de compras realizadas.
cont_ventas (int): Número total de ventas realizadas.
Returns:
tuple[float, int, int]: El nuevo saldo (0), número de compras (0) y número de ventas (0) después del reinicio.
"""


def recuperar_comando_e_importe(linea: str) -> tuple[str, str]:
"""
Recupera el comando y, si lo hay, el importe de una línea de entrada.
Args:
linea (str): Línea de texto introducida por el usuario.
Returns:
tuple: El comando (str o None) y el importe (str o None).
Ejemplos:
>>> recuperar_comando_e_importe("compra 100")
('compra', '100')
>>> recuperar_comando_e_importe("saldo")
('saldo', None)
>>> recuperar_comando_e_importe("")
(None, None)
"""
lista_palabras = linea.split()

if len(lista_palabras) == 1:
return lista_palabras[0], None
elif len(lista_palabras) == 2:
return lista_palabras[0], lista_palabras[1]
else:
return None, None


def main():
"""
Función principal que gestiona el flujo del programa. El programa permite al usuario realizar
operaciones de compra y venta, consultar el saldo, restablecer las operaciones y finalizar.
Funciona a través de un bucle que sigue las instrucciones del usuario hasta que el comando "fin" es ingresado.
El saldo y las transacciones se actualizan según los comandos introducidos.
Comandos disponibles:
- compra [importe]: Resta el importe del saldo.
- venta [importe]: Suma el importe al saldo.
- saldo: Muestra el saldo actual junto con el número de compras y ventas.
- reset: Restablece el saldo y las transacciones a cero.
- fin: Termina el programa.
Ejemplos:
> compra 100
> venta 50
> venta
*ERROR* Entrada inválida
> venta cincuenta euros
*ERROR* Entrada inválida
> compra 50€
*ERROR* Entrada inválida
> saldo 666
*ERROR* Entrada inválida
> saldo
Saldo actual = -50.00 (1 compras y 1 ventas)
> venta 200
> reset
Saldo anterior = 150.00 (1 compras y 2 ventas)
> saldo
Saldo actual = 0.00 (0 compras y 0 ventas)
> fin
"""
cont_compras = 0
cont_ventas = 0
saldo = 0

while not encuentra_fin:

comando, importe = recuperar_comando_e_importe(linea)

if comando is None or not comprobar_comando(comando):
mostrar_mensaje_error()
elif comando in ("saldo", "reset", "fin") and importe is not None:

elif comando == "saldo":

elif comando == "reset":

elif comando == "fin":

elif importe is None or not comprobar_importe(importe):

else:

if comando == "compra":

elif comando == "venta":



if __name__ == "__main__":
main()
Loading

0 comments on commit 9031c62

Please sign in to comment.