https://github.com/juanpablofuentes/Pasiona/tree/master/Ejemplos01/NumerosComplejos
Ejercicio sobrecargas
Vamos a hacer una clase Futbolista con las siguientes propiedades
Nombre, Goles
Las ponemos en el constructor obligatorias
Vamos a sobrecargar los comparadores (>,<,>=,<=, == y !=) para que nos comparen los futbolistas por el número de goles.
Además sobrecargamos el toString para que nos muestre el nombre del futbolista y sus goles y el GetHashCode para que nos devuelva el hash combinado del nombre y el número de goles
Juegos de cartas
Vamos a desarrollar una serie de clases para jugar a la baraja.
Una baraja se compone de cartas, que suelen tener un palo y un valor.
Hay dos tipos de barajas clásicas. La francesa, de 52 cartas y la española, de 40. Cada una tiene sus palos y su numeración.
Con la baraja española podemos jugar a juegos como el MUS y con la francesa a juegos como el póquer.
Quiero poder hacer partidas de mus y póquer y me gustaría tener unas clases que me puedan representar los valores de esas partidas e incluso saber que jugador es el que gana.
Por ejemplo, tengo que tener una baraja y de esa baraja tendré que poder barajarla (aleatorizarla) y repartir cartas (obtener cartas de la baraja).
En el caso del mus tengo 4 jugadores y se reparten 4 cartas a cada uno. Hay cuatro comprobaciones: Grande, pequeña, pares y juego. Tendríamos que poder saber cual de los 4 jugadores gana en cada apartado.
En el caso del póquer tenemos un número indeterminado de jugadores (entre 2 y…). Se reparten 5 cartas y tendríamos que saber qué jugador es el que gana. Aquí sólo tenemos una comprobación.
Tengo que identificar que clases voy a implementar. Si tendré o no herencia. Por ejemplo puedo tener una clase abstracta carta de la que deriven española y francesa. Lo mismo con las barajas. De los jugadores querré saber, como mínimo, el nombre y su mano (las cartas que le han tocado)
Hagamos un primer esqueleto sin implementar la funcionalidad, aunque sí indicándola.
En la baraja francesa el valor de una carta es su número, en la española es su número excepto si es un 11 o un 12, que es 10.
Una baraja debe tener todas las cartas. Si es española del 1 al 12 de cada palo (oros, copas, spadas y bastos). Si es francesa del 1 al 13 de cada palo (picas, diamantes, corazones y tréboles).
Una baraja debería poder desordenar las cartas.
Ejercicio: Clase Complejo
Crear una clase para trabajar con números complejos.
class Complejo
Tendrán una parte real y una imaginaria, ambas de tipo float. Deben inicializarse en el constructor (con parámetros). Crear un constructor vacío que ponga 0,0
Crearemos las siguientes funciones:
sumar(complejo) ->Suma al número el número complejo que le pasamos
multiplicar(complejo)->Multiplica por el complejo que le pasamos
igual(complejo) -> devuelve true si los números complejos son iguales
Todas estas funciones trabajan con el propio número.
Crearemos también una propiedad virtual de sólo lectura que nos devuelva el valor absoluto del número complejo. El valor absoluto viene definido por la raíz cuadrada de la suma del cuadrado de a y b
Además vamos a hacer:
Sobrecargar el ToString para que nos pinte una cadena con el número complejo. Si la parte real vale 5 y la imaginaria 3 nos escribe “5 + 3i”
Sobrecargar el equals para que si dos números complejos tienen la misma parte real y la misma parte imaginaria nos diga que son iguales
Ejemplo polimorfismo
En la clase base
public virtual String saludo() { return "Hola "+Nombre; }
Clases hijas:
public class Empleado :Persona { public int Sueldo { get; set; } public Empleado(String nombre) { Nombre=nombre; } public override String saludo() { return "¡Que pasa " + Nombre; } }
internal class Alumno:Persona { public Alumno(String nombre) { Nombre = nombre; } public override String saludo() { return "Bienvenido " + Nombre; } }
Ejemplo propiedad estática
internal class Persona { public int Edad { get; set; } private static bool procesar= true; // Campo estático // Propiedad que tiene un campo privado asociado y que en el get o el set // Hacemos o comprobaciones o algo private string _nombre; // Campo privado para almacenar el valor de la propiedad public string Nombre { get => "Don/doña "+_nombre; // Descriptor de acceso get (lectura) set { // Descriptor de acceso set (escritura) if (!string.IsNullOrEmpty(value)) { this._nombre = value; } } } public Persona(): this("Anonimo") { } public Persona(String nombre):this(nombre,18) { } public Persona(String nombre, int edad) { Nombre = nombre; Edad = edad; } public void procesarOrden() { if (procesar) { procesar=false; Console.WriteLine("Procesando la orden"); } else { Console.WriteLine("No puedo procesar cpu ocupada"); } } public void acabarProceso() { procesar= true; Console.WriteLine("Proceso acabado"); } public static String saludo() { return "Hola "; } }
En el programa
Persona pepe = new Persona(); Persona ana = new Persona(); Persona juan = new Persona(); pepe.procesarOrden(); ana.procesarOrden(); juan.procesarOrden(); pepe.acabarProceso(); ana.procesarOrden(); juan.procesarOrden();
Ejercicio mediciones
irene.py
from sklearn import metrics import numpy as np def errores(reales, observados): mse = metrics.mean_squared_error(observados, reales) rmse = np.sqrt(mse) mae = metrics.mean_absolute_error(observados, reales) mape = metrics.mean_absolute_percentage_error(observados, reales) * 100 # Multiplicamos por 100 para porcentaje r2 = metrics.r2_score(observados, reales) max_error = metrics.max_error(observados, reales) return { "mse":mse, "rmse":rmse, "mae":mae, "mape":mape, "r2":r2, "max_error":max_error } def mostrar_resultados(resultados): print(f"Error Medio Cuadrático (MSE): {resultados["mse"]:.2f}") print(f"Raíz del error Medio Cuadrático (RMSE): {resultados["rmse"]:.2f}") print(f"Error Absoluto Medio (MAE): {resultados["mae"]:.2f}") print(f"Porcentaje de Error Absoluto Medio (MAPE): {resultados["mape"]:.2f}%") print(f"Coeficiente de Determinación (R²): {resultados["r2"]:.2f}") print(f"Error Máximo: {resultados["max_error"]:.2f}")
Caso de uso:
import irene as ir # Datos medicion = [43, 61, 37, 35, 79, 37, 60, 38, 30, 69, 88, 82, 95, 72, 71, 30, 74, 39, 91, 36, 65, 46, 74, 31, 94, 36, 71, 98, 89, 54] reales = [44, 66, 38, 39, 81, 40, 62, 39, 33, 71, 88, 85, 99, 73, 71, 34, 77, 44, 94, 40, 69, 51, 76, 33, 96, 36, 75, 99, 91, 57] # Calculo el error err=ir.errores(medicion,reales) # Imprimimos los resultados ir.mostrar_resultados(err)
Ejercicio clase
Vamos a crear una clase producto con las siguientes propiedades:
String Referencia
String Nombre
int Stock
Double Precio
Vamos a crear una propiedad virtual PVP que es el precio más el iva (21%) solo de lectura
En el stock vamos a comprobar en el setter que no ponemos valores negativos
Vamos a crear un constructor con todos los datos, uno con todos los datos menos el nombre (y le pondremos como nombre la referencia) y uno solo con la referencia y el precio (en nombre pondremos la referencia y en stock 0).
Probad a crear algún producto.
Sobrecarga de constructores
En program
Persona pepe=new Persona(); Persona pepe1 = new Persona("Pepe"); Persona pepe2 = new Persona("pepe",30);
En la clase:
public Persona(): this("Anonimo") { } public Persona(String nombre):this(nombre,18) { } public Persona(String nombre, int edad) { Nombre = nombre; Edad = edad; }
Ejemplo clases
class Persona { // A la manera de java, creo getter y setter private int sueldo; public int getSueldo() { return sueldo; } public void setSueldo(int sueldo) { this.sueldo = sueldo; } // Propiedad sin ninguna modificación. El get y el set se hacen tal cual public int Edad { get; set; } // Propiedad que tiene un campo privado asociado y que en el get o el set // Hacemos o comprobaciones o algo private string _nombre; // Campo privado para almacenar el valor de la propiedad public string Nombre { get => "Don/doña "+_nombre; // Descriptor de acceso get (lectura) set { // Descriptor de acceso set (escritura) if (!string.IsNullOrEmpty(value)) { _nombre = value; } } } protected int id; }