Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 0x3c en 2 Enero 2013, 17:39 pm



Título: ayuda con mi source
Publicado por: 0x3c en 2 Enero 2013, 17:39 pm
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:

Código:
#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...

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

ayuda y gracias de ante mano


Título: Re: ayuda con mi source
Publicado por: avesudra en 2 Enero 2013, 19:03 pm
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:
Código
  1. 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):
Código
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char **argv)
  4. {
  5.    int opcion;
  6.  
  7.    do
  8.    {
  9.        printf("Opcion: ");
  10.        char linea[80];
  11.        fgets(linea, sizeof(linea), stdin);
  12.        sscanf(linea, "%d",&opcion);
  13.    }
  14.    while(opcion!=0);
  15.  
  16.    return 0;
  17. }
Revisa este post que está en las chinchetas:     |Lo que no hay que hacer en C/C++. Nivel basico|  (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)


Título: Re: ayuda con mi source
Publicado por: 0x3c 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...








saludos


Título: Re: ayuda con mi source
Publicado por: leosansan en 2 Enero 2013, 20:20 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
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.      float val1,val2; /* declaro las variables que almacenaran los numeros/valores con que se va a trabajar */
  6.      char c; /* declaro la variable que almacenara el signo/operador '+','*','/' o '-' */
  7.      char op; /* declaro la variable que usare para las opciones */
  8.  
  9.      puts("Elige una opcion:"); /* le digo al usuario cuales son las opciones disponibles */
  10.      puts("1 = Sumar");
  11.      puts("2 = Restar");
  12.      puts("3 = Multiplicar");
  13.      puts("4 = Dividir");
  14.  
  15.      op=getchar(); /* le paso los parametros de la variable o a la funcion getchar() */
  16.      if(op == '1'){/* si o igual a '1' */
  17.        puts("As elegido sumar"); /* informo al usuario la opcion que ha elegido */
  18.        scanf("%g%c%g",&val1,&c,&val2); /* almaceno los numeros/valores y el signo operador */
  19.        if(c == '+') /* lee el signo/operador y si es igual a + que haga lo de abajo */
  20.            printf("%g",val1 + val2); /* y finalmente realizo la operacion elegida he imprimo el resultado */
  21.        else
  22.            puts("Error en el signo");
  23.      }
  24.      if(op == '2'){/* lo mismo que arriba xD */
  25.        puts("As elegido restar!");
  26.        scanf("%g%c%g",&val1,&c,&val2);
  27.        if(c == '-')
  28.            printf("%g",val1 - val2);
  29.        else
  30.            puts("Error en el signo");
  31.    }
  32.    if(op == '3'){
  33.        puts("As elegido multiplicar!");
  34.        scanf("%g%c%g",&val1,&c,&val2);
  35.        if(c == '*')
  36.            printf("%g",val1 * val2);
  37.        else
  38.            puts("Error en el signo");
  39.    }
  40.  
  41.      if(op == '4'){
  42.        puts("As elegido dividir!");
  43.        scanf("%g%c%g",&val1,&c,&val2);
  44.        if(c == '/')
  45.            printf("%g",val1 / val2);
  46.        else
  47.            puts("Error en el signo");
  48.      }
  49.    return(0);
  50. }
  51.  
Saluditos!. ......  :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes: :rolleyes:


Título: Re: ayuda con mi source
Publicado por: 0x3c en 3 Enero 2013, 04:47 am
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?

Código:
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?

Código:
scanf("%g%c%g",&val1,&c,&val2);

saludos y gracias


Título: Re: ayuda con mi source
Publicado por: durasno en 3 Enero 2013, 07:10 am
Citar
1- 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

Citar
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?
Con solo googlear:
%g: Scan a floating-point number in either normal or exponential notation.


Saludos


Título: Re: ayuda con mi source
Publicado por: 0x3c en 3 Enero 2013, 11:24 am
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


Título: Re: ayuda con mi source
Publicado por: leosansan en 3 Enero 2013, 17:30 pm
.......que por cierto me alegra que sea tan activo :P

Citar
De 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:


Título: Re: ayuda con mi source
Publicado por: 0x3c en 4 Enero 2013, 02:29 am
bueno gracias por aclararme las dudas que tenia...las tendre pendiente para la proxima...







saludos