Foro de elhacker.net

Programación => Java => Mensaje iniciado por: atina en 22 Febrero 2021, 20:13 pm



Título: mostrar por pantalla todos los enteros x tales que su cuadrado (x * x) se encuentre entre los valores
Publicado por: atina en 22 Febrero 2021, 20:13 pm
Programa de interfaz gráfica en donde el usuario introduce los valores minimo (intMin) y máximo (intMax), al clicar sobre el botón realiza la operación: mostrar por pantalla todos los enteros num tales que su cuadrado (num * num) se encuentre entre los valores del mínimo y del máximo

private void btnCalcularActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    textPanel3.setText(" Darrera acció feta: Clic al botó Calcular");
 
    //Convierto los String introducidos en  int.
    String min = introMin.getText();
    int intMin = Integer.parseInt(min);
    String max = introMax.getText();
    int intMax = Integer.parseInt(max);
    int num = 0;
    int resultado = num*num;
 
    do {
        if ((resultado >= intMin) && (resultado<=intMax)){
           textCalcu.setText(Integer.toString(num));
        }
        num++;
    } while ((num * num >= intMin) && (num * num <= intMax));
}

Le he dado muchas vueltas y no doy con el error. Antes me imprimía la última opción que se cumplia pero tiene que imprimir cada número que cumpla esa condición.

Si alguien pudiera ayudarme...

Muchas gracias igualmente!!


Título: Re: mostrar por pantalla todos los enteros x tales que su cuadrado (x * x) se encuentre entre los valores
Publicado por: K-YreX en 23 Febrero 2021, 00:48 am
Antes de nada, el código debe estar publicado entre etiquetas de Código GeSHi. Puedes seleccionarlas en el desplegable que dice "Código GeSHi" (encima del cuadro de texto) o escribiendo manualmente:
[code=java]
<tu código aquí>
[/code]

Esto es por el siguiente bloque:
Citar
Código
  1. do {
  2.    if ((resultado >= intMin) && (resultado<=intMax)){
  3.        textCalcu.setText(Integer.toString(num));
  4.    }
  5.    num++;
  6. } while ((num * num >= intMin) && (num * num <= intMax));
Estás cargando en textCalcu el valor del primero, en la siguiente iteración lo sustituyes por elsegundo y así sucesivamente. Entonces no te da tiempo a verlos y únicamente ves el último que es el que queda indefinidamente.
Por otro lado veo un error importante y es que no estás actualizando el valor de resultado (siempre vale 0).
Por último, la estructura do-while() no es la más adecuada para esta situación. Lo correcto sería utilizar un while() o en su defecto un for() ahorrando la condición del if().

La forma de hacer esto es crear un String auxiliar en el que ir concatenando toda la cadena que quieres mostrar. Por ejemplo:
Código
  1. String mensaje = ""; // Importante inicializarlo para poder concatenar
  2. int num = 0;
  3. while(num * num >= intMin && num * num <= intMax) {
  4.    mensaje += num + " - "; // El " - " es para separarlos mediante un guion, puedes usar "\n" para separarlos por lineas
  5.    ++num;
  6. }
  7. // Y una vez creada la cadena completa, la muestras:
  8. textCalcu.setText(mensaje);
Como ves, no utilizo la variable 'resultado'. La puedes utilizar para guardar la operación de (num * num) y no tener que calcularla 2 veces.
Otra posible mejora es utilizar un StringBuffer o StringBuilder en vez de String para concatenar la cadena (es más eficiente).

Otra posible solución para no tener que multiplicar (num * num) en cada iteración, es hacer la operación inversa. Es decir si tiene que cumplirse que:
Código:
intMin <= (num * num) <= intMax
Entonces también tiene que cumplirse:
Código:
sqrt(intMin) <= num <= sqrt(intMax)
siendo sqrt(n) la raíz cuadrada de n.
Sin embargo, en esta ocasión tendrías que tener cuidado para comparar entre números enteros y números reales.