Con el interfaz Giros y las clases torretas y tanque vamos a crear una clase ‘Calibrar’ que utilice una variable privada ‘pieza’ de tipo genérico pero que implemente el interfaz giros. La tenemos que pasar en el constructor. Tendrá el método giros que nos coloca la pieza en posición cero a base de girar a la derecha y nos devuelve el número de giros que hemos tenido que hacer.
Categoría: C#
Ejercicio diccionario
Vamos a crear una clase Ventas para almacenar las ventas de los empleados. Para ello usaremos un diccionario <string,int> en el que la clave es el nombre del empleado y el valor las ventas.
Tendrá los siguientes métodos:
agregarVenta(string empleado, int ventas)
Nos añade las ventas al diccionario. Si el empleado existe se suman las ventas, no se sustituyen.
totalVentas()
Nos devuelve el total de ventas de todos los empleados
mediaVentas()
Nos devuelve la media de ventas por empleado
mejorVendedor()
Nos devuelve el nombre del mejor vendedor
despedir(string nombre)
Elimina al vendedor del diccionario
Ejercicio Queue
Crear la clase Tarea con las siguientes propiedades:
Nombre (string)
Encargado(string)
Horas(int)
Crear la clase Programa con la siguiente propiedad:
Queue<Tarea> Lista
Y los siguientes métodos:
add(Tarea t) -> añade la tarea a la lista
procesar() -> Devuelve el nombre, encargado y horas de la primera tarea y la quita de la lista
tiempo()-> Devuelve el número de horas necesario para procesar todas las tareas
optimizar()->Reordena las tareas para que las que ocupan menos horas se pongan la primera de la lista.
Nueva funcionalidad Dilema prisionero
1.- Incorporar nuevas estrategias:
Espejo: Si el jugador contrario ha cooperado más que desertado, nosotros también cooperamos. En caso contrario, desertamos. Si hay empate o es la primera vez, cooperamos.
Contrario: Hacemos lo contrario de la última jugada del adversario, si ha cooperado, desertamos y viceversa.
2.- Diferentes matrices de pago
Poder incorporar variantes de la matriz de pago. Por ejemplo el juego ‘Gallina’ tiene la siguiente matriz de pagos:
Cooperar | Desertar | |
---|---|---|
Cooperar | 5, 5 | 1, 10 |
Desertar | 10,1 | -20, -20 |
En el juego AmigoEnemigo la matriz de pagos es la siguiente:
Cooperar | Desertar | |
---|---|---|
Cooperar | 1, 1 | 0, 2 |
Desertar | 2, 0 | 0, 0 |
Podemos probar como cambia la efectividad de las estrategias en diferentes condiciones.
3.- El Juego no tiene constructor y todas las propiedades se inicializan en la declaración o hay que añadirlas a mano. Crear un constructor (puede tener parámetros por defecto) que solucione esta carencia, y que nos permita pasar otra matriz de pago.
¿Un return o varios?
La cosa no está clara:
https://stackoverflow.com/questions/36707/should-a-function-have-only-one-return-statement
Artículo sobre el tema:
https://www.anthonysteele.co.uk/TheSingleReturnLaw
Una buena práctica:
Minimize the number of returns in each routine. It’s harder to understand a routine if, reading it at the bottom, you’re unaware of the possibility that it returned somewhere above.
Use a return when it enhances readability. In certain routines, once you know the answer, you want to return it to the calling routine immediately. If the routine is defined in such a way that it doesn’t require any cleanup, not returning immediately means that you have to write more code.
Escribir en fichero
string docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); StreamWriter outputFile = new StreamWriter(Path.Combine(docPath, "salida.txt"))); outputFile.WriteLine("Esto es una línea"); outputFile.WriteLine("Esto es otra"); outputFile.Close();
Códigos juego Piedra Papel Tijera (Lagarto Spock)
Inyección de dependencia
Las interfaces nos permiten desacoplar las funciones al no depender de una clase, sino de la implementación de un interfaz:
https://anexsoft.com/ejemplo-de-inyeccion-de-dependencias-con-c
Definición:
Gente que está en contra (en ocasiones):
Explicación interfaces
En este enlace queda muy claro:
Curso interfaces c#
Aquí también lo explican bien:
Otro ejemplo polimorfismo
class Persona { private string _nombre; public Persona(string nombre) { Console.WriteLine("Constructor persona " + nombre); this.Nombre = nombre; } public string Nombre { set { this._nombre = value; } get { return this._nombre; } } public virtual string saludo() { return "Hola "+Nombre+" que tal"; } } class Empleado :Persona { public Empleado(string nombre, int sueldo=0) : base(nombre) { Console.WriteLine("Constructor empleado " + nombre); this.Cargo = "Empleado"; } public int Sueldo { get; set; } private string _cargo; public string Cargo { set { this._cargo = value; } get { return this._cargo; } } public override string saludo() { return "Hola empleado " + Nombre + " ¿Todo bien?"; } public virtual double sueldoNeto() { return Sueldo * .85; } } class Gerente : Empleado { public int Bono { get; set; } public int Dietas { get; set; } public Gerente(string nombre) : base(nombre) { Console.WriteLine("Constructor gerente " + nombre); this.Cargo = "Gerente"; } public Gerente(string nombre, int sueldo) : base(nombre, sueldo) { } public Gerente(string nombre, int sueldo, int dietas) : this(nombre, sueldo) { Dietas = dietas; } public override string saludo() { return "Hola Sr. " + Nombre + " ¿Desea alguna cosa?"; } public override double sueldoNeto() { return base.sueldoNeto()+Dietas; } } sealed class Direccion : Gerente { public int StockOptions { get; set; } public Direccion(string nombre) : base(nombre, 100) { Console.WriteLine("Constructor direccion " + nombre); } public Direccion(string nombre, int sueldo) : base(nombre, sueldo) { } public Direccion(string nombre, int sueldo, int dietas):base(nombre, sueldo, dietas) { } public Direccion(string nombre, int sueldo, int dietas, int stockoptions) : this(nombre, sueldo, dietas) { this.StockOptions = stockoptions; } public override string saludo() { return "Buenos días Sr. " + Nombre + " Estamos a sus órdenes"; } public override double sueldoNeto() { return base.sueldoNeto()+StockOptions*.5; } } class Cliente : Persona { public Cliente(string nombre) : base(nombre) { } }
Uso:
Empleado eva = new Empleado("Eva",1200); Gerente ana = new Gerente("Ana"); ana.Sueldo = 1700; ana.Dietas = 200; Direccion rosa = new Direccion("Rosa"); rosa.Sueldo = 2500; rosa.Dietas = 300; rosa.StockOptions = 100; Console.WriteLine(rosa.sueldoNeto()); Empleado[] plantilla = { eva, ana, rosa }; double total = 0; foreach(Empleado item in plantilla) { total += item.sueldoNeto(); } Console.WriteLine(total);