Fundamentos de Programación II
Tema Tema 2. Herencia Herencia y Poli mor fis mo 1. ¿Qué ¿Qué tipo s de relación hay entre las siguientes clases?
Personal de la Universidad
1
PAS
n
Profesor
a) herencia y asociación c) dependencia y asociación
Estudiante
b) herencia y dependencia d) transposición transposici ón y bifuncionalismo bifuncionali smo
2. ¿Cuál ¿Cuál es el el resul tado del si guiente pro grama?
cl ass Pr ogr ogr ama { publ i c stati c vo voi d mai n( St r i ng [ ] ar gs) { Cl ase1 ase1 obj obj 1=new new Cl ase1 ase1( ) ; obj 1. i mpr i mi r ( 4) ; Cl ase2 ase2 obj obj 2=new new Cl ase2 ase2( ) ; obj 2. i mpr i mi r ( 3) ; } } cl ass Cl Cl ase1 { pr ot ect ed i nt pr op1 op1=10, pr op2 op2=4; publ i c vo voi d i mpr i mi r ( i nt i ) { pr op1= op1=pr op1+ op1+i ; pr op2= op2=pr op2+ op2+i ; Syst em. out . pr i nt ( pr op1 op1+" " +pr op2+" " ) ; } } cl ass Cl Cl ase2 ase2 ext ext ends ends Cl Cl ase1 ase1 { publ i c vo voi d i mpr i mi r ( i nt i ) { pr op1=pr op1 op1- i ; pr op2=pr op2 op2- i ; Syst em. out . pr i nt ( pr op1 op1+" " +pr op2) ; } } 3. ¿Qué ¿Qué modificador de visibi lidad debo usar en los siguientes casos? Para un atrib uto Para un método Para un método Para un atrib uto
Ejercicios Ejercici os Tema 2
d e una clase que va a tener hijas de soporte de servicio d e una clase que no va a tener tener hij as
Página 1
Fundamentos de Programación II
4. ¿Cuál es el resultado del siguiente programa?
abst r act cl ass Uno { pr ot ect ed i nt i =2; abs t r ac t publ i c voi d f r as e( ) ; } cl ass Dos ext ends Uno { publ i c voi d f r ase( ) { i nt i =3; Syst em. out . pr i nt l n( " Est oy en un obj et o de cl ase Dos con i : " +i ) ; } } cl ass Tr es ext ends Dos { publ i c voi d f r ase( ) { Syst em. out . pr i nt l n( "Estoy en un obj et o de cl ase Tr es con i : "+i ) ; } } cl ass Dr i ver { publ i c stati c voi d mai n( St r i ng[ ] ar gs) { Uno [ ] l i st a =new Uno [ 2] ; l i st a [ 0] = new Dos( ) ; l i st a [ 1] = new Tr es( ) ; f or ( i nt i =0; i <2; i ++) { l i st a[ i ] . f r ase( ) ; } } }
5. En una tienda se venden 2 tipos d e ordenadores: port átiles y de sobr emesa. Ambo s tip os de ordenadores se caracterizan por su código y por su precio. Además cada uno tiene un eslogan que es: " Ideal para sus v iajes" en el caso de los portátiles y " Es el que más pesa, pero el que menos cuesta" para el caso de los ordenadores de sobremesa. Además los ordenadores portátiles tienen un atributo peso, y los de sobremesa la descripción del tipo d e torre. Realice un diseño indicando las clases que hay que tener en cuenta (incluyendo atribu tos y métodos ) y su relació n. Implemente en Java dic has clases.
6. En un banco tenemos varios tipos de cuentas bancarias en todas las cuales es posible retirar fondos y hacer depósitos. Consideremos tres tipos de cuentas: c uenta corriente, libreta de ahorro y libreta 2000. Las cuentas corrientes se usan para realizar pagos y no proporcionan ningún interés. La cuenta corriente puede tener asociada una libreta de ahorro para cubrir descubiertos de la cuenta corriente. Por otro lado, las libretas de ahorro proporcionan un interés del 4%. La libreta 2000 es un tipo de libreta de ahorro que rinde un mayor interés (del 8%) pero la retirada de fondos está penalizada con un 2% de la cantidad retirada. En estas c ondiciones: a) Construir un diagrama de clases usando UML, incluyendo los atributos y métodos en cada clase. Incluya t ambién l as relaciones entre las d istint as clases b) Programar las clases result antes c) Constr uir un prog rama ejemplo que use las clases del apartado a). En el progr ama deben crearse objetos de cada una de las clases, inicializando las cuentas con unos valores iniciales. Además se retiraran fondos de cada uno de los tipos de cuenta, se actualizarán los int ereses de la libreta 2000 y se deposi tará una determinada cantid ad en la libr eta 2000.
Ejercicios Tema 2
Página 2
Fundamentos de Programación II
7. ¿Cuál es el resul tado del si guiente pro grama?
cl ass Padr e { pr ot ect ed i nt aa=0; publ i c i nt aa( ) { r et ur n aa; } } cl ass Hi j a ext ends Padr e { publ i c Hi j a ( i nt bb) { t hi s. aa=bb+1; } } cl ass Ni et a ext ends Hi j a { publ i c Ni et a ( i nt cc) { super( cc+2) ; } } cl ass Fami l i a { publ i c stati c voi d mai n( St r i ng [ ] ar gs) { Hi j a h= new Hi j a( 4) ; h=f ( h) ; Sys t e m. out . pr i nt l n ( h. aa( ) ) ; } pr i vat e st at i c Ni et a f ( Padr e h) { Ni et a n=new Ni et a ( h. aa( ) ) ; r et ur n n; } } 8. Dada la siguiente relación entre clases:
Publicación
Tesis
Revista
donde la clase publicación tiene los métodos: devuelve_autor y devuelve_editorial. La clase tesis tiene además el método devuelve_departamento y la clase revista devuelve_número_de_revista. ¿Qué métodos podrían ser invocados usando una variable polimórfica de tipo publicación? a)devuelve_autor, devuelve_editorial y devuelve_número_de revista b)devuelve_numero_de_revista y devuelve_departamento c)devuelve_autor, devuelve_editorial, devuelve_departamento y devuelve_número_de_revista d)devuelve_autor, devuelve_editorial
9. ¿Cuál de las siguientes afirmaciones es la única correcta? a) Para que una clase sea abstract debe tener al menos u n método abstract b) Se pueden crear obj etos de una cl ase abstract c) Se pueden crear referencias de un a clase abstract d) Un atributo private en una clase abstract puede ser heredado por una subc lase y modific ado en esa subclase
Ejercicios Tema 2
Página 3
Fundamentos de Programación II
10. Dada la sigui ente jerarquía de clases: Naturaleza
Animal
Hervíboro
Rinoceronte
Elefante
Con las siguientes declaraciones: Naturaleza n; Animal a; Herbívoro h; Elefante e; Rinoceronte r; ¿Cuál de las sigui entes sentencias son incorrectas y por qué? a) a=n b) e=r c) h=e d) a=h
11. Dada la sigui ente jerarquía de clases: Instrumento
{abstracta}
Viento
Cuerda
Arpa
Con las sigui entes declaraciones: Cuerda c; Viento v; Arpa a; Instrumento i; ¿Cuál de las siguientes asignaciones es la única correcta? a) b) c) d)
a=v; v=c; c=i; i=a;
12. Implemente el código de una interfaz llamada Primera que contenga dos métodos A y B. Defina otra interfaz llamada Segunda que herede de la anterior y además contenga un método llamado C. Escriba el código de otra clase llamada Objetos que use la segunda interfaz. ¿Cuántos métodos debe implementar esta clase? Implemente dichos métodos de forma que cada método imprima una línea indicando el nombre del método. Cree un programa que utilice los métodos definidos.
Ejercicios Tema 2
Página 4
Fundamentos de Programación II
13. Construya un programa que calcule el volumen molar de una sustancia a una presión y temperatura dadas usando la ecuación de estado de un gas ideal: PV=nNakT donde p es la presión, V el volumen, n el número de moles, N a la cons tante de Avogadro, k la constante de Boltzmann y T la temperatura. Sabiendo que la contante de Avogadro vale 6.023 23 -23 10 partículas/mol y la constante de Boltzmann 1.38066 10 J/K, el programa debe hacer uso de dichas constantes definiéndolas a través de una interfaz.
14. ¿Cuál es el resultado d el sigu iente progr ama?
c l as s Ej er c i c i o { publ i c stati c voi d mai n ( St r i ng [ ] ar gs) { Vehi cul o v= new Vehi cul o( " AAA" , 1000) ; Coche c = new Coche( " BBB" , 1000) ; v. i ncr ement ar _preci o( 100) ; Syst em. out . pr i nt ( v. devol ver _mar ca( ) +” “) ; Syst em. out . pr i nt l n( v. devol ver _pr eci o( ) ) ; c. i ncr ement ar _pr eci o( 100) ; Syst em. out . pr i nt ( c. devol ver _mar ca( ) +” “) ; Syst em. out . pr i nt l n( c. devol ver _pr eci o( ) ) ; v=c; v. i ncr ement ar _preci o( 100) ; Syst em. out . pr i nt ( v. devol ver _mar ca( ) +” “) ; Syst em. out . pr i nt l n( v. devol ver _pr eci o( ) ) ; } } cl ass Vehi cul o { pr ot ect ed St r i ng mar ca; pr ot ect ed doubl e pr eci o; publ i c Vehi cul o ( St r i ng mar ca, doubl e pr eci o) { t hi s. mar ca=mar ca; t hi s. pr eci o=pr eci o; } publ i c voi d i ncr ement ar _preci o( doubl e p) { pr eci o=pr eci o+p; } publ i c doubl e devol ver _preci o( ) { r et ur n pr eci o; } publ i c St r i ng devol ver _mar ca( ) { r et ur n mar ca; } } cl ass Coche ext ends Vehi cul o { publ i c Coche ( St r i ng mar ca, doubl e pr eci o) { super ( mar ca, pr eci o) ; } publ i c voi d i ncr ement ar _pr eci o( doubl e p) { pr eci o=pr eci o+2*p; } }
Ejercicios Tema 2
Página 5
Fundamentos de Programación II
15. ¿Cuál es el resultado d el sigu iente progr ama?
abst r act cl ass Al umno { pr ot ect ed St r i ng nombr e; pr ot ect ed doubl e not a; publ i c Al umno ( St r i ng nombr e, doubl e not a) { t hi s. nombr e=nombr e; t hi s. not a=not a; }/ / mét odo abst r act publ i c doubl e cal cul ar not a ( ) ; }/ / de cl ase Al umno cl ass Al umno_ Or di nar i o ext ends Al umno { pr i vat e char cur so; publ i c Al umno_Or di nar i o ( St r i ng nombr e, doubl e not a, char cur so) { super ( nombr e, not a) ; t hi s. cur so=cur so; }/ / f i n mét odo publ i c doubl e cal cul ar not a ( ) { r et ur n not a; }/ / f i n mét odo }/ / de cl ase Al umno_Or di nari o c l as s Ej er c i c i o { publ i c stati c voi d mai n ( St r i ng [ ] ar gs) { Al umno al umno1; al umno1=new Al umno( " Fel i x", 5. 0) ; Syst em. out . pr i nt l n ( al umno1. cal cul ar not a( ) ) ; al umno1=new Al umno_Or di nar i o ( “Luci a”, 7. 0, ‘ 1’ ) ; Syst em. out . pr i nt l n ( al umno1. cal cul ar not a( ) ) ; }/ / f i n mét odo }/ / f i n cl as e Ej er c i ci o a) Error: No se pueden crear objetos de una clase abstracta b) 5.0 c) Error: alumno1 no se puede referir a objetos de distintas clases d) 7.0
16. En un banco s e tienen una serie de clientes caracterizados p or su NIF, número de cuenta y saldo. Dentro de estos cli entes exist e un cliente especial llamado Preferente. Dicho cli ente se caracteriza porque posee varios fondos de inversión. Cada fondo se caracteriza por su número y el saldo m ensual. Se pide: a) Dibujar, usando UML, el diagrama de clases indicando qué clases hay y la relación entre ellas. b) Implementar en Java todas las clases resultantes del diagrama. c) Escribir un programa principal en Java donde se creen un cliente y un cliente Preferente. Para cada uno de ellos se debe poder consultar todos los atributos que contiene. Además, para el caso del cliente Preferente se debe poder consultar también los datos de cada uno de sus fondos (número y el saldo mensual). El número de fondos que posee el cliente Preferente y las c aracterísticas de cada fondo deben introducir se por teclado.
Ejercicios Tema 2
Página 6
Fundamentos de Programación II
17. ¿Cuál es el error del si guiente pro grama?
i nt er f ace A { doubl e a=2. 3; voi d i mpr i meresul t adoA ( ) { Syst em. out . pr i nt l n ( "val or de } } i nt er f ace B { i nt b=435; voi d i mpr i mer esul t adoB ( ) ; } cl ass AA i mpl ement s A, B { doubl e aa=324. 32; publ i c voi d i mpr i mer esul t adoA ( ) { Syst em. out . pr i nt l n ( " val or de } publ i c voi d i mpr i mer esul t adoB ( ) { Syst em. out . pr i nt l n ( " val or de } } c l as s Pr i nc i pal { publ i c stati c voi d mai n ( St r i ng [ ] AA ob1=new AA( ) ; ob1. i mpr i mer esul t adoA( ) ; ob1. i mpr i mer esul t adoB( ) ; } }
a"+ a) ;
a"+ a+ " val or de aa"+ aa) ; b" + b+ " val or de aa"+ aa) ;
ar gs) {
18. Una tienda de informática vende dos tipos de artículos (software y hardware) ambos caracterizados por su código (de tipo char) y su descripción. Además, en los productos software hay que indicar el tipo de producto (con una cadena), y en los hardware se debe indicar si es un periférico o no. Para saber el precio de un artículo utilice una interface que indique que para un artículo cuyo código es A el precio es 100.0 euros, si el código es B el precio es 50.3; para un artículo con código C el precio es 150.50 euros. En el caso de ser un producto hardware, los artículos sólo serán A ó B y si es un periférico el precio se incrementará en un 10%. Los productos software serán exclusivamente B ó C incrementándose el precio del artículo en un 5% si el software es de tipo ProgramaJuegos. Nota: la interface debe tener un método abstracto. a) Dibuje en UML los diagramas de las clases y las relaciones entre ellas. Para cada clase debe indicar los atributos y métodos teniendo en cuenta que se puede consultar y modif icar cada atributo. b) Implemente las clases y la int erfaz. c) Realice un programa principal donde cree un objeto software y otro hardware y muestre el precio y demás características del objeto. 19. Se pretende auto matizar el sistema de una empresa dedicada al alqui ler de viviendas. Los tipos de viviendas que la empresa ofrece son pisos y chalets. De todas las viviendas se registra su identificador (un valor entero), metros cuadrados y precio mensual de alquiler. De los p isos s e debe saber si están amueblados y el año de construcción. Por ot ra parte, de los chalets se debe saber si tienen piscina. Para cada tipo de vivienda también se desea conocer el nombre y DNI de los tres úl timos inquili nos. Se pide: a) Dibujar el diagrama de clases indicando qué clases hay, la relación entre ellas y los miembros (atributos y métodos) de cada clase usando notación UML. Considere Inquilino como u na clase b) Implementar en Java todas las clases resultantes del diagrama. Todas las clases deben implementar métodos de consulta para cada variable de ejemplar. c) Escribir un programa principal en Java donde en una única matriz se guarde un objeto piso y uno chalet. Posterior mente, se debe cons ult ar usando esa matriz el nombre y DNI de cada uno de los tres últ imos inqu ilinos q ue ha tenido esa vivienda.
Ejercicios Tema 2
Página 7
Fundamentos de Programación II
20. ¿Qué impri me el sigui ente programa?
abst r act cl ass Uno { pr ot ect ed i nt d1, d2; abst r act publ i c i nt devol ver _suma ( i nt x, i nt y) ; } cl ass Dos ext ends Uno { publ i c i nt devol ver _suma( i nt x, i nt y) { d1=x+3; d2=y+3; r et ur n d1+d2; } } cl ass Tr es ext ends Dos { publ i c i nt devol ver _suma( i nt x, i nt y) { d1=x- 3; d2=y- 3; r et ur n d1+d2; } publ i c i nt devol ver _ s uma( i nt x, i nt y, i nt i , i nt j ) { d1=x- i ; d2=y- j ; r et ur n d1+d2; } } c l as s Pr i nc i pal { publ i c stati c voi d mai n( St r i ng [ ] ar gs) { i nt c=0, d=0; Uno [ ] l i st a=new Uno[ 2] ; l i st a [ 0] = new Dos( ) ; l i st a [ 1] = new Tr es( ) ; f or ( i nt i =0; i <2; i ++) { d=l i st a[ i ] . devol ver _suma( 10, 10) ; Syst em. out . pr i nt f ( "d=%d \ n", d) ; c=l i st a[ i ] . devol ver _suma( 10, 10, 5, 5) ; Syst em. out . pr i nt f ( "c=%d \ n", c) ; } } } 21. ¿Por qué da error el siguiente programa? ¿Cómo lo solucionaría?
cl ass A { pr i vat e i nt l =2; publ i c i nt get _ l ( ) { r et ur n l ; } } cl ass B ext ends A { publ i c i nt cal cul ar _m( i nt i nt m=l +x; r et ur n m; } } c l as s Pr i nc i pal { publ i c stati c voi d mai n( St r i i nt l , m; B o1=new B( ) ; l =o1. get _ l ( ) ; Syst em. out . pr i nt f ( "l =%d m=o1. cal cul ar _m( 2) ; Syst em. out . pr i nt f ( " m=%d } } Ejercicios Tema 2
x) {
ng [ ] ar gs) {
\ n", l ) ; \ n" , m) ;
Página 8
Fundamentos de Programación II
22. ¿Qué impri me el sigui ente programa?
cl ass Uno { pr ot ect ed i nt d1, d2; publ i c i nt get _suma( ) { r et ur n d1+d2; } } cl ass Dos ext ends Uno { publ i c voi d cambi ar _ds( i nt x, i nt y) { d1=x+3; d2=y+3; } } cl ass Tr es ext ends Dos { publ i c voi d c ambi ar _ ds ( i nt x, i nt y, i nt i , i nt j ) { d1=d1+x- i ; d2=d2+y- j ; } } c l as s Pr i nc i pal { publ i c stati c voi d mai n( St r i ng [ ] ar gs) { i nt c , d; Dos obj 2=new Dos( ) ; Tr es obj 3=new Tr es( ) ; obj 2. cambi ar _ds( 2, 2) ; obj 3. cambi ar _ds( 3, 3) ; obj 3. cambi ar _ds( 10, 9, 7, 8) ; d=obj 2. get _s uma( ) ; c=obj 3. get _suma( ) ; Syst em. out . pr i nt f ( " d=%d \ nc=%d\ n" , d, c) ; } } 23. ¿Cuál es el resultado d el sigu iente progr ama?
c l as s Pr i nc i pal { publ i c stati c voi d mai n( St r i ng [ ] ar gs) { doubl e cant i dad_i ni , cant i dad_i nc; Coche c1=new Coche( ) ; cant i dad_i ni =c1. devol ver _cant i dad( ) ; cant i dad_i nc=c1. cambi ar_ cant i dad( 20. 17) ; Syst em. out . pr i nt f ( "%. 1f %. 1f ", cant i dad_i ni , cant i dad_i nc); } } cl ass Vehi cul o { pr i vat e doubl e c=10. 11; publ i c doubl e devol ver _cant i dad( ) { r et ur n c ; } } cl ass Coche ext ends Vehi cul o { publ i c doubl e cambi ar _cant i dad( doubl e p) { r et ur n devol ver _cant i dad( ) +p; } } a) b) c) d)
10,1 30,3 10,1 30,2 Error: No se puede usar el método devolver_cantidad en la clase Coche porque la variable c es private Error: No se puede invocar directamente en el return de la clase Coche al método devolver_cantidad
Ejercicios Tema 2
Página 9
Fundamentos de Programación II
24. ¿Cuál es el error del si guiente pro grama?
i nt erf ace Const ant es { doubl e PI =3. 141593; doubl e e=2. 718282; doubl e FI =1. 618034; } i nt er f ace Met odos { voi d met odoA ( ) ; doubl e met odoB ( ) ; } cl ass Cal cul os i mpl ement s Met odos, Const ant es { publ i c doubl e met odoB ( ) { r e t ur n PI * e* FI ; } } a) La clase Cálculos no puede implementar más de una interfaz b) Los métodos de la interfaz Metodos deben ser públicos c) La clase Calculos debe ser abstract d) No hay ningún error
25. ¿Cuál es el resultado d el sigu iente progr ama?
c l as s Ej er c i c i o { publ i c stati c voi d mai n ( St r i ng [ ] ar gs) { A a1= new A( 7) ; A a2= new B( 9) ; B b1= new B( 10) ; Syst em. out . pr i nt ( a1. get _p1( ) +" ") ; Syst em. out . pr i nt ( a2. get _p1( ) +" ") ; Syst em. out . pr i nt ( b1. get _p1( ) +" ") ; a1=b1; Syst em. out . pr i nt ( b1. get _p2( ) +" ") ; }/ / f i n mai n } f i nal c l as s A{ st at i c i nt p1=0; publ i c A ( i nt v) { p1=v; } publ i c i nt get _p1( ) { r et ur n p1; } } cl ass B ext ends A { i nt p2=0; publ i c B( i nt p) { super ( p) ; p2=p; } publ i c i nt get _p2( ) { r et ur n p2+p1; } } a) b) c) d)
10 10 10 20 7 9 10 20 Se produce un error porque las variables de las clases no tienen visibilidad declarada Se produce un error porque una clase declarada como final no se puede heredar
Ejercicios Tema 2
Página 10
Fundamentos de Programación II
26. ¿Qué impri me el sigui ente programa?
c l as s Pr i nc i pal { publ i c stati c voi d mai n ( St r i ng [ ] ar gs) { Or denador orde=new Por t at i l ( 34, 870. 12, 2. 3) ; ; Syst em. out . pr i nt f ( "Codi go: %d \ nPr eci o_t ot al : %. 2f ", or de. devuel vecodi go( ) , or de. c al c ul a_ pr ec i ot ot al ( 5) ) ; } }/ / f i n cl as e Pr i nci pal cl ass Or denador { pr i vat e i nt codi go; pr i vat e doubl e pr eci o; publ i c Or denador ( i nt codi go, doubl e pr eci o) { t hi s. codi go=codi go; t hi s. pr eci o=pr eci o; } publ i c i nt devuel vecodi go( ) { r et ur n codi go; } publ i c doubl e devuel vepr eci o( ) { r et ur n pr eci o; } f i nal publ i c doubl e cal cul a_pr eci ot ot al ( i nt uni dades) { r et ur n pr eci o*uni dades; } }/ / f i n cl ase Or denador cl ass Por t at i l ext ends Or denador { pr i vat e doubl e peso; publ i c Por t at i l ( i nt codi go, doubl e pr eci o, doubl e peso) { super ( codi go, pr eci o) ; t hi s. peso=peso; } publ i c doubl e devuel vepeso( ) { r et ur n peso; } publ i c doubl e cal cul a_pr eci ot ot al ( i nt uni dades) { r et ur n devuel vepr eci o( ) *uni dades*. 90; } }/ / cl as e Por t at i l 27. Una empresa de envío de paquetes tiene varias sucursales en todo el país. Cada sucursal está definida por s u número de sucursal, dirección y ciudad. Además, conviene distingui r si la sucursal es Principal o Secundaria. En caso de ser sucursal Principal se debe saber el número de sucursales secundarias que dependen de ella y en el caso de la Secundaria es necesario saber el nombre de la sucursal de la que depende. Para calcular el precio que cuesta enviar cada paquete, las sucur sales tienen en cuenta el peso del paquete y la priori dad, sabiendo que se cobra 1 euro por kilo, 10 euros más si la prioridad es alta y 20 si es Express. Cada paquete enviado tendrá un número de referencia. Construya un diagrama UML que indique la relación entre las clases. Cree un diagrama UML para cada clase que incluya todos sus miembros. Implemente las clases correspondientes añadiendo métodos para consultar todos los atributos y para modificar el peso y la prioridad de los paquetes Por último, construya un método main donde se cree un objeto sucursal Secundaria mediante una referencia polimórfica. El programa deberá imprimir el precio y el peso de los paquetes que se reciban en dicha sucursal. La información de los paquetes deberá guardarse en una matriz. Deberá controlarse que la prioridad del paquete sea 0, 1 ó 2. Tanto los datos de la sucursal como los de los paquetes deberán introducirse por teclado. Nota: No considere que paquete es un atributo de sucurs al.
Ejercicios Tema 2
Página 11
Fundamentos de Programación II
28. En una mediateca tenemos disponibles dos tipos diferentes de documentos: Libros y DVD’s (video). Todos los documentos se caracterizan por una fecha de edición, un título, un valor nominal (en euros), y un atributo que indica si el documento está prestado o no. A su vez, los libros deben incluir el autor y los DVD’s el director de la película. Si una vez prestado un documento no se devuelve en la fecha debida existe una penalización en todos ellos. En los libros la penalización se obtiene como un 5% de su valor nominal. En los DVD’s es un 6% del valor nominal más un valor fijo de 2 euros. A su vez, los socios de la mediateca se caracterizan por su nombre y número de socio. Los socios de la mediateca pueden sacar en préstamo un máximo de n documentos. En caso de retraso en la devolución de los documentos prestados se aplica al socio una penalización obtenida como la suma de las penalizaciones de cada documento prestado. Se pide:
a) Dibujar el diagrama de clases indic ando las relaciones entre las mismas. b) Dibujar para cada clase el diagrama UML indi cando los mi embros que hay en cada una. Debe incluir todos los métodos que sean necesarios para la resolución del ejercicio. c) Implementar en Java dic has clases. d) Implementar un programa principal que defina dos documentos de tipos dist intos. Los documentos se inicializarán directamente en el programa principal. A continuación cree un objeto de clase socio (inicializado también directamente en el main) que saque en préstamo los dos documentos anteriores. Finalmente, imprima los datos del socio así como la penalización correspondiente por un retraso en la devolución de los dos documentos. Utilice una matriz para almacenar los objetos documento haciendo uso del polimorfismo. 29. Escriba un programa para una biblioteca que contiene libros y revistas. Ambas publicaciones ti enen un c ódigo, un año de publi cación y un atributo prestado. Cuando se crea la publicación, el atributo prestado está a falso porque la publicación no está prestada. Las revistas tienen un número y los libros un nombre del autor. Ambos tipos de publicaciones deben tener métodos de cons ulta de todos sus atribut os. Para prevenir po sibles cambios en el programa se tiene que implementar una interfaz que contenga los métodos prestar(), devolver() y prestado(). La clase publicación implementará dicha interfaz. El programa deberá obtener el número de publicaciones prestadas Para ello la clase Principal contendrá dos métodos: a) un método que cuente las publicaciones prestadas. Dicho método recibirá como parámetro una lista de las publicaciones existentes en la biblioteca y devolverá cuántas hay prestadas. b) el método main que creará una matriz de referencias polimórficas de tipo publicación, invocará al método con el que se obtiene el número de publicaciones prestadas e imprimirá el número de publicaciones prestadas. También se deberá imprimir los datos de todas las publicaciones. Como ejemplo cree una matriz de 2 libros y 2 revistas y considere que se prestan un lib ro y una revis ta. Se debe: a) Dibujar el diagrama de clases indicando qué clases hay, la relación entre ellas y los miembros (atributos y métodos) de cada clase usando notación UML. b) Implementar en Java todas las clases e interfaces resultantes del diagrama. c) Escribir un programa principal en Java en el que se realicen las operaciones comentadas anteriormente (cálculo de publicaciones prestadas usando un método específico para tal f in e impresión en el método main del número de publicaciones prestadas).
Ejercicios Tema 2
Página 12
Fundamentos de Programación II
30. ¿Qué impri me el sigui ente programa?
c l as s Pr i nc i pal { publ i c stati c voi d mai n ( St r i ng [ ] ar gs) { Rueda r 1=new Rueda ( 16, " R1") ; Rueda r 2=new Rueda ( 16, " R1") ; Rueda r 3=new Rueda ( 17, " R2") ; Sys t e m. out . pr i nt l n( r 1. equal s ( r 3) ) ; Sys t e m. out . pr i nt l n( r 1. equal s ( r 2) ) ; r 1=r 3; Sys t e m. out . pr i nt l n( r 1. equal s ( r 3) ) ; } }/ / f i n cl as e Pr i nci pal cl ass Rueda { pr i vat e i nt di mensi on; pr i vat e St r i ng I D; publ i c Rueda ( i nt di mensi on, St r i ng I D) { t hi s. di mensi on=di mensi on; t hi s . I D=I D; } publ i c i nt get _di mensi on( ) { r et ur n di mensi on; } publ i c St r i ng get _I D( ) { r et ur n I D; } publ i c bool ean equal s ( Obj ect o) { bool ean l ogi ca=f al se; i f ( t hi s==o) l ogi ca=t r ue; el se i f ( t hi s. I D == ( ( Rueda) o) . get _I D( ) && t hi s. di mensi on==( ( Rueda) o) . get _di mensi on( ) ) { l ogi ca=t r ue; } r et ur n l ogi c a; } }
Ejercicios Tema 2
Página 13
Fundamentos de Programación II
31. a) ¿Qué imprim e el sigui ente programa?
cl ass Pr oduct o i mpl ement s Compar abl e
{ i nt I D; St r i ng nombr e; doubl e pr eci o; publ i c Pr oduct o( i nt I D, St r i ng n, doubl e p) { t hi s . I D=I D; nombr e=n; pr eci o=p; } publ i c St r i ng t oSt r i ng( ) { r et ur n I D+" : " +nombr e+" " +pr eci o+" eur os" ; } publ i c St r i ng get _nombr e( ) { r et ur n nombr e; } publ i c i nt get _ I D ( ) { r et ur n I D; } publ i c doubl e get _pr eci o( ) { r et ur n pr eci o; } publ i c i nt compar eTo ( Pr oduct o p) { i nt r es=0; i f ( I D>p. get _ I D( ) ) { r es=1; } el se { i f ( I D
Página 14
Fundamentos de Programación II
publ i c stat i c voi d bur buj a ( Pr oduct o [ ] p) { Pr oduct o aux; i nt l ongi t ud; l ongi t ud=p. l engt h; f or ( i nt i =0; i 0) { aux=p[ j ] ; p[ j ] =p[ j +1] ; p[ j +1] =aux; } } } } } b) ¿Y si el método compareTo() se sustituye por el siguiente?
publ i c i nt compar eTo( Product o p) { r et ur n nombr e. compar eTo( p. get _ nombr e( ) ) ; } c) ¿Y si el método compareTo() se sustituye por el siguiente?
publ i c i nt compar eTo( Product o p) { r et ur n new Doubl e( pr eci o) . compar eTo( new Doubl e( p. get _pr eci o( ) ) ) ; }
32. Escrib ir un prog rama en Java que ordene una serie personas p or edad (de mayor a menor) usando el método de ordenación por intercambio. Las personas estarán contenidas en una matriz de objetos de clase Persona. Esta clase tendrá dos atributos, nombre y edad, además de los métodos necesarios para resolver el ejercicio. El método de ordenación deberá ser genérico para que acepte cualquier tipo de matriz de objetos. Repetir el programa para ordenar ahora por no mbre (en orden alfabético de mayor a menor).
Ejercicios Tema 2
Página 15