SOLUCIONES CLASES C# 50 Define, en Visual C#, una clase Bombilla que sirva permita modelar el estado y comportamiento de una bombilla, la cual podrá estar encendida o apagada. La clase constará de: Los atributos privados: encendida (lógico), intensidad (float), iMáxima (intensidad máxima que puede alcanzar la bombilla), iMinima (el mínimo de intensidad que tendrá al encenderse). Los métodos saberEstado, ponerEstado, modificarIntensidad, serán los métodos a través de los cuales se accederá a los campos anteriores: o ponerEstado.- Permitirá encender o apagar la bombilla, según el parámetro que le llegue. Cuando se enciende una bombilla, el valor de la intensidad es iMinima o modificarIntensidad.- Se encargará de aumentar, o disminuir, la intensidad de la bombilla en una cantidad que recibe como parámetro. Nunca se podrá superar la iMaxima y cuando la intensidad sea cero, o menor que cero, la bombilla se apagará o saberEstado.- Permitirá conocer el estado y la intensidad de la bombilla en un instante determinado. La clase dispondrá de constructores, que además de fijar los valores de intensidad máxima y mínima de encendido de la bombilla, realizarán: o El primero que se encargará de crear el objeto bombilla por defecto, esto es, la bombilla está apagada. o El segundo crea el objeto bombilla encendida con su intensidad mínima. Codifica la clase Programa que pruebe la clase anterior, para lo cual creará diferentes objetos bombilla e irá probando los métodos y el resultado de su aplicación. namespace Ejercicio50 { // -----------------------------------------------------------------------// Clase Bombilla. Modela el funcionamiento de una bombilla // // Autor: J. Alvarez // Fecha: 01/02/2014 // -----------------------------------------------------------------------class Bombilla { bool encendida; float intensidad; float iMaxima; float iMinima; // Constructor que fija las intensidades mínimas y máximas public Bombilla(float iMinima, float iMaxima) { encendida = false; intensidad = 0; this.iMinima = iMinima; this.iMaxima= iMaxima; } // Constructor que fija la intensidad con la que se enciende la bombilla public Bombilla(float intensidad, float iMinima, float iMaxima) { encendida = true; this.intensidad = intensidad; this.iMinima = iMinima; this.iMaxima = iMaxima; } // Método para saber el estado y la intensidad de una bombilla public void saberEstado(out float intensidad, out bool estado) { intensidad = this.intensidad; estado = encendida; } // Método pra encener/apagar la bombilla public void ponerEstado(bool encernder) { if (encernder) { if (!encendida) { encendida = true; intensidad = iMinima; } } else { encendida = false; intensidad = 0; } } // Aumenta/Disminuye la intensidad de una bombilla public void modificarIntensidad(float cantidad) { if (encendida) { intensidad += cantidad; if (intensidad > iMaxima) intensidad = iMaxima; if (intensidad < iMinima) { intensidad = 0; encendida = false; } } } } // Clase Programa50. Prueba la clase Bombilla class Program50 { static void Main(string[] args) { bool estadoBombilla; float intensidad; Bombilla bombilla1 = new Bombilla(10, 100); Bombilla bombilla2 = new Bombilla(50, 10, 100); // Mostramos el estado y la intensidad de la bombilla1 bombilla1.saberEstado(out intensidad, out estadoBombilla); Console.WriteLine("Bombilla1: Estado: {0} - Intensidad: {1}", estadoBombilla, intensidad); // Mostramos el estado y la intensidad de la bombilla2 bombilla2.saberEstado(out intensidad, out estadoBombilla); Console.WriteLine("Bombilla2: Estado: {0} - Intensidad: {1}", estadoBombilla, intensidad); // Intentamos aumentar la intensidad de la bombilla apagada bombilla1.modificarIntensidad(500); // Mostramos el estado y la intensidad de la bombilla2 bombilla1.saberEstado(out intensidad, out estadoBombilla); Console.WriteLine("Bombilla1: Estado: {0} - Intensidad: {1}", estadoBombilla, intensidad); // Aumentamos por encima del valor máximo la bombilla 2 bombilla2.modificarIntensidad(500); // Mostramos el estado y la intensidad de la bombilla2 bombilla2.saberEstado(out intensidad, out estadoBombilla); Console.WriteLine("Bombilla2: Estado: {0} - Intensidad: {1}", estadoBombilla, intensidad); // Encendemos la bombilla 1 bombilla1.ponerEstado(true); // Mostramos el estado y la intensidad de la bombilla2 bombilla1.saberEstado(out intensidad, out estadoBombilla); Console.WriteLine("Bombilla1: Estado: {0} - Intensidad: {1}", estadoBombilla, intensidad); //Apgamos la bombilla 2 bajanndo su intensidad bombilla2.modificarIntensidad(-500); // Mostramos el estado y la intensidad de la bombilla2 bombilla2.saberEstado(out intensidad, out estadoBombilla); Console.WriteLine("Bombilla2: Estado: {0} - Intensidad: {1}", estadoBombilla, intensidad); } } } 51 Nos han pedido modelar, en Visual C#, la clase Monedero, la cual debe permitir gestionar la cantidad de dinero que una persona tiene en un momento determinado. Se supone que cuando le entregan a una persona un monedero, se lo entregan vacío, pero también podrían dárselo con una cantidad inicial. Sobre el monedero se pueden realizar varias operaciones: meter dinero en el monedero, sacar dinero y visualizar cuánto dinero hay disponible. Sólo podrá operarse con el monedero a partir de estos métodos. No se podrá sacar más dinero que el que haya en el monedero, ni se admitirán cantidades negativas de dinero. Codifica la clase Programa que pruebe la clase anterior namespace Ejercicio51 { // --------------------------------------------------------------------------------// Modelar, en Visual C#, la clase Monedero, para gestionar la cantidad de dinero // que una persona tiene en un momento determinado. Inicialmente se supone vacío // pero también podrían dárselo con una cantidad inicial. // Operaciones: guardar dinero , sacar dinero y visualizar dinero disponible // // Autor: J. Alvarez // Fecha: 01/02/2014 // --------------------------------------------------------------------------------class Monedero { float dinero; // Inicializa el monedero a cero public Monedero() { dinero = 0; } // Inicializa el monedero con una cantidad inicial public Monedero(float cantidad) { dinero = cantidad; } // Visualiza el saldo del monedero public float VisualizarDinero { get { return dinero; } } public string ingresarDinero(float cantidad) { string mensaje; // No se admite que la cantidad sea negativa if (cantidad > 0) { dinero += cantidad; mensaje = "Operación realizada correctamente"; } else mensaje = "No se puede ingresar una cantidad negativa"; return mensaje; } public string sacarDinero(float cantidad) { string mensaje; // No se admite que la cantidad sea negativa if (cantidad > 0) { if (dinero >= cantidad) { dinero -= cantidad; mensaje = "Operación realizada correctamente"; } else mensaje = "No se dispone de esa cantidad de dinero"; } else mensaje = "No se puede retirar una cantidad negativa"; return mensaje; } } // Clase Programa51. Permite modelar la clase Monedero class Program51 { static void Main(string[] args) { Monedero miMonedero = new Monedero(); Monedero tuMonedero = new Monedero(4000); // Visualizamos los saldos de los monederos Console.WriteLine("Saldo Monedero miMonedero = {0} ", miMonedero.VisualizarDinero); Console.WriteLine("Saldo Monedero tuMonedero = {0} ", tuMonedero.VisualizarDinero); // Ingresamos en el primer monedero 1000 euros y los retiramos del segundo Console.WriteLine("miMonedero {0} ", miMonedero.ingresarDinero(1000)); Console.WriteLine("tuMonedero {0} ", tuMonedero.sacarDinero(1000)); // Visualizamos los saldos de los monederos Console.WriteLine("Saldo Monedero miMonedero = {0} ", miMonedero.VisualizarDinero); Console.WriteLine("Saldo Monedero tuMonedero = {0} ", tuMonedero.VisualizarDinero); // Intentamos ingresar en miMonedero una cantidad negativa Console.WriteLine("miMonedero {0} ", miMonedero.ingresarDinero(-1000)); // Intentamos sacer de tuMonedero más de lo que tiene. Console.WriteLine("tuMonedero {0} ", tuMonedero.sacarDinero(8000)); // Visualizamos los saldos de los monederos Console.WriteLine("Saldo Monedero miMonedero = {0} ", miMonedero.VisualizarDinero); Console.WriteLine("Saldo Monedero tuMonedero = {0} ", tuMonedero.VisualizarDinero); } } } 52 - La empresa informática “IES Número1” necesita llevar un registro de todos sus empleados que se encuentran en la oficina central, para eso ha creado el diagrama de clases que se muestra La clase Empleado está formada por: Campo Estático o float SALBASE; se corresponde con el salario base que es de 600,00 euros Campos Privados o string nombre; o string dni; o int edad; o bool casado; o float sueldo; Constructores o Empleado() o Empleado (string nombre, string dni, int edad, bool casado, float sueldo) Nota.- Si el campo dni que se recibe no tiene ocho caracteres no se guardará. Si la edad no está comprendida entre los 18 y los 45 años, se pondrá a cero. Por último, si el sueldo no fuese positivo se pondrá a cero. Propiedades o Una de lectura y escritura por cada campo, excepto para el sueldo que sólo será de lectura. Métodos o string Categoria().- Establecerá la categoría del trabajador en función de su edad. Cuando sea menor de 21 años, su categoría será Principiante, si está entre los 18 y 35 será “Junior” y con más de 35 años será “Senior” o void EstablecerSueldo().- Establecerá el sueldo del empleado o o void AumentarSalario(float porcentaje). Permite aumentar el sueldo en el porcentaje recibido. Si el porcentaje fuese negativo, se reduciría su sueldo, nunca por debajo de los 600 euros. int edad; La clase Programador está formada por: Campos Privados o string lenguaje; es el lenguaje en el que programa Constructor o Programador (string nombre, string dni, int edad, bool casado, float sueldo, string lenguaje) Propiedades o Una de lectura y escritura para acceder al campo privado. Codifica la clase Programa que pruebe las clases anteriores, para lo cual esta clase dispondrá de un método principal que fije diferentes valores y comprueba que todo funciona correctamente. Por ejemplo: Programador Programador Programador Programador objProgramador1 objProgramador2 objProgramador3 objProgramador4 = = = = new new new new Programador("Visual C++"); Programador("Gemma Cienfuegos", "57098765",21, false, 860, "Java"); Programador("Susana Llaneza", "10056234", 32, true , 1200, "Visual C#"); Programador("María Álvarez", "", 18, true, 0, "Phyton"); objProgramador1.Nombre = "Mercedes García"; objProgramador1.Edad = 43; objProgramador1.Dni = "10867111"; objProgramador1.Casado = true; objProgramador1.EstablecerSueldo(2700); objProgramador1.MostrarDatosEmpleado(); objProgramador2.AumentarSalario(5); objProgramador2.MostrarDatosEmpleado(); namespace Ejercicio52 { class Empleado { static double SALBASE = 600.00; string nombre; string dni; int edad; // Debe estar entre 18 y 45 años */ bool casado; double sueldo; public Empleado() { } public Empleado (string nombre, string dni, int edad, bool casado, double sueldo) { this.nombre = nombre; this.casado = casado; if (dni.Length != 8) this.dni = string.Empty; this.dni = dni; if ((edad < 18) || (edad > 45)) this.edad = -1; else this.edad = edad; if (sueldo < 0) this.sueldo = 0; else this.sueldo = sueldo; } public string Nombre { set {nombre= value;} get {return nombre;} } public string Dni { set {dni = value;} get {return dni;} } public int Edad { set {edad = value;} get {return edad;} } public bool Casado { set {casado = value;} get {return casado;} } public double Sueldo { get {return sueldo;} } public string Categoria() { string tipoTrabajador; if (edad <= 21) tipoTrabajador = "Principiante"; else if (edad > 35) tipoTrabajador = "Senior"; else tipoTrabajador = "Junior"; return tipoTrabajador; } public void EstablecerSueldo(float salario) { if (sueldo < 0) sueldo = SALBASE; this.sueldo = salario; } public void AumentarSalario(float porcentaje) { sueldo = sueldo*(1+porcentaje/100); if (sueldo < 600) sueldo = SALBASE; } public void MostrarDatosEmpleado() { string eCivil; if (casado) eCivil = "Casado"; else eCivil = "Soltero"; Console.WriteLine("Empleado ........: {0}", nombre); Console.WriteLine("Dni..............: {0}", dni); Console.WriteLine("Edad ............: {0}", edad); Console.WriteLine("Categoria .......: {0}", Categoria()); Console.WriteLine("Estado Civil.....: {0}", eCivil); Console.WriteLine("Salario .........: {0}", Sueldo); Console.WriteLine("======================================================= "); } } class Programador:Empleado { string lenguaje; public Programador(string lenguaje) { this.lenguaje = lenguaje; } public Programador(string nombre, string dni, int edad, bool casado, double sueldo, string lenguaje):base(nombre, dni, edad, casado, sueldo) { this.lenguaje=lenguaje; } public string Lenguaje { set {lenguaje = value;} get {return lenguaje;} } } class Program { static void Main(string[] args) { Programador objProgramador1 = new Programador("Visual C++"); Programador objProgramador2 = new Programador("Gemma Cienfuegos", "57098765",21, false, 860, "Java"); Programador objProgramador3 = new Programador("Susana Llaneza", "10056234", 32, true , 1200, "Visual C#"); Programador objProgramador4 = new Programador("María Álvarez", "", 18, true, 0, "Phyton"); // Trabajamos con el programador1 objProgramador1.Nombre = "Mercedes García"; objProgramador1.Edad = 43; objProgramador1.Dni = "10867111"; objProgramador1.Casado = true; objProgramador1.EstablecerSueldo(2700); objProgramador1.MostrarDatosEmpleado(); objProgramador2.AumentarSalario(5); objProgramador2.MostrarDatosEmpleado(); } } } 53 En sentido amplio se llama número racional o fracción común a todo número que puede representarse como el cociente de dos enteros con denominador distinto de cero. Por ejemplo, 0,25 se puede representar como ¼. Cuando en un equipo informático realizamos múltiples operaciones encadenadas, con números reales se producen aproximaciones que pueden llegar a distorsionar el resultado final, por ello, sería interesante disponer de una clase Racionales que disponga de los campos y métodos necesarios para poder implementar las tareas siguientes: Sumar valores Racionales. Restar valores Racionales. Multiplicar valores Racionales. Dividir valores Racionales. Comprobar la igualdad de valores Racionales. Crea el método esIgual, que recibiendo los dos valores Racionales, devolverá true si son iguales y false en otro caso Los números racionales serán iguales cuando se cumpla que a x d = b x c Comparar dos valores racionales.- Crea el método comparaRacional, que recibiendo los dos valores Racionales, devolverá -1 si el primer valor es menor que el segundo, 0 si son iguales y 1 si el primer valor es mayor Codifica la clase Programa que pruebe la clase anterior, para lo cual esta clase dispondrá de un método principal que le pregunte a un alumno de secundaria por dos fracciones y nos muestre por los resultados de aplicar las operaciones anteriores. Ejemplo: Si le mandan sumar dos fracciones, donde la primera fracción es de la forma numerador 3, denominador 5 y la segunda fuese numerador 4, denominador 5 la salida por pantalla sería: Resultado =3/5 + 4/5 = 7/5 Donde resultado, fraccion1, fraccion2 son objetos de la clase Racional namespace Ejercicio53 { // ----------------------------------------------------------------------------// Clase Racional, permite operar valores racionales sin pérdida de información // // Autor: Joaquin Alvarez // Fecha: 01/02/2014 // ----------------------------------------------------------------------------class Racional { public int numerador, denominador; public Racional(int n, int d) { numerador = n; denominador = d; } // Sobrecarga del operador suma para adaptarlo a la suma de feacciones public static Racional operator + (Racional x, Racional y) { return new Racional(x.numerador * y.denominador + y.numerador * x.denominador, x.denominador * y.denominador); } // Sobrecarga del operador resta para adaptarlo a la diferencia de feacciones public static Racional operator - (Racional x, Racional y) { return new Racional(x.numerador * y.denominador - y.numerador * x.denominador, x.denominador * y.denominador); } // Sobrecarga del operador producto para adaptarlo al producto de feacciones public static Racional operator * (Racional x, Racional y) { return new Racional(x.numerador * y.numerador , x.denominador * y.denominador); } // Sobrecarga del operador cociente para adaptarlo al cociente de feacciones public static Racional operator / (Racional x, Racional y) { return new Racional(x.numerador * y.denominador , x.denominador * y.numerador); } // Comprobamos la igualdad de dos números racionales public static bool operator == (Racional x, Racional y) { if ((double)x == (double)y) return true; else return false; } // Comprobamos la igualdad de dos números racionales public static bool operator != (Racional x, Racional y) { if ((double)x != (double)y) return true; else return false; } // Comprobamos si el primer numero racional es menor que el segundo public static bool operator < (Racional x, Racional y) { if ((double)x < (double)y) return true; else return false; } // Comprobamos si el primer numero racional es mayor que el segundo public static bool operator > (Racional x, Racional y) { if ((double)x > (double)y) return true; else return false; } // Conversión de la fracción al tipo de dato double public static explicit operator double(Racional f) //Convierte a double. { return (double)f.numerador / f.denominador; } // Reemplazar el método ToString para mostrar un número fraccionario por pantalla // en el formato adecuado: public override string ToString() { return (String.Format("{0} / {1}", numerador, denominador)); } // Creamos una función esIgual para comparar números racionales public bool esIgual(Racional x, Racional y) { if (x == y) return true; else return false; } // Creamos una función para comparar valores racionales public int comparaRacional(Racional x, Racional y) { if (x == y) return 0; else if (x < y) return -1; else return 1; } } // Clase Programa53: Prueba la clase Racional class Program53 { static void Main(string[] args) { Racional numero1, numero2, resultado; int numerador, denominador; // Preguntamos por el numerador del primer número racional Console.Write("Introduce el numerador del primer número racional: "); numerador = Convert.ToInt32(Console.ReadLine()); // Preguntamos por el denominador del primer número racional Console.Write("Introduce el denominador del primer número racional: "); denominador = Convert.ToInt32(Console.ReadLine()); // Creamos el número racional numero1 = new Racional(numerador, denominador); // Preguntamos por el numerador del segundo número racional Console.Write("Introduce el numerador del segundo número racional: "); numerador = Convert.ToInt32(Console.ReadLine()); // Preguntamos por el denominador del segundo número racional Console.Write("Introduce el denominador del segundo número racional: "); denominador = Convert.ToInt32(Console.ReadLine()); // Creamos el número racional numero2 = new Racional(numerador, denominador); // Realizamos la suma y mostrsamos el resultado resultado = numero1 + numero2; Console.WriteLine(resultado); // Realizamos la resta y mostramos el resultado resultado = numero1 - numero2; Console.WriteLine(resultado); // Realizamos el producto y mostramos el resultado resultado = numero1 * numero2; Console.WriteLine(resultado); // Realizamos el cociente y mostramos el resultado resultado = numero1 / numero2; Console.WriteLine(resultado); // Comprobamos si los números son iguales if (resultado.esIgual(numero1, numero2)) Console.WriteLine("{0} y {1} son iguales", numero1, numero2); else Console.WriteLine("{0} y {1} son distintos", numero1, numero2); // Comprobamos si el primer número es menor que el segundo if (resultado.comparaRacional(numero1, numero2) < 0) Console.WriteLine("{0} es menor que {1}", numero1, numero2); else Console.WriteLine("{0} es mayor que {1}", numero1, numero2); } } } 54 Crear una clase llamada “hora” que contenga en su parte privada tres variables enteras llamadas hh, mm y ss, que representan las horas, los minutos y los segundos. Dicha clase tendrá además: Un constructor sin parámetros para la clase de forma que se inicialicen las tres variables privadas a cero. Otro constructor con parámetros para poder inicializar una hora con los valores que se quieran al declarar un objeto. Si cualquiera de estos valores no fueran correctos (0-23 y 0-59), se les asignará el valor 0 a ese único valor. Propiedades para una de las variables privadas, comprobando su rango de valores. Si no lo cumple, asignar un cero Redefinir el método ToString() de tal forma que para que nos muestre la hora de cualquier objeto de la clase con el formato hh:mm:ss Redefinir el operador “+”, de tal forma que se puedan sumar dos objetos hora. El resultado será otro objeto de tipo hora con los valores correctos (0-23 y 0-59) de las variables privadas. Las horas que excedan de 24 vuelven a comenzar en cero. Redefinir el operador “>”, de tal forma que podamos comparar si dos objetos de la clase hora, devolviéndonos true en el caso que el primero sea mayor que el segundo y false en caso contrario. Redefinir el operador “<”, de tal forma que podamos comparar si dos objetos de la clase hora, devolviéndonos true en el caso que el primero sea menor que el segundo y false en caso contrario. Codifica la clase Programa que pruebe la clase anterior. namespace Programa54 { // ------------------------------------------------------------------------// Clase Hora. Permite operar los objetos hora a través del polimorfismo // de los operadores // // Autor: Joaquín Álvarez // Fecha: 01/02/2013 // ------------------------------------------------------------------------class Hora { int horas; int minutos; int segundos; // Constructor sin paráemtros. Inicializa la hora public Hora() { horas = minutos = segundos = 0; } // Constructor con parámetros. Fija la hora public Hora(int hora, int minuto, int segundo) { // Comprobamos que la hora sea válida if ((hora > 0) && (hora < 24)) this.horas = hora; else this.horas = 0; // Comprobamos que el minuto sea válido if ((minuto > 0) && (minuto < 60)) this.minutos = minuto; else this.minutos = 0; // Comprobamos que el segundo sea válido if ((segundo > 0) && (segundo < 60)) this.segundos = segundo; else this.segundos = 0; } // Propiedad para asignar y recuperar la hora public int Horas { set { horas = value; } get { return horas; } } // Propiedad para asignar y recuperar el minuto public int Minutos { set { minutos = value; } get { return minutos; } } // Propiedad para asignar y recuperar el segundo public int Segundos { set { segundos = value; } get { return segundos; } } // Modificamos el método ToString para escribir según las necesidades public override string ToString() { return string.Format("{0} : {1} : {2} ",horas, minutos, segundos); } // Redefinimos el operador > para poder comparar horas public static bool operator >(Hora hora1, Hora hora2) { int segundos1, segundos2; segundos1 = hora1.segundos + hora1.minutos * 60 + hora1.horas * 3600; segundos2 = hora2.segundos + hora2.minutos * 60 + hora2.horas * 3600; return segundos1>segundos2; } // Redefinimos el operador < para poder comparar horas public static bool operator <(Hora hora1, Hora hora2) { int segundos1, segundos2; segundos1 = hora1.segundos + hora1.minutos * 60 + hora1.horas * 3600; segundos2 = hora2.segundos + hora2.minutos * 60 + hora2.horas * 3600; return segundos1 < segundos2; } public static Hora operator + (Hora hora1, Hora hora2) { Hora resultado = new Hora(); resultado.segundos = hora1.segundos + hora2.segundos; if (resultado.segundos > 59) { resultado.segundos = resultado.segundos - 60; resultado.minutos = 1; } resultado.minutos += hora1.minutos + hora2.minutos; if (resultado.minutos > 59) { resultado.minutos = resultado.minutos - 60; resultado.horas = 1; } resultado.horas += hora1.horas + hora2.horas; if (resultado.horas > 23) resultado.horas = 0; return resultado; } } // Clase Programa54: Prueba la clase Hora class Program54 { static void Main(string[] args) { Hora hora1, hora2; // Creamos la primera hora meduante el contructor con parámetros hora1 = new Hora(08, 01, 59); // Creamos la segunda hora con el constructor por defecto hora2 = new Hora(); // Asignamos la hora2 utilizando las propiedades hora2.Horas = 03; hora2.Minutos = 58; hora2.Segundos = 59; // Acumulamos las dos horas Console.WriteLine(hora1 + hora2); // Comprobamos qué hora va antes if (hora1 < hora2) Console.WriteLine("la hora {0} es anterior a la hora {1}", hora1, hora2); if (hora1 > hora2) Console.WriteLine("la hora {0} es posterior a la hora {1}", hora1, hora2); } } }