Foro de elhacker.net

Programación => Java => Mensaje iniciado por: LaLakers94 en 9 Noviembre 2013, 18:16 pm



Título: Ayuda con Código Sencillo
Publicado por: LaLakers94 en 9 Noviembre 2013, 18:16 pm
Hola, estoy empezando con Java y he empezado con actividades muy sencillitas, al menos me lo parecen hasta que me doy cuenta de que no sé hacerlas. Las intento probar mediante consola y no funcionan, no sé en que puedo fallar. Si me pudiesen echar una mano, lo agradecería de corazón.

Son 2 actividades:

1) Un método calcularNumeroArmonico tal que, dado un número entero n, devuelva el sumatorio 1 + 1/2 + 1/3 + … + 1/n. Este es mi código:
Código
  1. public static Double numeroArmonico (Integer n){
  2. Double numero = 0.0;
  3. for (int i = 1; i <= n; i++){
  4. numero += (1/i);
  5. }
  6. return numero; }

2)Un método que, dado un número entero n, devuelva la suma de todos sus dígitos. Por ejemplo, 12345 devolvería 15. Este es mi código:
Código
  1. public static Integer sumaDigitos (Integer n){
  2. Integer suma = 0;
  3. String numero = n.toString();
  4.  
  5. for (int i = 0; i < numero.length(); i++) {
  6. suma += Integer.valueOf(numero.charAt(i)); }
  7.  
  8. return suma; }

En el primero pruebo con n=3 y me devuelve 1.0
En el segundo, con 12345, me devuelve 255  :huh: :huh:

¿Qué error he cometido?


Título: Re: Ayuda con Código Sencillo
Publicado por: egyware en 9 Noviembre 2013, 19:09 pm
El primero es que haces esto

Código
  1. int divisor = 10;
  2. int numero = 5/divisor;
  3.  
Según nuestros conocimientos de matemática, el resultado debería ser 0.5. Sin embargo el resultado es 0. Pero dirán "es que estamos almacenando el numero en un entero" Y ES CIERTO entonces hacemos las modificaciones necesarias.

Código
  1. int divisor = 10;
  2. float numero = 5/divisor;

Sin embargo "numero" sigue siendo 0.
Lo que sucede realmente es que el compilador ASUME que estás haciendo una división entera debido que el divisor es entero. Para evitar que esto ocurra el divisor debe ser float o doble (puedes hacer un cast a float/double o declarar divisor como float/doble.)

Lo segundo NO TENGO IDEA PORQUE NO TE FUNCIONA, pero podrías intentar imprimir en pantalla que es lo que te devuelve "numero.charAt(i)" y luego  Integer.valueOf(numero.charAt(i)) para confirmar si está haciendo lo que debe.

Bueno Saludos! espero haberte ayudado.


Título: Re: Ayuda con Código Sencillo
Publicado por: LaLakers94 en 9 Noviembre 2013, 19:57 pm
Hola, muchas gracias por las respuestas.

He podido solucionar el primero y en el segundo he mostrado por pantalla lo que comentas.
Código
  1. Integer n1 = 12345;
  2. String numero = n1.toString();
  3.  
  4. System.out.println(numero.charAt(1));
  5. System.out.println(Integer.valueOf(numero.charAt(1))); //Devuelve 50 - Ni idea de por qué.

La línea 4 devuelve 2. (Parece que funciona).
La línea 5 devuelve 50 (Ni idea de por qué).
Como ''numero.charAt(i)'' devuelve el dígito correspondiente al índice i, he reorganizado el código eliminando el ''Integer.ValueOf()'' y me sigue dando mal, de hecho, es el mismo resultado erróneo (255).


Título: Re: Ayuda con Código Sencillo
Publicado por: Mitsu en 9 Noviembre 2013, 20:23 pm
Hola. Al parecer, la conversión del char primitivo a int está devolviendo su valor ascii (creo).

Al parecer hay que utilizar el método de la clase Character getNumericValue, que devuelve el valor numérico (Integer) de ese número extraido en tipo char:

Código
  1. suma += Integer.valueOf(Character.getNumericValue(numero.charAt(i)));
  2.  

O puedes primero transformar ese char a String y luego convertirlo a Int:

Código
  1. suma += Integer.valueOf(String.valueOf(numero.charAt(i)));
  2.  

El código quedaría de éste método quedaría así:

Código
  1. public static Integer sumaDigitos (int n){
  2.    Integer suma = 0;
  3.    String numero = String.valueOf(n);
  4.  
  5.      for (int i = 0; i < numero.length(); i++) {
  6.        suma += Integer.valueOf(Character.getNumericValue(numero.charAt(i)));
  7.      }  
  8.  
  9.    return suma;
  10.  }
  11.  


Título: Re: Ayuda con Código Sencillo
Publicado por: LaLakers94 en 9 Noviembre 2013, 20:37 pm
Muchísimas gracias a ambos, ahora entiendo. Ya había optado por hacer otro método que se me había ocurrido (Ir dividiendo el entero entre 10 sucesivamente e ir sumando los restos) pero aplicaré este para no olvidarlo.

Gracias de nuevo.


Título: Re: Ayuda con Código Sencillo
Publicado por: Mitsu en 9 Noviembre 2013, 21:00 pm
Igual te dejo el code por si te sirve:

Código
  1. import java.util.Scanner;
  2. import java.text.DecimalFormat;
  3.  
  4. public class OperacionesMatematicas {
  5.  
  6.  public static Double numeroArmonico (int n){
  7.    double numero = 1.0;
  8.    for (int i = 2; i <= n; i++){
  9.      numero += (double) (1.0/i);
  10.    }
  11.  
  12.    return numero;
  13.  }
  14.  
  15.  public static Integer sumaDigitos (int n){
  16.    int suma = 0;
  17.    String numero = String.valueOf(n);
  18.  
  19.      for (int i = 0; i < numero.length(); i++) {
  20.        suma += Integer.valueOf(Character.getNumericValue(numero.charAt(i)));
  21.      }  
  22.  
  23.    return suma;
  24.  }
  25.  
  26.  public static void main(String... args) {
  27.  
  28.    OperacionesMatematicas op1 = new OperacionesMatematicas();
  29.    Scanner into = new Scanner(System.in);
  30.    Object resultado = 0;
  31.    int numero = 0;
  32.    int choice;
  33.  
  34.    do {
  35.    System.out.println("&#191;Que operacion desea realizar?");
  36.    System.out.println("[+] 1 - Numero Armonico de un numero");
  37.    System.out.println("[+] 2 - Suma de Digitos de un numero");
  38.    choice = into.nextInt();
  39.    if(choice != 1 && choice != 2) {
  40.      System.out.println("Opcion no disponible. Intente nuevamente.");
  41.    }
  42.    } while (choice != 1 && choice != 2);
  43.  
  44.  
  45.    if (choice == 1) {
  46.      System.out.println("Ingrese el numero.");
  47.      numero = into.nextInt();
  48.      DecimalFormat df = new DecimalFormat("#,#,##0.00"); // para formatear un real (2 decimales)
  49.      System.out.println("Numero armonico de " + numero + ":\t" + df.format(op1.numeroArmonico(numero)));
  50.    }
  51.    else if (choice == 2) {
  52.      System.out.println("Ingrese el numero.");
  53.      numero = into.nextInt();
  54.      System.out.println("Suma de los digitos de " + numero + ":\t" + op1.sumaDigitos(numero));
  55.    }
  56.  
  57.    // System.out.print(Character.getNumericValue('%')); // devuelve -1 si le pasamos un char que no represente un numero
  58.  
  59.  }
  60.  
  61. }
  62.  



Un saludo.



PD: No uses los Wrapper de los primitivos si no es necesario. Puedes usarlos con Listas, o para utilizar metodos que estan en los Wrappers. Para lo sencillo, los primitivos van bien.