From c22394f588e4770dc4158e818071d35d646edb7d Mon Sep 17 00:00:00 2001 From: nihuspinelli Date: Wed, 5 Oct 2022 22:00:52 -0300 Subject: [PATCH] PRACTICA 3 --- exercises/exercise1.py | 14 +++++++++----- exercises/exercise2.py | 23 ++++++++++++++++++---- exercises/exercise3.py | 26 ++++++++++++++++++++++--- exercises/exercise4.py | 18 +++++++++++++---- exercises/exercise5.py | 44 +++++++++++++++++++++++++++++++++++------- 5 files changed, 102 insertions(+), 23 deletions(-) diff --git a/exercises/exercise1.py b/exercises/exercise1.py index 4d88ccc..6569398 100644 --- a/exercises/exercise1.py +++ b/exercises/exercise1.py @@ -6,9 +6,7 @@ class Circle: """Todo cículo tiene un radio y se desea conocer tanto el área como el perímetro (longitud de circunferencia). - Reportar los números redondeados a dos decimales - Restricciones: - Utilizar 1 variable de instancia - Utilizar 2 métodos de instancia @@ -17,8 +15,14 @@ class Circle: - No utilizar Properties - Utilizar Type Hints en todos los métodos y variables """ - - + def __init__(self,radio): + self.radio = radio + + def area(self): + return round(pi * self.radio ** 2, 2) + + def perimetro(self): + return round(2 * self.radio * pi, 2) # NO MODIFICAR - INICIO # Test básico circle = Circle(1) @@ -42,4 +46,4 @@ class Circle: # Test invocación encadenada assert Circle(1).area() == 3.14 assert Circle(1).perimetro() == 6.28 -# NO MODIFICAR - FIN +# NO MODIFICAR - FIN \ No newline at end of file diff --git a/exercises/exercise2.py b/exercises/exercise2.py index 2b02c90..4ee0c07 100644 --- a/exercises/exercise2.py +++ b/exercises/exercise2.py @@ -4,13 +4,10 @@ class Article: """Todos los artículos tienen un nombre y un costo, opcionalmente algunos tienen un porcentaje de descuento. - El IVA es un impuesto que se aplica a todos los productos por igual, actualmente es de 21% pero puede cambiar en el futuro. - Para calcular el precio de un artículo, hay que sumar el IVA y luego restar los descuentos si hubiera. Redondear a 2 decimales. - Restricciones: - Utilizar 3 variables de instancia - Utilizar 1 método de instancia @@ -21,6 +18,22 @@ class Article: - Utilizar Type Hints en todos los métodos y variables """ + __iva=0.21 + + def __init__(self, nombre, costo, descuento=0): + self.nombre = nombre + self.costo = costo + self.descuento = descuento + + + def calcular_precio(self): + precio = round(self.costo + (self.costo * self.__iva), 2) + precio_final = round(precio - (self.descuento * precio), 2) + return precio_final + + @classmethod + def actualizar_iva(cls,iva): + cls.__iva=iva # NO MODIFICAR - INICIO # Test parámetro obligatorio @@ -49,9 +62,11 @@ class Article: article = Article("Auto", 1, 0.21) assert article.nombre == "Auto" +print(article.calcular_precio()) assert article.calcular_precio() == 0.96 + # Test palabra clave article = Article(costo=1, nombre="Auto") assert article.nombre == "Auto" @@ -68,4 +83,4 @@ class Article: article = Article(costo=1, nombre="Auto") assert article.nombre == "Auto" assert article.calcular_precio() == 1.25 -# NO MODIFICAR - FIN +# NO MODIFICAR - FIN \ No newline at end of file diff --git a/exercises/exercise3.py b/exercises/exercise3.py index 331440a..549f0df 100644 --- a/exercises/exercise3.py +++ b/exercises/exercise3.py @@ -4,7 +4,6 @@ class Article: """Re-Escribir el ejercicio anterior utilizando una property en vez de un método de instancia. - Restricciones: - Utilizar 3 variables de instancia - Utilizar 1 property @@ -14,7 +13,28 @@ class Article: - No utilizar Dataclasses - Utilizar Type Hints en todos los métodos y variables """ - + __IVA = 0.21 + + def __init__(self, nombre, costo, descuento = 0): + self.nombre = nombre + self.costo = costo + self.descuento = descuento + + @property + def precio(self): + precio = round (self.costo + (self.costo * self.__IVA),2) + precio_final = round (precio - (self.descuento * precio),2) + return precio_final + + def calcular_precio (self): + precio_iva = round((self.costo * self.__IVA) + self.costo,2) + precio = round((precio_iva - precio_iva * self.descuento),2) + return precio + + @classmethod + def actualizar_iva(cls, iva_nuevo): + cls.__IVA = iva_nuevo + return cls.__IVA # NO MODIFICAR - INICIO # Test parámetro obligatorio @@ -71,4 +91,4 @@ class Article: article = Article(costo=1, nombre="Auto") assert article.nombre == "Auto" assert article.precio == 1.25 -# NO MODIFICAR - FIN +# NO MODIFICAR - FIN \ No newline at end of file diff --git a/exercises/exercise4.py b/exercises/exercise4.py index b424db7..99882af 100644 --- a/exercises/exercise4.py +++ b/exercises/exercise4.py @@ -6,11 +6,8 @@ """Una carrera tiene varias materias, la "longitud" de una carrera hace referencia a cuantas materias tiene. - Cada materia tiene un nombre. - Escribir una estructura de clases que refleje lo anterior. - Restricciones: - Utilizar Dataclasses - Utilizar 2 clases @@ -22,6 +19,19 @@ - No utilizar properties - Utilizar Type Hints en todos los métodos y variables """ +@dataclass +class Materia: + nombre:str + +@dataclass +class Carrera: + longitud:str + + def __str__(self): + return f"Carrera(materias=(self.longitud))" + + def __len__(self): + return len(self.longitud) # NO MODIFICAR - INICIO @@ -52,4 +62,4 @@ ) assert len(ciclo_basico) == 2 -# NO MODIFICAR - FIN +# NO MODIFICAR - FIN \ No newline at end of file diff --git a/exercises/exercise5.py b/exercises/exercise5.py index 92d717c..8785629 100644 --- a/exercises/exercise5.py +++ b/exercises/exercise5.py @@ -2,25 +2,19 @@ laboralmente Contribuyentes, sin embargo, existen varios tipos de contribuyentes, por ejemplo, el Monotributista y el que es Empleado en relación de dependencia. Ambos están dentro del sistema pero pagan diferentes impuestos. - El monotributista tiene que pagar en función de sus ingresos brutos anuales: - Si son menores a $370.000, paga $2646,22 mensuales - Si son menores a $550.000, paga $2958,95 mensuales - Si son menores a $770.000, paga $3382,62 mensuales - Si son mayores a $770.000, paga $3988,85 mensuales - En el caso de los empleados en relación de dependencia, ellos pagan un 17% de impuestos sobre sus ingresos brutos mensuales. - Inspirado en datos reales: https://www.afip.gob.ar/monotributo/categorias.asp - Escribir una estructura de clases que refleje lo anterior. Para simplificar el análisis, todos los montos serán mensuales (dividir los límites del monotributo por 12). - Aclaración: Este ejercicio está basado en la realidad pero se realizaron múltiples simplificaciones para adecuarlo al contexto del curso. - Restricciones: - Utilizar Dataclasses - Utilizar 3 clases: 1 abstracta y 2 concretas @@ -35,12 +29,48 @@ import abc from abc import ABC, abstractmethod from dataclasses import dataclass +from decimal import Rounded from typing import List +class Contribuyente(ABC): + @abstractmethod + def calcular_sueldo(self): + pass + +@dataclass +class Empleado(Contribuyente): + sueldo:int + + def calcular_sueldo(self): + return self.sueldo*0.83 + +@dataclass +class Monotributista(Contribuyente): + sueldo:float + + def calcular_sueldo(self): + sueldo_bruto = self.sueldo*12 + + if sueldo_bruto<370000: + sueldo_mensual_final=self.sueldo-2646.22 + elif sueldo_bruto<550000: + sueldo_mensual_final=self.sueldo-2958.95 + elif sueldo_bruto<770000: + sueldo_mensual_final=self.sueldo-3382.62 + elif sueldo_bruto>770000: + sueldo_mensual_final=self.sueldo-3988.85 + return sueldo_mensual_final + + + def calcular_sueldos(contribuyentes: List[Contribuyente]): """Data una lista de contribuyentes, devuelve una lista de los sueldos de cada uno.""" + sueldos_vacios=[] + for i in contribuyentes: + sueldos_vacios.append(i.calcular_sueldo()) + return sueldos_vacios # NO MODIFICAR - INICIO @@ -100,4 +130,4 @@ def calcular_sueldos(contribuyentes: List[Contribuyente]): assert calcular_sueldos(contribuyentes) == [76011.15, 66400.0] -# NO MODIFICAR - FIN +# NO MODIFICAR - FIN \ No newline at end of file