viernes, 25 de enero de 2019

Ejercicios resueltos en C. Funciones. Paso por valor y por referencia

En lenguaje C, es muy importante conocer cómo se trabaja con funciones, por ejemplo. Antes de entrar en materia con ejercicios que he resuelto, permitirme presentar la siguiente imagen, que bajo mi punto de vista es más que ilustrativa sobre en qué consiste un paso por valor o un paso por referencia y la importancia de utilizar un método u otro en función de nuestro objetivo.


Ejercicio 1: Escribir una función que sume dos números. Implemente un programa que la utilice.


#include <stdio.h>



int main () {

    int a, b;

    printf ("Numero 1: \n");

    scanf ("%d",&a);

    printf ("Numero 2: \n");

    scanf ("%d",&b);

 

    printf ("Resultado : %d",suma(a,b));

 

 

    return 0;

}



int suma (int a, int b) {

    return a+b;

}

</pre>




Ejercicio 2: Escribir un programa que reciba como argumento un conjunto de números. Calcular la media mediante una función.



#include <stdio.h>

float media (int *l,int n);
int main (int argc, char ** argv) {
    int i;
    int *lista;
    
    lista=(int *)malloc(sizeof(int *)*(argc-1)); // -1 al ser INT; +1 al ser CHAR
    if (lista == NULL) {
        printf ("ERROR");
        return 1;
    }
    
    for (i=0;i<argc;i++) {
        lista=atoi(argv[i]);
    }
    printf ("Media: %f",media(lista,(argc-1)));
    
    
    return 0;
}


float media (int *l,int n) {
    int i, suma =0;
    for (i=0;i<n;i++) {
        suma+=l[i];
    }
    return ((float)suma/(float)n);
}


Ejercicio 3: Escribir un programa que reciba una serie de cadenas de caracteres como argumentos. El programa deberá concatenarlas y dar la vuelta a la cadena resultante. La cadena que almacene la concatenación de los argumentos debe utilizar la memoria justa y necesaria.



  



#include <stdio.h>

int main (int argc, char **argv) {
    char *cadena;
    int i,largo,temp;
    
    // ¿Cuanto ocupa?
    for (i=0;i<argc;i++) {
        largo+=strlen(argv[i]);
    }
    
    // Realizo la reserva de memoria para almacenar, +1 fin de cadena
    cadena=(char *)malloc(sizeof(char)*(largo+1));
    strcpy (cadena,""); // Quito los espacios en blanco
    if (cadena == NULL) {
        printf ("Se produjo un error al reservar la memoria\n");
        return 1;
    }
    
    // Almacenamos argv en cadena
    for (i=0;i<argc;i++) {
        cadena=strcat(cadena,argv[i]);
    }
    
    printf ("\nLa cadena original es: %s\n",cadena);
    // Por último, damos la vuelta a la cadena resultante.
    for (i=0;i<strlen(cadena)/2;i++) {
        temp = cadena [i];
        cadena[i]=cadena[strlen(cadena)-1-i];
        cadena[strlen(cadena)-1-i]=temp;
    }
    
    printf ("\n-------\n");
    printf ("La cadena alterada es: %s",cadena);
    
    
    return 0;
}