Ayuda para instrucciones if-else y while()

Iniciado por edr89, 4 Mayo 2013, 17:49 PM

0 Miembros y 1 Visitante están viendo este tema.

edr89

Hola, recien empiezo a trabajar con C y necesito crear un programa que cuente el numero de ceros que hay en una cadena que ingresa el usuario, es decir, el usuario teclea 5,4,3,8,0,1,7,3, al final la aplicacion debe de decir el numero total de ceros es uno, o tres, o cinco, etc.
#include <stdio.h>
int main()
{
int smplnum;
int sumaceros;
sumaceros=0;
char respuesta;
respuesta=' ';
printf("quieres agregar un numero?, escribe s=si, n=no\n");
scanf("%c",&respuesta);
while(respuesta=='s'|| respuesta=='S')
{
printf("Escribe el numero.\n");
scanf("%d",&smplnum);
if(smplnum ==0)
{
           sumaceros=sumaceros+1;
}
else
{

printf("quieres agregar un numero?, escribe s= si, n=no");
scanf("%c",&respuesta);
}
}
printf("el numero de ceros es %d.\n",sumaceros);
}


Puedo compilar el programa, no me marca ningun error pero al correrlo me pide un numero, si es igual a cero el loop corre y vuelve a preguntar por el nuevo numero pero al teclear un numero distinto de cero la aplicacion pregunta, me da el numero de ceros y ce cierra. El problema esta en :
printf("quieres agregar un numero?, escribe s= si, n=no");
scanf("%c",&respuesta);

el scanf de la condicion else se lo salta,  no me deja teclear mas numero y termina el programa.
Por favor si alguien tiene idea de que sucede agradeceré sus comentarios.
Saludos!


leosansan

#1
Ya funciona, se trataba de limpiar el buffer bien dejando un espacio en blanco antes del %c del mismo scanf, que es la opción que te dejo:

Código (cpp) [Seleccionar]

#include <stdio.h>
int main(){
    int smplnum;
    int sumaceros=0;
    char respuesta=' ';
    printf("quieres agregar un numero?, escribe s=si, n=no\n");
    scanf("%c",&respuesta);
    while(respuesta=='s'|| respuesta=='S') {
        printf("Escribe el numero.\n");
        scanf("%d",&smplnum);
        if(smplnum ==0)
            sumaceros++;
        else {
            printf("quieres agregar un numero?, escribe s= si, n=no");
            scanf(" %c",&respuesta);
        }
    }
    printf("el numero de ceros es %d.\n",sumaceros);
    return 0;
}


Saluditos!. ....  

edr89

Cita de: leosansan en  4 Mayo 2013, 18:04 PM
Ya funciona, se trataba de limpiar el buffer bien dejando un espacio en blanco antes del %c del mismo scanf, que es la opción que te dejo:

Muchas gracias, funciona!!  ;-)
En general, cada que se usa scanf, ¿debo dejar un espacio? se me hizo raro que el primer scanf, la pregunta inicial, no tiene ese espacio y corre bien, deberia dejarle tambien ese espacio en blanco?

Gracias!!  ;)

amchacon

Bueno tiene una explicación. Al principio estás leyendo caracteres, de modo que el salto de línea se suprime automáticamente.

Después lees un número, y por un error del scanf, se lee solo la cifra y se deja el salto de línea en el buffer.

De modo que cuando llega a la siguiente pregunta, lo primero que encuentra es el salto de linea. De modo que da la lectura por terminada.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

edr89

ok, mas o menos entiendo y de hecho me acabo de dar cuenta que cuando el numero es cero en automatico pide el siguiente numero y nunca termina el ciclo hasta que tecleo uno distinto de cero es cuando pregunta de nuevo y por fin puedo salir, es decir, cuando el usuario teclea 0 tiene que preguntar de nuevo, quieres agregar otro numero?, cosa que no hace.

¿Tengo que poner otro if despues de la validacion de cero para que el programa pregunte de nuevo si quieres agregar un numero? Estoy intentando agregar simplemente printf y scanf pero me da error al compilar:

Citar'else' without a previous 'if'

amchacon

Fácil, partiendo del código que ha puesto Leon. Quitale el else.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

mavicadi

#6
Pero de la manera que lo ha hecho, simplemente comparará si el número que ha introducido es un 0 y no si contiene ceros no ?!

Bueno nada, creo que ya lo he entendido. Fallo mio.

Los mensajes no se pueden borrar ?!

Un saludo!

edr89

Cita de: amchacon en  5 Mayo 2013, 00:49 AM
Fácil, partiendo del código que ha puesto Leon. Quitale el else.

ok, segun entendi:
#include <stdio.h>
int main(){
   int smplnum;
   int sumaceros=0;
   char respuesta=' ';
   printf("Ingresar numero?, s=si, n=no\n");
   scanf("%c",&respuesta);
   while(respuesta=='s'|| respuesta=='S') {
       printf("Escribe el numero.\n");
       scanf("%d",&smplnum);
       if(smplnum ==0)
           sumaceros=sumaceros+1;
           printf("quieres agregar otro numero?, escribe s= si, n=no\n");
           scanf(" %c",&respuesta);
       if(respuesta=='s')
           printf("Escribe el numero.\n");
           scanf("%d",&smplnum);
       if(smplnum ==0)
           sumaceros=sumaceros+1;
           printf("quieres agregar otro numero?, escribe s= si, n=no\n");
           scanf(" %c",&respuesta);
   }
   printf("el numero de ceros es %d.\n",sumaceros);
   return 0;
}


cualquiera sea el numero pregunta si quieres añadir otro, en realidad no importa si es entero, natural. La cosa es que cuente todos los ceros de la cadena de datos.

mavicadi

Ya he entendido el funcionamiento del programa, antes me había confundido.

Bueno, a simple vista creo que los dos últimos if te sobran, ya que seguirás dentro del while hasta que la respuesta sea NO, entonces con preguntar al final te vale.

De todos modos he probado el código y cuando deseas salir, la primera vez que le das a NO, el programa sigue esperando.

Yo lo haría de la manera que ha puesto leonsansan pero sin el "else" tal y como ha comentado amchacon.

Quedaría así :

#include <stdio.h>
int main(){
   int smplnum;
   int sumaceros=0;
   char respuesta=' ';
   printf("Ingresar numero?, s=si, n=no\n");
   scanf("%c",&respuesta);
   while(respuesta=='s'|| respuesta=='S') {
       printf("Escribe el numero.\n");
       scanf("%d",&smplnum);
       if(smplnum ==0)
        sumaceros=sumaceros+1;
        printf("quieres agregar otro numero?, escribe s= si, n=no\n");
        scanf(" %c",&respuesta);
   }

   printf("el numero de ceros es %d.\n",sumaceros);
   return 0;
}

edr89