Problema con while

Iniciado por psycho248, 4 Enero 2014, 06:34 AM

0 Miembros y 2 Visitantes están viendo este tema.

psycho248

Tengo un problema con este sencillo algoritmo que en la última vuelta de while no suma el contador de cantm. si pongo en cant 3 y en los tres pongo f solo suma 2, si pongo 5 solo suma 4 y así.
Apenas voy entrando en este interesante mundo de la programación. Espero que alguien pueda ayudarme con este atoron.

//Definir el número de mujeres que hay en n cantidad de personas
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int cant, cantm, cont;
char sex;
cont=1;
sex=' ';
printf("Ingrese la cantidad de personas\n");
scanf("%d",&cant);
while (cont<=cant){
printf("Ingrese el sexo de la persona %d \n",cont);
fflush(stdin);
scanf("%c\n",&sex);
  if(sex=='f' || sex=='F'){
    cantm++;
       }
      cont++;
}

printf("La cantidad de mujeres es: %d \n",cantm);
return 0;
}


leosansan

#1
Cita de: psycho248 en  4 Enero 2014, 06:34 AM
Tengo un problema con este sencillo algoritmo que en la última vuelta de while no suma el contador de cantm. si pongo en cant 3 y en los tres pongo f solo suma 2, si pongo 5 solo suma 4 y así.

Citar

scanf("%d\n",&cant);




¿Lo ves?. Ese /n en el scanf produce un  comportamiento inesperado del scanf. En su lugar va:

Citar

scanf("% d",&cant);


Observa que lleva un espacio en blanco el scanf después del %d.

¿Por qué?- Has la prueba sin ponerlo y veras lo que sucede. Es una simple forma de "limpiar" el llamado buffer. Para más información utiliza el motor de búsquedas del foro. :rolleyes: :rolleyes: :rolleyes:





psycho248

Hola. Muchas gracias por tu respuesta. Lo que sucede si no pongo el \n en scanf, al correrlo imprime el texto "ingrese el sexo de la persona" en grupos de 2 o mas según el numero de cant. Es realmente muy rearo porque ya probe con for y do y los mismos resultados  :rolleyes:

leosansan

#3
Cita de: psycho248 en  4 Enero 2014, 15:32 PM
Hola. Muchas gracias por tu respuesta. Lo que sucede si no pongo el \n en scanf, al correrlo imprime el texto "ingrese el sexo de la persona" en grupos de 2 o mas según el numero de cant. Es realmente muy rearo porque ya probe con for y do y los mismos resultados  :rolleyes:

Para cuando postees el código elige las etiquetas GeSHi y toma la C++ y en medio de las etiquetas Code que aparecen "pegas" tu código. Al no hacerlo de esta manera parte del código no sale correcta, especialmente las matrices.

Lo que sucede no es nada raro, es lo habitual en un scanf dentro de un bucle especialmente. Ocurre porque el último ENTER que introduces por teclado se queda en lo que se llama memoria intermedia o buffer, de forma que al correr el programa un bucle y encontrarse con otro scanf, como se había quedado con el ENTER en memoria, ejecuta la siguiente instrucción que requiera de un ENTER, lo tenía en memoria y antes de coger  nuevos datos suelta ese que tiene. Esto es lo que te ocurre:

Citar
Ingrese la cantidad de personas
4
Ingrese el sexo de la persona 1
Ingrese el sexo de la persona 2


Si te das cuenta se produce un salto, como si alguien hubiese dado al ENTER de más.

Una forma simple, en este caso, es lo que te comente de dejar un espacio en blanco en el scanf antes de escribir el %c. Y esto es lo que pasaría:


Citar

Ingrese la cantidad de personas
4
Ingrese el sexo de la persona 1
a
Ingrese el sexo de la persona 2
s
Ingrese el sexo de la persona 3
f
Ingrese el sexo de la persona 4
f
La cantidad de mujeres es: 2


Ves que sencillo. Aquí el código, básicamente es el tuyo con la única modificación del scanf y, muy importante, acostúmbrate a indentar o sangrar el código para que sea más legible y con las etiquetas code:

Código (cpp) [Seleccionar]

//Definir el número de mujeres que hay en n cantidad de personas
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
   int cant, cantm=0, cont=1;
   char sex;
   printf("Ingrese la cantidad de personas\n");
   scanf("%d",&cant);
   while (cont<=cant)
   {
       printf("Ingrese el sexo de la persona %d \n",cont);
       scanf(" %c",&sex);
           if(sex=='f' || sex=='F')
               cantm++;
       cont++;
   }
   printf("La cantidad de mujeres es: %d \n",cantm);
return 0;
}


¡¡¡¡ Saluditos! ..... !!!!


REEDITADO.

rir3760

Cita de: leosansan en  4 Enero 2014, 19:49 PMLo que suucede no es nada raro, es lo habitual en un scanf dentro de un bucle especialmente. Ocurre porque el último ENTER que introduces por teclado se queda en lo que se llama memoria intermedia o buffer, de forma que al corre el programa un bucle y encontrarse con otro scanf, como se había quedado con el ENTER en memoria, ejecuta la siguiente instrucción que requiera de un ENTER, lo tenía en memoria y antes de coger  nuevos datos suelta ese que tiene.

[...]

Una forma simple, en este caso, es lo que te comente de dejar un espacio en blanco en el scanf antes de escribir el %c.
Esa es la solucion pero, por alguna razón, no la agregaste a tu programa. La sentencia en cuestión debe ser:
scanf(" %c",&sex);

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

leosansan

Cita de: rir3760 en  4 Enero 2014, 20:11 PM
Esa es la solucion pero, por alguna razón, no la agregaste a tu programa. La sentencia en cuestión debe ser:
scanf(" %c",&sex);

Un saludo

Gracias por estar siempre al quite. Eso pasa por  :-X :-X :-X

Un fuerte abrazo, maestro.


¡¡¡¡ Saluditos! ..... !!!!



P.D: Ya reedite el mensaje anterior.

psycho248

 :o Cierto!! muy sencillo. Muchas Gracias. Lo recordaré de ahora en adelante
:xD

dato000

Finalmente, la solución más facil al jodido fflush!!!!



gracias me estaba matando con fgets, getchar, fscanf, sscanf porque siempre pasa con este maldito buffer,  :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:

Magía magía pura!!! muchas gracias no imaginaba algo tan pero tan complicado de una manera tan simple, con una solución que me deja casi extasiado  ;-) ;-) ;-) ;-)

Este post deberia ser parte de las referencias al de "no se debe hacer en C..." porque es muy facil, muy básico y muy simple de implementar.