Programación General > C/C++

 simple burbuja, se me queda colgado

<< < (3/3)

picyo:
estoy siguiendo un curso de un libro mas bien, begining Visual C++ 2008, y me parece perfecto, porque como dcis, no va directamente a los windows forms, primero te enseña desde "abajo" viendo la API. Ahora he hecho un parentesis del libreo, para hacer una modificacion de uno de los ejemplos, y hacer cosas por mi cuenta. Estoy mezclando ( quizas este mal eso) cosas del "antiguo" C o C++, pero bueno. Lo que quiero hacer es bastante simple:

* Cada vez preguntar si se quiere jugar.
* En caso de no, se aprieta 'N'.
* En caso de si, se aprieta 'S'. Al apretar S, pongo otro getchar. Si pulsamos la letra "q", la opcion sera correcta y ganamos un punto, de caso contrario volveria al principio.
* si cuano nos pregunta si queremos seguir jugando decimos que no ("N"), "quiero" es False, y se acaba este juego ( o cosa.:P).

Pues CASI me va bien, pero... no me entra nunca en el segundo switch, de hecho para ver si entra o no pongo una lectura de la tecla apretada y siempre es la misma ( el resultado de la tecla pulsada lo da en numero ascii). Por que puede ser qu eno me entre ahí?
Y hay otro caso... da "2" vueltas a todo... AHora pongo una serie de pantallazos y el codigo de programa:
codigo:

--- Código: C++ --- // verificarTecla.cpp : main project file. #include "stdafx.h"#include <stdio.h>#include <conio.h>#include <string.h>   using namespace System;void mensaje (void);  int main(array<System::String ^> ^args){    char tecla,tecla1;    int nomasqueuna,puntos=0;    bool quiero=true;    char quiero1;    nomasqueuna=1;    while(quiero){        Console::WriteLine("Seguro que quieres jugar? 'S' para Si, 'N' para no");                tecla=getchar();        //quiero=false;        switch (tecla)        {        case ('S'):                  mensaje();                 Console::WriteLine("Has pulsado{0}. Escribe la letra",tecla);                 tecla=getchar();   //  NO ME HACE CASO EN ESTE GETCHAR! SIEMPER TIENE EL MISMO VALOR                             switch (tecla)                 {                     Console::WriteLine(" Pulsada tecla {0}.Si Entra en Sitch",tecla);                     tecla=getchar();                     case ('q'):                        puntos++;                        Console::WriteLine(" ****Has apretado la tecla {0}, con total de puntos {1}*****",tecla,puntos);                     case (!'q'):                         Console::WriteLine("MIERDA, sin puntos {0}",tecla);                         break;                                             }                                           break;        case ('N'):                quiero=false;        break;        default:                Console::WriteLine("Opción incorrecta");               break;                }       }                   return 0;} // main void mensaje (void){    Console::WriteLine("hola");}  Al ejecutar, se ve este resultado, al teclear la letra S (mayúscula):
[/url]

Uploaded with ImageShack.us

[/img]
Como veis, no me hace caso a este nuevo gecthar(). Bien, imaginemos que pongo cualquier letra ( una tecla solo) entonces veo :

[/url]</noscript>
[/img]

Si tecleo una letra distinta a S o N, pero solo una, se repite 2 veces, y si pongo 2 letras, lo hara 3:
[/url]

Uploaded with ImageShack.us
[/img]

bueno tengo asi pues localizados los problemas:
1) No me lee el segundo gecthar, por tanto , no me hace caso a la opcion "S". He probado hacerlo mediante "if" pero con mismo resultado.
2) repeticion según el número de teclas tecleadas del bucle.

NO hallo solucion a ello chicos... y la verdad es que he sido capaz de hacer programas mucho mas costosos que este.. y esta tonteria, me da problemas...increíble..que ocurre?

picyo:
Uhm, a modo de prueba error, he arreglado el problema, pero la verdad, no entiendo porque he de poner ese gechar en esa posicion. Ok, antes de salir, la variable tecla ya tiene un nuevo valor, `pero realmente el break no se a donde lo lleva ..¿?

--- Código: C++ --- // verificarTecla.cpp : main project file. #include "stdafx.h"#include <stdio.h>#include <conio.h>#include <string.h>   using namespace System;void mensaje (void);  int main(array<System::String ^> ^args){    char tecla,tecla1;    int nomasqueuna,puntos=0;    bool quiero=true;    char quiero1;    nomasqueuna=1;    while(quiero){        Console::WriteLine("Seguro que quieres jugar? 'S' para Si, 'N' para no");                tecla=getchar();        //quiero=false;        switch (tecla)        {                case ('S'):                  mensaje();                 tecla=getchar();                 Console::WriteLine("Has pulsado{0}. Escribe la letra",tecla);                                     tecla=getchar();                                  Console::WriteLine("tecla={0}",tecla);                 switch (tecla)                 {                     Console::WriteLine(" Pulsada tecla {0}.Si Entra en Sitch",tecla);                     case ('q'):                        puntos++;                        Console::WriteLine(" ****Has apretado la tecla {0}, con total de puntos {1}*****",tecla,puntos);                        tecla=getchar(); // POR QUE NECESITO PONERLO AQUI, Y NO AL PRINCIPIO COMO LO PONIA?                        break;   // ME HABIA DEJADO ESTE BREAK, PERO, AL "ROMPER", NO LO SACA FUERA DEL 2o SWITCH?                     case (!'q'):                         Console::WriteLine("MIERDA, sin puntos {0}",tecla);                         break;                                            }                                           break;        case ('N'):                quiero=false;        break;        default:                Console::WriteLine("Opción incorrecta");               break;                }        }                        return 0;} // main void mensaje (void){    Console::WriteLine("hola");}   

ProfesorX:
Hola picyo, primero que nada, te aconsejaria lo siguiente, estas trabajando con Visual C++, pero estas utilizando las "Extensiones CLR para .NET", estas extenciones de C++ NO son portables, solo funcionan en entornos .NET Framework, asi que si tu intension es escribir codigo C++ portable a cualquier sistema operativo, evita utilizarlas. La principal funcion de estas extensiones CLR seria desde mi punto de vista escribir codigo C++ que sea compatible con lenguajes .NET, como Visual Basic o Visual C#, asi que si no es esa tu intension, desechalo.

Ahora respecto a tus dudas:

1. gertchar(), este seria tu primer problema, la manera como funciona el getchar() es que lee valores desde la entrada estandar (stdin), pero no limpia todo el buffer de entrada al leer, asi que si tu escribes por ejemplo S y luego das enter, en el buffer se queda el valor de S y tambien el valor de el enter, que en este caso es un avance de linea (caracter No 10), por eso al volver a usar getchar, seguira leyendo los valores que quedan en el buffer de entrada. La solucion a esto es utilizar la funcion fflush(stdin) para limpiar el buffer de entrada y asi el proximo getchar() leera los datos de manera correcta, o sea que debes hacer:


--- Código: C++ ---         tecla=getchar();        fflush(stdin);  
Ahora, si insistes en utilizar las Extensiones CLR, la manera correcta de leer seria:


--- Código: C++ ---         tecla = Console::Read();  
2. break, respecto al break, la sentencia break lo que hace es sacar la ejecucion del bloque actual, asi que en tu caso, el break mas interno NO te sacara de todos los switch, solo te saca del mas interno. Ademas, el break no solo se utiliza en switch, se puede utilizar en cualquier sentencia, y su funcion es la misma, te saca del bloque actual.

Un ejemplo para que notes como funcona el break:

--- Código: C++ --- if (condicion) {  sentencia1;  sentencia2;  if (condicion)     {     sentencia3;     if (condicion)       {       sentencia4       // la ejecucion continuara en sentencia6, se salta sentencia5;       break;       sentencia5;       }     sentencia6;     }  sentencia7} if (condicion) {  sentencia1;  sentencia2;  if (condicion)     {     sentencia3;     // la ejecucion continuara en sentencia7, se salta el if, sentencia4     // sentencia5 y sentencia6;     break;     if (condicion)       {       sentencia4       sentencia5;       }     sentencia6;     }  sentencia7}  
Espero que con esto te quede mas claro.

Saludos :)

picyo:
uhm. Si si, muchisimo :)
Lo que dices acerca que no se borra el registro ( o donde sea que este :p) cuando haces getchar() si lo he visto, pero no tenia ni idea que hacer. En una de las lineas ( no se si al final la he quitado) ponia un Console::writeLine(" algo{0}",tecla) y en tecla me aparecia el numero 10 . De ahí he deducido que era del código ASCII, y lo he consultado. En efecto, es lo que tu dices, el codigo 10 es un salto de línea y la verdad... no sabía como solucionarlo  ( Ahora si ;) )

respecto .NET, lo que realmente quiero aprender ( al principio) es Visual C++ ( Y vIsual basic, Visual C#...) pero para empezar quiero ( y creo que ha de ser asi) empezar por la API de Windows, e incluso saber el C++ "estandar" o sea, sin basarse en librerias de Windows. Creo que los voy aprendiendo a la par, y saber como se hace lo mismo ( siempre que se pueda) de un modo u otro. Me gustaria acabar haciendo una aplicacion, un juego para crios, para apreender algo ( no se muy bien que ). por eso he empezado ya con eso de los puntos y tal :p

picyo:
Hola! estoy haciendo el seguimiento del libreo, y salen dudas ( como no!) acerca del tipo de proyecto, o que es MFC o que es CLI o que es win32...o que es todo junto..vaya lio :)
ya lo voy comprendiendo, si alguien que lea por aqui tiene mi misma duda ( ya la tengo resarcida) os paso un link que em ha gustado :

http://geeks.ms/blogs/rfog/archive/2009 ... c-cli.aspx

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa