Depto. Ingeniería de Sistemas Telemáticos Universidad Politécnica de Madrid ETSI Telecomunicación,CiudadUniversitaria,28040Madrid FUNDAMENTOS DE PROGRAMACIÓN. FEBRERO 2002. Con libros y apuntes. Duración 1 hora 45 minutos. Responda a las preguntas en el espacio al efecto. APELLIDOS:..................................................................................................................NOMBRE...................................... CUENTA : lpr........................ Problema 1 (4 puntos) Se desea realizar una clase, llamada "ConjuntoDePuntos", cuyos objetos representan conjuntos de "Puntos", y que incluye las operaciones típicas sobre conjuntos (unión, intersección, pertenencia, etc). Nótese que no hay límite en la cantidad de “Puntos” que contiene un “ConjuntoDePuntos”. Añadir un Punto de coordenadas (x,y) a un “ConjuntoDePuntos” que ya tiene un punto de coordenadas (x,y) no tiene ningún efecto. Dadas las siguientes declaraciones: class Punto { private double x; private double y; public Punto (double x, double y) { public double getX() { return x; } public double getY() { return y; } this.x = x; this.y = y; } } class ConjuntoDePuntos { .... // Atributos de la Clase public ConjuntoDePuntos () {/* Código del constructor */ ... } public ConjuntoDePuntos (ConjuntoDePuntos otro) { /*Código del Constructor */ ...} public Enumeration elements () { /* Código del método */ ...} public void incluir (Punto p) { /* Código del Método */ ... } public boolean pertenece(Punto p) { /* Código del Método */ ... } } Pregunta 1 (1 punto): Escriba el código correspondiente al Constructor que construye un ConjuntoDePuntos vacío, y los atributos que tendrá la clase. Vector v; public ConjuntoDePunto () { v = new Vector (); } Pregunta 2 (1 punto): Codifique el método pertenece. public boolean pertenece(Punto p) { for (Enumeration e = v.elements() ; e.hasMoreElements() ;) { Punto pi = (Punto) e.nextElement (); System.out.println(pi); if ((p.getX()== pi.getX()) && (p.getY ()== pi.getY())) return true; } Pregunta 3 (1 punto): Codifique el método incluir. Nótese que añadir un punto que ya pertenece a un conjunto no tiene ningún efecto sobre el conjunto. public void incluir (Punto p){ if (! this.pertenece (p)) v.add (p) } Pregunta 4 (1 punto): Códice el constructor que construye un ConjuntoDePuntos a partir de otro ConjuntoDePuntos. Nótese que cualquier operación sobre los puntos de cualquier ConjuntoDePuntos no debe tener efectos sobre los puntos de otro ConjuntoDePuntos. public ConjuntoDePuntos (ConjuntoDePuntos otro) { for ( Enumeration e = otro.elements() ; e.hasMoreElements() ;) incluir ((Punto) e.nextElement ()); } APELLIDOS:..................................................................................................................NOMBRE...................................... Problema 2 (4 puntos): Sean las siguientes declaraciones: class Persona { String Nombre; public Persona (String nombre){ this.Nombre = Nombre;} public String toString (){ return "Nombre: " + Nombre;} } interface AtiendeAlPublico { String atender (String peticion); } Pregunta 1 (1’5 puntos): Codifique la clase Ciudadano, teniendo en cuenta que: - Un Ciudadano es una Persona con un número de identificación único (dni). - El dni es número entero positivo. - Los números de dni se asignan a partir de 0 y de forma consecutiva en la propia clase. - Debe tener un método toString. class Ciudadano extends Persona { static int dnicount=0; int dni; public Ciudadano (String Nombre){ super (Nombre); this.dni = ++dnicount; } public String toString (){ return super.toString () + " } dni: " + dni; Pregunta 2 (1’5 puntos): Codifique la clase Dependiente como una clase derivada de Persona que implementa el Interfaz AtiendeAlPublico con la siguiente tabla de respuestas para el método atender: - “Hola” => “Hola” - “Adios” => “Adios” - Otro msg => “Vuelva usted Mañana” class Dependiente extends Persona implements AtiendeAlPublico { public Dependiente (String Nombre){ super (Nombre); } public String atender (String peticion){ if (peticion.equals ("Hola")) return "Hola"; else if (peticion.equals ("Adios")) return "Adios" ; else return "Vuelva usted Mañana" ; } Pregunta 3 (1 punto): Dado que algunas Personas (los Dependientes) implementan el interfaz AtiendeAlPublico, explique para que Ciudadanos es correcto el siguiente código: Ciudadano c = ... ; Persona p = c; Dependiente d = (Dependiente) p; System.out.println (d.atender ("Hola")); Para Ninguno, ya que la clase Dependientes deriva de Personas al igual que la clase Funcionarios, pero no se pueden convertir objetos de una clase en objetos de otra en ningún caso. Problema 3 (2 Puntos) Escriba un método recursivo que imprima el número de unos que hay en la representación binaria de un número entero positivo dado. Para ello, use el siguiente hecho conocido: el número de unos en la representación binaria del número N es igual al número de unos en la representación binaria de N/2 si N es par o igual al número de unos en la representación binaria de N/2 mas 1 si N es impar. El número de unos que tiene la representación binaria de N=1 es, precisamente, 1, y el número de unos que tiene la representación binaria de N=0 es, precisamente 0. Si N es negativo, el método lanzará una excepción. int Unos (int N) throws Exception{ if (N < 0) throw new Exception ("Valor de N negativo"); if (N==0) return 0; if (N==1) return 1; if (N % 2 == 0) return Unos (N/2); else return 1 + Unos (N/2); }