Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Cesar0691 en 30 de Mayo 2021, 06:05
-
Hola, ¿qué tal? Espero que estén muy bien. Tengo un problema que no puedo resover con la opcion de presione cualquier tecla para continnuar y no sé qué 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 código
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 cómo ponerlo, según yo funciona pero no sé cómo agregar lo que me falta.
De ante mano gracias
-
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.
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);
}
-
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
-
Bueno, quizás tu maestro sabe algo que yo no se...
Si así fuera, cuéntanoslo ;)
Un saludo.