elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  mostrar por pantalla todos los enteros x tales que su cuadrado (x * x) se encuentre entre los valores
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: mostrar por pantalla todos los enteros x tales que su cuadrado (x * x) se encuentre entre los valores  (Leído 2,032 veces)
atina

Desconectado Desconectado

Mensajes: 1


Ver Perfil
mostrar por pantalla todos los enteros x tales que su cuadrado (x * x) se encuentre entre los valores
« 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!!


En línea

K-YreX


Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: mostrar por pantalla todos los enteros x tales que su cuadrado (x * x) se encuentre entre los valores
« Respuesta #1 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.


« Última modificación: 23 Febrero 2021, 01:02 am por K-YreX » En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines