elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con while
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con while  (Leído 1,871 veces)
psycho248

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Problema con while
« 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í.
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 Desconectado

Mensajes: 1.314


Ver Perfil
Re: Problema con while
« Respuesta #1 en: 4 Enero 2014, 08:05 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:






« Última modificación: 7 Enero 2014, 22:04 pm por leosansan » En línea

psycho248

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Problema con while
« Respuesta #2 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:
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Problema con while
« Respuesta #3 en: 4 Enero 2014, 19:49 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
  1. //Definir el número de mujeres que hay en n cantidad de personas
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. int main(int argc, char *argv[])
  5. {
  6.    int cant, cantm=0, cont=1;
  7.    char sex;
  8.    printf("Ingrese la cantidad de personas\n");
  9.    scanf("%d",&cant);
  10.    while (cont<=cant)
  11.    {
  12.        printf("Ingrese el sexo de la persona %d \n",cont);
  13.        scanf(" %c",&sex);
  14.            if(sex=='f' || sex=='F')
  15.                cantm++;
  16.        cont++;
  17.    }
  18.    printf("La cantidad de mujeres es: %d \n",cantm);
  19. return 0;
  20. }
  21.  

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


REEDITADO.
« Última modificación: 4 Enero 2014, 20:15 pm por leosansan » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Problema con while
« Respuesta #4 en: 4 Enero 2014, 20:11 pm »

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:
Código
  1. scanf(" %c",&sex);

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 Desconectado

Mensajes: 1.314


Ver Perfil
Re: Problema con while
« Respuesta #5 en: 4 Enero 2014, 20:18 pm »

Esa es la solucion pero, por alguna razón, no la agregaste a tu programa. La sentencia en cuestión debe ser:
Código
  1. 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.
En línea

psycho248

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Problema con while
« Respuesta #6 en: 4 Enero 2014, 20:22 pm »

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

dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Problema con while
« Respuesta #7 en: 4 Enero 2014, 21:09 pm »

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.
En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema BlueZScanner y problema de conexión
Hacking Mobile
Kasswed 3 6,363 Último mensaje 6 Mayo 2006, 22:04 pm
por Gospel
Problema Css o problema con el sidebar
Desarrollo Web
gaboomsk8 6 3,606 Último mensaje 27 Diciembre 2011, 21:56 pm
por gaboomsk8
Problema :(
Windows
Margrm 5 3,379 Último mensaje 3 Diciembre 2021, 18:20 pm
por Randomize
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines