You are on page 1of 26

´ PROGRAMACION Escuela de Inform´tica. UPV.

Curso 2001/2002 a

PROBLEMAS RESUELTOS.
Correspondientes a los temas 2 al 5
Francisco Marqu´s y Natividad Prieto e

´ Indice General
1 Introducci´n o ´ 2 Tema 2. CONCEPTOS BASICOS ´ 3 Tema 3. CONDICIONES Y ELECCION ´ 4 Tema 4. LA ITERACION ´ 5 Tema 5. VECTORES. RECORRIDO Y BUSQUEDA 1 1 8 14 20

1

Introducci´n o

Se muestra continuaci´n la resoluci´n de los problemas m´s significativos que aparecen o o a en los apuntes de la asignatura. Como no se presenta la resoluci´n de todos los problemas propuestos originalmente o (aunque si de la mayor´ de los mismos), conviene indicar que no siempre coincide la ıa numeraci´n seguida para los problemas a lo largo de esta resoluci´n con la utilizada o o originalmente cuando se propon´ en los apuntes de cada tema. Se ha respetado, sin ıan embargo, el orden correlativo de presentaci´n de los mismos. o

2

´ Tema 2. CONCEPTOS BASICOS
1. Escribir un programa en Java que pregunte un nombre, direcci´n y tel´fono y eso e criba en pantalla una ficha con dicha informaci´n o El programa define como variables de tipo cadena de caracteres nombre,apellidos, direccion y telefono. Estos datos se leen del teclado, para ello se define la variable entrada de tipo input y se utiliza la operaci´n readline. o 1

Problemas resueltos:

´ 2 TEMA 2. CONCEPTOS BASICOS

2

Despu´s se presenta en pantalla la informaci´n en forma de ficha, para ello se e o utilizan las primitivas write y writeln asociadas a la variable salida de tipo output. Finalmente se cierran los ficheros entrada y salida. El programa completo ser´ ıa: import nsIO.*; class Ficha { public static void main (String param[]) { String nombre, apellidos, direccion, telefono; input entrada = new input(); output salida = new output(); salida.write(‘‘Nombre:’’); nombre = entrada.readname(); salida.write(‘‘Apellidos:’’); apellidos = entrada.readname(); salida.write(‘‘Direcci´n:’’); o direccion = entrada.readline(); salida.write(‘‘Tel´fono:’’); e telefono = entrada.readname(); salida.writeln(‘‘*** Ficha ***’’); salida.writeln(‘‘_____________’’); salida.writeln(apellidos+’’, ‘‘+nombre); salida.write(‘‘Direcci´n:’’+direccion+’’\t’’); o salida.writeln(‘‘Tel´fono:’’+telefono); e entrada.close(); salida.close(); } } Un ejemplo de ejecuci´n de este programa ser´ el siguiente: o ıa

[....]\$ java EscribeFicha Nombre:Pedro Apellidos:Martinez Ferrero Direcci´n: c/ Perez Gald´s, 156 o o

tempC = entrada. El programa completo ser´ ıa: import nsIO.close(). tempF. Finalmente se cierran los ficheros entrada y salida. El dato. A continuaci´n se realizan los c´lculos para obtener el valor de la o a temperatura en grados Fahrenheit: o F = oC ∗9 + 32 5 Posteriormente se presenta en pantalla el resultado obtenido. salida. para ello se utilizan la primitiva writeln asociada a la variable salida de tipo output. output salida = new output(). 156 Tel´fono:963756823 o o e 3 2. input entrada = new input(). Pedro Direcci´n: c/ Perez Gald´s.´ 2 TEMA 2. para ello se define la variable entrada de tipo input y se utiliza la operaci´n o readdouble.close().*. Escribir un programa en Java que transforme una temperatura dada en grados Fahrenheit a grados Celsius. El programa define como variable de entrada tempC y como variable resultado o de salida tempF. ambas de tipo real double. class Temperatura { public static void main (String param[]) { double tempC. salida. siendo 1o C=33. tempF = tempC*9/5+32. entrada. CONCEPTOS BASICOS Tel´fono:963756823 e *** Ficha *** _____________ Martinez Ferrero. tempF. se lee del teclado.8o F.writeln(‘‘Temperatura en o F=’’+ tempF).readdouble().write(‘‘Temperatura en o C:’’). salida. } } .

. output salida = new output(). para ello se define la variable entrada de tipo input y se utiliza la operaci´n readdouble. radio.0 [.´ 2 TEMA 2..0 Temperatura en o F=32. double. El programa completo quedar´ ıa: import nsIO. todas ellas de tipo real. El dato.0 3. class Esfera_1 { public static void main (String param[]) throws Exception { double radio.*.write(‘‘Escribe el radio (real positivo):’’). . se lee del teclado.]\$ java Temperatura Temperatura en o C:100. salida. CONCEPTOS BASICOS Un ejemplo de ejecuci´n de este programa ser´ el siguiente: o ıa 4 [. para ello se utilizan la e primitiva writeln asociada a la variable salida de tipo output. double superficie.. volumen.]\$ java Temperatura Temperatura en o C:0. a salida. A continuaci´n se realizan los c´lculos para obtener la o o a superficie y el volumen de la esfera: superf icie = 4 ∗ π ∗ radio2 4 superf icie ∗ radio ∗ π ∗ radio3 = 3 3 volumen = Despu´s se presentan en pantalla los resultados obtenidos.writeln(‘‘C´lculo de la superficie y volumen de una esfera’’)... Finalmente se cierran los ficheros entrada y salida.0 Temperatura en o F=2012. input entrada = new input().. Escribir un programa en Java para calcular la superficie y el volumen de una esfera a partir del valor del radio (sup´ngase que es un valor positivo) o El programa define como variable de entrada radio y como variables resultado o de salida superficie y volumen.

por ejemplo: hora representaci´n o 9 900 9:30 930 10:15 1015 11:45 1145 20:10 2010 23:50 2350 Para resolver el problema planteado se deben de seguir los siguientes pasos: (a) Leer los datos de entrada (b) Calcular el tiempo de viaje (c) Calcular el nuevo tiempo de viaje con la reducci´n del 15% o . horas de salida y llegada. Estas se pueden representar como enteros.writeln(‘‘Superficie=’’+superficie).writeln(‘‘Volumen=’’+volumen).close().0*Math. Una empresa de transporte por carretera ha adquirido veh´ ıculos nuevos que viajan m´s r´pido que los antiguos. volumen = superficie*radio/3.PI*radio*radio. salida. salida. Los datos del problema planteado son: • hora de salida • hora de llegada El programa debe realizar los c´lculos necesarios para presentar los siguientes a resultados: • duraci´n del viaje o • hora de llegada En primer lugar se plantea la cuesti´n de c´mo representar los datos de entrada o o ´ del problema. CONCEPTOS BASICOS radio = entrada. superficie = 4.close(). salida. Sup´ngase que la reducci´n media que se consigue del o o o tiempo total de viaje es del 15%.´ 2 TEMA 2. calcule el nuevo horario de llegada y muestre en pantalla el nuevo tiempo de viaje y la nueva hora de llegada. entrada.0. } } 5 4. Escribid un programa en Java que lea el horario de salida y llegada antiguo.readouble(). La empresa desear´ conocer c´mo afectar´ ´sto a a a ıa o a e la duraci´n de los viajes.

hsalida. mm = minutos%60. el m´todo de resoluci´n del problema ser´ el siguiente: e o ıa (a) Leer los datos de entrada. class Trayectos { public static void main (String param[]) { input entrada = new input(). CONCEPTOS BASICOS (d) Obtener el nuevo tiempo de llegada 6 Para realizar los c´lculos de tiempos de viaje.´ 2 TEMA 2. se calcular´n los minutos mediante: a minutos = hhmm ∗ 60 + hhmm%100 100 El proceso inverso para calcular el tiempo en horas y minutos ser´: a hh = minutos/60. output salida = new output(). Con todo ello. .85 ∗ tiempoviaje (d) Obtener el nuevo tiempo de llegada La nueva hora de llegada se calcula sumando tiempoviajenuevo a la hora de salida: llegadanueva = salida + tiempoviajenuevo Este c´lculo se realiza en minutos y ya s´lo queda pasarlo a horas y minutos: a o llegadanueva = (llegadanueva/60) ∗ 100 + (llegadanueva%60) El programa ser´ el siguiente: ıa import nsIO.*. por ejemplo 1015 para representar las 10:15.15 ∗ tiempoviaje = 0. int hllegada. si hhmm es el tiempo en horas (hh) y minutos (mm). salida y llegada (b) Calcular el tiempo de viaje • Pasamos las horas de salida y llegada a minutos • El tiempo de viaje es la diferencia: tiempoviaje = ( salida ∗ 60 llegada ∗ 60 +hhmm%100)−( +hhmm%100) 100 100 (c) Calcular el nuevo tiempo de viaje con la reducci´n del 15%: o tiempoviajenuevo = tiempoviaje − 0. resulta c´modo pasar los tiempos a a o minutos.

.readint().writeln("Duraci´n del viaje:"+tpoviajeNuevo+" minutos").´ 2 TEMA 2..close(). int tpoviaje =llegadaMin .writeln("Nueva Hora de llegada:"+llegadaNueva). entrada..]$ java Trayectos Hora de salida:900 Hora de llegada:1015 Nueva Hora de llegada:1003 Duraci´n del viaje:63 minutos o . salida. hsalida = entrada. hllegada = entrada. salida. tpoviajeNuevo = (tpoviaje * 85)/100. llegadaNueva=100*(llegadaNuevaMin/60)+(llegadaNuevaMin\%60).. int llegadaMin =(hllegada/100)*60 +(hllegada\%100).readint(). CONCEPTOS BASICOS int tpoviajeNuevo.salidaMin..write("Hora de salida:").]$ javac Trayectos. int llegadaNuevaMin = salidaMin + tpoviajeNuevo. llegadaNueva.write("Hora de llegada:"). o salida.close().. salida. 7 salida.java [. int salidaMin =(hsalida/100)*60 + (hsalida\%100). } } La compilaci´n y un ejemplo de ejecuci´n del programa ser´ o o ıa: [.

if ((num1<0 && num2>0) || (num1>0 && num2<0)) fsal..´ 3 TEMA 3. else fsal. u Resoluci´n: El problema puede resolverse directamente en Java.. output fsal = new output(). else fsal..writeln("el producto de los dos numeros es negativo").readint()... . Dados dos n´meros enteros.writeln("el producto de los dos numeros es negativo").writeln("el producto de los dos numeros es positivo o nulo").. if (num1!=0 && num2!=0 && (num1<0 ^ num2<0)) fsal. } } Es posible modificar la expresi´n condicional utilizando cualquiera de las siguientes o (entre otras): . //pedir los dos numeros fsal..readint(). utilizando las o operaciones predefinidas de entrada/salida... realizar un programa que escriba uno u de los dos mensajes: ”el producto de los dos n´meros es positivo o nulo” o bien u ”el producto de los dos n´meros es negativo”..writeln("el producto de los dos numeros es negativo"). num1 y num2. int num2 = fent..writeln ("el producto de los dos numeros es positivo o nulo"). else fsal. No hay que calcular el producto. del modo siguiente: import nsIO. .*.writeln("el producto de los dos numeros es positivo o nulo").. class neg_pos { public static void main(String args[]) { input fent = new input().. Problemas resueltos: .. .. int num1 = fent. //decidimos como es if (num1==0 || num2==0 || (num1>0 && num2>0) || (num1<0 && num2<0)) fsal. CONDICIONES Y ELECCION 8 3 ´ Tema 3. CONDICIONES Y ELECCION 1.writeln("Introduce los dos numeros: ")..

n int diasPag. output fsal = new output(). class antig¨edad { u public static void main(String args[]) { int ant. Por ejemplo. if (dir && a~os < 35 && ant > 36) diasPag += 2. Ello lleva a una resoluci´n. dir = (’s’==fent. a~os.readchar()). tiene derecho a dos d´ por cada mes de presencia. Si tiene menos de 45 a˜os y si n ıas n su antig¨edad es superior a los 5 a˜os. efectuar los c´lculos a a if (ant<12) diasPag=2*ant. CONDICIONES Y ELECCION 9 2. se le conceden 4 d´ sumplementarios. //est´n todos los datos. boolean dir. // datos de entrada // salida fsal. considerando que los datos son: la antig¨edad expresada en meses ant. Consid´rese el texto siguiente: ”En una empresa el c´lculo de las vacaciones pae a gadas se efect´a de la manera siguiente: si una persona lleva menos de un a˜o en u n la empresa. El resultado es el n´mero de d´ de vacaciones u ıas pagadas. ya que se determina en el mismo. Si es un directivo y si tiene menos de 35 a˜os y si su antig¨edad es n u superior a 3 a˜os.´ 3 TEMA 3. fsal. al menos ıas a 28 d´ ıas. que debe hacerse en cada caso. la edad ha de ser inferior a 65 a˜os y superior a 18 n a˜os. • Completar el programa introduciendo verificaciones sobre la coherencia de los datos. expresada directamente en el lenguaje java o o de la forma siguiente: import nsIO.writeln("Es un directivo (s/n?)").writeln("Edad en a~os?"). si no. etc. n fsal. n . Sin embargo el texto puede ser confuso debido o al hecho de que puede haber directivos que cumplan al mismo tiempo la ultima ´ condici´n. else { diasPag=28. obtiene 2 d´ sumplementarios.readint(). n Resoluci´n: El texto no es ambiguo. u ant = fent. u n ıas • Reformular el texto suprimiendo toda ambig¨edad. con precio si´n.readint(). la edad en a˜os edad. u • Escribir el programa correspondiente. n a~os = fent. input fent = new input().writeln("Antig¨edad en meses?"). y la condici´n u n o de ser o no directivo dir.*.

n int diasPag. input fent = new input(). para validar la edad. n } fent. else { diasPag=28. a~os. //est´n todos los datos.writeln("Antig¨edad en meses?"). CONDICIONES Y ELECCION if (a~os < 45 && ant > 60) diasPag += 4.readint(). // datos de entrada // salida fsal.readint(). fsal. output fsal = new output(). u u . A) elige un n´mero entre 1 y e u 16. efectuar los c´lculos a a if (ant<12) diasPag=2*ant. Otro jugador (jug. a lo que el primer jugador (jug. n if (a~os < 18 || a~os > 65) out. if (dir && a~os < 35 && ant > 36) diasPag += 2. B) puede hacer cuatro preguntas de la forma: ¿es ”13” el n´mero?. } } 10 Una modificaci´n como la propuesta. u a o menor.readchar()). dir = (’s’==fent. class antig¨edad { u public static void main(String args[]) { int ant. n } fent. } } } 3.writeln("Demasiado joven o mayor"). A) responder´ diciendo: igual. n n else { fsal.writeln("Tiene derecho a: " + diasPag + "dias"). seg´n el n´mero propuesto sea igual menor o mayor que el elegido. mayor.writeln("Edad en a~os?").writeln("Es un directivo (s/n?)").´ 3 TEMA 3. podr´ efectuarse moo ıa dificando el programa anterior de la forma siguiente: import nsIO. Consid´rese el juego siguiente: un jugador (jug. n if (a~os < 45 && ant > 60) diasPag += 4.writeln("Tiene derecho a: " + diasPag + "dias"). n a~os = fent. boolean dir.*. u ant = fent.

else if (resp. M´s adelante se ver´ una soluci´n general al problema a o a a o planteado.readline(). u resp = fent. Si no se ha acertado los dos posibles rangos de valores son los u n´meros entre 1 y 3.equals("igual")) fsal.writeln("Es el n´mero 7"). Por ejemplo. se puede preguntar: a ¿es ”4” el n´mero?.readline(). u resp = fent. String resp.readline(). else if(resp. else if(resp.equals("menor")) fsal. por una parte.*.writeln("Es el n´mero 5"). CONDICIONES Y ELECCION • Estudiar una estrategia ganadora para el juego.writeln("He acertado").writeln("He acertado").writeln("es 4 el n´mero?"). u } . u u Siguiendo textualmente la estrategia anterior. u resp = fent. u } else {fsal. u else fsal. class adivina { public static void main(String args[]) { input fent = new input(). Con ello conseguimos ante cualquier pregunta n a descartar el n´mero m´s elevado posible de valores. if (resp. y los n´meros entre 5 y 7.writeln("es 2 el n´mero?"). por otra. 11 • Realizar un programa en que el usuario sea el jugador A y el ordenador el B. lo que facilitar´ la discusi´n. // Preguntamos fsal. se puede realizar un programa como el que sigue: import nsIO.writeln("He acertado").writeln("es 6 el n´mero?"). si el rango de u a valores en un momento dado est´ comprendido entre 1 y 7. if (resp. La estrategia m´s razonable consiste en dividir cada intervalo en dos subintervalos a de tama˜o lo m´s parecido posible.writeln("Es el n´mero 2").equals("menor")) { fsal. Resoluci´n: Para simplificar la soluci´n se supondr´ que el intervalo de n´meros o o a u entre los que se puede elegir son los del rango comprendido entre 1 y 7. u else fsal.´ 3 TEMA 3. if (resp.equals("igual")) fsal. output fsal = new output().writeln("Es el n´mero 1").equals("igual")) fsal.equals("menor")) fsal.

.*. class calculadora { public static void main(String args[]) { input fent = new input().. + result).readln(). op = fent. 5. result=0.writeln("num1?"). double num1=0. u o import nsIO. el operador ternario y mediante tratamiento de excecpciones.read(). -. break. Se desea escribir un programa para calcular la ra´ cuadrada real de un n´mero ız u real cualquiera pedido inicialmente al usuario. CONDICIONES Y ELECCION } } 12 4. case ’*’: result = num1*num2. Escr´ o ıbanse distintas soluciones al problema anterior.readdouble(). // operador implicado fsal. num2=0. Escr´ ıbase un programa para simular una calculadora. case ’-’: result = num1-num2. /.writeln("operador?"). break. haciendo uso de: operadores cortocircuitados. instrucciones condicionales. Resu´lvase utilizando tanto instrucciones "if. fsal.else". case ’/’: result = num1/num2.. break. donde num1 y num2 son dos n´meros u reales cualesquiera y operador es uno de entre: +. Como dicha operaci´n no est´ defio a nida para los n´meros negativos es necesario tratar. a continuaci´n el operador y finalmente el o valor num2. num2 = fent. fsal. dicho posible u u error sin que el programa detenga su ejecuci´n. } fsal. Hace uso de la instrucci´n "switch". switch (op) { case ’+’: result = num1+num2. num1 = fent. de alg´n modo.readdouble(). El programa pedir´ a al usuario en primer lugar el valor num1. output fsal = new output(). // num entrada y resultado. Resoluci´n: El siguiente programa resuelve el problema anterior suponiendo que la o entrada de datos se efect´a libre de errores.writeln("El resultado es: " break. como e "switch". Consid´rese que los c´lculos e a posibles son del tipo num1 operador num2..´ 3 TEMA 3.writeln("num2?"). *. char op.. fent.then.

double num1=0. result=0.read(). fsal. case ’-’: result = num1-num2. char op.writeln("operador?"). fent. break. } fsal.writeln("El resultado es: " } } break. + result). } catch (NumberFormatException e) { fsal. fsal.readln().*. class calculadora { public static void main(String args[]) { input fent = new input().readdouble(). num2=0.writeln("num1?"). // num entrada y resultado. CONDICIONES Y ELECCION } } 13 La versi´n siguiente trata la situaci´n en la que uno de las entradas num´ricas se o o e ha escrito incorrectamente. . } switch (op) { case ’+’: result = num1+num2. op = fent.writeln("num2?").´ 3 TEMA 3. fsal. return.writeln("ERROR EN LA ENTRADA:"). num2 = fent. break. origin´ndose una excepci´n: a o import nsIO. num1 = fent. case ’*’: result = num1*num2. break. // operador implicado try { fsal.readdouble(). output fsal = new output(). case ’/’: result = num1/num2.writeln("uno de los numeros introducidos es incorrecto").

si x es el n´mero que se introduce por teclado. i<x. output fsal= new otput(). int x2=x.*. a o o a u ¿Deja alguna vez de cumplirse?. La condici´n de repetici´n del bucle es i<x. fent.writeln(‘‘Introduce el n´mero:’’). y x2 es la u variable sobre la que se va a realizar el c´lculo. la estrategia o m´todo para realizar a e este c´lculo ser´ a ıa: x2=x. ¿Qu´ valores toma?. } } (a) ¿Cu´ntas variables intervienen y de qu´ tipo son? x que es el dato y x2 que a e es el resultado. i++) x2+=x. ¿Cu´ntas veces se eval´a?. o u x veces.writeln(‘‘El cuadrado de ‘‘+x+’’ es:’’+x2). o o que se eval´a x veces. LA ITERACION 14 4 ´ Tema 4. y la variable de control del bucle i (b) ¿Cu´l es la variable de control del bucle?.´ 4 TEMA 4. class cuadrado { public void static main (String args) { input fent = new input().readint(). LA ITERACION 1. Escribir un programa en Java que calcule el cuadrado del n´mero que se introduce u como dato utilizando unicamente sumas ´ Resoluci´n: El cuadrado de un n´mero. Problemas resueltos: . fsal. fsal. u int x=fent. (c) ¿Cu´l es la condici´n de repetici´n del bucle?. repetir (x-1) vez a~adir x a x2 n El c´digo en Java ser´ o ıa: import nsIO.close(). La variable i comienza valiendo 1 y se incrementa de u uno en uno por lo que seguro que llega un momento en el que vale x y el bucle termina. x. La variable a e i toma valores entre 1 y x-1. for (int i=1. se puede expresar como la suma de x. ambas de tipo entero. fsal. Por lo tanto.close().

¿Cu´ntas veces se realizan?.close(). int x2=x. while (i<x) { x2+=x. LA ITERACION 15 (d) ¿Que instrucciones forman el cuerpo del bucle?.close(). u int x=fent. fsal.´ 4 TEMA 4.readint(). i++. Se realiza x-1 veces. esto es: i x2 = k=0 x (f) Una traza del programa para x=4 ser´ ıa: i – 1 2 3 4 x2 4 8 12 16 El programa anterior pero utilizando la estructura while en lugar del for ser´ ıa: import nsIO*.writeln(‘‘El cuadrado de ‘‘+x+’’ es:’’+x2). fsal. class cuadrado { public void static main (String args) throws Exception { input fent = new input(). i+1 vez. (e) ¿Qu´ relaci´n guardan las variables que se utilizan en el bucle?. Describe qu´ hace el siguiente segmento de c´digo en Java. int i=1. output fsal= new otput(). } fsal. Supongamos que n es e o una variable de tipo int que ya tiene asignado un determinado valor . a El cuerpo del bucle est´ formado por la instrucci´n de incremento de la a o variable resultado x2.writeln(‘‘Introduce el n´mero:’’). En la variable e o x2 siempre se tiene la suma acumulada de x. } } 2. fent.

else i=n. for (. i--. LA ITERACION { double resultado=0. La condici´n de repetici´n del bucle es i>=1. Escribir un programa en Java para calcular el t´rmino n-´simo de la serie: e e an = 3 ∗ an−1 + 2 a0 = 1 . adem´s del dato n que se a supone conocido. while (i>=1) { resultado+=(1/i). El segmento de programa calcula la suma de la serie arm´nica: o |n| resultado = k=1 1/k Y la relaci´n que cumplen las variables del bucle en cada iteraci´n es la siguiente: o o |n| resultado = k=i+1 1/k Este fragmento de programa se podr´ haber escrito utilizando un bucle for: ıa if (i<0) i=-n else i=n. El cuerpo del bucle es u a el incremento de la variable resultado en la cantidad 1/i y la modificaci´n de la o variable de control del bucle. Esta variable va decreciendo de uno en uno hasta valer 0.´ 4 TEMA 4. 3. i que es la variable o de control del bucle y resultado que es de tipo real.i--) resultado+=(1/i). int i. } } 16 Resoluci´n: Este segmento de programa utiliza dos variables. i>=1.0. Inicialmente la variable i toma el valor absoluto de n. if (n<0) i=-n. y por o o lo tanto se eval´a una vez m´s que el valor absoluto de n.

fsal. i<n.*. . Por ello e necesitaremos dos variables para poder calcular cada t´rmino: e import nsIO. . fsal. LA ITERACION 17 Algunos t´rminos de esta serie son los siguientes: 1.readint(). e o El programa en Java ser´ ıa: import nsIO.writeln(‘‘Introduce el n´mero:’’). 53. . output fsal= new output(). output fsal= new otput(). . i++) a=3*a+2. e Resoluci´n: El c´lculo del n-´simo t´rmino de la serie se puede hacer mediante un o a e e bucle en el que en cada iteraci´n se calcula un t´rmino de la serie.close(). . int a=1. class serie { public void static main (String args) { input fent = new input(). El valor del o e t´rmino anterior es el contenido de la variable en la iteraci´n anterior. 5. 2. Escribir un programa en Java para calcular el t´rmino n-´simo de la serie de e e Fibonacci: an = an−1 + an−2 a1 = 1 a0 = 0 Resoluci´n: Los primeros t´rminos de esta serie son: 0. 8. . . fsal. u int n=fent. 13. 5. 1. . 3. e fent. o e Cada t´rmino de esta serie se calcula a partir de los dos anteriores.close().´ 4 TEMA 4. 1. class serie { public void static main (String args) { input fent = new input(). for (int i=0. 17.*. } } 4.writeln(‘‘El t´rmino es:’’+a). . 161.

System. int m=n. for (int i=0. int m=n. i++) { actual+=anterior. o u Un algoritmo para hacer esto seria: // n es el numero en decimal System.out.close().´ 4 TEMA 4.close().print(‘‘La representacion en binario del numero ’’+n+’’ es.readint().. u int n=fent.writeln(‘‘El t´rmino es:’’+actual).println(‘‘Leelo al reves!!’’).print(m$%$2). LA ITERACION 18 fsal. i<n. e fent. while (m!=1) { System..out.writeln(‘‘Introduce el n´mero:’’). anterior=actual-anterior.println(‘‘La representacion en binario del numero ’’+n+’’ es.’’).out.println(). int actual=1.. Escribir un programa para convertir n´meros en base decimal a base 2 u Resoluci´n: Si el n´mero en decimal se divide sucesivas veces por 2 y se escriben o u los restos de derecha a izquierda se obtiene la representaci´n en binario del n´mero.. fsal. } } 5. Si se deseara devolver el n´mero en binario en una variable de tipo entera pou dr´ ıamos hacer: // n es el numero en decimal System. int anterior=0.out. } fsal. } System. m=m/2.’’).out. //copia del dato .

Se realiza log n veces.out. ¿Cu´ntas veces se eval´a?. ambas de tipo entero. pot*=10. // representaci´n entera del n´mero binario o u while (m!=0) { m/=2. La variable a e m toma valores entre n y 1. y de las variables m y pot. //guardar la potencia de 10 int res=n$%$2. a El cuerpo del bucle est´ formado por la instrucci´n de actualizaci´n de la a o o variable resultado res. 19 (a) ¿Cu´ntas variables intervienen y de qu´ tipo son? n que es el dato.´ 4 TEMA 4. pot = pot ∗ 10i . LA ITERACION int pot=1. } System. res = mod2 ∗ 10k 2i 2k k=0 (f) Una traza del programa para n=115 ser´ ıa: m 115 57 28 14 7 3 1 res 1 11 110 1100 11001 110011 1100111 pot 1 10 100 1000 10000 100000 1000000 . La condici´n de repetici´n del bucle es o o m!=1. res+=(m$%$2)*pot. la variable de control del bucle m y la auxiliar pot. (b) ¿Cu´l es la variable de control del bucle?.println(res). y se va reduciendo a la mitad. res que a e es el resultado. ¿Qu´ valores toma?. La variable m comienza valiendo n y se u va dividiendo por la mitad por lo que seguro que llega un momento en el que vale 1 y el bucle termina. que se eval´a log n +1 veces. (d) ¿Que instrucciones forman el cuerpo del bucle?. (c) ¿Cu´l es la condici´n de repetici´n del bucle?. (e) ¿Qu´ relaci´n guardan las variables que se utilizan en el bucle?. Si estamos e o en la iteraci´n i-´sima: o e m= i n n . a o o a u ¿Deja alguna vez de cumplirse?. ¿Cu´ntas veces se realizan?.

Sea v un vector de num elementos de cierto tipo base tbase. i<=(N-1)/2. v[j]=aux. v[N-i-1]=aux. de forma acua mulada.. 2. v[i]=v[N-i-1]. de forma que una se incremente en sentido ascendente y la otra se decremente en sentido descendente. RECORRIDO Y BUSQUEDA Problemas resueltos: 1. i++) { aux=v[i]..´ 5 TEMA 5. Una posible estrategia consiste en leer los datos del o a fichero "pluvio. i++. i<j. ı Resoluci´n: Las dos estrategias siguientes permiten resolver el problema: o (a) Recorrer el vector hasta su elemento central ((N-1)/2). o real´ ıcese un programa para: ”Obtener el mes que ha llovido m´s.. e intercambiar sucesivamente los elementos sim´tricos. tal y como se ha efectuado en la resoluci´n de problemas similares en los apuntes de teor´ Hecho esto.” n ı Resoluci´n: Como los datos se encuentran no ordenados temporalmente en un o fichero.. VECTORES. . es necesario leerlos inicialmente reorganiz´ndolos para facilitar la posterior a determinaci´n del m´ximo. Constr´yase un prou grama para invertir los elementos del vector. v[i]=v[j]. } . (b) // v es el vector de dimensi´n N o tbase aux. for (int i=0. RECORRIDO Y BUSQUEDA 20 5 ´ Tema 5. as´ como la cantidad llovida en dicho mes. en su posici´n 1 el elemento que inicialmente conten´ la posici´n o o ıa o num-2 y as´ sucesivamente.dat" en las matrices lluvia y diasM. a lo largo de todo el a˜o. Finalizando cuando ambas se crucen. e o o (b) Recorrer el vector hasta su elemento central utilizando dos variables contador: i y j. VECTORES. Las instrucciones siguientes se corresponden a cada una de las dos estrategias: (a) // v es el vector de dimensi´n N o tbase aux. j--) { aux=v[i]. esto es: al finalizar la ejecuci´n del o mismo el vector contendr´ en su posici´n 0 el elemento que inicialmente conten´ la a o ıa posici´n num-1. es o ıa. } . Siendo e el elemento sim´trico del que tiene posici´n i el de posici´n N-i-1.dat".. cuyo contenido y organizaci´n es ya conocido. int j=N-1. utilizando una variable contador i.. Dado el fichero "pluvio. for (int i=0.

Resu´lvase el problema de nuevo siguiendo dicha estrategia. a continuaci´n. la determinaci´n del m´ximo de dicho vector. Resoluci´n: Para resolver el problema es necesario acumular el n´mero de personas o u que tienen las distintas edades posibles. // Contendr´ el mes de pluviosidad m´xima a a int maxCant=0. a Las siguientes instrucciones resuelven el problema siguiendo la estrategia planteada en el p´rrafo anterior: a int maxMes=1. Hecho esto. La moda de un conjunto de valores es el valor que se repite mayor n´mero de veces u en el conjunto. la componente 30 del vector contendr´ ı. el problema: . siguiendo la estrategia anterior. se puede utilizar un vector de enteros. VECTORES. mes<=12. // Contendr´ la pluviosidad del mes maxMes a int acum=0. a a a El siguiente programa en Java resuelve. acumulando las pluviosidades de cada mes en una ıa variable al efecto (un elemento de un vector de 12 componentes). a el n´mero de personas que tengan 30 a˜os. es trivial. y para cada mes recorrer todos sus n d´ para determinar la cantidad llovida a lo largo de dicho mes. for (dia=1.125.out.. e 3. maxMes=mes. RECORRIDO Y BUSQUEDA 21 necesario recorrer todos los meses del a˜o.. y por lo tanto del mes del a˜o con m´s o a n a pluviosidad.´ 5 TEMA 5. la moda de ese conjunto de valores (basta con escribir o una si hay varias). if (acum>maxCant) {maxCant=acum. dia++) acum += lluvia[mes][dia]. Como se puede considerar que dichas edades est´n limitadas al rango 0. mes++) { acum = 0.println(maxMes+" : "+maxCant). de a tama˜o 125. un recorrido ıdo del mismo bastar´ para determinar un m´ximo (valor m´s frecuente. As´ por ejemplo. ..dat". // Contendr´ la pluviosidad acumulada del mes en curso a for (mes=1. Cada vez que se ıas dispone de la cantidad llovida en un mes ser´ necesario determinar si es o no una a cantidad m´yor que cualquiera de las anteriores. u n Una vez se hayan le´ y acumulado en el vector todos los valores. o moda). Una segunda estrategia posible habr´ consistido en la lectura de los valores d´ a ıa ıa d´ del fichero "pluvio. Escr´ ıbase un programa para leer desde cierto fichero (que puede ser la entrada est´ndard) los valores de las edades de un grupo de personas y que a presente..} } System. para acumular en cada una de sus componentes el n´mero de personas n u que tienen dicha edad. dia<=diasM[mes].

int acumI[] = new int[21]. VECTORES. class moda { public static main(String args[]) { input fent = new input(). teniendo en cuenta los intervalos sin o guientes: [0.20[. [10. La ultima componente del vector (num 20) contendr´ la ´ a pluviosidad que exceda los 200 litros."+posMax).. [190 a 200[ y. for (int i=1. la componente de ´ ındice 9 contendr´ la pluviosidad comprendida a en el rango [90.100[. [90.dat” es posible subdividir los d´ o ıas del a˜o.*.´ 5 TEMA 5..10[. RECORRIDO Y BUSQUEDA import nsIO. int edades[] = new int[125]. . int aux.. Escr´ ıbase un programa que escriba en una lista cada intervalo junto con el n´mero total de d´ del a˜o en que la cantidad llovida pertenezca a dicho intervalo. . . Por ejemplo.. dia <=ultM[mes].. y almacenando en cada una de ellas la cantidad llovida en el intervalo correspondiente. mes<=12. output fsal = new output(). en funci´n de la cantidad llovida... // b´squeda del m´ximo u a int posMax=0. dia++) if (lluvia[mes][dia]>=200) acumI[20]++. // vector acumulador..100[. haciendo uso de un vector con 21 componentes (de la 0 a la 20). i++) if (edades[i]>edades[posMax]) posMax=i.more()) edades[fent. A partir de la informaci´n del fichero ”pluvio. // recorrido de la matriz lluvia for (int mes=1.. i<=125.. El siguiente segmento en Java resuelve el problema partiendo de la suposici´n o de que inicialmente se han almacenado en las variables matriz lluvia y ultM la informaci´n correspondiente a la pluviosidad del a˜o. // vector acumulador // lectura del fichero while (fent. // resultados fsal. else { aux = (int)lluvia[mes][dia].readint()]++. mes++) for (int dia=1. de forma similar a como se o n ha efectuado en la resoluci´n de problemas en los apuntes de teor´ o ıa: .writeln("la moda es.. u ıas n Resoluci´n: Se puede seguir una estrategia similar a la utilizada en el problema o anterior. m´s de 200 ´ a litros. por ultimo. } } 22 4...

i++) System. comproo bando en cada elemento si es o no el inicio de una subsecuencia como la deseada.. Resoluci´n: Sup´ngase que el vector vPal con N elementos de tipo String ha sido o o definido e inicializado. N´tese que se trata de de un problema de b´squeda: el de determinar la existencia o u de posiciones sim´tricas (i y j) en el vector que contengan palabras distintas.. Sea v un vector de valores enteros. . j--. int j=N-1.. u Resoluci´n: Se trata de un problema de b´squeda: el de la posici´n de la primera o u o subsecuencia que satisfaga el enunciado.out. o tres n´meros enteros consecutivos en posiciones consecutivas del vector. esto es. si existe.. la segunda y la pen´ltima palabras del vector tambi´n lo son. de la primera subsecuencia del vector que comprenda...´ 5 TEMA 5. .. . RECORRIDO Y BUSQUEDA acum[aux/10]++.} // i>=j o v[i] distinta v[j] if (i>=j) System. Si el tama˜o de la subsecuencia es peque˜o (por ejemplo 3.println(i*10+" "+(i*10+10)+" lluvia:"+acum[i]). . 23 5. int i=0. As´ las siguientes instrucciones siguen la estrategia indicada: ı.. Real´ ıcese un programa para determinar la posici´n. y as´ suceu e ı sivamente. } // escritura de resultados for (int i=0.. Entonces la siguiente secuencia de instrucciones en Java permiten determinar si dicho vector es o no cap-i-cua: . Escr´ ıbase un programa para determinar si un vector de palabras (String) es capi-cua.println("No es cap-i-cua"). VECTORES. para determinar si la primera y ultima palabras del vector son la ´ misma.... 6.out.. o porque se cruzan n o entonces el vector es cap-i-cua.println("Es cap-i-cua"). // para recorrer el vector while ((i<j) && !(v[i]. Si e en el recorrido efectuado con la iteraci´n anterior se llega al centro del vector.. como es el caso) entonn n ces una soluci´n posible consiste en recorrer el vector ascendentemente. String vPal[] = new String[N]. else System. al menos. o finaliz´ndose porque los ´ a ındices se˜ alan la misma posici´n.out. // El vector vPal ha sido inicializado con las palabras .equals(v[j]))) {i++. i<21..

println("No se encuentra").. else System. int i = 1.. else i++. contar ıa ıa... . RECORRIDO Y BUSQUEDA .. la estran tegia anterior podr´ ser farragosa e ineficiente.... .. // tama~o de la secuencia buscada n // contador de apariciones // para recorrer el vector while (i < N && conta<numRep) { if (v[i]-1==v[i]) conta++.out. boolean subSec = false. .... int v[] = new int[N]. else System. int numRep = 3.´ 5 TEMA 5. Las instrucciones siguientes permiten encontrar la posici´n del elemento m´s peo a que˜o en un vector v de n enteros (n ≥ 1): n . } // i > N-3 o subSec if (subSec) System. . else conta=1...println("Empieza en "+ (i-numRep))..println("No se encuentra"). 7.out. . int v[] = new int[N]. 24 // true si se ha hallado la secuencia // para recorrer el vector while (i <= N-3 && !subSec) { if (v[i]+1==v[i+1] && v[i+1]+1==v[i+2]) subSec=true. a continuaci´n determinar si es o no el n´mero deseado. Se podr´ por lo contrario. Si el tama˜o de la subsecuencia fuera grande (mayor que 3 por ejemplo).println("Empieza en "+i). int conta=1. Las o o u siguientes instrucciones siguen la estrategia se˜alada: n . i++.out..... int v[] = new int[n]... int i = 0. VECTORES. cuantas apariciones como las deseadas han habido (con una sola comparaci´n en o cada iteraci´n) y.out. } // i = N o conta=numRep if (conta==numRep) System.

(d) ¿Cu´l es la complejidad temporal del algoritmo expresada en t´rminos del a e n´mero de veces que se repite la instrucci´n cr´ u o ıtica?.. pos=0. int pos. min=v[pos]. ¿cu´l es el tama˜o del problema?. u e n (b) ¿Existen instancias significativas? No existen instancias significativas ya que se trata de un algoritmo de recorrido en el que se efect´an n iteraciones y u cada una de ellas con coste constante. respectivamente.. El algoritmo consiste o en dos bucles anidados para el recorrido de la matriz por filas y columnas. for (int i=1. i++) if v[i]<min { pos=i. este c´lculo implica un a . (b) Suma de dos matrices cuadradas de dimensi´n nxn. Se trata de un algoritmo de coste lineal con la dimensi´n o de los vectores.. se a o multiplican las correspondientes componentes k de los vectores y se acumulan sobre el resultado. Tambi´n en este caso o e se tiene dos bucles anidados. ´ste es el tama˜ o del problema. min. en cada iteraci´n m´s interna se calcula cada una de las o a componentes de la matriz resultante de la suma. La complejidad del algoritmo en t´rminos del n´mero de veces que se repite la instrucci´n cr´ e u o ıtica es n − 1. en cada iteraci´n se calcula cada una de las o componentes de la matriz resultante. Y por lo e tanto. El algoritmo correspondieno te ser´ un recorrido por los dos vectores implicados.´ 5 TEMA 5. a u (c) Producto de matrices cuadradas de dimensi´n nxn.. 8. VECTORES. se repite n − 1 o veces. ¿Cu´ntas veces se a repite?. El coste del algoritmo es cuadr´tico con el n´mero de filas o columnas. . El coste del algoritmo es por lo tanto lineal. n. en este caso. min=v[pos]. i<n.. RECORRIDO Y BUSQUEDA .} // posici´n del m´nimo en pos. Est´diese la complejidad temporal de los algoritmos iterativos obtenidos de la u implementaci´n directa (sin mejoras especiales) de las definiciones de las siguientes o operaciones: Resoluci´n: o (a) Producto escalar de dos vectores de dimensi´n n. en cada iteraci´n k. o ı } Resoluci´n: o 25 (a) ¿De qu´ va a depender el coste temporal del algoritmo anterior?. Una instrucci´n cr´ o ıtica es la comparaci´n v[i] < min.. (c) ¿Cu´l podr´ ser la instrucci´n cr´ a ıa o ıtica en este algoritmo?. El coste de este algoritmo depender´ a n a del n´mero de elementos del vector.

i<n. el coste del mismo ser´ ıa c´bico con el n´mero de filas o columnas. u u . El algoritmo para calcular la matriz c como producto de las matrices a y b ser´ ıa: for (int i=0. RECORRIDO Y BUSQUEDA 26 recorrido adicional de fila y columna. VECTORES. k] ∗ b[k. j]. i++) for (int j=0. } Si tomamos como instrucci´n cr´ o ıtica de este algoritmo el producto de componentes de las matrices aux = aux + a[i. j++) { aux=0. k++) aux=aux+a[i.j].´ 5 TEMA 5.k]*b[k. j<n. k<n.j]=aux. c[i. for (int k=0.