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
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| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)
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
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:#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:
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
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
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
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:
bueno gracias por aclararme las dudas que tenia...las tendre pendiente para la proxima...
saludos