Ejercicio eventos lambda

Vamos a modificar el ejercicio de los tanques y las torretas.

Añadiremos una interfaz IAtaque que obligará a crear el método disparar. Tanques y torretas implementarán esta interfaz.

Vamos a crear una clase Disparo con las propiedades ‘direccion‘ y ‘potencia‘.

Tanto la torreta como los tanques van a tener el evento ataque que tendrá como parámetros el sender (this) y un Disparo. Este evento se invocará en el método Disparar, pasando como parámetros el propio objeto y la dirección del objeto y 100 de potencia en el caso de la torreta y 400 en el caso del tanque.

Ejercicio eventos

Tenemos una clase empleado con la propiedad nombre que se pide en el constructor.

Tenemos una clase empresa con una lista de empleados. La clase dispone de los métodos contratar y despedir que nos añaden o nos quitan un empleado de la lista respectivamente.

Vamos a crear un evento que cuando se despida a un empleado se active pasando como parámetro el empleado despedido.

Añadiremos una clase Administracion con los siguientes métodos: alta y baja. Ambos reciben un parámetro de tipo empleado y generan la documentación de dar de alta y de baja un empleado. Para este ejercicio, simplemente imprime por consola Nombre empleado estás contratado y Nombre empleado estás dado de baja.

Crear un evento para el alta y en el programa crear un objeto de la clase Administracion y suscribir los eventos de contratar y despedir a alta y baja respectivamente.

Ejercicio llamar delegados

Vamos a crear una clase CuentaCorriente con las propiedades (full) nombre y saldo.

La clase tendrá una lista de manejadores similar a la del coche, compuesta por un delegado void alerta(string) y una listaAlertas de tipo alerta. Esta lista será pública.

En el set de saldo llamaremos a la lista de alertas con el mensaje ‘saldo cambiado’.

En el programa crearemos un método void aviso (string) que simplemente nos muestra por consola el mensaje que le pasemos.

Crearemos una cuenta corriente llamada cuenta  y le pondremos en la lista de alertas el aviso. Después cambiaremos el saldo y comprobaremos que funciona.

 

Ejercicio delegados

Tenemos una clase producto con propiedades nombre(string) y precio(double) que se pasan en el constructor

Vamos a crear un delegado cambiar que devuelve un double y toma como parámetro un double.

Crearemos tres funciones con la misma firma: descuento, que devuelve la cantidad que le pasemos menos el 10%. aumento, que devuelve la cantidad que le pasemos más un 5% y rebaja que devuelve la cantidad que le pasemos dividido por dos.

Crearemos un método cambiarPrecio al que le pasemos como delegado lo que queremos aplicar y nos cambie el precio conforme a ese delegado.

En el programa, para probar, crearemos el producto ‘Chupa de cuero’ de precio 100 € y le aplicaremos los tres métodos seguidos para ver los resultados.

Ejercicio Custom Generics

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.

Ejercicio Agenda

Vamos a crear una agenda de teléfonos. Crearemos la clase Agenda y utilizaremos un SortedList<string,string).

Tendremos los siguientes métodos:

agregarContacto(nombre,telefono) Añade el nombre a la agenda, si ya está cambia el número

quitarContacto(nombre) Elimina el nombre y el número de la agenda

telefono(nombre) Nos devuelve el teléfono de ese contacto

nombre(telefono) Nos devuelve el nombre del contacto que tenga ese teléfono

repetidos() Nos devuelve una lista con los contactos que tengan el mismo teléfono (List de string con los nombres)

Sobreescribiremos el método toString para que nos muestre toda la agenda.

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.