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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  AL SALIR OPRIMIENDO UNA TECLA IMPRIME TAMBIÉN LO ÚLTIMO INGRESADO
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: AL SALIR OPRIMIENDO UNA TECLA IMPRIME TAMBIÉN LO ÚLTIMO INGRESADO  (Leído 3,686 veces)
snoopty

Desconectado Desconectado

Mensajes: 86


Ver Perfil
AL SALIR OPRIMIENDO UNA TECLA IMPRIME TAMBIÉN LO ÚLTIMO INGRESADO
« en: 15 Septiembre 2021, 10:41 am »

// 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;
}



« Última modificación: 15 Septiembre 2021, 10:50 am por snoopty » En línea

Locura_23

Desconectado Desconectado

Mensajes: 162



Ver Perfil
Re: AL SALIR OPRIMIENDO UNA TECLA IMPRIME TAMBIÉN LO ÚLTIMO INGRESADO
« Respuesta #1 en: 15 Septiembre 2021, 14:58 pm »

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
  1. while( !(GetAsyncKeyState('S') )
  2. {
  3.     //y el resto
  4. }
  5.  

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
  1. //donde declaraste las demas variables
  2. char controlUsuario;
  3.  
  4. // luego si colocar la S o la N va en gusto del programador, entiendo más clara cuando es
  5. //negativa la condicion, osea cuando oprime n. Fijate que se tiene en cuenta n minuscula Y
  6. //N mayuscula.
  7. while( controlUsuario != 'n' && controlUsuario != 'N' )
  8. {
  9.  
  10. //operaciones
  11.  
  12. cout << "Continuar ? (s/n)";
  13.  
  14. cin.get(controlUsuario);
  15.  
  16. }
  17.  



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

Código
  1.  
  2. d = b + c
  3. // recuerda poner nombres DESCRIPTIVOS para tus variables, hace más legible el código
  4. // lo anterior podria ser, por ejemplo.
  5.  
  6. suma = num + otroNum;
  7.  
  8. //recuerda que mientras mas CLARO y EVIDENTE a la vista el codigo mejor.
  9.  
  10.  

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

Código
  1. cout << "\nLa suma es: " << b + c << endl;
  2.  

Como ves, no es necesario ni bajarlo a una variable

Saludos



« Última modificación: 15 Septiembre 2021, 15:06 pm por Locura_23 » En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: AL SALIR OPRIMIENDO UNA TECLA IMPRIME TAMBIÉN LO ÚLTIMO INGRESADO
« Respuesta #2 en: 15 Septiembre 2021, 18:12 pm »

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
  1. #include <limits>
  2. ...
  3. while (...) {
  4. ...
  5. cin.ignore(numeric_limits<streamsize>::max(), '\n');
  6. cin.get(controlUsuario);
  7. }
  8.  

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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
dando vuelta el texto ingresado xD
Scripting
Darioxhcx 8 4,060 Último mensaje 10 Agosto 2008, 08:00 am
por Novlucker
Detectar tecla presionada y si es tal tecla hacer tal cosa
Programación Visual Basic
Wiidos 3 6,195 Último mensaje 20 Marzo 2011, 19:15 pm
por raul338
Como identificar si se ha ingresado nombre o no en C++
Programación C/C++
SpockUrielo 3 3,113 Último mensaje 19 Junio 2012, 08:25 am
por do-while
buscar dato ingresado
.NET (C#, VB.NET, ASP)
bs78 0 2,341 Último mensaje 20 Febrero 2013, 14:15 pm
por bs78
salir de un bucle presionando la tecla ESC
Programación C/C++
kakshi 2 4,607 Último mensaje 4 Agosto 2019, 21:49 pm
por kakshi
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines