Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jhonsc en 14 Enero 2012, 15:12 pm



Título: Probelma en C. Ayuda!!!
Publicado por: jhonsc en 14 Enero 2012, 15:12 pm
Buenas, estoy aprendiendo C (tengo un nivel muy bajo), y al hacer un programa con este código:
Código
  1. #include <stdio.h>
  2.  
  3. main(int argc, char *argv[])
  4. {
  5.  char n1, n2, operador;
  6.  int resultado;
  7.  n1=atoi(argv[1]);
  8.  operador=atoi(argv[2]);
  9.  n2=atoi(argv[3]);
  10.  if (operador=='+')
  11.  {
  12.     resultado=n1+n2;
  13.     printf("El resultado de sumar %d y %d es: %d\n", n1, n2, resultado);
  14.     salir();
  15.  }
  16.  if (operador=='-')
  17.  {
  18.    resultado=n1-n2;
  19.    printf("El resultado de restar %d y %d es: %d\n", n1, n2, resultado);
  20.    salir();
  21.  }
  22.  if (operador=='*')
  23.  {
  24.    resultado=n1*n2;
  25.    printf("El resultado de multiplicar %d y %d es: %d\n", n1, n2, resultado);
  26.    salir();
  27.  }
  28.  if (operador=='/')
  29.  {
  30.    resultado=n1/n2;
  31.    printf("El resultado de dividir %d y %d es: %d\n", n1, n2, resultado);
  32.    salir();
  33.  }
  34.  if (operador!='+' && operador!='-' && operador!='*' && operador!='/')
  35.  {
  36.    printf("Operador no reconocido. Utilize uno de los siguientes operadores:\n"
  37.           "-Suma:             \"+\"\n"
  38.           "-Resta:            \"-\"\n"
  39.           "-Multiplicación:   \"*\"\n"
  40.           "-División:         \"/\"\n"
  41.           "Utilize los operadores con el siguiente formato: número operador número.\n");
  42.    salir();
  43.  }
  44.  }
  45.  
  46. int salir()
  47. {
  48.  return 0;
  49. }
  50.  
...no obtengo el resultado esperado. En vex de esto obtengo el mensaje de que no he introducido ningún operador:
Código:
$ gcc -o ys pasa.c
$ ./ys 5 + 6
Operador no reconocido. Utilize uno de los siguientes operadores:
-Suma:             "+"
-Resta:            "-"
-Multiplicación:   "*"
-División:         "/"
Utilize los operadores con el siguiente formato: número operador número.
$
Le he dado muchas vueltas al código y no encuentro el error. Muchas gracias por adelantado.


Título: Re: Probelma en C. Ayuda!!!
Publicado por: Gallu en 14 Enero 2012, 17:08 pm
Hola he visto que estabas usando tipos de datos incorrectos para lo que quieres hacer , la variable operador no la puedes recuperar con atoi , recuerda que es un signo , y un signo, he tocado tu código , ahora ya funciona...

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. main(int argc, char *argv[])
  5. {
  6. char operador;
  7. int resultado = 0;
  8. int n1 = 0 , n2 = 0;
  9.  
  10. n1=atoi(argv[1]);
  11. //operador=atoi(argv[2]);
  12. strcpy(&operador , argv[2]) ;
  13.  
  14. n2=atoi(argv[3]);
  15. if (operador=='+')
  16. {
  17.    resultado = n1 + n2;
  18.    printf("El resultado de sumar %d y %d es: %d\n", n1, n2, resultado);
  19.    salir();
  20. }
  21. if (operador=='-')
  22. {
  23.   resultado=n1-n2;
  24.   printf("El resultado de restar %d y %d es: %d\n", n1, n2, resultado);
  25.   salir();
  26. }
  27. if (operador=='*')
  28. {
  29.   resultado=n1*n2;
  30.   printf("El resultado de multiplicar %d y %d es: %d\n", n1, n2, resultado);
  31.   salir();
  32. }
  33. if (operador=='/')
  34. {
  35.   resultado=n1/n2;
  36.   printf("El resultado de dividir %d y %d es: %d\n", n1, n2, resultado);
  37.   salir();
  38. }
  39. if (operador!='+' && operador!='-' && operador!='*' && operador!='/')
  40. {
  41.   printf("Operador no reconocido. Utilize uno de los siguientes operadores:\n"
  42.          "-Suma:             \"+\"\n"
  43.          "-Resta:            \"-\"\n"
  44.          "-Multiplicación:   \"*\"\n"
  45.          "-División:         \"/\"\n"
  46.          "Utilize los operadores con el siguiente formato: número operador número.\n");
  47.   salir();
  48. }
  49. }
  50.  
  51. int salir()
  52. {
  53. return 0;
  54. }
  55.  


Título: Re: Probelma en C. Ayuda!!!
Publicado por: rir3760 en 14 Enero 2012, 17:18 pm
Todo correcto salvo un detalle: no se debe utilizar la función "strcmp" de esa forma ya que "operador" no es un array, solo se puede almacenar en esta un carácter.

Basta con utilizar directamente el valor del carácter argv[2][0] o bien copiar este en la variable operador:
Código
  1. operador = argv[2][0];

Un saludo



Título: Re: Probelma en C. Ayuda!!!
Publicado por: Xandrete en 14 Enero 2012, 19:30 pm
Oh, y otra cosa. No tiene nada que ver con programación en C/C++ pero tengo que decirlo >.<

"Utilice" va con c, no con z. ¡No te lo tomes a mal, por favor! A mí me gustaría que me corrigieran si me equivoco  ;)

¡Saludos!


Título: Re: Probelma en C. Ayuda!!!
Publicado por: jhonsc en 14 Enero 2012, 19:53 pm
No me lo tomo a mal para nada, tranquilo. Gracias por la ayuda!


Título: Re: Probelma en C. Ayuda!!!
Publicado por: jhonsc en 15 Enero 2012, 15:45 pm
Siento salir ahora con otra duda, pero, si quiero sumar dos decimales, y que el resultado se decimal que hago?¿ Esto es lo que llevo:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. main(int argc, char *argv[])
  5. {
  6. float n1, n2, resultado;
  7. n1=atoi(argv[1]);
  8. n2=atoi(argv[2]);
  9. resultado = n1 + n2;
  10. printf("El resultado de sumar %f y %f es: %f\n", n1, n2, resultado);
  11. salir();
  12. }
  13.  
  14. int salir()
  15. {
  16. return 0;
  17. }
  18.  
El resultado es esta:
Código:
$ ./pam 3.5 + 3.4
El resultado de sumar 3.000000 y 3.000000 es: 6.000000
$
Cuando lo que espero es que me salga es:
Código:
$ ./pam 3.5 + 3.4
El resultado de sumar 3.500000 y 3.400000 es: 6.900000
$


Título: Re: Probelma en C. Ayuda!!!
Publicado por: rir3760 en 15 Enero 2012, 16:09 pm
El problema se debe a que estas utilizando la función "atoi" para la conversión y ella es quien descarta (mas bien se detiene al encontrar) la parte decimal.

Sustituye el uso de esa función por "atof", su uso es similar pero retorna un numero de punto flotante (tipo double).

Un saludo


Título: Re: Probelma en C. Ayuda!!!
Publicado por: jhonsc en 15 Enero 2012, 16:25 pm
Ya lo hice y me salió lo siguiente: (este es otro ejemplo, pero el error al utilizar atof es el mismo que con el código completo, lo hago para ahorrar espacio)
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. main(int argc, char *argv[])
  4. {
  5. double n1, n2, n3;
  6. n1=atof(argv[1]);
  7. n2=atof(argv[2]);
  8. n3=atof(argv[3]);
  9. printf("La variable n1= %f\nLa variable n2= %f\nLa variable n3= %f\n", n1, n2, n3 );
  10. return 0;
  11. }
  12.  
Salida:
Código:

$ ./pam 3 4 5
La variable n1= 524288.000000
La variable n2= 0.000000
La variable n3= 262144.000000
$
Como ven, me cambia los números.


Título: Re: Probelma en C. Ayuda!!!
Publicado por: rir3760 en 15 Enero 2012, 18:18 pm
Antes de utilizar una función debes tener acceso a su prototipo y eso se realiza incluyendo el encabezado que corresponda. En el caso de atoi y atof es <stdlib.h>.

Ello porque cuando se llama a una función sin tener acceso al prototipo de esta se asume lo siguiente:

1) El numero de argumentos que recibe esta dado en la llamada.
2) El valor de retorno es int.

Un saludo


Título: Re: Probelma en C. Ayuda!!!
Publicado por: jhonsc en 15 Enero 2012, 18:26 pm
Muchísimas gracias de nuevo.