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; }