Está en la página 1de 13

2016ConvocatoriaJunySol.

pdf

Carlesmg

Programación

3º Grado en Ingeniería Telemática

Escuela Técnica Superior de Ingeniería


Universitat de València

Reservados todos los derechos.


No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Alumno: Convocatoria 1
Programacion (14-06-2016)

Ejercicio 1

FINAL 3.75 puntos (0.4+0.3+0.2+1+0.5+0.2+0.75+0.4)

Tengo un equipo de Domótica en casa que gestiona distintos tipos de sensores: sensores in-
clinómetros y sensores de Temperatura. Dada la clase Sensor que gestiona cualquier tipo de sensor,
public c l a s s S e n s o r {
private S t r i n g nombre ;
private double v a l o r ;

public S e n s o r ( S t r i n g nom) {
nombre= nom ;
}

public double g e t L e c t u r a ( ) {
return v a l o r ;
}

public void s e t L e c t u r a ( double l ) {


v a l o r= l ;
}
}

1. Escribe las clases Inclinometro y Temperatura que son dos clases que representan a tipos
especı́ficos de sensor: sensor inclinómetro y sensor de temperatura respectivamente. En estas
dos clases, la lectura y escritura del dato del sensor se realiza de la misma forma que en
cualquier tipo de sensor, como está ya especificado en la clase Sensor.
SOLUCIÓN
public c l a s s I n c l i n o m e t r o extends S e n s o r {
public I n c l i n o m e t r o ( S t r i n g nombre ) {
super ( nombre ) ;
}
}

public c l a s s Temperatura extends S e n s o r {


public Temperatura ( S t r i n g nom) {
super (nom ) ;
}
}

2. Indica todas las formas con las que podemos referenciar a un sensor de tipo Inclinometro.
SOLUCIÓN
Inclinometro
Sensor
Object

3. Qué mensajes le podemos mandar a un objeto Inclinometro.


SOLUCIÓN
getLectura()
setLectura()

4. Los sensores pueden dar alguna lectura negativa y en nuestro sistema de domótica, las lec-
turas negativas se consideran lecturas erróneas. Modifica la clase Sensor anterior para poder
controlar las lecturas erróneas mediante excepciones. Escribe una clase nueva si es necesario.
SOLUCIÓN
Necesitamos crear una clase excepción nueva que trate las lecturas erróneas,

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5226749
Convocatoria 1 Alumno:
Programacion (14-06-2016)

public c l a s s N e g a t i v o E x c e p c i o n extends E x c e p t i o n {
private double dato ;

public N e g a t i v o E x c e p c i o n ( double x ) {
dato= x ;
}

public double g e t V a l o r ( ) {
return dato ;
}
}

y modificar el método getlectura() de la clase Sensor


public c l a s s S e n s o r {
public double g e t L e c t u r a ( ) throws N e g a t i v o E x c e p c i o n {
i f ( v a l o r <0)
throw new N e g a t i v o E x c e p c i o n ( v a l o r ) ;
return v a l o r ;
}

5. Escribe una clase llamada Domotica que gestionará todos los sensores del sistema de domótica
de nuestra casa. La clase almacenará todos los sensores en un vector, tipo Vector<T> de las
Collections Framework. Para gestionar las lecturas positivas y negativas de todos los sensores
la clase tendrá un vector de reales dónde almacenará las lecturas positivas, y otro vector donde
almacenará las lecturas negativas. Atendiendo a estas caracterı́sticas de la clase Domotica
define la clase con sus atributos y un constructor sin parámetros.
SOLUCIÓN
import j a v a . u t i l . V e c t o r ;

public c l a s s Domotica {
private Vector<S e n s o r > m i s S e n s o r e s ;
private Vector<Double> l e c t u r a s P o s i t i v a s ;
private Vector<Double> l e c t u r a s N e g a t i v a s ;

public Domotica ( ) {
m i s S e n s o r e s= new Vector<S e n s o r > ( ) ;
l e c t u r a s P o s i t i v a s= new Vector<Double > ( ) ;
l e c t u r a s N e g a t i v a s= new Vector<Double > ( ) ;
}
}

6. Escribe un método en la clase Domotica que añada un sensor que se le pase como argumento
al vector de sensores de la clase.
SOLUCIÓN
public void a n y a d e S e n s o r ( S e n s o r s ) {
t h i s . m i s S e n s o r e s . addElement ( s ) ;
}

7. Escribe un método en la clase Domotica que tenga la siguiente signatura


public void barridoSensores(),
que se encargue de recorrer todos los sensores de nuestro sistema de domótica, realizar la
lectura del sensor, y guardar dicha lectura en el vector de lecturas positivas o negativas respec-
tivamente. Recuerda que las lecturas negativas las hemos tratado previamente con el uso de
excepciones, y aquı́ haremos uso de dicho código.
SOLUCIÓN
public void b a r r i d o S e n s o r e s ( ) {
f o r ( i n t i =0; i <m i s S e n s o r e s . s i z e ( ) ; i ++)
{

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5226749
Alumno: Convocatoria 1
Programacion (14-06-2016)

try {
double x= m i s S e n s o r e s . g e t ( i ) . g e t L e c t u r a ( ) ;
l e c t u r a s P o s i t i v a s . add ( x ) ;
} catch ( N e g a t i v o E x c e p c i o n ex ) {
l e c t u r a s N e g a t i v a s . add ( ex . g e t V a l o r ( ) ) ;
}
}
}

8. Escribe el programa principal que simule el funcionamiento de nuestro sistema de domótica,


para ello nuestro programa generará un objeto de la clase Domotica, añadirá un sensor de
tipo Inclinometro con el nombre ”InclinometroDigital”, otro sensor de tipo inclinométro ”In-
clinómetroCapacitivo” y por último un sensor de temperatura ”AireAcondicionado”. El pro-
grama realizará un barrido de las lecturas de los sensores del sistema de domótica.

public s t a t i c void main ( S t r i n g [ ] a r g s ) {


Domotica miDomotica= new Domotica ( ) ;

S e n s o r s 1= new I n c l i n o m e t r o ( ” I n c l i D i g i t a l ” ) ;
S e n s o r s 2= new I n c l i n o m e t r o ( ” I n c l i C a p a c i t i v o ” ) ;
S e n s o r s 3= new Temperatura ( ” A i r e A c o n d i c i o n a d o ” ) ;
miDomotica . a n y a d e S e n s o r ( s 1 ) ;
miDomotica . a n y a d e S e n s o r ( s 2 ) ;
miDomotica . a n y a d e S e n s o r ( s 3 ) ;

miDomotica . b a r r i d o S e n s o r e s ( ) ;
}

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5226749
Convocatoria 1 Alumno:
Programacion (14-06-2016)

Ejercicio 2

FINAL 1.75 puntos (1+0.5+0.25)

Supongamos que tenemos el siguiente código que sólo funciona con tipos de dato int.
public c l a s s Contenedor {
private i n t [ ] d a t o s ;
private i n t n ;

/∗ ∗∗ Método p r i v a d o para b u s c a r l a p o s i c i ó n en l a que s e e n c u e n t r a un


∗ d e t e r mi n a d o d a t o en e l c o n t e n e d o r
∗ @param d a t o a b u s c a r
∗ @return l a p o s i c i ó n donde e s t é e l d a t o . S i e l d a t o no e s t á d e v u e l v e −1∗/

private i n t b u s c a r P o s i c i o n D a t o ( i n t dato ) {
i n t pos ;
i n t i =0;
while ( ( i <n ) && d a t o s [ i ]< dato )
i ++;

i f ( d a t o s [ i ]==dato )
pos=i ;
else
pos =−1;

return pos ;
}
}

1. Modifica y reescribe el código que te damos a continuación para que la clase Contenedor
funcione para cualquier tipo de datos usando tipos parametrizados.
SOLUCIÓN
Parametrizamos la clase y y obligamos a la clase parametrizada que implemente los métodos
definidos en la interfaz.
public i n t e r f a c e EsComparable <T>{
public boolean menorQue (T d a t o s ) ;

Reescribimos la clase Contentedor parametrizando el tipo de dato que guardamos en el con-


tenedor. Usamos el método equals para comparar si dos objetos son iguales, y usamos el
método menorQue definido en la interfaz.
public c l a s s Contenedor<T extends EsComparable <T>> {
private T [ ] d a t o s ;
private i n t n ;

private i n t b u s c a r P o s i c i o n D a t o (T dato ) {
i n t pos ;
i n t i =0;
while ( ( i <n ) && d a t o s [ i ] . menorQue ( dato ) )
i ++;
i f ( d a t o s [ i ] . e q u a l s ( dato ) )
pos=i ;
else
pos =−1;

return pos ;
}

2. Queremos usar el contenedor generalizado para guardar sensores de la clase Sensor, escribe la
clase Domotica, indicando atributos y un constructor sin parámetros.

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5226749
Alumno: Convocatoria 1
Programacion (14-06-2016)

public c l a s s S e n s o r {
private S t r i n g nombre ;
private double l e c t u r a ;

public S e n s o r ( ) {
nombre=” ” ;
}
}

SOLUCIÓN
public c l a s s Domotica {
private Contenedor<S e n s o r > m i s S e n s o r e s ;

public Domotica ( ) {
m i s S e n s o r e s= new Contenedor<S e n s o r >( ) ;
}

3. ¿Qué tienes que cambiar en la clase Sensor para que podamos guardar en el contenedor objetos
de tipo Sensor.
SOLUCIÓN
Obligar a la clase a que implemente la interfaz, definiendo el método menorQue que hemos
definido en la interfaz y redefinir el método equals en la clase Sensor.
public c l a s s S e n s o r implements EsComparable<S e n s o r > {
public boolean menorQue (T dato ) {
// Implementar e l método menorQue para que compare dos s e n s o r e s

public boolean e q u a l s ( O b j e c t o ) {
// Implementar e l método e q u a l s que compara s i dos s e n s o r e s son i g u a l e s
}

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5226749
Convocatoria 1 Alumno:
Programacion (14-06-2016)

Ejercicio 3

FINAL/SEGUNDO PARCIAL 1.25puntos/1.5 puntos

Define la sincronización e indica qué tipos de sincronización existen en el lenguaje de progra-


mación Java.
SOLUCIÓN
La sincronización es el mecanismo que controla el orden en qué se ejecutan las tareas.
Tipos de sincronización:

Competición (Exclusión mútua) Cuando dos o más tareas comparten variables, queremos que
cada tarea ejecute un conjunto de sentencias como si fuese una operación indivisible o atómica
(de forma que la otra tarea no interfiera), denominándose este conjunto de sentencias sección
crı́tica.

Cooperación La tarea A debe de esperar mientras no se produzca un cambio de estado en un


recurso compartido. El cambio de estado en el recurso lo produce otra tarea B.

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5226749
Alumno: Convocatoria 1
Programacion (14-06-2016)

Ejercicio 4

FINAL/SEGUNDO PARCIAL 1.25puntos/1.75 puntos

En la práctica 7 implementamos un servidor de hora que ofrece la hora actual a los clientes que
la solicitan. El servidor le manda la hora actual al cliente serializando una instancia del objeto Hora.
La comunicación entre Cliente y Servidor se realiza mediante el protocolo TCP.
La clase Servidor
public c l a s s S e r v i d o r
{
private S e r v e r S o c k e t s e r v e r S o c k e t ;
private I n e t S o c k e t A d d r e s s inboundAddr ;
private Hora hora ;

La clase Hora
public void Hora ( )
{
C a l e nd a r c a l e n d a r i o = C al e n d a r . g e t I n s t a n c e ( ) ;

hora = c a l e n d a r i o . g e t ( C a l e n da r .HOUR OF DAY ) ;


minuto = c a l e n d a r i o . g e t ( C a l en d a r .MINUTE ) ;
segundo = c a l e n d a r i o . g e t ( C a l e n d ar .SECOND) ;
}

Escribe el trozo del código del servidor en el que le manda la hora actual al cliente que lo ha
solicitado.
SOLUCIÓN
// Escuchando s o c k e t s de c o n e x i ó n y generamos e l f l u j o de s a l i d a
Socket sock = this . serverSocket . accept ( ) ;
OutputStream oStream = s o c k . getOutputStream ( ) ;
ObjectOutputStream ooStream = new ObjectOutputStream ( oStream ) ;

// Creación d e l o b j e t o hora , s e r i a l i z a c i ó n y e n vı́ o d e l o b j e t o hora


t h i s . hora = new Hora ( ) ;
ooStream . w r i t e O b j e c t ( t h i s . hora ) ;
ooStream . c l o s e ( ) ;

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5226749
Convocatoria 1 Alumno:
Programacion (14-06-2016)

Ejercicio 5

FINAL/SEGUNDO PARCIAL (1.5 puntos/1.75 puntos)

Tenemos un sistema de domótica que controla varios sensores, y queremos que la adquisición de
datos se realice de forma concurrente. Dadas las siguientes clases del sistema de domótica:
public c l a s s S e n s o r {
protected S t r i n g nombre ;

public S e n s o r ( S t r i n g n ) {
t h i s . nombre= n ;
}
}

public c l a s s Temperatura extends S e n s o r {


public Temperatura ( S t r i n g n ) {
super ( n ) ;
}
}

1. Modifica el código anterior para que se puedan lanzar de forma concurrente el funcionamiento
de un sensor de tipo Temperatura.
SOLUCIÓN
public c l a s s Temperatura extends S e n s o r implements Runnable {
public Temperatura ( S t r i n g n ) {
super ( n ) ;
}

public void run ( ) {


System . out . p r i n t l n ( ” H i l o Temperatura ”+ t h i s . nombre ) ;
}

2. En esta simulación del sistema de domótica, lo que realizará cada hilo que se ejecuta es mostrar
por pantalla un mensaje con el nombre del sensor. Escribe el programa principal que lance
cuatro sensores de temperatura distintos según su ubicación de la casa: ”salón”, ”habitación”,
”banyo” y ”cocina”.
SOLUCIÓN
public s t a t i c void main ( S t r i n g [ ] a r g s ) {

Thread t 1= new Thread (new Temperatura ( ” S a l o n ” ) ) ;


Thread t 2= new Thread (new Temperatura ( ” H a b i t a c i o n ” ) ) ;
Thread t 3= new Thread (new Temperatura ( ” banyo ” ) ) ;
Thread t 4= new Thread (new Temperatura ( ” c o c i n a ” ) ) ;

t1 . start ();
t2 . start ();
t3 . start ();
t4 . start ();
}

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5226749
Alumno: Convocatoria 1
Programacion (14-06-2016)

Ejercicio 6

FINAL/SEGUNDO PARCIAL (1punto/1.5puntos)

Proporciona la sentencia completa que construye flujos con la funcionalidad especificada:

1. Se deseen leer tipos primitivos almacenados en memoria (supongamos que la referencia al array
de datos es datos).
SOLUCIÓN
DataInputStream i n 1 = new DataInputStream (new ByteArrayInputStream ( d a t o s ) ) ;

2. Se desean leer un objeto serializado que está guardado en un fichero llamado ”objeto.txt”.
SOLUCIÓN
O b j e c t I n p u t S t r e a m i n 2 = new O b j e c t I n p u t S t r e a m (new F i l e I n p u t S t r e a m ( ” o b j e t o . t x t ” ) ) ;

3. Se desean leer bytes que se encuentran en un fichero llamado ”datos2.txt”.


SOLUCIÓN
InputStream i n = new F i l e A r r a y I n p u t S t r e a m ( ” d a t o s 2 . t x t ” ) ;

4. Se deseean leer los caracteres de un fichero de texto llamado ”palabras.txt”.


SOLUCIÓN
F i l e R e a d e r f r = new F i l e R e a d e r ( ” p a l a b r a s . t x t ” ) ;

o
DataInputStream f r = new DataInputStream ( F i l e I n p u t S t r e a m ( ” p a l a b r a s . t x t ” ) ) ;

5. Se desea automatizar la lectura de los tres primeros items items anteriores de forma que se
leen los 3 de forma sequencial en el orden especificado y automáticamente.
SOLUCIÓN
V e c t o r <InputStream> i n p u t s = new V e c t o r <InputStream> ( ) ;
i n p u t s . add ( i n 1 ) ;
i n p u t s . add ( i n 2 ) ;
i n p u t s . add ( i n 3 ) ;
Enumeration <InputStream> enu = i n p u t s . e l e m e n t s ( ) ;
S e q u e n c e I n p ut S t r e a m s e q = new S e q u e n c e I n p u t S t r e a m ( enu ) ;

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5226749
Convocatoria 1 Alumno:
Programacion (14-06-2016)

Ejercicio 7

SEGUNDO PARCIAL (1 punto)

Explica que significa la persistencia en el lenguaje de programación java. Indica qué clases lo
llevan a cabo.
SOLUCIÓN
La persistencia es la posibilidad de guardar un objeto de forma que pueda existir incluso cuando
la aplicación haya finalizado.
En java se consigue con las clases Serializable y Externalizable.

10

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5226749
Alumno: Convocatoria 1
Programacion (14-06-2016)

Ejercicio 8

SEGUNDO PARCIAL 2.5 puntos (0.5+1+0.5+0.5)

Dada la clase Sensor


import j a v a . i o . ∗ ;

public c l a s s S e n s o r {
private S t r i n g nombre ;
private i n t i d ;
private S t r i n g t i p o ;

public S e n s o r ( S t r i n g n , i n t i , S t r i n g t ) {
nombre = n ;
id = i ;
tipo = t ;
}
public S e n s o r ( ) {
nombre=” ” ;
i d =0;
t i p o=” ” ;
}
}

1. Escribe el código completo de la clase Sensor de forma que cuando se serialicen objetos de
este tipo solo serialice el identificador del sensor. Usa la clase Externalizable para serializar
los objetos.
SOLUCIÓN

public c l a s s S e n s o r implements E x t e r n a l i z a b l e {

private S t r i n g s e n s o r ;
private i n t i d ;
private S t r i n g t i p o ;

public void w r i t e E x t e r n a l ( ObjectOutput out ) throws IOException {


out . w r i t e O b j e c t ( i d ) ;
}

public void r e a d E x t e r n a l ( O b j e c t I n p u t i n ) throws IOException ,


ClassNotFoundException {
id = ( int ) in . readObject ( ) ;
}
}

2. Escribe el método que hace falta en la clase Sensor para que sea capaz de mostrar por pan-
talla la información de un sensor de la siguiente forma Sensor(nombre, id, tipo) cuando se
ejecute esta sentencia desde el programa principal
S e n s o r mi S en sor ;
System . out . p r i n t l n ( m i Sen sor ) ;

SOLUCIÓN
Reescribir el método String toString()
public c l a s s S e n s o r implements E x t e r n a l i z a b l e {
public S t r i n g t o S t r i n g ( ) {
String res ;
r e s = ” S e n s o r ( ”+nombre+” , ”+i d+” , ”+t i p o+” ) ” ;
return r e s ;
}
}

11

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5226749
Convocatoria 1 Alumno:
Programacion (14-06-2016)

3. Escribe el main que cree un sensor con nombre ”Temperatura1”, identificador 1 y tipo ”tem-
peratura”, muestre la información del sensor por pantalla, serialice el objeto guardando la
información en un fichero de texto llamado ”sensores.txt”, y posteriormente deserialice el ob-
jeto guardado en el fichero ”sensores.txt”, y lo muestro por pantalla.
SOLUCIÓN
public s t a t i c void main ( S t r i n g [ ] a r g s ) throws IOException , ClassNotFoundException {

S e n s o r s 1 = new S e n s o r ( ” Temperatura1 ” , 1 , ” t e m p e r a t u r a ” ) ;

ObjectOutputStream out = new ObjectOutputStream (new F i l e O u t p u t S t r e a m ( ” s e n s o r e s . t x t ” ) ) ;


out . w r i t e O b j e c t ( s 1 ) ;

System . out . p r i n t l n ( ” S e r i a l i z a n d o o b j e t o ” + s 1 ) ;

O b j e c t I n p u t S t r e a m i n = new O b j e c t I n p u t S t r e a m (new F i l e I n p u t S t r e a m ( ” s e n s o r e s . t x t ” ) ) ;
Sensor s1 = ( Sensor ) in . readObject ( ) ;

System . out . p r i n t l n ( ” Objeto d e s e r i a l i z a d o ”+ s 1 ) ;

out . c l o s e ( ) ;
in . close ( ) ;
}

4. ¿Qué mostrará por pantalla cuando deserialice el objeto?


SOLUCIÓN
Mostrará el identificador del sensor ya que sólo se ha serializado este campo, los demás campos
(nombre y temperatura) apareceren vacı́os.
Usuario ( , 1 , ) ;

12

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5226749

También podría gustarte