• Domingo 28 de Abril de 2024, 21:23

Autor Tema:  Problema con bucle.  (Leído 2234 veces)

Aprendiz21Sam

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Problema con bucle.
« en: Martes 19 de Enero de 2010, 17:38 »
0
Hola, tengo un problema con este bucle que no me funciona.

Este es el programa. Entro en el bucle y me pregunta el número. Se lo doy y me da el símbolo, hasta ahí todo bien. Entonces me pregunta que si quiero pulse S para salir, pero no me da la opción de pulsar nada, sino que se salta el scanf ("%c", &Salir); y vuelve a entrar en el bucle. También he probado el while y no funciona, es decir, he probado a poner el valor de salir directamente en 'S' y sigue entrando. ¿Alguna explicación? Gracias de antemano.

Código: C
  1. /*Bibliotecas de C*/
  2.  
  3. #include <stdio.h>
  4. #include <conio.h>
  5.  
  6. /*Cabecera de las funciones*/
  7.  
  8. /*Programa pincipal*/
  9. int main()
  10. {
  11.     /*Variables del programa principal*/
  12.     int Letra;
  13.     char A;
  14.     char Salir;
  15.     /*Valor de las variables*/
  16.    
  17.     /*Petición de datos*/
  18.     while (Salir != 's' or Salir != 'S')
  19.     {
  20.       printf ("nEscriba un numero para determinar su simbolo: ");
  21.       scanf ("%d", &Letra);
  22.       A = Letra;
  23.       printf ("n%d = %c", Letra, A);
  24.       printf ("nPulse 'S' para salir u otra tecla para poner otro numero: ");
  25.       scanf ("%c", &Salir);
  26.     }
  27.     /*Algoritmo principal*/
  28.    
  29.     /*Salida de datos*/
  30.    
  31.     /*Otros*/
  32.     getch();
  33.     return 0;
  34. }
  35.  

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema con bucle.
« Respuesta #1 en: Martes 19 de Enero de 2010, 17:47 »
0
Cualquier caracter sera diferente de S o (or, o || en C/C++) diferente de s. Lo que queres es que el bucle se ejecute mientras Salir no sea NINGUNO de los dos, es decir que sea diferente de S Y diferente de s.

Código: Text
  1. while (Salir != 's' && Salir != 'S')
  2.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Aprendiz21Sam

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: Problema con bucle.
« Respuesta #2 en: Martes 19 de Enero de 2010, 17:54 »
0
Sigo teniendo un problemilla. El while ahora si funciona, pero el bucle en si no, porque no me deja escribir el valor de "Salir.

Código: C
  1.  while (Salir != 's' && Salir != 'S')
  2.     {
  3.       printf ("nEscriba un numero para determinar su simbolo: ");
  4.       scanf ("%d", &Letra);
  5.       A = Letra;
  6.       printf ("n%d = %c", Letra, A);
  7.       printf ("nPulse 'S' para salir u otra tecla para poner otro numero: ");
  8.       scanf ("%c", &Salir);
  9.     }
  10.  

El último scanf no se ejecuta nunca.

Gracias de antemano.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema con bucle.
« Respuesta #3 en: Martes 19 de Enero de 2010, 18:18 »
0
scanf es veneno, reemplazarlo por fgets + sscanf suele solucionar todos los problemas.

Código: C
  1. /*Bibliotecas de C*/
  2. #include <stdio.h>
  3.  
  4. /*Cabecera de las funciones*/
  5.  
  6. /*Programa pincipal*/
  7. int main()
  8. {
  9.     /*Variables del programa principal*/
  10.     int Letra;
  11.     char A;
  12.     char Salir = 'n';
  13.     char cad[80];
  14.     /*Valor de las variables*/
  15.    
  16.     /*Petición de datos*/
  17.     while (Salir != 's' && Salir != 'S')
  18.     {
  19.       printf ("nEscriba un numero para determinar su simbolo: ");
  20.       fgets(cad, sizeof(cad), stdin);
  21.       sscanf (cad, "%d", &Letra);
  22.       A = Letra;
  23.       printf ("n%d = %c", Letra, A);
  24.       printf ("nPulse 'S' para salir u otra tecla para poner otro numero: ");
  25.       fgets(cad, sizeof(cad), stdin);
  26.       sscanf (cad, "%c", &Salir);
  27.     }
  28.     /*Algoritmo principal*/
  29.    
  30.     /*Salida de datos*/
  31.    
  32.     /*Otros*/
  33.     getchar();
  34.     return 0;
  35. }
  36.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Aprendiz21Sam

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: Problema con bucle.
« Respuesta #4 en: Martes 19 de Enero de 2010, 18:25 »
0
Vaya gracias. Ahora si funciona pero tengo algunas dudas.
Veras yo utilizo muy pocos recursos para hacer programas con los que debería usar otros recursos. Por ejemplo, para un número aleatorio no utilizo las funciones de rand, etc. Lo que sí me gustaría saber es por qué no funcionaba mi "scanf ("%c", Salir);".

Gracias de antemano.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema con bucle.
« Respuesta #5 en: Martes 19 de Enero de 2010, 18:43 »
0
De nada, a diferencia de fgets, scanf deja caracteres sin retirar del buffer de entrada de teclado como por ejemplo el salto de linea, entonces cuando volves a leer simplemente retorna ese salto de linea (se suele decir que ensucia el buffer).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Aprendiz21Sam

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: Problema con bucle.
« Respuesta #6 en: Martes 19 de Enero de 2010, 18:57 »
0
Gracias por la explicación. Entonces si no me equivoco, aunque sea un poco enrevesado, podría escribirlo de este modo...

 
Código: C
  1.   while (Salir != 's' && Salir != 'S')
  2.     {
  3.       printf ("nEscriba un numero para determinar su simbolo: ");
  4.       scanf ("%d", &Letra);
  5.       A = Letra;
  6.       printf ("n%d = %c", Letra, A);
  7.       printf ("nPulse 'S' para salir u otra tecla para poner otro numero: ");
  8.       fflush (stdin);
  9.       scanf ("%c", &Salir);
  10.     }
  11.  

Una pregunta mas ya que eres moderador. ¿Si tengo mas dudas sigo con este hilo o creo otro nuevo?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema con bucle.
« Respuesta #7 en: Martes 19 de Enero de 2010, 21:43 »
0
No, eso esta mal, no es standard, la forma correcta de hacerlo es la que te dije ... y ademas no tiene sentido usar una funcion que ensucia el buffer y limpiarlo.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Aprendiz21Sam

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: Problema con bucle.
« Respuesta #8 en: Martes 19 de Enero de 2010, 21:46 »
0
De acuerdo gracias por las explicaciones. En la otra pregunta que he hecho de otro programa que estoy realizando, modificare los "scanf" por lo que me dijiste.

Duda sobre "scanf" y bucle resuelta.

Gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema con bucle.
« Respuesta #9 en: Martes 19 de Enero de 2010, 22:04 »
0
De nadas  :comp:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.