Probelma en C. Ayuda!!!

Iniciado por jhonsc, 14 Enero 2012, 15:12 PM

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

jhonsc

Buenas, estoy aprendiendo C (tengo un nivel muy bajo), y al hacer un programa con este código:

#include <stdio.h>

main(int argc, char *argv[])
{
  char n1, n2, operador;
  int resultado;
  n1=atoi(argv[1]);
  operador=atoi(argv[2]);
  n2=atoi(argv[3]);
  if (operador=='+')
  {
     resultado=n1+n2;
     printf("El resultado de sumar %d y %d es: %d\n", n1, n2, resultado);
     salir();
  }
  if (operador=='-')
  {
    resultado=n1-n2;
    printf("El resultado de restar %d y %d es: %d\n", n1, n2, resultado);
    salir();
  }
  if (operador=='*')
  {
    resultado=n1*n2;
    printf("El resultado de multiplicar %d y %d es: %d\n", n1, n2, resultado);
    salir();
  }
  if (operador=='/')
  {
    resultado=n1/n2;
    printf("El resultado de dividir %d y %d es: %d\n", n1, n2, resultado);
    salir();
  }
  if (operador!='+' && operador!='-' && operador!='*' && operador!='/')
  {
    printf("Operador no reconocido. Utilize uno de los siguientes operadores:\n"
           "-Suma:             \"+\"\n"
           "-Resta:            \"-\"\n"
           "-Multiplicación:   \"*\"\n"
           "-División:         \"/\"\n"
           "Utilize los operadores con el siguiente formato: número operador número.\n");
    salir();
  }
  }

int salir()
{
  return 0;
}

...no obtengo el resultado esperado. En vex de esto obtengo el mensaje de que no he introducido ningún operador:

$ 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.
"Vive rápido, muere joven y deja un bonito cadáver"
"Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
"Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad."

Gallu

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...


#include <stdio.h>
#include <string.h>

main(int argc, char *argv[])
{
char operador;
int resultado = 0;
int n1 = 0 , n2 = 0;

n1=atoi(argv[1]);
//operador=atoi(argv[2]);
strcpy(&operador , argv[2]) ;

n2=atoi(argv[3]);
if (operador=='+')
{
    resultado = n1 + n2;
    printf("El resultado de sumar %d y %d es: %d\n", n1, n2, resultado);
    salir();
}
if (operador=='-')
{
   resultado=n1-n2;
   printf("El resultado de restar %d y %d es: %d\n", n1, n2, resultado);
   salir();
}
if (operador=='*')
{
   resultado=n1*n2;
   printf("El resultado de multiplicar %d y %d es: %d\n", n1, n2, resultado);
   salir();
}
if (operador=='/')
{
   resultado=n1/n2;
   printf("El resultado de dividir %d y %d es: %d\n", n1, n2, resultado);
   salir();
}
if (operador!='+' && operador!='-' && operador!='*' && operador!='/')
{
   printf("Operador no reconocido. Utilize uno de los siguientes operadores:\n"
          "-Suma:             \"+\"\n"
          "-Resta:            \"-\"\n"
          "-Multiplicación:   \"*\"\n"
          "-División:         \"/\"\n"
          "Utilize los operadores con el siguiente formato: número operador número.\n");
   salir();
}
}

int salir()
{
return 0;
}
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

rir3760

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:
operador = argv[2][0];

Un saludo

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Xandrete

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!

jhonsc

No me lo tomo a mal para nada, tranquilo. Gracias por la ayuda!
"Vive rápido, muere joven y deja un bonito cadáver"
"Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
"Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad."

jhonsc

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:

#include <stdio.h>
#include <string.h>

main(int argc, char *argv[])
{
float n1, n2, resultado;
n1=atoi(argv[1]);
n2=atoi(argv[2]);
resultado = n1 + n2;
printf("El resultado de sumar %f y %f es: %f\n", n1, n2, resultado);
salir();
}

int salir()
{
return 0;
}

El resultado es esta:

$ ./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:

$ ./pam 3.5 + 3.4
El resultado de sumar 3.500000 y 3.400000 es: 6.900000
$
"Vive rápido, muere joven y deja un bonito cadáver"
"Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
"Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad."

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

jhonsc

#7
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)

#include <stdio.h>
#include <string.h>
main(int argc, char *argv[])
{
double n1, n2, n3;
n1=atof(argv[1]);
n2=atof(argv[2]);
n3=atof(argv[3]);
printf("La variable n1= %f\nLa variable n2= %f\nLa variable n3= %f\n", n1, n2, n3 );
return 0;
}

Salida:


$ ./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.
"Vive rápido, muere joven y deja un bonito cadáver"
"Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
"Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad."

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

jhonsc

Muchísimas gracias de nuevo.
"Vive rápido, muere joven y deja un bonito cadáver"
"Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
"Hay una fuerza motriz más poderosa que el vapor, la electricidad y la energía atómica: la voluntad."