Autor Tema: Ayuda no se como poner lo de precione cualquier tecla para continuar  (Leído 688 veces)

Cesar0691

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Que tal espero que esten muy bien tengo un problema que no puedo resover con la opcion de precione cualquier tecla para continnuar y no se que hacer, este es el problema original:
Presentar un menú con las siguientes opciones:
1.- Calcular el área de un triángulo.

2.- Calcular el área de un cuadrado.

3.- Calcular el área de un rectángulo.

4.- Salir.

 

Seleccione opción... Cuando el usuario seleccione una opción el programa deberá pedirle al usuario que proporcione los datos necesarios para realizar el cálculo del área que haya seleccionado. Después de que el programa haya realizado los cálculos deberá mostrar el resultado de la siguiente forma:
 

El área de un triángulo de base = 2 y altura = 3, es de 3 m2.

Presione cualquier tecla para continuar.

 

Después de que el usuario presione cualquier tecla, mostrar nuevamente el menú de opciones.
El programa finalizará cuando el usuario haya seleccionado la opción 4.
Realice el diagrama de flujo para este programa.

y esto es lo que tengo de codigo
Código: [Seleccionar]
import java.util.Scanner;

public class Areas {

public static void main(String[] args) {

Scanner neme = new Scanner(System.in);
int opcion;

do {
System.out.println("Seleccione una de las opciones:");
System.out.println("1.-Calcular el area de un triangulo\n2.-Calcular el area de un rectangulo\n3.-Calcular el area de un cuadrado\n4.-Salir");
opcion = neme.nextInt();
double base=0.0,altura=0.0,area=0.0,baserec=0.0,alturarec=0.0,arearec=0.0,basecua=0.0,alturacua=0.0,areacua=0.0;

if(opcion==1) {
System.out.println("Ingrese la base del triangulo");
base = neme.nextDouble();
System.out.println("Introduce la altura del triangulo");
altura = neme.nextDouble();
area=(base*altura)/2;
System.out.println("El area del triangulo de base = " + base + " y altura = " + altura + ", es de " + area + " m2 ");
}
else {
if(opcion==2) {
System.out.println("Introduce la base del rectangulo");
baserec=neme.nextDouble();
System.out.println("Introduce la altura del rectangulo");
alturarec=neme.nextDouble();
arearec=baserec*alturarec;
System.out.println("El area del rectangulo de base = " + baserec + " y altura = " + alturarec + ", es de " + arearec + " m2 ");
}
else
if(opcion==4) {
System.out.println("Introdusca la bace del cuadrado");
basecua=neme.nextDouble();
System.out.println("Introdusca la altura del cuadrado");
alturacua=neme.nextDouble();
areacua=basecua*alturacua;
System.out.println("El area del cuadrado de base = " + basecua + "y altura = " + alturacua + ", es de " + areacua + " m2 ");
}
}
   }while(opcion <5);
}


}

y no se como ponerlo, segun yo funciona pero no se como agregar lo que me falta.
De ante mano gracias

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 724
    • Ver Perfil
Re: Ayuda no se como poner lo de precione cualquier tecla para continuar
« Respuesta #1 en: 30 de Mayo 2021, 12:33 »
Hola.

En Java, no se puede hacer la opción de "pulse CUALQUIER tecla para continuar" ( y si alguien sabe hacerlo soy todo oídos)

La entrada de la consola Java es una "entrada almacenada en búfer", es decir, se va capturando lo que se teclea, pero la entrada no se da por finalizada hasta que no se pulsa la tecla ENTER.

Por tanto, Sí podemos dar la opción de detener el programa e indicar "pulse ENTER para continuar".
Pero no CUALQUIER tecla.

He visto alguna solución compleja a esto, como hacer una petición a Windows para que active la consola de comandos y sea él quien espere una pulsación de tecla, con lo cuál ya estaríamos escribiendo un código que no funcionaría bajo otros sistemas como Linux y que podría tener un comportamiento inesperado si lo estamos ejecutando desde un IDE como NetBeans, Eclipse o similar.

No vale la pena complicarse tanto para algo así.


Así que lo que sí podemos hacer es detener la ejecución del programa hasta que el usuario pulse ENTER.
Y esto lo hacemos simplemente usando el objeto Scanner para que el usuario haga una entrada de datos.
Esto implica que el usuario podrá teclear letras y números y se verá en pantalla lo que teclea. Esto es inevitable.
Pero bueno, nosotros lo que haremos será indicar en pantalla que lo que el usuario debe hacer es pulsar ENTER para continuar.
Si es rebelde y le da por teclear, pues ya es problema suyo.

Como en tu programa estás leyendo datos numéricos, con nextInt() y nextDouble(), previamente habrá que "limpiar" el buffer de entrada porque estos métodos dejan como residuo el carácter especial que representa a la tecla ENTER.
Y esto hace que cuando queramos hacer la pausa del programa, esta no se haga porque esos residuos hacen creer a Java que el usuario ya ha pulsado ENTER para continuar, cuando en realidad no ha tenido ocasión de hacerlo.

Esta pausa la haríamos después de los if que analizan la opción introducida por el usuario.
Por cierto, te he corregido los IF , pues la opción 4 que se supone es para terminar el programa la habías asignado a calcular el área del cuadrado.

Además he ampliado los IF, uno para informar al usuario de que se va a poner fin al programa cuando se pulsa 4, que siempre queda más informativo.
Y otro para cuando el usuario por error o lo que sea introduce una opción que no existe en el menú. En este caso también es inconveniente dar un mensaje en pantalla.


Para la pausa, usaremos el método nextLine() de la clase Scanner. Tanto para limpiar el buffer (capturar los residuos que hayan dejado nextInt() y nextDouble()) como para esperar a que se pulse ENTER.
Este método es el único que acepta una entrada de "datos vacía"
Podríamos limpiar con nextLine() y luego pausar con nextInt() por ejemplo. Pero nextInt() no aceptará que pulsemos ENTER sin más. Nos exigirá teclear un número antes de pulsar ENTER.

Por eso mejor usar nextLine().

Aquí te dejo el código. Pruébalo y pregunta lo que no entiendas.
Un saludo.

Código: [Seleccionar]
    public static void main(String[] args) {

Scanner neme = new Scanner(System.in);
int opcion;

do {
    System.out.println("Seleccione una de las opciones:");
    System.out.println("1.-Calcular el area de un triangulo\n2.-Calcular el area de un rectangulo\n3.-Calcular el area de un cuadrado\n4.-Salir");
    opcion = neme.nextInt();
    double base=0.0,altura=0.0,area=0.0,baserec=0.0,alturarec=0.0,arearec=0.0,basecua=0.0,alturacua=0.0,areacua=0.0;

    if(opcion==1) {
        System.out.println("Ingrese la base del triangulo");
        base = neme.nextDouble();
        System.out.println("Introduce la altura del triangulo");
        altura = neme.nextDouble();
        area=(base*altura)/2;
        System.out.println("El area del triangulo de base = " + base + " y altura = " + altura + ", es de " + area + " m2 ");
    }
    else if(opcion==2) {
        System.out.println("Introduce la base del rectangulo");
        baserec=neme.nextDouble();
        System.out.println("Introduce la altura del rectangulo");
        alturarec=neme.nextDouble();
        arearec=baserec*alturarec;
        System.out.println("El area del rectangulo de base = " + baserec + " y altura = " + alturarec + ", es de " + arearec + " m2 ");
    }
    else if(opcion==3) {
        System.out.println("Introdusca la bace del cuadrado");
        basecua=neme.nextDouble();
        System.out.println("Introdusca la altura del cuadrado");
        alturacua=neme.nextDouble();
        areacua=basecua*alturacua;
        System.out.println("El area del cuadrado de base = " + basecua + "y altura = " + alturacua + ", es de " + areacua + " m2 ");
    } else if (opcion == 4) {
        System.out.println("\nFIN DE PROGRAMA");
    } else { //Por si se introduce un valor que no es una opción de menú
        System.out.println("Opcion invalida");
    }
    //Para pausar la ejecución del programa
    neme.nextLine(); //Limpiamos buffer del System.in
    System.out.println("\n\t\tPRESIONE ENTER PARA CONTINUAR..."); //Mensaje en pantalla
    neme.nextLine(); //Ahora el programa se detiene hasta que se pulse ENTER
       }while(opcion != 4);
    }
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Cesar0691

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Re: Ayuda no se como poner lo de precione cualquier tecla para continuar
« Respuesta #2 en: 31 de Mayo 2021, 04:19 »
De verdad muchas gracias, no sabia que no se podia hacer, creo que mi maestro lo puso como una especie de trampa, saludos y de nuevo muchas gracias

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 724
    • Ver Perfil
Re: Ayuda no se como poner lo de precione cualquier tecla para continuar
« Respuesta #3 en: 31 de Mayo 2021, 11:09 »
Bueno, quizás tu maestro sabe algo que yo no se...
Si así fuera, cuéntanoslo  ;)

Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".