Duda tonta de parámetros

Iniciado por Orb, 18 Enero 2016, 14:25 PM

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

Orb

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 :

#include <stdio.h>
int operacion(int a, int b){
a=2;
b=3;
int s,r;
s=a+b;
r=a-b;
printf("\nLa suma es%d\n", s);
printf("\nLa resta es%d\n", r);
}
int main(void){
int x,y;
operacion(x,y);
}


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

fary

Un byte a la izquierda.

0xFer

Hola.

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

int x = 2,y = 3;
operacion(x,y);
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

Yoel Alejandro

#3
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 (cpp) [Seleccionar]

#include <stdio.h>
int operacion(int a, int b) {

int s,r;

s=a+b;
r=a-b;

printf("a = %d, b = %d\n", a, b);

printf("\nLa suma es: %d\n", s);
printf("\nLa resta es: %d\n", r);

return 0;
}

int main(void){

int x,y;

printf("Intro primer valor: ");
scanf("%d", &x);
printf("Intro segundo valor: ");
scanf("%d", &y);

operacion(x,y);
}


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




Cita de: 0xFer en 18 Enero 2016, 15:16 PM
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.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

fary

Le estais dando una respuesta erronea, la solución a su ejercicio es esta:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        printf("Error, no introduciste los parametros.");
    }else{
        int n1 = atoi(argv[1]);
        int n2 = atoi(argv[2]);

        printf("La suma de los numeros es: %i\n", n1 + n2);
        printf("La resta de los numeros es: %i\n", n1 - n2);
    }
    getchar();
    return(0);
}


Salida del programa:

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.
Un byte a la izquierda.

0xFer

#5
Cita de: Orb en 18 Enero 2016, 14:25 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.
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

Yoel Alejandro

Cita de: fary en 18 Enero 2016, 15:37 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.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

MAFUS

#7
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 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:
int operacion(int a, int b) {
   printf("La suma de a y b es %i.", a + b);
   ...


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:
int operacion() {
   int a = 2;
   int b = 3;
   printf("La suma de a y b es %i.", a + b);
   ...


Hacer algo como lo que has puesto:
int operacion(int a, int b) {
   a = 2;
   b = 3;
   ...

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.

Yoel Alejandro

Cita de: 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.

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.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

Orb

#9
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?