AL SALIR OPRIMIENDO UNA TECLA IMPRIME TAMBIÉN LO ÚLTIMO INGRESADO

Iniciado por snoopty, 15 Septiembre 2021, 10:41 AM

0 Miembros y 1 Visitante están viendo este tema.

snoopty

// Logro Salir del Código pero simultáneamente me imprime
// " LA SUMA ES: ...... mostrando el último Valor ingresado
#include <iostream>
#include <windows.h>

using namespace std;

int main ()
{

int b;
int c;
int d;


while ((!(GetAsyncKeyState('S') & 1 )))
{
cout<<"\n\n\n\n\tINTENTO DE ESCAPE DE BUCLE WHILE OPRIMIENDO \"s\""<<endl;


cout<<"\n\n\tPresione \"s\" para salir"<<endl;


cout<<"\n\n\n\n\tIngrese el Primer"<<" "<<"N\243mero:  ";
cin>>b;

cout<<"\n\n\n\n\tIngrese el Segundo"<<" "<<"N\243mero:  ";
cin>>c;


d=(b+c);


cout<<"\n\n\n\n\tLA SUMA ES:  "<<d<<endl;
}

cout<<"\n\n\tPROGRAMA TERMINADO"<<endl;

return 0;
}


Locura_23

#1
Hola!
No me convence mucho la condicion del while... si quieres hacer que el usuario salga del bucle ,segun lo que planteaste, puedes hacer

Código (cpp) [Seleccionar]

while( !(GetAsyncKeyState('S') )
{
    //y el resto
}


No entiendo la segunda condicion que planteas en el while... ( el "& 1") ? Puede que ahi te esté tirando el error.

Aunque yo no agregaria toda la ENORME libreria de windows para solo esa funcion de la tecla. Puedes conseguir el mismo resultado con una variable char y el metodo cin.get(), y seria una forma mas eficiente y rapida, para conseguir los mismos resultados. Siempre buscamos la eficiencia del codigo. Soluciones simples son mejores.

Código (cpp) [Seleccionar]

//donde declaraste las demas variables
char controlUsuario;

// luego si colocar la S o la N va en gusto del programador, entiendo más clara cuando es
//negativa la condicion, osea cuando oprime n. Fijate que se tiene en cuenta n minuscula Y
//N mayuscula.
while( controlUsuario != 'n' && controlUsuario != 'N' )
{

//operaciones

cout << "Continuar ? (s/n)";

cin.get(controlUsuario);

}




Luego, en la asignacion, no es necesario los parentesis.

Código (cpp) [Seleccionar]


d = b + c
// recuerda poner nombres DESCRIPTIVOS para tus variables, hace más legible el código
// lo anterior podria ser, por ejemplo.

suma = num + otroNum;

//recuerda que mientras mas CLARO y EVIDENTE a la vista el codigo mejor.



Por ultimo, en la linea donde imprimir por pantalla el resultado de la suma, puedes colocar directamente esto:

Código (cpp) [Seleccionar]

cout << "\nLa suma es: " << b + c << endl;


Como ves, no es necesario ni bajarlo a una variable

Saludos


RayR

Es normal lo que pasa, dado que el GetAsyncKeyState únicamente se llama al inicio de cada iteración del bucle. Una vez que entras a él, todo lo que está dentro del bloque se ejecuta, y después se hace la comprobación.

La forma en que estás usando esta función (verificando el bit menos significativo) no está mal, pero puede dar problemas y no se recomienda mucho su uso. Mira aquí (en concreto lo de "Although the least significant bit..."): https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getasynckeystate#remarks

Para ejercicios de prueba lo puedes usar, pero lo recomendable es limitarse a probar el bit más significativo (GetAsyncKeyState(codigo) & 0x8000), aunque no hace lo mismo, y en este caso probablemente no te sirva. De todas formas, tu código tiene un problema de fondo, y es que funciones como GetAsyncKeyState no se llevan muy bien con los mecanismos de entrada estándar de C++, como cin, getchar, etc, y es mejor evitar mezclarlos así. Mejor haz algo como lo que te puso  Locura_23, aunque en ese caso, deberías limpiar el buffer antes del cin.get, o leerá el '\n' dejado por el cin anterior. No sé si sepas hacerlo, pero por si no, una forma con cin.ignore:

Código (cpp) [Seleccionar]
#include <limits>
...
while (...) {
...
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin.get(controlUsuario);
}


Aunque hay otras igualmente válidas. Simplemente hay que evitar las que involucran fflush o fseek. Obviamente, a diferencia de GetAsyncKey, con cin.get, el usuario deberá presionar Enter después de la 's', pero no me parece que eso sea un problema.