Autor
|
Tema: Problema con while (Leído 1,871 veces)
|
psycho248
Desconectado
Mensajes: 11
|
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; }
|
|
« Última modificación: 4 Enero 2014, 16:27 pm por psycho248 »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
|
|
« Última modificación: 7 Enero 2014, 22:04 pm por leosansan »
|
En línea
|
|
|
|
psycho248
Desconectado
Mensajes: 11
|
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
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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 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:
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: 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:
//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.
|
|
« Última modificación: 4 Enero 2014, 20:15 pm por leosansan »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Lo 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:
Un saludo
|
|
|
En línea
|
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
Desconectado
Mensajes: 1.314
|
Esa es la solucion pero, por alguna razón, no la agregaste a tu programa. La sentencia en cuestión debe ser:
Un saludo Gracias por estar siempre al quite. Eso pasa por
Un fuerte abrazo, maestro.¡¡¡¡ Saluditos! ..... !!!! P.D: Ya reedite el mensaje anterior.
|
|
|
En línea
|
|
|
|
|
|
|
|