Skip to content

Instantly share code, notes, and snippets.

@PalumboN
Created March 16, 2021 19:40
Show Gist options
  • Save PalumboN/54f646809da92f40726ef0e2ab0215e3 to your computer and use it in GitHub Desktop.
Save PalumboN/54f646809da92f40726ef0e2ab0215e3 to your computer and use it in GitHub Desktop.
Ejercicio de la Casa de Pepe y Julián. Modelado y polimorfismo.

Casa de Pepe y Julián

Pepe y Julián viven juntos, y nos pidieron que les ayudemos con un sistema para administrar los gastos de la casa.

La casa

De la casa se conoce la cantidad de víveres que tiene (en porcentaje) y un monto (en pesos) necesario para reparaciones. Además se quiere saber:

  • Si la casa tiene víveres suficientes: mayor al 40%
  • Si hay que hacer reparaciones.
  • Si la casa está en orden, que implica que no hay que hacer reparaciones y tiene víveres suficientes.

Implementar los objetos y métodos necesarios para obtener la información requerida y poder configurar los víveres tiene y reparaciones que necesita la casa, sabiendo que comienza con 50% de los víveres y sin necesidad de reparaciones.

Caso de Prueba: Hacer que se rompa algo de 1000 pesos de la casa, aumentando el monto de reparación. Verificar que la casa:

  • Tiene víveres suficientes
  • Hay que hacer reparaciones
  • No está en orden

Cuentas bancarias

Pepe y Julián poseen varios tipos de cuentas bancarias, de las cuales pueden conocer su saldo y extraer y depositar dinero:

  1. Una cuenta corriente, al depositar suma el saldo, al extraer resta.
  2. Una cuenta con gastos, también mantiene un saldo y, además, un costo por operación. Al depositar suma el importe indicado menos el costo por operación. Al extraer resta el saldo normalmente.

Caso de Prueba: para una cuenta vacía con 20 pesos de costo por operación, si se deposita 1000 pesos, el saldo queda en 980 pesos.

  1. Una cuenta combinada que tiene dos cuentas, una primaria y una secundaria. Si se deposita, el importe pasa a la primaria. Cuando se extrae es así: si la cuenta primaria tiene saldo suficiente se extrae de esa, y si no de la secundaria (vale suponer que la secundaria siempre tiene saldo). El saldo de la combinada es la suma del saldo de las dos.

Caso de Prueba: suponiendo que configuramos la cuenta combinada así: la primaria es la cuenta con gastos con 50 pesos de costo de operación y la secundaria es la cuenta corriente, ya con 500 pesos de saldo. Luego,

  • Se depositan 100 pesos en la cuenta combinada (van a la cuenta con gastos, porque es la primaria, depositándose 50 pesos efectivos).
  • Si se extraen 200 pesos (salen de la cuenta corriente, ya que a la primaria no le alcanza, dejándola en 300 pesos).
  • Verificar que el saldo de la cuenta con gastos queda en 50 pesos, la cuenta corriente con 300 pesos y la combindada con 350 pesos.

Ellos asignan una de esas cuentas para gestionar los gastos de la casa. Cada vez que se preduce un gasto en la casa, se extrae de la cuenta asignada el importe correspondiente.

Se pide poder generar un gasto por un importe determinado en la casa, y que eso se vea afectado en la cuenta elegida previamente.

Manteniendo la casa

Cada cierto tiempo Pepe y Julián hacen un mantenimiento de la casa y los gastos que producen dependen de la estrategia de ahorro que hayan consensuado. Existen tres estrategias de ahorro:

  1. Mínimo e indispensable: si la casa no tiene los víveres suficientes, compran lo necesaria para que alcance (o sea, llegar al 40%). El gasto de comprar víveres se calcula como porcentaje a comprar * calidad, siendo la calidad un valor determinado al elegir esta estrategia.

  2. Full:

    • Si la casa está en orden, se llena de víveres al 100%, sino solamente aumenta un 40%, siempre con una calidad de 5.
    • Además, si el saldo, después de comprar los víveres, en la cuenta alcanza para hacer todas las reparaciones y sobran más de 1000 pesos, se hacen, sino no.

Se pide poder hacer un mantenimiento a la casa, sufriendo los efectos según la estrategia de ahorro.

Caso de Prueba: Si la casa tiene 50% de los víveres, necesita 100 pesos para reparaciones y tiene asociada la cuenta corriente con 1000 pesos de saldo. Al hacer un mantenimiento con la estrategia Full:

  • Como la casa no está en orden, aumenta 40% de sus víveres gastando 40 * 5 = 200 pesos.
  • Si bien luego les alcanza para hacer las reparaciones, no sobrarían 1000 pesos, así que no se hacen.
  • Verificar que la casa queda con 90% de víveres, mantiene los 100 pesos para reparaciones, y la cuenta corriente queda con 800 pesos.

Para pensar: Si se agrega una nueva casa, ¿Es posible usar estas estrategias con ella? ¿Qué mensajes debería entender? (Podés responder con comentarios en el código o directamente inventando otra casa con tu propia implementación para que funcione)

@NahuelCarron
Copy link

//NO HICE EL TEMA PORCENTAJE PUES SUEÑO :.)

object casa{

var viveres = 50
var reparaciones = 100
var cuentaUsada = cuentaCorriente

//mensaje casa.viveresSuficientes() para saber si hay viveres suficientes o no
method viveresSuficientes(){
	return viveres > 40
}

//mensaje casa.algoParaReparar()  para saber si hay que hacer reparaciones
method algoParaReparar(){
	return reparaciones>0
}

//mensaje casa.estaEnOrden() para saber si la casa esta en orden
method estaEnOrden(){
	return viveres>40 and reparaciones<=0
}

//mensaje casa.cambiarCuenta(parametro) para elegir la cuenta de donde sacar o pener platita
method cambiarCuenta(cuenta){
	cuentaUsada = cuenta
}

//mensaje casa.consumirViveres() para consumir viveres de la casa
method consumirViveres(){
	viveres = viveres- 1.randomUpTo(40) 
}

//mensaje casa.comprarViveres(parametro) para comprar viveres 
method comprarViveres(monto){
	viveres = viveres+monto
	cuentaUsada.gasto(monto) 
}

//mensaje casa.deteriorarCasa() para generar deterioro en la casa
method deteriorarCasa(){
reparaciones = reparaciones+ 100.randomToUp(1000)
}

//mensaje casa.reparar(monto) para reparar la casa
method reparar(monto){
reparaciones = reparaciones-monto
cuentaUsada.gasto(monto)
}

//mensaje casa.estrategiaMYI(monto) para implementar la estrategia minimo e indispensable (trucha)
method estrategiaMYI(calidad){
	if(viveres<40){
		self.comprarViveres(40*calidad)
	}
	viveres = 40
}
	
//mensaje casa.estrategiaFull(monto) para implementar la estrategia full (trucha)
method estrategiaFull(){
	if(self.estaEnOrden()){
		self.comprarViveres(100)
	}else{
		self.comprarViveres(200)
	}
	if(cuentaCorriente.saldo()>1000){
		self.reparar(reparaciones)
	}
}		

}

object cuentaCorriente{
var saldo = 1000

method depositar(monto){
	saldo = saldo+monto
}

method gasto(monto){
	saldo = (saldo-monto).max(1)
}

method saldo(){
	return saldo
}

}

object cuentaConGastos{
var saldo = 0

method depositar(monto){
	saldo = saldo+(monto-50)
}

method gasto(monto){
	saldo = saldo-monto
}

method saldo(){
	return saldo
}	

}

object cuentaCombinada{
var saldo=0

method depositar(monto){
	cuentaConGastos.depositar(monto)
	saldo = cuentaConGastos.saldo()+cuentaCorriente.saldo()
}

method gasto(monto){
	if(cuentaConGastos.saldo() >= monto){
		cuentaConGastos.gasto(monto)
		saldo = cuentaConGastos.saldo()+cuentaCorriente.saldo()
	}else {
		cuentaCorriente.gasto(monto)
		saldo = cuentaConGastos.saldo()+cuentaCorriente.saldo()
	}	
}

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment