ayuda con mi source

Iniciado por 0x3c, 2 Enero 2013, 17:39 PM

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

0x3c

Hola un usuario de este foro($Edu$) me sugirio que hiciera una calculadora, asi que me puse a practicar y el codigo resultante fue este:


#include <stdio.h>

int main()
{
 float val1,val2; /* declaro las variables que almacenaran los numeros/valores con que se va a trabajar */
 char c; /* declaro la variable que almacenara el signo/operador '+','*','/' o '-' */
 char op; /* declaro la variable que usare para las opciones */
 
 puts("Elige una opcion:"); /* le digo al usuario cuales son las opciones disponibles */
 puts("1 = Sumar");
 puts("2 = Restar");
 puts("3 = Multiplicar");
 puts("4 = Dividir");
 
 op=getchar(); /* le paso los parametros de la variable o a la funcion getchar() */
 if(op == '1'); /* si o igual a '1' */
 puts("As elegido sumar"); /* informo al usuario la opcion que ha elegido */
 scanf("%f%c%f",&val1,&c,&val2); /* almaceno los numeros/valores y el signo operador */
 if(c == '+'); /* lee el signo/operador y si es igual a + que haga lo de abajo */
 printf("%f",val1 + val2); /* y finalmente realizo la operacion elegida he imprimo el resultado */
 
 op=getchar();
 if(op == '2'); /* lo mismo que arriba xD */
 puts("As elegido restar!");
 scanf("%f%c%f",&val1,&c,&val2);
 printf("%f",val1 - val2);
 
 op=getchar();
 if(op == '3');
 puts("As elegido multiplicar!");
 scanf("%f%c%f",&val1,&c,&val2);
 if(c == '*');
 printf("%f",val1 * val2);
 
 op=getchar();
 if(op == '4');
 puts("As elegido dividir!");
 scanf("%f%c%f",&val1,&c,&val2);
 if(c == '/');
 printf("%f",val1 / val2);
 
 return(0);
}


pero ahora tengo un problema...cuando se muestran las opciones todo anda bien pero luego se vuerve un desastre...


1 = Sumar
2 = Restar
3 = Multiplicar
4 = Dividir
1
As elegido sumar                                                                                                              
22 + 30                                                                                                                      
21.999986As elegido restar!


ayuda y gracias de ante mano
Si Vis Pacem, Para Bellum.

Another Legend Has Fallen

avesudra

#1
Tiene toda la pinta de ser por que se ha llenado el buffer y se ha vuelto loco :rolleyes: . O limpias el buffer de esta manera:
while(c=getchar() != '\n'&& c!= EOF);
Poniendo el código anterior antes de cada scanf.
O usando fgets + sscanf(para evitar que se llene el buffer)(Este código lo puso Eternal Idol en su momento):
#include <stdio.h>

int main(int argc, char **argv)
{
   int opcion;

   do
   {
       printf("Opcion: ");
       char linea[80];
       fgets(linea, sizeof(linea), stdin);
       sscanf(linea, "%d",&opcion);
   }
   while(opcion!=0);

   return 0;
}

Revisa este post que está en las chinchetas:     |Lo que no hay que hacer en C/C++. Nivel basico|
Regístrate en

0x3c

bueno gracias por hecharle un ojo a mi code reduje el codigo tanto como pude y todavia sigo teniendo problemas :/ quite las lineas donde aparecia getchar() y nada le quite los ; a las sentencias que contiene condicionales(eso tambien era un error) y nada....seguire tratando hasta que el codigo me funcione tomare tu consejo...








saludos
Si Vis Pacem, Para Bellum.

Another Legend Has Fallen

leosansan

Cita de: n3t_3rr0r en  2 Enero 2013, 19:30 PM
bueno gracias por hecharle un ojo a mi code reduje el codigo tanto como pude y todavia sigo teniendo problemas :/ quite las lineas donde aparecia getchar() y nada le quite los ; a las sentencias que contiene condicionales(eso tambien era un error) y nada....seguire tratando hasta que el codigo me funcione tomare tu consejo...
Pues quitando los getchar, los punto y coma y "poniendo las llaves a los if" funciona ..... eso sí, le añadí un else por si se equivocan de signo y poco más:
Código (cpp) [Seleccionar]
#include <stdio.h>

int main()
{
      float val1,val2; /* declaro las variables que almacenaran los numeros/valores con que se va a trabajar */
      char c; /* declaro la variable que almacenara el signo/operador '+','*','/' o '-' */
      char op; /* declaro la variable que usare para las opciones */

      puts("Elige una opcion:"); /* le digo al usuario cuales son las opciones disponibles */
      puts("1 = Sumar");
      puts("2 = Restar");
      puts("3 = Multiplicar");
      puts("4 = Dividir");

      op=getchar(); /* le paso los parametros de la variable o a la funcion getchar() */
      if(op == '1'){/* si o igual a '1' */
        puts("As elegido sumar"); /* informo al usuario la opcion que ha elegido */
        scanf("%g%c%g",&val1,&c,&val2); /* almaceno los numeros/valores y el signo operador */
        if(c == '+') /* lee el signo/operador y si es igual a + que haga lo de abajo */
            printf("%g",val1 + val2); /* y finalmente realizo la operacion elegida he imprimo el resultado */
        else
            puts("Error en el signo");
      }
      if(op == '2'){/* lo mismo que arriba xD */
        puts("As elegido restar!");
        scanf("%g%c%g",&val1,&c,&val2);
        if(c == '-')
            printf("%g",val1 - val2);
        else
            puts("Error en el signo");
    }
    if(op == '3'){
        puts("As elegido multiplicar!");
        scanf("%g%c%g",&val1,&c,&val2);
        if(c == '*')
            printf("%g",val1 * val2);
        else
            puts("Error en el signo");
    }

      if(op == '4'){
        puts("As elegido dividir!");
        scanf("%g%c%g",&val1,&c,&val2);
        if(c == '/')
            printf("%g",val1 / val2);
        else
            puts("Error en el signo");
      }
    return(0);
}

Saluditos!. ......  :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:

0x3c

muchisimas gracias! de verdad funciono :D ahora tengo unas dudas sobre las modificaciones que hiciste..

1- ese { que usaste lo usaste por que es necesario para el condicional?

if(op == '1'){

2- cambiaste el indentificador de la variable es decir cambiaste pusiste %g en vez de %f, por que? y como esto no afecta el funcionamiento del code?


scanf("%g%c%g",&val1,&c,&val2);


saludos y gracias
Si Vis Pacem, Para Bellum.

Another Legend Has Fallen

durasno

#5
Citar1- ese { que usaste lo usaste por que es necesario para el condicional?

Código:

if(op == '1'){
No es de mala onda pero en cualquier libro, nota, etc. acerca de C explica el uso del condicional if, cuando se abre las llaves y cuando se puede omitir

Citar2- cambiaste el indentificador de la variable es decir cambiaste pusiste %g en vez de %f, por que? y como esto no afecta el funcionamiento del code?
Con solo googlear:
%g: Scan a floating-point number in either normal or exponential notation.


Saludos
Ahorrate una pregunta, lee el man

0x3c

bueno el problema del condicional es que estoy siguiendo un libro y no he legado a esa parte todavia(ha sido mas por pereza que por falta de tiempo) pero seguire practicando...y seguire publicando los codigos, dudas y preguntas que tenga en este foro :D que por cierto me alegra que sea tan activo :P







saludos
Si Vis Pacem, Para Bellum.

Another Legend Has Fallen

leosansan

#7
Cita de: n3t_3rr0r en  3 Enero 2013, 11:24 AM
.......que por cierto me alegra que sea tan activo :P

CitarDe novatillo a novatillo o sea entre tú y yo:
* Si el "cuerpo" del if, else, etc se compone de una sola sentencia no hacen falta las llaves. Fíjate que en el código que te pase hay if que sí tienen llaves -se componen de varias sentencias- y otros que no -sólo contienen una sentencia-.
** Si uso %f para imprimir 2 o 2.5 imprimirá 2.000000 o 2.500000, mientras que usando %g imprimirá 2 o 2.5, es decir "reduce" los decimales a su mínima expresión
*** El uso del "else" es opcional. Lo incluí por si la operación que se entra por teclado no se correspondía con la opción elegida..
Saluditos!. ............ [/size] :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:

0x3c

bueno gracias por aclararme las dudas que tenia...las tendre pendiente para la proxima...







saludos
Si Vis Pacem, Para Bellum.

Another Legend Has Fallen