Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Por qué no me lee con scanf un char al final de un ciclo?

Estas en el tema de Por qué no me lee con scanf un char al final de un ciclo? en el foro de C/C++ en Foros del Web. No se si en el título me explique bien... @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver original #include <stdio.h> #include <math.h> #include <stdlib.h>   int main ( ...
  #1 (permalink)  
Antiguo 27/05/2011, 01:37
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años
Puntos: 8
Pregunta Por qué no me lee con scanf un char al final de un ciclo?

No se si en el título me explique bien...

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5. int main()
  6. {
  7.     int numero;
  8.     int prueba;
  9.     char sn;
  10.    
  11.     while(1 == 1){
  12.          srand(time(NULL));
  13.          numero = (rand() % 1000) + 1;
  14.          printf("Tengo un numero entre 1 y 1000\n"
  15.                 "Puedes adivinar cual es?\n"
  16.                 "Por favor escribe tu primera respuesta\n");
  17.          scanf("%d", &prueba);
  18.          
  19.          while(prueba != numero){
  20.               if(prueba > numero){
  21.                    printf("\nMuy arriba. Intenta de nuevo.\n");
  22.                    scanf("%d", &prueba);
  23.                    }
  24.               if(prueba < numero){
  25.                    printf("\nMuy abajo. Intenta de nuevo.\n");
  26.                    scanf("%d", &prueba);
  27.                    }
  28.               }
  29.  
  30.          if(prueba == numero){
  31.               printf("Felicidades! Adivinaste el numero!\n");
  32.               }
  33.          
  34.          printf("Quieres jugar otra vez? (S/N)\n");
  35.          scanf("%c", &sn);
  36.          if(sn == "S" || sn == "s")
  37.               continue;
  38.          else
  39.               break;
  40.          }
  41. }

Cuando adivinas el número se cierra rápidamente... sin poder escribir S o N para continuar o no?

Ayuda D:

Saludos!
  #2 (permalink)  
Antiguo 27/05/2011, 04:56
 
Fecha de Ingreso: abril-2011
Mensajes: 49
Antigüedad: 13 años
Puntos: 1
Respuesta: Por qué no me lee con scanf un char al final de un ciclo?

Cambia

while(1==1) (que por cierto si quieres un bucle infinito con while(1) basta)

y pon :

while (sn!='s'){
}

de esta manera te ahorras el if de abajo del todo; simplemente pon el mensaje al final de todas las comprobaciones.
  #3 (permalink)  
Antiguo 27/05/2011, 06:52
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años
Puntos: 8
Respuesta: Por qué no me lee con scanf un char al final de un ciclo?

Cita:
Iniciado por Isra_84 Ver Mensaje
Cambia

while(1==1) (que por cierto si quieres un bucle infinito con while(1) basta)

y pon :

while (sn!='s'){
}

de esta manera te ahorras el if de abajo del todo; simplemente pon el mensaje al final de todas las comprobaciones.
Ok... quedó así:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5. int main()
  6. {
  7.     int numero;
  8.     int prueba;
  9.     char sn[2] = "S";
  10.    
  11.     while(sn != "n" && sn != "N"){
  12.          srand(time(NULL));
  13.          numero = (rand() % 1000) + 1;
  14.          printf("Tengo un numero entre 1 y 1000\n"
  15.                 "Puedes adivinar cual es?\n"
  16.                 "Por favor escribe tu primera respuesta\n");
  17.          scanf("%d", &prueba);
  18.          
  19.          while(prueba != numero){
  20.               if(prueba > numero){
  21.                    printf("\nMuy arriba. Intenta de nuevo.\n");
  22.                    scanf("%d", &prueba);
  23.                    }
  24.               if(prueba < numero){
  25.                    printf("\nMuy abajo. Intenta de nuevo.\n");
  26.                    scanf("%d", &prueba);
  27.                    }
  28.               }
  29.  
  30.          if(prueba == numero){
  31.               printf("Felicidades! Adivinaste el numero!\n");
  32.               }
  33.          
  34.          printf("Quieres jugar otra vez? (S/N)\n");
  35.          scanf("%c", &sn);
  36.          printf("\n");
  37.          }
  38. }

Pero cuando adivinas el número y aprietas cualquier tecla se cierra! :S
  #4 (permalink)  
Antiguo 27/05/2011, 07:31
 
Fecha de Ingreso: abril-2011
Mensajes: 49
Antigüedad: 13 años
Puntos: 1
Respuesta: Por qué no me lee con scanf un char al final de un ciclo?

Declara sn como un char no como un array de char

char sn [2] <----- array de char


char sn<-----variable char
  #5 (permalink)  
Antiguo 27/05/2011, 07:43
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años
Puntos: 8
Respuesta: Por qué no me lee con scanf un char al final de un ciclo?

Ya... pero sigue continuando el ciclo sin permitirme ingresar S o N :S
  #6 (permalink)  
Antiguo 27/05/2011, 09:24
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 7 meses
Puntos: 188
Respuesta: Por qué no me lee con scanf un char al final de un ciclo?

Hola amigo, verás hay varios detallitos en tu código. Si lees con atención este lo vas a poder solucionar facilmente.

Para crear una opcion del tipo "preciona S" para volver a jugar o "presiona N" para cerrar. Te recomiendo que hagas uso del ciclo do while.

Código C:
Ver original
  1. int main(){
  2. char opcion;
  3.  
  4.  
  5. do{
  6.  
  7. //Todo el código aquí
  8.  
  9. .
  10. .
  11. .
  12. .
  13. .
  14.  
  15.  
  16.  
  17. //Pregunto al usuario si quiere volver a jugar o si desea cerrar el programa
  18.  
  19. printf("Preciona 'S' para volver a jugar o 'N' para cerrar el programa");
  20. opcion = getch();
  21.  
  22. }while(opcion == 'S');
  23.  
  24.  
  25.  
  26. }

Posteriormente, en esta parte está el primer error:
Código C:
Ver original
  1. while(prueba != numero){
  2.              if(prueba > numero){
  3.                    printf("\nMuy arriba. Intenta de nuevo.\n");
  4.                    scanf("%d", &prueba);
  5.                    }
  6.               if(prueba < numero){
  7.                    printf("\nMuy abajo. Intenta de nuevo.\n");
  8.                    scanf("%d", &prueba);
  9.                    }
  10.               }//Fin del while

La sentencia if debe ser del tipo:

Código C:
Ver original
  1. if(prueba > numero){
  2.                        .
  3.                        .
  4.                        .
  5.                        .
  6. }
  7. else  if(prueba < numero){
  8.                        .
  9.                        .
  10.                        .
  11.                        .
  12. }
  13. else {
  14.  
  15. printf("Felicidades! Adivinaste el numero!\n");
  16.  
  17. }

Y es todo, la parte en donde preguntas "Quieres jugar otra vez ya está incluida en el ciclo do while.

Saludos.


_____________________
P.D: El programa se te cerraba porque hacia falta un getch() o _getch() o system("pause"); al final del programa.
con el ciclo do while no lo vas a necesitar.
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #7 (permalink)  
Antiguo 27/05/2011, 09:29
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años
Puntos: 8
Respuesta: Por qué no me lee con scanf un char al final de un ciclo?

Mmmm... el else if en este caso no es necesario... no tengo problemas en esa parte del código...

Ya hice lo que me dijiste con el do while y la condicion opcion = "S", y se sigue cerrando cuando pulso cualquier tecla!

Saludos :)
  #8 (permalink)  
Antiguo 27/05/2011, 10:15
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 7 meses
Puntos: 188
Respuesta: Por qué no me lee con scanf un char al final de un ciclo?

puedes subir el archivo .c o .cpp, porfavor, me ahorras tener que trancribirlo para compilarlo.

Ya que el copiar y pegar no sirve, porque en el proceso una especie de caracteres ascci tambien se copia y al compilar marca errores en todas las lineas >.<
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #9 (permalink)  
Antiguo 27/05/2011, 10:29
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Por qué no me lee con scanf un char al final de un ciclo?

Proba con esto:

while (sn != ''\n") sn = getchar();
printf("Quieres jugar otra vez? (S/N)\n");
scanf("%c", &sn);
printf("\n");
  #10 (permalink)  
Antiguo 27/05/2011, 17:51
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años
Puntos: 8
Respuesta: Por qué no me lee con scanf un char al final de un ciclo?

Afff no entiendo... lo único que quiero es que el programa se repita si pulsas S o s... y se cierre si no :(
  #11 (permalink)  
Antiguo 27/05/2011, 19:07
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Por qué no me lee con scanf un char al final de un ciclo?

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5. int main()
  6. {
  7.     int numero;
  8.     int prueba;
  9.     char sn;
  10.    
  11.     while(1 == 1){
  12.          srand(time(NULL));
  13.          numero = (rand() &#37; 1000) + 1;
  14.          printf("Tengo un numero entre 1 y 1000\n"
  15.                 "Puedes adivinar cual es?\n"
  16.                 "Por favor escribe tu primera respuesta\n");
  17.          scanf("%d", &prueba);
  18.          
  19.          while(prueba != numero){
  20.               if(prueba > numero){
  21.                    printf("\nMuy arriba. Intenta de nuevo.\n");
  22.                    scanf("%d", &prueba);
  23.                    }
  24.               if(prueba < numero){
  25.                    printf("\nMuy abajo. Intenta de nuevo.\n");
  26.                    scanf("%d", &prueba);
  27.                    }
  28.               }
  29.  
  30.          if(prueba == numero){
  31.               printf("Felicidades! Adivinaste el numero!\n");
  32.               }
  33.          while (sn != '\n') sn = getchar();
  34.          printf("Quieres jugar otra vez? (S/N)\n");
  35.          scanf("%c", &sn);
  36.          if(sn == 'S' || sn == 's')
  37.               continue;
  38.          else
  39.               break;
  40.          }
  41. }

Ahora que me sente en mi pieza y compile tu codigo pude ver bien los error. El primero de todo es el que te mencione..
Tienes que agregar while (sn != '\n') sn = getchar(); para vaciar el biffer de entrada porque al ingresar un numero y leer con scanf y presionas enter al mandarlo, ese enter queda en el baffer. Al leer un caracter este era el que se almacenaba en sn y entoces pasaba que se salteaba el scanf.

Segundo en el if para comparar con S o s fijate que estabas usando comillas dobles y eso es para cadenas de catacteres o array de caracteres. Para comparara un solo caracter con una variable tipo char (como es en tu caso) tienes que usar comillas simples.

Adios
  #12 (permalink)  
Antiguo 27/05/2011, 23:47
_Lx
 
Fecha de Ingreso: mayo-2011
Mensajes: 17
Antigüedad: 12 años, 11 meses
Puntos: 11
Información Respuesta: Por qué no me lee con scanf un char al final de un ciclo?


Creo que se ve mejor así:

Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <ctype.h>
  4. #include <time.h>
  5.  
  6. int main()
  7. {
  8.    int numero;
  9.    int prueba;
  10.    char sn;
  11.    
  12.    srand(time(NULL));
  13.    do{
  14.       numero = (rand()&#37;1000) + 1;
  15.       printf("\n\nTengo un numero entre 1 y 1000\n"
  16.              "Puedes adivinar cual es?\n"
  17.              "\nPor favor, escribe tu primera respuesta:\n\n");
  18.       do{
  19.          scanf("%d", &prueba);
  20.          if(prueba > numero){
  21.             printf("\nMuy arriba. Intenta de nuevo.\n\n");
  22.          }
  23.          else if(prueba < numero){
  24.             printf("\nMuy abajo. Intenta de nuevo.\n\n");
  25.          }
  26.       }while(prueba != numero);
  27.       printf("Felicidades! Adivinaste el numero!\n");
  28.       while( getchar()!='\n'); // lee lo que queda en el buffer de entrada hasta el '\n'(lo vacía).
  29.       printf("Quieres jugar otra vez? (S/N): ");
  30.       scanf("%c", &sn);
  31.    }while( toupper(sn) == 'S');
  32.    printf("\n\nNos vemos . . .");
  33.    getchar(); // pausa
  34.    return 0; // devuelve 0 indicando (al SO) que el programa finalizó correctamente.
  35. }


Nos vemos ...
  #13 (permalink)  
Antiguo 28/05/2011, 08:49
 
Fecha de Ingreso: septiembre-2007
Ubicación: PyRoot
Mensajes: 1.515
Antigüedad: 16 años, 7 meses
Puntos: 188
Respuesta: Por qué no me lee con scanf un char al final de un ciclo?

esta bien amigo. El problema es algo muy mínimo, pero si no subes tu archivo como quieres que te ayudemos.
__________________
Si quieres agradecer el triangulo obscuro de la parte derecha debes presionar +.
  #14 (permalink)  
Antiguo 28/05/2011, 16:46
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Por qué no me lee con scanf un char al final de un ciclo?

Cita:
Iniciado por New Ver Mensaje
esta bien amigo. El problema es algo muy mínimo, pero si no subes tu archivo como quieres que te ayudemos.
Creo que te confundiste de post...si lo subio
  #15 (permalink)  
Antiguo 30/05/2011, 02:33
 
Fecha de Ingreso: abril-2011
Mensajes: 49
Antigüedad: 13 años
Puntos: 1
Respuesta: Por qué no me lee con scanf un char al final de un ciclo?

Pon debajo de cada scan un fflush(stdin) para limpiar el buffer de entrada.

Sigue comentando a ver como va, que esto lo arreglamos como que me llamo Isra...

Etiquetas: char, final, scanf, ciclos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:57.