Examen Parcial Otoño 2010 (2010)

Examen Español
Universidad Universidad Politécnica de Cataluña (UPC)
Grado Ingeniería de Sistemas de Telecomunicación - 1º curso
Asignatura Metodologia y Programacion Orientada a Objetos
Año del apunte 2010
Páginas 9
Fecha de subida 12/11/2014
Descargas 0
Subido por

Vista previa del texto

Nombre.


 ATENCIÓN:
DEBERÉIS
ENTREGAR
ESTA

HOJA
CON
LA
SOLUCIÓN
A
LA
PREGUNTA
1
EN
ELLA

 EXAMEN
PARCIAL
Metodología
y
Programación
Orientada
a
Objetos.
 Curso
2010‐2011.
Cuatrimestre
Otoño.
1
de
Diciembre
de
2011
 
 1.


(0.75
PUNTOS)

Enmarcad
con
un
círculo
las
sentencias
que
son
ciertas
en
las
listas
que
se
 muestran
a
continuación,
descartando
las
que
son
falsas
(para
cada
lista
pueden
haber
varias
 sentencias
correctas
o
ninguna):
 Solución:
las
respuestas
correctas
se
enmarcan
y
se
señalan
con
el
símbolo

√.
 1. Sobre
clases
y
objetos
 a. √ En
una
misma
clase
los
constructores
deben
tener
diferentes
listas
de
 argumentos
 b. En
una
clase
todos
los
métodos
son
siempre
públicos
 c. √ 
Los
atributos
estáticos
son
atributos
de
clase,
esto
es,
solo
existe
una
instancia
 de
esos
atributos,
y
esa
instancia
es
compartida
por
todos
los
objetos
de
la
clase.
 d. Si
en
un
constructor
no
hay
código
para
asignar
valores
iniciales
a
un
atributo,
su
 valor
inicial
es
indeterminado
 2. Sobre
herencia:
 a. Las
subclases
no
pueden
alterar
el
código
de
los
métodos
heredados
 b. Las
subclases
heredan
todos
los
métodos
de
la
superclase
 c. √

El
que
las
subclases
suelen
representar
conceptos
más
específicos
se
traduce
en
 que
suelen
incorporar
más
atributos
y
más
métodos
que
las
subclases.
 d. Si
en
Java
se
define
una
clase
sin
especificar
explícitamente
que
es
una
clase
 derivada
de
otra,
esa
clase
ciertamente
no
es
subclase
de
ninguna
otra.

 3. Sobre
abstracción:
 a. √
Un
interfaz
detalla
comportamiento
en
forma
de
lista
de
cabeceras
de
funciones
 b. Una
clase
abstracta
tiene
métodos
abstractos
pero
puede
instanciarse
 c. √
Un
interfaz
puede
usarse
para
simular
herencia
múltiple
 d. √
Una
clase
puede
heredar
solo
de
una
superclase
pero
implementar
varios
 interfaces
 
 
 Nombre.


 ATENCIÓN:
DEBERÉIS
ENTREGAR
ESTA

HOJA
CON
LA
SOLUCIÓN
A
LA
PREGUNTA
1
EN
ELLA

 La
figura
que
sigue
muestra
una
parte
del
diagrama
de
clases
de
un
programa
que
controla
un
 videojuego
que
permite
a
dos
jugadores
simular
que
juegan
al

fútbol.

 
 
 Respecto
al
diagrama
cabe
destacar
que
los
atributos
de
Portería
son
las
coordenadas
x
e
y
de
 los
 vértices
 superior
 izquierdo
 
 e
 inferior
 derecho
 del
 área
 en
 la
 que
 se
 encuentra
 el
 objeto
 portería
en
cuestión.
Asimismo,
los
atributos
de
ObjetoMovil
son
las
coordenadas
x
e
y
en
la
 que
se
encuentra
el
objeto
en
cuestión
y
el
atributo
z
es
su
altura.
 2.

(0.75
PUNTOS)
Contestad,
razonando
BREVEMENTE
la
respuesta,
a
las
siguientes
 preguntas:
 a. ¿Qué
papel
juega
en
vuestra
opinión
el
Interfaz
Dibujable?
 Define el comportamiento que debe tener cualquier objeto que pueda dibujarse mediante la función dibuja() y permite que varias clases incorporen tal comportamiento (ObjetoMovil y sus derivadas, y Campo).
b. ¿Qué
implicación
práctica
tiene
en
las
clases
derivadas
de
ObjetoMovil
que
éste
 implemente
el
interfaz
Dibujable?
 
 Nombre.


 ATENCIÓN:
DEBERÉIS
ENTREGAR
ESTA

HOJA
CON
LA
SOLUCIÓN
A
LA
PREGUNTA
1
EN
ELLA

 Que todos los objetos instancias de tales clases incorporan una función dibuja() que permite dibujarlos.
c. ¿Qué
método(s)
polimórfico(s)
se
muestra(n)
en
el
diagrama
de
la
figura?
 dibuja() y puedeTocarConLaMano(p: Porteria).
2.
 (2,25
PUNTOS)
A
la
vista
del
diagrama
anterior,
escribid,
para
todas
sus
clases,
la
parte
de
 código
de
la
definición
de
la
clase
en
cuestión,
comenzando
con
el
“public
class….”
incluyendo
 solamente
la
declaración
de
los
todos
los
atributos
de
las
clases,
incluyendo
en
los
atributos
 aquellos
que
aparecen
al
implementar
las
relaciones.
Escribid
también
la
definición
completa
 del
Interfaz
Dibujable.
 public interface Dibujable { public void dibuja() ;} public class Balon extends ObjetoMovil{ private Jugador poseedor ; . . .} public class Campo implements Dibujable{ private Porteria[] porterias ; . . .} public class Equipo { private String nombre ; private List<Jugador> jugadores ; . . .} public class Jugador extends ObjetoMovil{ private String nombre ; private int dorsal ; private float altura, peso, velocidad ; private float tecnica ; . . .} public class JugadorCampo extends Jugador{ } public class ObjetoMovil implements Dibujable{ private float x, y, z ; . . .} 
 Nombre.


 ATENCIÓN:
DEBERÉIS
ENTREGAR
ESTA

HOJA
CON
LA
SOLUCIÓN
A
LA
PREGUNTA
1
EN
ELLA

 public class Partido { private int tiempo ; private int golesLocal ; private int golesVisitante ; private Equipo[] equipos ; private Balon balon ; private Campo campo ; . . .} public class Porteria { protected float areaX1, areaY1, areaX2, areaY2; . . .} public class Portero extends Jugador{ private Porteria porteria ; . . .} 3.

(1
PUNTO)
Proponed
la
cabecera
y
el
código
de
las
siguientes
funciones:
 3.1
 Un
 constructor
 con
 argumentos
 para
 la
 clase
 Jugador.
 Nota:
 en
 la
 evaluación
 de
 la
 respuesta
 se
 tendrá
 en
 cuenta
 la
 adecuación
 del
 constructor
 propuesto
 con
 el
 repertorio
 de
 métodos
que
aparecen
en
la
clase
Jugador.
 Cabeceras:
 public Jugador(float x, float y, float z, String nom, int dor,float alt, float p,float vel, float tec); Código:

 public Jugador(String nom, int dor,float alt, float p,float vel, float tec){ super(x,y,z) ; // Invoca a constructor con argumentos de ObjetoMovil nombre = nom; dorsal = dor; altura = alt; peso = p; velocidad = vel; tecnica = tec; } 
 Nombre.


 ATENCIÓN:
DEBERÉIS
ENTREGAR
ESTA

HOJA
CON
LA
SOLUCIÓN
A
LA
PREGUNTA
1
EN
ELLA

 3.2
 En
 clase
 Partido,
 un
 método
 llamado
 getJugadorConBalon,
 que
 devuelva
 el
 jugador
 que
 está
en
posesión
del
balón
cuando
el
método
es
invocado.
 
 public class Partido { ...
getJugadorConBalon() { return this.balon.getPoseedor(); } ...
} public class Balon extends ObjetoMovil{ ...
public Jugador getPoseedor() { return poseedor; } ...
} 4.
 (1,25
PUNTO)
 Dibujad
 el
 diagrama
 de
 objetos
 que
 muestre
 el
 estado
 de
 la
 ejecución
 del
 programa
cuando
éste
está
listo
para
permitir
que
los
jugadores
comiencen
a
jugar
(esto
es,
el
 estado
 en
 el
 que
 se
 han
 creado
 todos
 los
 objetos
 necesarios
 para
 comenzar
 a
 jugar:
 dos
 equipos
con
once
jugadores,
etc).

 Notas:

 1. No
es
necesario
que
dibujéis
los
11
jugadores
por
equipo
(utilizad
puntos
suspensivos),
 pero
a
la
hora
de
dibujarlos
tened
en
cuenta
que
no
se
pierda
información
relevante.
 2. No
es
necesario
añadir
en
cada
objeto
los
valores
de
sus
atributos.
 
 Nombre.


 ATENCIÓN:
DEBERÉIS
ENTREGAR
ESTA

HOJA
CON
LA
SOLUCIÓN
A
LA
PREGUNTA
1
EN
ELLA

 
 
 5.
 En
 esta
 pregunta
 se
 os
 pide
 que
 generéis
 código
 para
 ciertos
 métodos
 de
 las
 clases
 del
 diagrama.
 5.1
(1
PUNTO
)
En
la
clase
Equipo
se
define
un
método
addJugador
 Este
método
debe
añadir,
cuando
sea
posible,
un
jugador
al
equipo
en
cuestión.
 ¿Qué
argumento(s)
necesita
en
vuestra
opinión
este
método?
 El
único
atributo
necesario
es
j:
Jugador.
 Escribid
el
código
de
dicho
método.
 public class Equipo { ...
public void addJugador(j) { if( !dorsal_repetido(j.getDorsal()) && this.jugadores.size()<11) { jugadores.add(j); } } 
 Nombre.


 ATENCIÓN:
DEBERÉIS
ENTREGAR
ESTA

HOJA
CON
LA
SOLUCIÓN
A
LA
PREGUNTA
1
EN
ELLA

 public boolean dorsal_repetido(dorsal) { Iterator it = this.jugadores.iterator() ; while(it.hasNext()) { Jugador jug = it.next() ; if (jug.getDorsal() == dorsal) return true; } return false; } ...
} 5.2
 (1,5
 PUNTOS)
 En
 la
 clase
 Partido
 se
 define
 el
 método
 que
 lleva
 por
 nombre
 moverUnEquipo.
 Este
método
debe
mover
consecutivamente
todos
los
jugadores
de
uno
de
los
dos
equipos.
 ¿Qué
argumento(s)
necesita
en
vuestra
opinión
este
método?
 Para
 mover
 a
 los
 jugadores
 usaremos
 el
 método
 mover()
 que
 esta
 en
 su
 superclase
 ObjetoMovil.
El
método
no
necesita
argumentos,
o
sea
que
nosotros
tampoco.
Otra
posibilidad
 es
definir
el
método
mover(x,
y)
en
la
clase
ObjetoMovil
de
manera
que
nosotros
cambiamos
 los
 valores
 de
 los
 atributos
 x
 e
 y.
 En
 este
 caso
 necesitariamos
 los
 argumentos
 x
 e
 y
 como
 posición
en
la
que
queremos
mover
el
Jugador.

 En
cualquier
caso
nos
hará
falta
un
identificador
(de
0
a
1)
para
saber
cuál
de
los
dos
equipos
 queremos
mover.
 
 Escribid
el
código
de
dicho
método.

 public class Partido { ...
public void moverUnEquipo(i) { equipos[i].moverEquipo(); } ...
} public class Equipo { 
 Nombre.


 ATENCIÓN:
DEBERÉIS
ENTREGAR
ESTA

HOJA
CON
LA
SOLUCIÓN
A
LA
PREGUNTA
1
EN
ELLA

 ...
public void moverEquipo() { Iterator it = this.jugadores.iterator() ; while(it.hasNext(){ Jugador jug = it.next() ; jug.mover () ; } } ...
} 
 5.3
(1,5
PUNTOS)
En
las
clases
JugadorCampo
y
Portero
se
define
el
método
 public
boolean
puedeTocarConLaMano();
 Escribid
el
código
de
dicho
método
para
cada
una
de
esas
clases.
 public class Portero extends Jugador { ...
public boolean puedeTocarConLaMano() { return estaEnElArea(); } public boolean estaEnElArea() { //Obtenemos la posición del Jugador float x = getX(); float y = getY(); //Obtenemos el area de la portería float ax1 = this.porteria.getAreaX1(); float ax2 = this.porteria.getAreaX2(); float ay1 = this.porteria.getAreaY1(); float ay2 = this.porteria.getAreaY2(); return (x => ax1 && x <= ax2 && y <= ay1 && y >= ay2); } ...

 Nombre.


 ATENCIÓN:
DEBERÉIS
ENTREGAR
ESTA

HOJA
CON
LA
SOLUCIÓN
A
LA
PREGUNTA
1
EN
ELLA

 } public class JugadorCampo extends Jugador { ...
public boolean puederTocarConLaMano() { return false; } ...
}
 
 ...