Académique Documents
Professionnel Documents
Culture Documents
Ejemplo: Un mtodo que promedia 2 notas. Debe recibir como parmetro las notas (double) y luego los porcentajes e a por los que ponderar cada nota (int). a public double Ponderar (double a, double b, int c, int d){ double valor; //crea una variable para retornar valor =a*(c/100)+b*(d/100); return valor; } El mtodo anterior recibe cuatro parmetros y los pondera, entrega como resultado el valor de la ponderae a cin (un double, como lo indica la expresin inicial public double Ponderar). Para llamarlo, se hace de la o o siguiente manera:
double num= Ponderar(x,y,z,k); Donde x,y,z,k pueden ser directamente nmeros o variables. El resultado ser almacenado en la variable num. u a Importante: Los mtodos pueden no retornar nada, en tal caso, se les asigna la palabra reservada void. e Ejemplo: public void InvertirNumero(int num) realiza la funcin pero no regresa variable. o Un mtodo se acaba cuando ejecuta el comando return, es decir, todo lo que est bajo este comando no e e ser le a do. Scope: Es importante saber que las variables creadas en el mtodo slo existirn dentro de l, as es que e o a e puedo tener un mismo identicador en mi main y en un mtodo. e Al entregar parmetros a un mtodo se debe ser coherente en el orden y en el tipo. a e
Ejemplos
Problema 1: Distancia entre dos puntos
Enunciado Un astrnomo necesita un programa para calcular la distancia entre dos puntos de un plano. Escriba un o programa que tenga a lo menos un mtodo y cumpla con las siguientes caracter e sticas: 1. Pedir al usuario las coordenadas de los dos puntos. 2. Calcular la distancia entre los dos puntos. 3. Mostrar en pantalla el resultado. 4. Seguir ejecutando la aplicacin hasta que el usuario elija la opcin de salir. o o HINT: La distancia entre dos puntos de un plano puede calcularse con la siguiente ecuacin: o d= Criterios de solucin o Resolviendo por cada item que nos piden, tenemos: 1. Tendremos 4 variables para almacenar las coordenadas de los dos puntos: x1, y1, x2, y2. 2. Para calcular la distancia crearemos un mtodo con el nombre getDistancia y que reciba como argue mentos las coordenadas de ambos puntos. 3. Para mostrar en pantalla, simplemente ejecutamos el mtodo y desplegamos el resultado en pantalla. e 4. Para este ultimo punto, lo que haremos ser poner el cdigo principal dentro de un while y despus a o e de cada ciclo le preguntaremos al usuario si quiere salir. Si elige salir, entonces hacemos que el while termine. Posible Solucin o
import i i c 1 1 0 3 P a c k a g e .*; public class D i s t a n c i a { public static void main ( String [] args ) { boolean salir = false ; while (! salir ) { double x1 = Usuario . real ( " X1 : " ); double y1 = Usuario . real ( " Y1 : " ); double x2 = Usuario . real ( " X2 : " ); double y2 = Usuario . real ( " Y2 : " ); Usuario . mensaje ( " D i s t a n c i a entre los dos puntos : " + g e t D i s t a n c i a( x1 , y1 , x2 , y2 )); int decision ; do { decision = Usuario . entero ( " 1. C o n t i n u a r.\ n2 . Salir " ); } while ( decision != 1 && decision != 2); if ( decision == 2){ salir = true ; } } } public static double g e t D i s t a n c i a( double x1 , double y1 , double x2 , double y2 ) { double p o n t e n c i a 1 = Math . pow (( x2 - x1 ) , 2); double p o n t e n c i a 2 = Math . pow (( y2 - y1 ) , 2); double d i s t a n c i a E n t r e D o s P u n t o s = Math . sqrt ( p o n t e n c i a 1 + p o n t e n c i a 2); return d i s t a n c i a E n t r e D o s P u n t o s; } }
Posible solucin o
// Primera parte public boolean e s P e r f e c t o( int n ) { if ( n <= 1) { // si es negativo o 1 ( el 1 no es perfecto ) return ( false ); } else { int suma = 0; for ( int i = 1; i < n ; i ++) { if ( n % i == 0) { // divisor ? suma = suma + i ; } } if ( suma == n ) { // es la suma igual a n ? return ( true ); } else { return ( false ); } } } // Segunda parte public void colocarN ( int n ) { if ( n >= 1) { int numero = 6; // c o m e n z a m o s desde 6 , los a n t e r i o r e s no son primos while ( n > 0) { // u t i l i z a m o s el mismo valor i n g r e s a d o como contador if ( e s P e r f e c t o( numero )){ n - -; // e n c o n t r a m o s un perfecto , faltan n ; } numero ++; } // cuando salimos , numero contiene el n - esimo numero perfecto val = -- numero ; } }
Criterios de solucin o En ste tipo de problemas es buena opcin escribir a un lado una tabla con las variables, e ir anotando los e o cambios l nea a l nea, realizando una especie de debug manual. Se debe ser bastante sistemtico para no a equivocarse, y cuidar interpretar correctamente los cambios en las variables. Posible Solucin o 2. 3. 5. 7. 10 ok El programa muestra los nmeros primos menores u
a X
Criterios de solucin o En ste tipo de problemas es buena opcin escribir a un lado una tabla con las variables, e ir anotando los e o cambios l nea a l nea, realizando una especie de debug manual. Se debe ser bastante sistemtico para no a equivocarse, y cuidar interpretar correctamente los cambios en las variables. Posible Solucin o Lo que se imprime en consola es: 3 2 El mtodo calcula el mximo comn divisor e a u
Problema 5: Comida
Enunciado Indique el resultado que aparece en la consola cuando se ejecuta el siguiente programa.
import i i c 1 1 0 3 P a c k a g e .*; public class P r i n c i p a l { public static void main ( String [] args ) { int dinero = 10000 , hambre = 0; Usuario . m e n s a j e C o n s o l a( " Hambre : " + hambre + " Dinero : hambre = h a c e r _ h a m b r e (60); dinero = dinero - Desayuno ( hambre ); Usuario . m e n s a j e C o n s o l a( " Hambre : " + hambre + " Dinero : hambre = h a c e r _ h a m b r e (60 * 4); dinero = dinero - Almuerzo ( hambre ); Usuario . m e n s a j e C o n s o l a( " Hambre : " + hambre + " Dinero : hambre = h a c e r _ h a m b r e (60 * 5); dinero = dinero - Once ( hambre ); Usuario . m e n s a j e C o n s o l a( " Hambre : " + hambre + " Dinero : hambre = h a c e r _ h a m b r e (60 * 2); dinero = dinero - Cena ( hambre ); Usuario . m e n s a j e C o n s o l a( " Hambre : " + hambre + " Dinero : } public static int h a c e r _ h a m b r e( int tiempo ) { return tiempo / 60; } public static int Almuerzo ( int x ) { int valor = x * 1000; Usuario . m e n s a j e C o n s o l a( " Valor Almuerzo : " + valor ); return valor ; } public static int Desayuno ( int y ) { int valor = y * 500; Usuario . m e n s a j e C o n s o l a( " Valor Desayuno : " + valor ); return valor ; } public static int Cena ( int u ) { int i = u ; int hambre = 0; while ( i > 0) { hambre = hambre + 500; i = i -1; } Usuario . m e n s a j e C o n s o l a( " Valor Cena : " + hambre ); return hambre ; } public static int Once ( int v ) { int Cena = v * 500; Usuario . m e n s a j e C o n s o l a( " Valor : Once : " + Cena ); return Cena ; } }
" + dinero + " \ n " ); " + dinero + " \ n " ); " + dinero + " \ n " ); " + dinero );
Criterios de solucin o En ste tipo de problemas es buena opcin escribir a un lado una tabla con las variables, e ir anotando los e o cambios l nea a l nea, realizando una especie de debug manual. Se debe ser bastante sistemtico para no a equivocarse, y cuidar interpretar correctamente los cambios en las variables.
Solucin o Siguiendo la ejecucin obtenemos lo siguiente: o Hambre: 0 Dinero: 10000 Valor Desayuno: 500 Hambre: 1 Dinero: 9500 Valor Almuerzo: 4000 Hambre: 4 Dinero: 5500 Valor: Once: 2500 Hambre: 5 Dinero: 3000 Valor Cena: 1000 Hambre: 2 Dinero: 2000
10
Criterios de solucin o Al igual que en el problema anterior es buena opcin escribir a un lado una tabla con las variables, e ir o anotando los cambios l nea a l nea. En ste caso se debe tener cuidado con los loops, el scope de las variables e y los retornos de los mtodos. e
11
Problema 7: Recordatorio
Enunciado Escriba un mtodo que mejore la extensibilidad y el mantenimiento del siguiente cdigo: e o
import i i c 1 1 0 3 P a c k a g e .*; public class R e c o r d a t o r i o { public static void main ( String [] args ) { int seg , min , hr , dia , mes , anio ; seg = Usuario . entero ( " Ingrese el segundo en que desea el r e c o r d a t o r i o: " ); while ( seg < 0 || seg > 59) { Usuario . mensaje ( " Ha i n g r e s a d o un valor invalido " ); seg = Usuario . entero ( " Ingrese el segundo en que desea el r e c o r d a t o r i o" ); } min = Usuario . entero ( " Ingrese el minuto en que desea el r e c o r d a t o r i o: " ); while ( min < 0 || min > 59) { Usuario . mensaje ( " Ha i n g r e s a d o un valor invalido " ); min = Usuario . entero ( " Ingrese el minuto en que desea el r e c o r d a t o r i o" ); } hr = Usuario . entero ( " Ingrese la hora en que desea el r e c o r d a t o r i o: " ); while ( hr < 0 || hr > 23) { Usuario . mensaje ( " Ha i n g r e s a d o un valor invalido " ); hr = Usuario . entero ( " Ingrese la hora en que desea el r e c o r d a t o r i o" ); } dia = Usuario . entero ( " Ingrese el dia en que desea el r e c o r d a t o r i o: " ); while ( dia < 1 || dia > 31) { Usuario . mensaje ( " Ha i n g r e s a d o un valor invalido " ); dia = Usuario . entero ( " Ingrese el dia en que desea el r e c o r d a t o r i o" ); } mes = Usuario . entero ( " Ingrese el mes en que desea el r e c o r d a t o r i o: " ); while ( mes < 1 || mes > 12) { Usuario . mensaje ( " Ha i n g r e s a d o un valor invalido " ); mes = Usuario . entero ( " Ingrese el mes en que desea el r e c o r d a t o r i o" ); } anio = Usuario . entero ( " Ingrese el anio en que desea el r e c o r d a t o r i o: " ); while ( anio < 2009) { Usuario . mensaje ( " Ha i n g r e s a d o un valor invalido " ); anio = Usuario . entero ( " Ingrese el anio en que desea el r e c o r d a t o r i o" ); } Usuario . mensaje ( " El r e c o r d a t o r i o quedo fijado para : " + dia + " / " + mes + " / " + anio + " a las " + hr + " : " + min + " : " + seg ); } }
Criterios de solucin o Identicamos que partes del cdigo se repiten, de manera que podamos encapsularlas en un mtodo. Clarao e mente la peticin y validacin de valores es la parte que se repite en el cdigo. Notamos que hay dos formas o o o del mtodo semejantes, una donde el valor est acotado por dos nmeros, y otra donde est acotado por e a u a uno. Por ello lo que haremos ser sobrecargar el mtodo (dos mtodos con el mismo nombre, que cumplen a e e la misma funcin, pero que tienen parmetros distintos). o a
12
13
que retorna true si el n mero n que recibe como parmetro es un n mero de Smith, y false en caso contrario. u a u Importante: En su implementacin puede suponer que el mtodo numeroSmith siempre es invocado con o e un n mero entero n mayor que 1. u Criterios de solucin o Lo primero que hay que hacer es declarar el mtodo de la forma en que se pide en el enunciado. Luego, e se debe calcular dos sumas: la suma de los d gitos y la suma de los factores primos del nmero recibido u como parmetro. Para calcular la suma de los d a gitos se debe descomponer el n mero en cada uno de sus u d gitos. Para esto podemos usar un loop que vaya dividiendo por 10 el nmero y guardando el resto de la u divisin como cada uno de los d o gitos. Almacenando nalmente la suma. Despus, para calcular los factores e primos, se puede utilizar otro loop que intente dividir el nmero por cada uno de los posibles factores y vaya u guardando la suma de stos hasta haber completado con todos los factores. Finalmente, se debe comparar e ambas sumas y retornar correctamente true o false dependiendo si las sumas son iguales o no. Posible Solucin o
public static boolean n u m e r o S m i t h( int n ) { int aux , sum_dig , factor , s u m _ d i g _ p r i m o s; sum_dig = 0; aux = n ; while ( aux > 0) { sum_dig = sum_dig + aux % 10; aux = aux / 10; } factor = 2; s u m _ d i g _ p r i m o s = 0; while ( n > 1) { if ( n % factor == 0) { n = n / factor ; aux = factor ; while ( aux > 0) { s u m _ d i g _ p r i m o s = s u m _ d i g _ p r i m o s + aux % 10; aux = aux / 10; } } else factor ++; } return ( sum_dig == s u m _ d i g _ p r i m o s); }
14
con C = 0, es una generalizacin de la serie Babilnica para calcular la ra cuadrada, y es tal que o o z l n xn = k b cuando k 2. m El mtodo raiz, mostrado parcialmente abajo, fue diseado para que raiz(k,n) retorne una aproximacin e n o de la ra k de un nmero real n, donde k es un n mero entero mayor o igual a 1. Partiendo desde n = 0, el z u u algoritmo computa sucesivamente los valores de xn , retornando cuando la diferencia en valor absoluto entre xn+1 y xn es menor que epsilon. Complete la clase Principal, implementando los mtodos que faltan (f y g) y llenando apropiadamente e las partes donde aparecen signos de interrogacin (???), de tal forma que raiz calcule el valor correco to. Puede implementar todos los mtodos adicionales que desee pero no debe utilizar, en ninguna parte, e un mtodo de la clase Math (ejemplos de mtodos que no puede usar: Math.pow, Math.abs, Math.sqrt, etc.). e e
public class P r i n c i p a l { // aqui van los metodos que usted debe i m p l e m e n t a r public double raiz (??? k , ??? val ) { double epsilon = 0 . 0 0 0 0 1 ; double x_n ; double x_n_1 ; // s u p o n i e n d o val distinto de 0 , i n i c i a m o s la serie desde val /2 x_n_1 = val /2; x_n = 0; while ( f ( x_n_1 - x_n ) >= epsilon ) { ??? = x_n_1 ; x_n_1 = g ( x_n ,k , val ); } return x_n_1 ; } }
Criterios de solucin o Lo primero que tenemos que identicar es qu deben realizar los mtodos faltantes f y g. e e Analizando el cdigo entregado podemos determinar que f es el mtodo encargado de calcular el valor absoluto o e de la diferencia entre xn+1 y xn . Luego, tenemos que declarar el mtodo para que reciba un double y revise e si el valor recibido como parmetro es negativo, si es as debe retornar el mismo valor pero positivo, si no a debe retornar el mismo valor recibido como parmetro. a Del mismo modo podemos ver que g es el mtodo encargado de calcular el nuevo xn+1 ocupando las ecuaciones e denidas en el enunciado. As tenemos que declarar el mtodo para que reciba los parmetros adecuados y , e a con ellos calcule seg n la ecuacin y retorne el resultado. En este caso, como no podemos usar los mtodos u o e de la clase Math, debemos implementar un mtodo que permita elevar un nmero a una potencia dada. e u Para esto podemos utilizar un loop que multiplique el nmero por si mismo tantas veces como lo indique la u potencia a la que lo queramos elevar. Finalmente, debemos completar el mtodo ra indicando los tipos de parmetros que recibe, los cuales los e z a podemos saber por lo indicado en el enunciado. Adems se debe completar que el xn+1 se convierte en el xn a antes de calcular el siguiente miembro de la serie.
15
Posible Solucin o
public class P r i n c i p a l { public double eleva ( double x , int k ) { int i ; double r e s u l t a d o = 1; for ( i = 1; i <= k ; i ++) { resultado = resultado * x; } return r e s u l t a d o; } public double f ( double x ) { if ( x < 0) { return -x ; } else { return x ; } } public double g ( double x , int k , double val ) { return x - 1.0 / k * ( x - val / eleva (x , k - 1)); } public double raiz ( int k , double val ) { double x_n ; double x_n_1 ; double epsilon = 0.00001; // s u p o n i e n d o val distinto de 0 , i n i c i a m o s la serie desde val /2 x_n_1 = val / 2; x_n = 0; while ( f ( x_n_1 - x_n ) >= epsilon ) { x_n = x_n_1 ; x_n_1 = g ( x_n , k , val ); } return x_n_1 ; } }
16
17
Posible Solucin o
import i i c 1 1 0 3 P a c k a g e .*; /* * Programa para que un nino p r a c t i q u e las tablas de m u l t i p l i c a r. */ public class Math4Kid { // variable para d e t e r m i n a r la salida del programa static boolean salida = false ; public static void main ( String [] args ) { while (! salida ) { // mientras el usuario no haya elegido salir int opcion = menu (); // g u a r d a m o s la opcion que eligio en el menu switch ( opcion ) { case 1: // si eligio la 1 p e d i r T a b l a (); // vamos al metodo P e d i r T a b l a break ; case 2: // si eligio la 2 p e d i r M u l t i p l i c a c i o n (); // vamos al metodo P e d i r M u l t i p l i c a c i o n break ; case 3: // si eligio la 3 salir (); // vamos al metodo Salir break ; // no hay mas opciones posibles } } } // Metodo que muestra una ventana con las opciones a elegir static int menu () { int opcion = -1; // r e p e t i m o s hasta que haya elegido una opcion valida ( entre 1 y 3) while ( opcion < 0 || opcion > 3) { // le pedimos que elija alguna opcion opcion = Usuario . entero (" Ingrese alguna de las s i g u i e n t e s opciones : " + " \ n 1 - Pedir Tabla ? " + " \ n 2 - Pedir M u l t i p l i c a c i o n? " + " \ n 3 - Salir " ); // v e r i f i c a m o s si esta en el rango if ( opcion < -1 || opcion > 3) { // como no esta , le avisamos ( y volvemos al while ) Usuario . mensaje ( " Opcion no valida ! " ); } } return opcion ; } // Metodo que pide la tabla a m u l t i p l i c a r ( un entero ) , y se la entrega a // M o s t r a r T a b l a() static void p e d i r T a b l a() { int numero = Usuario . entero ( " Ingrese el numero de la tabla a m u l t i p l i c a r: " ); m o s t r a r T a b l a( numero ); } // Metodo que recibe un numero , y calcula la tabla de este ( desde el 1 al 10) static void m o s t r a r T a b l a( int n ) { for ( int i = 0; i < 10; ++ i ) { // ciclo para que repita 10 veces // ( i +1) para que muestre desde 1 hasta 10 Usuario . mensaje ( n + " x " + ( i ) + " = " + ( n * i )); } } // Metodo que pide dos numero a multiplicar , se los entrega y // muestra el r e s u l t a d o de E n t r e g a r M u l t i p l i c a c i o n () static void p e d i r M u l t i p l i c a c i o n() { int x = Usuario . entero ( " Ingrese el primero numero a m u l t i p l i c a r: " ); int y = Usuario . entero ( " Ingrese el segundo numero a m u l t i p l i c a r: " ); Usuario . mensaje ( e n t r e g a r M u l t i p l i c a c i o n(x , y )); } // Metodo que recibe dos numero y entrega la m u l t i p l i c a c i o n de ellos private static String e n t r e g a r M u l t i p l i c a c i o n( int x , int y ) { return " La m u l t i p l i c a c i o n de " + x + " y " + y + " es : " + ( x * y ); } // Metodo para m o s t r a r l e un mensaje de despida al usuario ( y setear la salida ) static void salir () { Usuario . mensaje ( " Esta saliendo del programa . " + " \ n E s p e r a m o s que haya sido de utilidad " ); salida = true ; } }
18
. Adems, suponga que esta clase tiene un mtodo esPrimo que retorna true si el n mero de entrada n es un a e u n mero primo, y false en caso contrario. En esta pregunta se debe agregar a esta clase el mtodo: u e
public int c a m b i o S i g n o( int n )
. El cual retorna el nmero de cambios de signo (i,j) hasta una cota dada n. Es importante que este mtodo u e retorne 0 si el parmetro de entrada n es menor que 2. a
19
Posible Solucin o
public int c a m b i o S i g n o( int n ) { if ( n < 2) { return 0; } else { int i = 3 , contar = 0 , cant_uno = 0 , c a n t _ t r e s = 0; boolean c a n d i d a t o = false ; while ( i <= n ) { if ( esPrimo ( i )) { if ( i % 4 == 1) { cant_uno ++; } else { c a n t _ t r e s ++; } } if ( cant_uno < c a n t _ t r e s) { c a n d i d a t o = true ; } else if ( cant_uno > c a n t _ t r e s && c a n d i d a t o) { contar ++; c a n d i d a t o = false ; } i ++; } return contar ; } }
20
21
22