Vous êtes sur la page 1sur 22

Pontificia Universidad Catolica de Chile Escuela de Ingenier a Departamento de Ciencia de la Computacion IIC1103 Introduccin a la Programacin o o

Cap tulo 3: Mtodos y Scope e Resumen terico o


Ya hemos visto que cuando necesitamos repetir una instruccin en java es muy util la iteracin (utilizando o o los recursos del for y de while). Pero a veces necesitamos ejecutar ms de una vez una accin en distintas a o partes del programa. Al igual que en una empresa, conviene separar funciones y delegarlas, as se declaran slo una vez, y en o adelante, se llaman cuando se necesitan. Para ello nos conviene almacenar ese cdigo bajo un nombre y as poder utilizarlo cada vez que lo deseemos o (llamndolo por su nombre). Este almacenamiento se conoce como mtodo. Un mtodo se declara de la a e e siguiente manera: <Ambito> <Tipo Retorno> <Nombre> (<Parametros>){ <codigo> } Donde mbito indica si ser un mtodo pblico (public) o privado (private), tipo Retorno indica la a a e u clase de retorno que entregar el mtodo (String, int, boolean, objetos, etc), nombre es la forma en que a e llamaremos al mtodo y parmetros son los datos que necesita recibir el mtodo para ejecutar la funcin e a e o u a e que almacena en el cdigo (OJO: puede no recibir ningn parmetro, en tal caso, los parntesis igual deben o escribirse). Bsicamente un mtodo es como una mquina que recibe algo en bruto (los parmetros) y dea e a a vuelve un producto elaborado.

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:

IIC1103 Cap tulo 3: Mtodos y Scope e

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

IIC1103 Cap tulo 3: Mtodos y Scope 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; } }

(x2 x1)2 + (y2 y1)2

IIC1103 Cap tulo 3: Mtodos y Scope e

Problema 2: Nmeros Perfectos u


Enunciado Un nmero natural se dice perfecto si es igual a la suma de sus divisores propios (divisores menores que el u n mero). Por ejemplo, los nmeros 6 y 28 son perfectos ya que 6 = 1 + 2 + 3 y 28 = 1 + 2 + 4 + 7 + 14, u u mientras que el nmero 12 no es perfecto ya que los divisores propios de 12 son 1, 2, 3, 4 y 6, y la suma de u estos n meros es 16. u En esta pregunta usted debe implementar dos mtodos de la clase Perfecto que es utilizada para almacenar e n meros perfectos. u public class Perfecto { private int val; ... } En esta clase, val es utilizado para almacenar el valor de un nmero perfecto. u Implemente el mtodo esPerfecto de la clase Perfecto que recibe como entrada un n mero n y retorna e u true si este n mero es perfecto, y f alse en caso contrario. u Implemente el mtodo colocarN de la clase Perfecto, que recibe como entrada un nmero n y asigna a e u val el valor del n-simo n mero perfecto. Por ejemplo, si n es igual a 2, entonces val recibe valor 28 e u ya que ste es el segundo n mero perfecto. e u Criterios de solucin o Lo primero que identicamos en el problema son los tipos de ingreso y de retorno de cada mtodo. e En el primer caso est especicado que el tipo de entrada es un nmero, asumimos entero (int), y el de a u retorno es un valor booleano. En el segundo caso, nuevamente el valor de entrada es un entero, pero no hay retorno (solo se modica un atributo) por lo que tipo ser void (no hay retorno). a Ahora en la parte algor tmica, en el primer caso sabemos que para identicar un nmero como perfecto, u debemos sumar todos sus divisores propios. Dado que slo consideraremos los propios (menor que el nmero), o u debemos recorrer los nmeros desde 1 hasta n 1 (un f or es buena opcin), vericar si es divisor (un if ), u o y, de serlo, sumarlo (necesitamos una variable que guarde la suma). Finalmente debemos ver si esta suma es igual al n mero n (otro if ) y de serlo retornar true. Dado que slo consideraremos nmeros positivos, de u o u ser negativo el valor ingresado retornaremos f alse. En el segundo caso, debemos buscar el n-simo n mero perfecto. Por esto debemos partir desde 6 (ya que e u sabemos es el primer nmero perfecto, despreciamos los anteriores) e ir avanzado (algn loop), contando u u los n meros perfectos encontrados (un if , utilizando esPerfecto, y un contador). Deber u amos avanzar hasta que encontremos el n mero perfecto n-simo (un while ser adecuado). En este caso asumimos que el valor u e a ingresado es mayor o igual a 1.

IIC1103 Cap tulo 3: Mtodos y Scope e

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 ; } }

IIC1103 Cap tulo 3: Mtodos y Scope e

Problema 3: Cdigo Desconocido o


Enunciado El siguiente es un cdigo desconocido, encontrado por casualidad. Qu es lo que este programa mostrar en o e a la consola si al pedir un nmero se le ingresara un 10? Qu es lo que este programa est en verdad calculando u e a si se le ingresa un valor X?
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 x = Usuario . entero ( " Ingrese un numero entero positivo " ); if ( f ( x ) || g ()) { Usuario . m e n s a j e C o n s o l a( x + " ok " ); } } public static boolean f ( int var ) { boolean a = false ; for ( int j = 2; j < var ; j ++) { a = false ; for ( int i = j - 1; i > 1; i - -) { if ( j % i == 0) { a = true ; } } if (! a ) { Usuario . m e n s a j e C o n s o l a( j + " . " ); } } var = var / 2; return true ; } public static boolean g () { Usuario . m e n s a j e C o n s o l a( " .123. " ); return false ; } }

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

IIC1103 Cap tulo 3: Mtodos y Scope e

Problema 4: Mtodo Desconocido e


Enunciado Dada la siguiente clase:
public class Clase { public int m e t o d o D e s c o n o c i d o( int u , int v ) { int a = 0; int r = 0; boolean c = true ; while ( c ) { if ( v == 0) { a = u; c = false ; } else { r = u % v; u = v; v = r; } } return a ; } }

. Cul es el resultado del siguiente cdigo? Qu est calculando el metodoDesconocido? a o e a


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 ) { Clase c = new Clase (); Usuario . m e n s a j e C o n s o l a( c . m e t o d o D e s c o n o c i d o(9 , 12)); Usuario . m e n s a j e C o n s o l a( c . m e t o d o D e s c o n o c i d o(2 , 6)); } }

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

IIC1103 Cap tulo 3: Mtodos y Scope e

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 + " \ 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.

IIC1103 Cap tulo 3: Mtodos y Scope e

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

IIC1103 Cap tulo 3: Mtodos y Scope e

Problema 6: Calculando Nmeros u


Enunciado Escriba el output de este programa:
import i i c 1 1 0 3 P a c k a g e .*; public class I m p r i m i r T e x t o { static int i ; public static void potencia ( int numero , int pot ) { int auxiliar = numero ; if ( pot == 0) { numero = 1; } else { for ( i = 0; i < pot - 1; i ++) { numero = numero * auxiliar ; } } } public static int negar ( int numero ) { return -1 * numero ; } public static void m u l t i p l i c a r E I n c r e m e n t a r( Numero miNumero , int i ) { miNumero . numero = miNumero . numero * i ; i ++; } public static void main ( String [] args ) { Numero miNumero = new Numero (2); Usuario . m e n s a j e C o n s o l a( miNumero . numero + " \ n " ); potencia ( miNumero . numero , 4); Usuario . m e n s a j e C o n s o l a( miNumero . numero + " \ n " ); miNumero . numero = negar ( miNumero . numero ); Usuario . m e n s a j e C o n s o l a( miNumero . numero + " \ n " ); m u l t i p l i c a r E I n c r e m e n t a r( miNumero , i ); Usuario . m e n s a j e C o n s o l a( miNumero . numero + " \ n " ); Usuario . m e n s a j e C o n s o l a( i + " \ n " ); i = miNumero . mayor (i , 1); Usuario . m e n s a j e C o n s o l a( i + " \ n " ); Numero o t r o N u m e r o = new Numero (3); int resta = o t r o N u m e r o. restar ( miNumero ); Usuario . m e n s a j e C o n s o l a( resta ); } } public class Numero { int numero = 0; public Numero ( int numero ) { this . numero = numero ; } public int mayor ( int numero , int c o m p a r a d o r) { if ( this . numero < c o m p a r a d o r) { return c o m p a r a d o r; } else { return this . numero ; } } public Numero O b t e n e r R e s t a( Numero o t r o N u m e r o) { int resta = o t r o N u m e r o. numero - this . numero ; return new Numero ( resta ); } public int restar ( Numero miNumero ) { Numero n u m e r o F i n a l = ( miNumero . O b t e n e r R e s t a( this )); return n u m e r o F i n a l. numero ; } }

IIC1103 Cap tulo 3: Mtodos y Scope e

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

Solucin o Siguiendo la ejecucin obtenemos lo siguiente: o 2 2 -2 -6 3 1 9

IIC1103 Cap tulo 3: Mtodos y Scope 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

IIC1103 Cap tulo 3: Mtodos y Scope e

12

Posible Solucin o Dado lo anterior deniremos los siguientes mtodos: e


public static int P e d i r E n t e r o( String mensaje , int valorInferior , int v a l o r S u p e r i o r) { int valor = Usuario . entero ( mensaje ); while ( valor < v a l o r I n f e r i o r || valor > v a l o r S u p e r i o r) { Usuario . mensaje ( " Ha i n g r e s a d o un valor invalido " ); valor = Usuario . entero ( mensaje ); } return valor ; } public static int P e d i r E n t e r o( String mensaje , int cota , boolean superior ) { // superior sera true cuando la cota sea superior , sera false si es cota // inferior int valor = Usuario . entero ( mensaje ); while (( valor > cota && ! superior ) || ( valor < cota && superior )) { Usuario . mensaje ( " Ha i n g r e s a d o un valor invalido " ); valor = Usuario . entero ( mensaje ); } return valor ; }

Con sto el cdigo queda de la siguiente manera: 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 = P e d i r E n t e r o( " Ingrese el segundo en que desea el r e c o r d a t o r i o: " ,0 , 59); min = P e d i r E n t e r o( " Ingrese el minuto en que desea el r e c o r d a t o r i o: " , 0 , 59); hr = P e d i r E n t e r o( " Ingrese la hora en que desea el r e c o r d a t o r i o: " , 0 , 23); dia = P e d i r E n t e r o( " Ingrese el dia en que desea el r e c o r d a t o r i o: " , 1 , 31); mes = P e d i r E n t e r o( " Ingrese el mes en que desea el r e c o r d a t o r i o: " , 1 , 12); anio = P e d i r E n t e r o( " Ingrese el anio en que desea el r e c o r d a t o r i o: " ,2009 , true ); 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 ); } }

IIC1103 Cap tulo 3: Mtodos y Scope e

13

Problema 8: Nmero de Smith u


Enunciado Todo nmero natural puede ser descompuesto de manera unica como una multiplicacin de nmeros primos. u o u Por ejemplo, el nmero 12 es igual a 2 2 3, mientras que el nmero 231 es igual 3 7 11. Esta descomposicin u u o es usada para denir los nmeros de Smith. Formalmente, un nmero natural n > 1 es un n mero de Smith u u u si la suma de sus d gitos es igual a la suma de los d gitos de sus factores primos. Por ejemplo, 22 es un n mero de Smith ya que 22 = 2 11, la suma de los d u gitos de 22 es 4 y la suma de los d gitos de los factores primos de 22 es 2 + (1 + 1) = 4. De la misma forma, 666 es un nmero de Smith ya que 666 = 2 3 3 37 y u 6 + 6 + 6 = 18 = 2 + 3 + 3 + (3 + 7). 1+2 2+3+1 = = 2+2+3 3 + 7 + (1 + 1) Por el contrario, 12 y 231 no son nmeros de Smith ya que: u

En esta pregunta usted deber implementar un mtodo con encabezado a e


public boolean n u m e r o S m i t h( int n )

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); }

IIC1103 Cap tulo 3: Mtodos y Scope e

14

Problema 9: Series aritmticas e


Enunciado Antes de la invencin de la calculadora, los ingenieros utilizaban series aritmticas para calcular el valor de o e ciertas funciones matemticas. Los Babilonios siglos antes de Cristo ya conoc series que converg a an an, por ejemplo, a la ra cuadrada de un nmero. La serie denida por las ecuaciones: z u x0 = C, xn+1 = xn 1 k xn b xk1 n ,

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.

IIC1103 Cap tulo 3: Mtodos y Scope e

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 ; } }

IIC1103 Cap tulo 3: Mtodos y Scope e

16

Problema 10: Math4Kid


Enunciado Realice un programa que le ayude a probar las capacidades de multiplicacin de un nio peque o. Para esto, o n n debe implementar y utilizar cada uno de los siguientes mtodos: e int Menu(): desplegar una ventana donde pedir que el usuario ingrese la opcin que desea, y la a a o retornar. a Las opciones son: 1. void PedirTabla(): despliega una ventana donde pide el nmero de la tabla que se desea comprobar u y se lo entrega a M ostrarT abla() 2. void PedirMultiplicacin(): despliega una ventana donde pide dos nmeros, digamos x e y, y se los o u entrega a EntregarM ultiplicacion(int, int) para luego mostrar el resultado. 3. void Salir(): muestra un mensaje de despedida al usuario (y luego se cierra el programa). Para esto, debe implementar adems los mtodos: a e void MostrarTabla(int n): recibe un nmero n, del que calcula y muestra en un ventana la tabla u correspondiente. Ejemplo: 1x1=1, 1x2=2, ..., 1x10 = 10. String EntregarMultiplicacion(int x, int y): recibe dos n mero x e y, retorna un String con el u resultado. Ejemplo: si x es 3 e y es 5, debe retornar la multiplicacin de 3 y 5 es: 15 o Nota: Su programa se debe ejecutar hasta que el usuario decida salir. Adems, debe vericar que los datos a ingresados sean vlidos, mostrando un mensaje de advertencia cuando stos sean incorrectos. a e Criterios de solucin o El enunciado, aunque confuso, es bastante estructurado. Debemos: 1. Mostrar un men con las opciones, guardar la elegida por el usuario, y llamar al mtodo correspondiente u e 2. Crear una variable que guarde la eleccin del usuario. Dado el problema, debe ser de tipo int. o 3. Crear el mtodo P edirT abla que recibe y retorna nada. Llama a M ostrarT abla(). e 4. Crear el mtodo P edirM ultiplicacion que recibe y retorna nada. Muestra en una ventana lo que e retorna el mtodo M ostrarT abla(). e 5. Crear el mtodo Salir, que le muestra un mensaje de despedida al usuario. e 6. Crear el mtodo M ostrarT abla(), que recibe un nmero n, del que calcula y muestra en un ventana e u la tabla correspondiente (entre 1 y 10). 7. Crear el mtodo EntregarM ultiplicacion, que retorna un string, cuyo contenido es la multiplicacin e o entre los dos enteros que recibe. 8. Mientras que el usuario no decida salir, repetir todo lo anterior.

IIC1103 Cap tulo 3: Mtodos y Scope e

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 ; } }

IIC1103 Cap tulo 3: Mtodos y Scope e

18

Problema 11: Cambio de Signo


Enunciado Todo nmero primo mayor que 2 es de la forma 4*k+1 o 4*k+3, donde k es un nmero natural. Por ejemplo, u u 17 = 4*4+1, mientras que 3 = 0*4 + 3. Sean F y G dos funciones denidas de la siguiente forma. Para cada n mero natural n, F(n) es el nmero de primos menores o iguales a n que son de la forma 4*k+1, mientras u u que G(n) es el nmero de primos menores o iguales a n que son de la forma 4*k+3. Por ejemplo, F(20) = 3 u ya que los primos menores o iguales a 20 son 2, 3, 5, 7, 11, 13, 17 y 19, y de esos, unicamente los nmeros u 5, 13 y 17 son de la forma 4*k+1. De la misma forma se puede concluir que G(20) = 4. Para un par (i,j) de nmeros naturales tales que i < j, decimos que (i,j) es un cambio de signo si: u (1) F(i) < G(i); (2) F(k) = G(k), para todo k entre i y j (i < k < j); (3) F(j) > G(j). Se pide construir un mtodo que cuente el nmero de cambios de signo hasta una cota dada n, vale decir, e u que cuente el n mero de pares (i,j) que cumplen las condiciones (1), (2) y (3), y que adems cumples que i u a < j <= n. Concretamente, suponga que la clase Primo ya ha sido denida:
public class Primo { ... private boolean esPrimo ( int n ){ // Retorna true solo si n es primo ... } }

. 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

IIC1103 Cap tulo 3: Mtodos y Scope e

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 ; } }

IIC1103 Cap tulo 3: Mtodos y Scope e

20

Problema 12: Formato horario


Enunciado Hay dos formatos t picos en los cuales se especica una hora: 24 horas las horas van desde las 00:00 (medianoche) hasta las 23:59; y 12 horas las horas van desde las 12:00 am (medianoche) hasta las 11:59 am, y desde las 12:00 pm (mediod hasta las 11:59 pm. a) Por ejemplo, las 21:53 (en formato de 24 horas) corresponde a las 9:53 pm (en formato de 12 horas), y las 00:27 corresponde a las 12:27 am. Por otra parte, en nuestro hablar cotidiano, las 12:27 am las expresamos como son las 12 am con 27 minutos, pero las 9:53 pm las expresamos t picamente como faltan 7 minutos para las 10 pm. Escriba un mtodo void calcularHora(int hora, int minutos) en Java con las siguientes caracter e sticas: calcularHora recibe del usuario dos valores de tipo entero, correspondientes a la hora y los minutos en formato de 24 horas y, luego de hacer los clculos correspondientes, muestra en la pantalla la misma hora a pero en formato de 12 horas y expresada en la forma cotidiana de dar la hora. Por ejemplo, si el calcularHora recibe 0 y 27, entonces muestra son las 12 am con 27 minutos; y si recibe 21 y 53, entonces muestra faltan 7 minutos para las 10 pm. Criterios de solucin o Lo primero que debemos hacer es declarar el mtodo como nos indican en el enunciado: no retorna nada y e recibe como parmetros dos enteros. a Para poder mostrar el mensaje correcto debemos primero revisar si la hora est entre las 0 y las 12 o entre a las 12 y las 24 para determinar si estamos en el bloque am o en el bloque pm. Esto lo hacemos con un bloque de if y else. Adems debemos considerar aparte el caso de que la hora sea 0 para mostrar 12 am en ese caso. a Luego de determinar si estamos en am o pm debemos revisar los minutos, con otro bloque de if y else para mostrar el mensaje correcto segn la forma cotidiana de dar la hora. u Posible solucin o
public void c a l c u l a r H o r a( int hora , int minutos ){ if ( hora == 0) { if ( minutos <= 30) { Usuario . mensaje ( " son las 12 am con " + minutos + " minutos " ); } else { Usuario . mensaje ( " faltan " + (60 - minutos ) + " minutos para las 1 am " ); } } else if ( hora < 12) { if ( minutos <= 30) { Usuario . mensaje ( " son las " + hora + " am con " + minutos + " minutos " ); } else if ( hora == 11 && minutos > 30) { Usuario . mensaje ( " faltan " + (60 - minutos ) + " minutos para las " + ( hora + 1) + " pm " ); } else { Usuario . mensaje ( " faltan " + (60 - minutos ) + " minutos para las " + ( hora + 1) + " am " ); } } else { if ( minutos <= 30) { Usuario . mensaje ( " son las " + ( hora - 12) + " pm con " + minutos + " minutos " ); } else if ( hora == 23 && minutos > 30) { Usuario . mensaje ( " faltan " + (60 - minutos ) + " minutos para las " + ( hora - 11) + " am " ); } else { Usuario . mensaje ( " faltan " + (60 - minutos ) + " minutos para las " + ( hora - 11) + " pm " ); } } }

IIC1103 Cap tulo 3: Mtodos y Scope e

21

Problema 13: Nmero cuasi-par u


Enunciado Un nmero natural positivo se dice cuasi-par si la suma de sus divisores es un n mero par. u u Por ejemplo, el nmero 6 es cuasi-par ya que sus divisores son 1, 2, 3 y 6, y la suma de estos nmeros es 12. u u En cambio el nmero 4 no es cuasi-par ya que sus divisores son 1, 2 y 4, y la suma de estos nmeros es 7. u u Escriba un mtodo cuasiPar que reciba del usuario un nmero natural n, e imprima en consola los primeros e u n n meros cuasi-pares. Por ejemplo, si n es igual a 5, entonces este mtodo imprime en consola los n meros u e u 3, 5, 6, 7 y 10, ya que estos son los primeros 5 nmeros cuasi-pares. Nota: Puede suponer que el usuario u siempre ingresa un nmero n mayor o igual a 1. u Criterios de solucin o Lo primero que debemos hacer es declarar el mtodo como nos indican en el enunciado: no debe retornar e nada y debe recibir un nmero entero. u Partimos revisando que nmeros son cuasi-pares para eso debemos calcular la suma de los divisores del u n mero. Para esto podemos hacer un ciclo que vaya dividiendo el nmero por todos los valores posibles y u u revise cuando la divisin no deja resto. Cuando esto ocurre signica que encontramos un divisor por lo que o lo agregamos a la suma y actualizamos el nmero dividindolo por el divisor encontrado. u e Finalmente comprobamos si la suma de los divisores es par, revisando el resto de dividirla por dos. Si es par imprimimos el nmero. u Todo lo anterior lo hacemos hasta que hayamos encontrado tantos nmeros cuasi-pares como los solicitados u por el usuario. Para esto utilizamos otro ciclo. Posible solucin o
public void cuasiPar ( int n ){ int numero , suma , divisor ; numero = 1; while ( n > 0) { suma = 0; divisor = 1; while ( divisor <= numero ) { if (( numero % divisor ) == 0) suma = suma + divisor ; divisor ++; } if (( suma % 2) == 0) { Usuario . m e n s a j e C o n s o l a( numero ); n - -; } numero ++; } }

IIC1103 Cap tulo 3: Mtodos y Scope e

22

Vous aimerez peut-être aussi