Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Orb en 18 Enero 2016, 14:25 pm



Título: Duda tonta de parámetros
Publicado por: Orb en 18 Enero 2016, 14:25 pm
Buenas, tengo este ejercicio :
escribir un programa que reciba dos números como parámetros y muestre por pantalla la syma y la resta de esos dos valores.

Y esto es lo que hice :

Código
  1. #include <stdio.h>
  2. int operacion(int a, int b){
  3. a=2;
  4. b=3;
  5. int s,r;
  6. s=a+b;
  7. r=a-b;
  8. printf("\nLa suma es%d\n", s);
  9. printf("\nLa resta es%d\n", r);
  10. }
  11. int main(void){
  12. int x,y;
  13. operacion(x,y);
  14. }
  15.  

Mi duda es simplemente si está bien hecho acorde a lo que pide el enunciado del ejercicio, es decir, si realmente lo hice bien y por parámetros tal como pide el problema o tiene otra forma de ser hecho.

UN saludo


Título: Re: Duda tonta de parámetros
Publicado por: fary en 18 Enero 2016, 14:47 pm
Esta mal.

Lee esto sobre los argumentos del main.

http://decsai.ugr.es/~jfv/ed1/c/cdrom/cap6/cap64.htm

Saludos.


Título: Re: Duda tonta de parámetros
Publicado por: 0xFer en 18 Enero 2016, 15:16 pm
Hola.

Lo correcto es inicializar los valores del parámetro antes de invocar a la función:

Código
  1. int x = 2,y = 3;
  2. operacion(x,y);


Título: Re: Duda tonta de parámetros
Publicado por: Yoel Alejandro en 18 Enero 2016, 15:19 pm
El problema que tienes es que en el cuerpo de la función operacion() no estás pidiendo los valores al usuario final, sino que los estás estableciendo tú mismo como a=2 y b=3.

Usando la función de entrada scanf() para pedir los valores, el programa quedaría como:

Código
  1. #include <stdio.h>
  2. int operacion(int a, int b) {
  3.  
  4. int s,r;
  5.  
  6. s=a+b;
  7. r=a-b;
  8.  
  9. printf("a = %d, b = %d\n", a, b);
  10.  
  11. printf("\nLa suma es: %d\n", s);
  12. printf("\nLa resta es: %d\n", r);
  13.  
  14. return 0;
  15. }
  16.  
  17. int main(void){
  18.  
  19. int x,y;
  20.  
  21. printf("Intro primer valor: ");
  22. scanf("%d", &x);
  23. printf("Intro segundo valor: ");
  24. scanf("%d", &y);
  25.  
  26. operacion(x,y);
  27. }
  28.  

Otro detalle, no se si lo notaste es que faltó el valor de retorno de operacion() el cual se declaró como int. Por eso debes añadir la instrucción "return 0" al final del cuerpo de la función.

La salida en pantalla queda como
Citar
Intro primer valor: 3
Intro segundo valor: 5
a = 3, b = 5

La suma es: 8

La resta es: -2

----------------------------------
Saludos, Yoel



0xFer dijo:

Lo correcto es inicializar los valores del parámetro antes de invocar a la función:

Bueno 0xFer, yo diría antes de invocar a la función operacion(), o también sería válido dentro del cuerpo de ella.

Una tercera alternativa sería usando los argc y argv[] que sugirió fary.

Saludos, Yoel.


Título: Re: Duda tonta de parámetros
Publicado por: fary en 18 Enero 2016, 15:37 pm
Le estais dando una respuesta erronea, la solución a su ejercicio es esta:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6.    if (argc != 3)
  7.    {
  8.        printf("Error, no introduciste los parametros.");
  9.    }else{
  10.        int n1 = atoi(argv[1]);
  11.        int n2 = atoi(argv[2]);
  12.  
  13.        printf("La suma de los numeros es: %i\n", n1 + n2);
  14.        printf("La resta de los numeros es: %i\n", n1 - n2);
  15.    }
  16.    getchar();
  17.    return(0);
  18. }

Salida del programa:

Código:
C:\Users\Juan\Desktop\Ejemplo\bin\Debug>Ejemplo.exe 5 4
La suma de los numeros es: 9
La resta de los numeros es: 1

saludos.


Título: Re: Duda tonta de parámetros
Publicado por: 0xFer en 18 Enero 2016, 15:45 pm
escribir un programa que reciba dos números como parámetros y muestre por pantalla la syma y la resta de esos dos valores.

Si, la solución  que pone fary me parece correcta.


Título: Re: Duda tonta de parámetros
Publicado por: Yoel Alejandro en 18 Enero 2016, 16:19 pm
Le estais dando una respuesta erronea (..)

Fair, ¿por qué es errónea? En todo caso no eres quién mandó el ejercicio, así que no conoces el criterio de lo que se está pidiendo o como se espera hacerlo.

Yo trato de dar la respuesta más amplia posible, no sólo la que encuadra con mi preferencia personal, o la forma como YO lo haría.

Se trata de pedir dos números, y devolver su suma y su resta. Es mi opinión se pueden pedir como argumentos de main(), o de cualquier función auxiliar dentro del programa.

En términos de eficiencia e implementación es diferente, pero estoy tratando de dar una respuesta EN LA MISMA LÍNEA QUE PLANTEÓ ORIGINALMENTE EL USUARIO, es decir, respetando su esfuerzo y criterio original, para que mi respuesta pueda ser realmente útil a él.

En vez de lucirme explicando la manera sensacional COMO YO LO HARÍA, en cuyo caso me estaría respondiendo a mí mismo y no a él.

Saludos, Yoel.


Título: Re: Duda tonta de parámetros
Publicado por: MAFUS en 18 Enero 2016, 16:19 pm
De todas formas tampoco tiene claro como funciona el paso de parámetros a una función.
Ya son unos cuántos que confunden parámetros de función con declaración de variables locales. Si su estudio viene del mismo sitio, en dónde sea que lo hagan, dan las clases muy mal.

Orb, cuándo tu función está declarada cómo
Código
  1. int operacion(int a, int b)
quiere decir que desde donde se la llame se le van a pasar dos enteros, el a y el b, para que dentro de la función se trabaje con ellos. Algo así como:
Código
  1. int operacion(int a, int b) {
  2.    printf("La suma de a y b es %i.", a + b);
  3.    ...
  4.  

En cambio si quisieras que a y b formaran parte de la función pero no deben ser usadas para pasar parámetros en ella:
Código
  1. int operacion() {
  2.    int a = 2;
  3.    int b = 3;
  4.    printf("La suma de a y b es %i.", a + b);
  5.    ...
  6.  

Hacer algo como lo que has puesto:
Código
  1. int operacion(int a, int b) {
  2.    a = 2;
  3.    b = 3;
  4.    ...
  5.  
Es una mala práctica ya que, sea lo que sea que has recibido por a y b, lo sustituyes por tus propios datos. Tu dirás: si así funciona, ¿porqué cambiar? La razón es que para llamar a la función debes pasarle tantos argumentos como así la hayas definido, además si la usa otra persona que no eres tú esperará que funcione de una forma cuándo se encontrará con resultados extraños porqué machacas lo que ella ha querido pasar.

Por otra parte tu función retorna un valor entero. Cuándo las funciones son declaradas con un valor de retorno éstas siempre deben terminar devolviendo un dato de ese tipo, aunqué después no lo uses, como ocurre casi siempre con printf (sí, printf devuelve un dato entero). Las únicas que están exentas de ello son las funciones con retorno tipo void.


Título: Re: Duda tonta de parámetros
Publicado por: Yoel Alejandro en 18 Enero 2016, 16:27 pm
De todas formas tampoco tiene claro como funciona el paso de parámetros a una función.
Ya son unos cuántos que confunden parámetros de función con declaración de variables locales. Si su estudio viene del mismo sitio en dónde sea que lo hagan dan las clases muy mal.

Mafus, por eso dije le dije a Orb que tenía que modificar el cuerpo de operacion() de modo que pidiera los valores por teclado en lugar que establacerlos él mismo como valores fijos.

Y de acuerdo contigo en que si definió la función con retorno int, entonces es necesario poner el return.
Aunque la verdad lo veo innecesario, si fuera por mí la hubiera declarado void y no se requeriría retornar nada, lo cual por cierto estaría más de acuerdo con el propósito original del ejercicio que es devolver los datos por pantalla.

Saludos, Yoel.


Título: Re: Duda tonta de parámetros
Publicado por: Orb en 18 Enero 2016, 16:44 pm
Buenas!

Lo primero gracias por tomaros la molestia de ayudarme.

He estado haciendo todos los ejercicios que se han ido mandando la universidad, pero al llegar a los parámetros ha sido una confusión total.
YO considero a esto un parámetro no sé si estaré equivocado
void suma (int a, int b)
En los apuntes se ponen estos ejemplos, unas en las que es por ejemplo void suma(void) y demás.
También he estado mirando los usos de arc y argv por si pudieran servirme aquí u en otra ocasión pero no acabo de entender su uso.
Arriba declaré los datos porque no pedía el ejercicio que los datos fuesen introducidos por el usuario.

Gracias de nuevo, un saludo

P.D:El return no lo he usado en los 3 meses que llevo aprendiendo, lo que hago lo hago directamente en ubuntu, tendrá algo que ver?


Título: Re: Duda tonta de parámetros
Publicado por: fary en 18 Enero 2016, 17:13 pm
Fair, ¿por qué es errónea? En todo caso no eres quién mandó el ejercicio, así que no conoces el criterio de lo que se está pidiendo o como se espera hacerlo.

Yo trato de dar la respuesta más amplia posible, no sólo la que encuadra con mi preferencia personal, o la forma como YO lo haría.

Se trata de pedir dos números, y devolver su suma y su resta. Es mi opinión se pueden pedir como argumentos de main(), o de cualquier función auxiliar dentro del programa.

En términos de eficiencia e implementación es diferente, pero estoy tratando de dar una respuesta EN LA MISMA LÍNEA QUE PLANTEÓ ORIGINALMENTE EL USUARIO, es decir, respetando su esfuerzo y criterio original, para que mi respuesta pueda ser realmente útil a él.

En vez de lucirme explicando la manera sensacional COMO YO LO HARÍA, en cuyo caso me estaría respondiendo a mí mismo y no a él.

Saludos, Yoel.

Buenas, tengo este ejercicio :
escribir un programa que reciba dos números como parámetros y muestre por pantalla la syma y la resta de esos dos valores.

Yo con esta descripción no entiendo que el programa pida dos números, si no que se le deben pasar como argumento.

Para entender esto no me hace falta mandar yo el ejercicio.

Por otra parte si con ese enunciado lo que quiere el profesor es que el usuario ingrese dos numeros desde la consola que no es lo mismo que un programa reciba dos numeros como parametros estamos ante un profesor pésimo ó por lo menos su forma de expresarse.

saludos.


Título: Re: Duda tonta de parámetros
Publicado por: MAFUS en 18 Enero 2016, 18:20 pm
Orb, los argumentos de la función main, argc y argv, son para acceder a los parámetros que se le pasa al programa como información adicional.

argc es un entero que indica cuántos parámetros se han enviado. El nombre del programa es el primer parámetro y por siempre tendrá un mínimo valor de 1.

argv es un array de cadenas, cada una de ellas es un parámetro pasado al programa, así pues suponiendo la siguiente ejecución de un programa en línea de comandos:

miprogramasuma 1 2

argc valdrá 3, marcando que se han introducido tres parámetros por llamada.
argv[0] será la cadena miprogramasuma
argv[1] será la cadena 1
argv[2] será la cadena 2

Hay que recordar que todo son cadenas, incluso los números que se han pasado como argumentos son cadenas y no se pueden operar matemáticamente sin antes haberlos convertidos a su valor numérico.
También hay que tener en cuenta que, como son argumentos de main, solo son visibles a esta función.
Por último, argc y argv son nombres de variables que pueden ser llamadas de otra forma (p. ej. nargs y argum) pero que por convención tienen estos nombres.