Examen práctico de febrero 2012
DAW - Programación
1 - Ejercicio 1 (2 puntos) Implementa una clase Trabajador con los siguientes atributos y métodos: vad os:: nombre, edad, categoría, antigüedad. At ri bu to s p ri vados Constantes static públicas. Determinan los diferentes tipos de categorías y antigüedad de un empleado disponibles en el sist ema: CAT_EMPLEADO. Valor 0 CAT_EMPLEADO. CAT_ENCARGADO. Valor 1 CAT_DIRECTIVO. Valor 2 ANT_NOVATO. Valor 0 ANT_MADURO. Valor 1 ANT_EXPERTO. Valor 2 Trabajador(String nombre, int edad, int categoria, int antigüedad). antigüedad). Constructor de la clase que inicializa los atributos de la misma. Comprobará que la categoría y la antigüedad sean correctos, si no lo son se lanzará la excepción IllegalArgumentException.. (0.75 puntos) IllegalArgumentException Métodos públicos consulta/cambia de cada uno de los atributos. Se debe comprobar la validez de los atributos y lanzar la excepción correspondiente si hay algún valor incorrecto. (0.5 (0.5 punt os) calcularSueldo(). Devuelve el sueldo del empleado calculado a public double calcularSueldo(). partir de su antigüedad y categoría profesional. La forma de calcular el sueldo del empleado será de acuerdo a la siguiente tabla (0.75 (0.75 puntos ) : Sueldo Sueldo base 607 € Empleado +15% sueldo base Encargado +35% sueldo base Directivo +60% sueldo base Novato +150 € Maduro +300 € Experto +600 € RESPUESTA
publ i c cl ass Trabaj Trabaj ado ador { / / con const ant es pú públ i cas cas est est át i cas cas publ i c st at i c f i nal i nt CAT_EM T_EMPLE PLEADO = 0; publ ubl i c st ati c f i nal i nt CA CAT_EN T_ENCARGADO = 1; publ i c stati c f i nal i nt CAT_DI _DI RECTI VO = 2; publ i c st at i c f i nal i nt ANT_NO T_NOVATO = 0; publ i c st at i c f i nal i nt ANT_MADURO = 1; publ i c st at i c f i nal i nt ANT_EX _EXPERTO = 2; / / at r i but os pri vad vados pr i vat vat e St r i ng nom nombre; pr i vat vat e i nt edad; pr i vat e i nt cat cat egor i a; pr i vat vat e i nt ant i güedad; /** * Cr Cr ea el obj et o Traba Trabaj ado ador , si exi st e al gún err or en l a cat cat egorí a o l a * ant ant i güed güedad ad se l anza anza l a excep excepci ci ón I l l egal egal Ar gument ent Excep xcept i on. on. Como el * enun enunci ci ado ado no l o exp expeci eci f i ca, no es nece necesar sar i o com comprobar probar el r est o de par par ámet r os * @par am nombr e * @par am edad * @par par am cat egor egor i a * @par par am ant ant i güed güedad ad */ publ i c Tr Tr abaj ador( ador( St r i ng nombr e, i nt edad, i nt cat cat egori a, i nt ant i güeda edad) { i f ( comprobar probar Cat egori egori a( cat egor egor i a) && && comprobar probar Ant i güed güedad ad(( ant ant i güed güedad ad)) ) { t hi s. nom nombre = nom nombre; t hi s. edad = edad;
Hardware de un sistema informático
t hi s. cat egor i a = cat egori a; t hi s. ant i güedad = ant i güedad;
}
} el se{ t hr ow new I l l egal Ar gument Except i on( "Cat egorí a o ant i güedad i ncorr ectos" ) ; }
publ i c i nt get Ant i güedad( ) { r etur n ant i güedad; } publ i c voi d set Ant i güedad( i nt ant i güedad) { i f ( comprobarAnt i güedad( ant i güedad) ) t hi s. ant i güedad = ant i güedad; el se{ t hr ow new I l l egal Ar gument Except i on( "Ant i güedad i ncorr ect a") ; } } publ i c i nt get Cat egor i a( ) { r et ur n cat egor i a; } publ i c voi d set Cat egor i a( i nt cat egor i a) { i f ( compr obar Cat egori a(categor i a) ) t hi s. cat egor i a = cat egori a; el se t hr ow new I l l egal Ar gument Except i on( "Cat egori a i ncor r ect a") ; } publ i c i nt get Edad( ) { r etur n edad; } publ i c voi d set Edad( i nt edad) { t hi s. edad = edad; } publ i c Str i ng getNombr e() { r et urn nombre; } publ i c voi d set Nombre( Str i ng nombre) { t hi s. nombre = nombre; } publ i c doubl e cal cul ar Suel do() { doubl e suel do=0; swi t ch( t hi s. cat egori a) { cas e CAT_EMPLEADO: suel do+=suel do*0. 15; br eak; case CAT_ ENCARGADO: suel do+=suel do*0. 35; br eak; case CAT_DI RECTI VO: suel do+=suel do*0. 60; br eak; } swi t ch( t hi s. ant i güedad) { cas e ANT_NOVATO: suel do+=150; br eak; case ANT_ MADURO: suel do+=300; br eak; case ANT_EXPERTO: suel do+=600; br eak; } r eturn suel do; } pr i vat e bool ean comprobarCategori a(i nt cat egori a){ bool ean check=t r ue; i f ( cat egor i a
CAT_DI RECTI VO) check=f al se;
-2-
DAW
Desarrollo de Aplicaciones Web
}
Tema 1
r et ur n check; } pri vate bool ean comprobar Ant i güedad( i nt ant i güedad) { bool ean check=t r ue; i f ( ant i güedadANT_EXPERTO) check=f al se; r et ur n check; }
Ejercicio 2 (1.5 puntos) Implementa dos funciones para obtener, la parte entera y la parte decimal de un número en punto flotante (double). La definición de las funciones es como sigue: int getParteEntera(dou ble numero) (0.5 punt os) int getParteDecim al(doubl e numero) (0.5 punt os) Internamente, estas dos funciones convierten el número double a cadena de caracteres para obtener la parte correspondiente. Una vez obtenido el valor buscado, la cadena se convertirá al tipo de retorno indicado. Además el programa principal (main) pedirá al usuario que introduzca un número por teclado y posteriormente mostrará un menú por pantalla en el que se pr egunte si desea obtener la parte entera o decimal del número introducido. El programa principal main se ejecutará hasta que el usuario introduzca la opción adecuada para salir (0.5 puntos) . RESPUESTA
i mport j ava. ut i l . Scanner; /** * * @aut hor j ose */ publ i c cl ass Ej erci ci o2 { publ i c st at i c i nt get Par t eEnt era(doubl e numero){ Str i ng snumero = Str i ng. val ueOf ( numero) ; i nt posi ci on_coma = snumer o. i ndexOf ( ' . ' ) ; i nt par t e_ent er a = I nt eger . par seI nt ( snumer o. subst r i ng( 0, posi ci on_coma) ) ; r et ur n par t e_ent er a; } publ i c st ati c i nt get Par t eDeci mal ( doubl e numero) { Str i ng snumero = Str i ng. val ueOf ( numero) ; i nt posi ci on_coma = snumer o. i ndexOf ( ' . ' ) ; i nt par t e_deci mal = I nt eger. par seI nt ( snumer o. subst r i ng( posi ci on_coma+1) ) ; r et ur n par t e_deci mal ; } publ i c stati c voi d mai n( St r i ng [ ] ar gs) { Scanner ent r ada_t ecl ado = new Scanner ( Syst em. i n) ; i nt opci on_menu=0; doubl e numer o=0; do{ / / l ect ur a de un val or Doubl e vál i do bool ean numero_val i do=f al se; do{ System. out . pr i nt l n( "I nt r oduzca un númer o doubl e vál i do: ") ; i f ( ent r ada_t ecl ado. hasNextDoubl e() ) { numero = ent r ada_t ecl ado. next Doubl e() ; numer o_val i do=t r ue; } el se{ System. out . pr i nt l n( "Númer o err oneo i nt r oduci do. Vuel va a i nt ent arl o") ; ent r ada_t ecl ado. next( ) ; } }whi l e(! numer o_val i do) ; / / most r amos el menú de opci ones Syst em. out . pr i nt l n( " ¿Qué desea hacer con el número?") ;
-3-
Hardware de un sistema informático
System. out . pr i nt l n( "1. Obt ener l a par t e ent er a. ") ; System. out . pr i nt l n( "2. Obt ener l a par t e deci mal ") ; System. out . pr i nt l n( "3. Sal i r del pr ogr ama") ; / / l eemos una opci ón vál i da numero_val i do=f al se; do{ Syst em. out . pr i nt l n( "I nt r oduzca opci ón: " ) ; i f ( ent r ada_t ecl ado. hasNextI nt ( ) ) { opci on_menu = ent r ada_t ecl ado. nextI nt ( ) ; i f ( opci on_menu>=1 && opci on_menu<=3) numer o_val i do=t r ue; el se Syst em. out . pr i nt l n( "Debe i nt r oduci r un val or ent r e 1 y 3") ; } el se{ System. out . pr i nt l n( "Númer o err oneo i nt r oduci do. Vuel va a i nt ent arl o") ; ent r ada_t ecl ado. next( ) ; } }whi l e(! numero_val i do) ; / / Según opci ón i nt r oduci da hacemos l a acci ón deseada swi t ch( opci on_menu){ case 1: Syst em. out . pri nt l n(" La par t e ent er a de " +numero+" " +getPart eEnter a(numero) ) ; br eak; case 2: Syst em. out . pri nt l n(" La par t e deci mal de " +numero+" " +get Par t eDeci mal ( numero) ) ; br eak;
}
}
DAW
es
es
} }whi l e( opci on_menu!=3) ;
Ejercicio 3 (2 puntos) Realizaremos un programa que calcule el valor de los coeficientes binomiales. Los coeficientes binomiales son ampliamente utilizados en distintas ramas de las matemáticas, como por ejemplo la estadística. Se representan como un binomio (dos valores) entre paréntesis (similar a una fracción pero sin la barra horizontal). La fórmula para calcular el coeficiente binomial de dos valores n y k, lo representaremos como (n,k) es la siguiente: ! (, ) = ! ( − )! donde ! representa el factorial y n y k mayores o iguales que 0. Para realizar este ejercicio sigue los siguientes pasos: a) Se implementará una función que calcule el factorial de un número. El número se pasará por parámetro y retornará el factorial calculado. La declaración de l a función será como sigue: (0.75 punt os)
publi c static int factorial(int n) El factorial de un número n, n! Se calcula de la siguiente manera: 1, si n=0. n*n-1....*1, si n>0. Por ejemplo, el factorial de 3, 3! = 3*2*1 = 6. b) Se implementará una función que calcule el coeficiente binomial. Los valores de n y k se pasarán por parámetro y la función devolverá el coeficiente calculado. Se utilizará la función factorial() para realizar este cálculo. La declaración de la función será como sigue (0.5 puntos) : public static int co eficienteBinomial(int n, int k)
-4-
Desarrollo de Aplicaciones Web
Tema 1
c) El programa principal (main) deberá pedir al usuario que introduzca los valores de n y k (mayor o igual que 0). Se calculará el valor del binomio llamando a la función coeficienteBinomial() y se mostrarán los resultado obtenidos por pantalla. (0.75 puntos). RESPUESTA
i mport j ava. ut i l . Scanner; /** * * @aut hor j ose */ publ i c cl ass Ej erci ci o3 { publ i c st at i c i nt f act o r i al ( i nt n) { i nt f act = 1; i nt cont ador = 2; whi l e ( contador <= n) { f act *= contador++; } r et urn f act; } publ i c stati c i nt coef i ci ent eBi nomi al ( i nt n, i nt k) { r et ur n f ac t or i al ( n) / ( f ac t or i al ( k ) * f a ct o r i al ( n - k) ) ; }
}
publ i c stati c voi d mai n( St r i ng[ ] ar gs) { Scanner ent r ada_t ecl ado = new Scanner ( Syst em. i n) ; bool ean numero_val i do = f al se; i nt n = 0, k = 0; do { System. out . pr i nt l n( "I nt r oduzca N: " ) ; i f ( ent r ada_t ecl ado. hasNextI nt ( ) ) { n = ent rada_t ecl ado. next I nt ( ) ; i f ( n>0) { numer o_val i do = t r ue; } el se { System. out . pr i nt l n( "Debe i nt r oduci r un val or mayor que 0") ; } } el se { Syst em. out . pr i nt l n( "Número er r oneo i nt r oduci do. Vuel va a i nt ent ar l o") ; ent r ada_t ecl ado. next( ) ; } } whi l e (! numer o_val i do) ; do { System. out . pr i nt l n( "I nt r oduzca K: ") ; i f ( ent r ada_t ecl ado. hasNextI nt ( ) ) { k = ent rada_t ecl ado. next I nt ( ) ; i f ( n>0) { numer o_val i do = t r ue; } el se { System. out . pr i nt l n( "Debe i nt r oduci r un val or mayor que 0") ; } } el se { Syst em. out . pr i nt l n( "Número er r oneo i nt r oduci do. Vuel va a i nt ent ar l o") ; ent r ada_t ecl ado. next( ) ; } } whi l e (! numer o_val i do) ; Syst em. out . pr i nt l n( "El coef i ci ent e bi nomi al ( n, k)="+coef i ci ent eBi nomi al ( n, k)) ; }
Ejercicio 4 (0.75 puntos) Implementa un algoritmo en el que dado un entero n > 1 leído por teclado, calcule e imprima los elementos correspondientes a la Conjetura de Ullman (en honor al matemático S. Ullman). La conjetura consiste en lo siguiente:
-5-
Hardware de un sistema informático
DAW
Empieza con cualquier entero positivo. Si es par, se divide entre 2; si es impar se multiplica por 3 se agrega 1. Se itera hasta obtener el número 1. Al final se obtendrá el número 1, independientemente del entero inicial. Por ejemplo, cuando el entero inicial es 26, la secuencia será: 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1 RESPUESTA
i mport j ava. ut i l . Scanner ; /** * * @aut hor j ose */ publ i c cl ass Ej erci ci o4 { publ i c stati c voi d mai n( St r i ng [ ] ar gs) { Scanner ent r ada_t ecl ado = new Scanner ( Syst em. i n) ; bool ean numer o_val i do = f al se; i nt n = 0; do { System. out . pr i nt l n( "I nt r oduzca un númer o posi t i vo: ") ; i f ( ent r ada_t ecl ado. hasNextI nt ( ) ) { n = ent r ada_t ecl ado. next I nt ( ) ; i f ( n>0) { numero_val i do = t r ue; } el se { System. out . pr i nt l n( "Debe i nt r oduci r un val or mayor que 0") ; } } el se { System. out . pr i nt l n( "Número er r oneo i nt r oduci do. Vuel va a i nt ent ar l o") ; ent r ada_t ecl ado. next( ) ; } } whi l e (! numer o_val i do) ; / / al gor i t mo par a l a conj et ur a System. out . pr i nt ( n+", ") ; whi l e(n! =1){ i f ( n%2==0) n/ =2; el se n=n*3+1; Syst em. out . pr i nt ( n+", ") ; } } }
Ejercicio 5 (0.75 puntos) Implemente una función que sirva para cifrar un texto con el conocido método de César. El criptosistema consiste en el desplazamiento de 3 caracteres en la posición del carácter a cifrar, es decir, la A se sustituye por la D, la B por la E, …, la X por la A, la Y por la B y la Z por la C. Por simplicidad, supondremos que el texto a cifrar solo contiene caracteres alfabéticos. Por tanto el ejercicio consiste en implementar la siguiente función: public String cifradoCesar(String cadenaACifrar) La función recibe como parámetro la cadena a cifrar y devuelve un objeto String con la cadena cifrada mediante el sistema de Cesar. publ i c cl ass Ej erci ci o5 { publ i c st at i c St r i ng ci f r adoCesar ( St r i ng cadenaACi f r ar ) { St r i ng abc=" ABCDEFGHI J KLMNÑOPQRSTUVWXYZ" ; i nt pos_c; St r i ng cadena_ci f r ada="" ; f or ( i nt i =0; i
-6-
Desarrollo de Aplicaciones Web
Tema 1
pos_c=abc. i ndexOf ( cadenaACi f r ar . char At ( i ) ) ; / / obt enemos el caract er t r es posi ci ones avanzado, cui dando el ext r emo cadena_ci f r ada+=abc. charAt( ( pos_c+3) %abc. l ength( ) ) ;
} r et ur n cadena_ci f r ada;
}
} publ i c stati c voi d mai n( St r i ng [ ] ar gs) { St r i ng abc=" ABCDEFGHI J KLMNÑOPQRSTUVWXYZ" ; Syst em. out . pr i nt l n( "Ci f r ado Cesar : "+ci f r adoCesar ( abc)) ; }
-7-