Problemas - Universidad Politécnica de Madrid

Anuncio
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);
}
Descargar