<> <> Implementar funciones y procedimientos en nuestros programas es una muy buena práctica entre los programadores, debido a que ayuda a mantener organizado el código y nos permite reutilizar funcionalidades en varias partes de nuestro programa. La idea es que se realicen siempre que se pueda. == Procedimientos == Un procedimiento es un fragmento de código cuya tarea es realizar una acción específica y de forma independientemente dentro de nuestro programa. En general los procedimientos se utilizan para resolver algún subproblema dado. La sintaxis es: {{{#!C void nombreprocedimiento (parametros){ ... ... instrucciones ... ... } }}} En donde: * void = El valor que va a retornar * nombreprocedimiento = El nombre del procedimiento, siempre se recomienda usar un nombre representativo a lo que se realizará. * parámetros = la cantidad de parámetros que recibe el procedimiento para su ejecución. Para llamar a un procedimiento debemos escribir el nombre del procedimiento junto a los parámetros dentro de paréntesis. {{{#!C nombre_procedimiento(parametros); }}} Ejemplo: Calcular la base de un triángulo. {{{#!C #include #include void calculaareatriangulo(float _base, float _altura){ float resultado; resultado=((_base*_altura)/2); printf ("El area del triangulo es %.2f", resultado); } int main(void) { float _base, _altura; printf ("Este programa calculara la base de un triangulo\n"); printf ("Ingrese la base para el triangulo: "); scanf ("%f", &_base); printf ("Ingrese la altura para el triangulo "); scanf ("%f", &_altura); calculaareatriangulo(_base, _altura); return 0; } }}} [[attachment:procedimiento1.c|Descarga el ejemplo]] En el ejemplo anterior se puede visualizar que nuestro programa principal (main), hace el llamado al procedimiento calculaareatriangulo que recibe dos parámetros, _base y _altura, requeridos para realizar la tarea de cálculo. También podemos encontrar con mucha frecuencia que los procedimientos sean declarados de la siguiente forma: {{{#!C #include #include void calculaareatriangulo(float _base, float _altura); int main(void) { float _base, _altura; printf ("Este programa calculara la base de un triangulo\n"); printf ("Ingrese la base para el triangulo: "); scanf ("%f", &_base); printf ("Ingrese la altura para el triangulo "); scanf ("%f", &_altura); calculaareatriangulo(_base, _altura); return 0; } void calculaareatriangulo(float _base, float _altura){ float resultado; resultado=((_base*_altura)/2); printf ("El area del triangulo es %.2f", resultado); } }}} [[attachment:procedimiento.c|Descarga el ejemplo]] Es muy recomendable definir todos los procedimientos y funciones antes de la función principal main, el motivo de esto es que en C todas las funciones y procedimientos deben definirse antes de la primera línea de código en que se usa. En caso de que incumplamos ésta norma a la hora de compilar tendremos errores. De forma trivial podremos decir que siempre que escribamos nuestros procedimientos por debajo del main, debemos declararlos de forma que digamos a nuestro programa que alguna parte de nuestro código existe un procedimiento con esa declaración. Con esto tendremos visibilidad completa de todo nuestro programa. == Funciones == Podemos definir que una función es prácticamente lo mismo que un procedimiento excepto por un gran detalle, una función siempre devolverá un valor al programa principal, por contraparte un procedimiento no lo hace. Para llamar a una función debemos primero debemos declarar una variable que será del tipo del retorno de la función, posterior escribimos el nombre de la función y entre paréntesis los parámetros requeridos. {{{#!C int variable; variable=nombre_funcion(parametros); }}} Ejemplo: {{{#!C #include #include void calculaareatriangulo(float _base, float _altura); int main(void) { float _base, _altura, area; printf ("Este programa calculara la base de un triangulo\n"); printf ("Ingrese la base para el triangulo: "); scanf ("%f", &_base); printf ("Ingrese la altura para el triangulo "); scanf ("%f", &_altura); area=calculaareatriangulo(_base, _altura); printf ("El area del triangulo es %.2f", area); return 0; } void calculaareatriangulo(float _base, float _altura){ float resultado; resultado=((_base*_altura)/2); return resultado; } }}} [[attachment:funciones.c|Descarga el ejemplo]] Al igual que los procedimientos, existe la forma de definir todas las funciones desde antes del programa inicial. {{{#!C #include #include float calculaareatriangulo(float _base, float _altura){ float resultado; resultado=((_base*_altura)/2); return resultado; } int main(void) { float _base, _altura, resultado; printf ("Este programa calculara la base de un triangulo\n"); printf ("Ingrese la base para el triangulo: "); scanf ("%f", &_base); printf ("Ingrese la altura para el triangulo "); scanf ("%f", &_altura); resultado=calculaareatriangulo(_base, _altura); printf ("El area del triangulo es %.2f", resultado); return 0; } }}} [[attachment:funciones1.c|Descarga el ejemplo]] == Parámetros == Algo muy importante para los procedimientos y funciones son los parámetros. Los parámetros son valores que se traspasan a un procedimiento o función para que puedan ser usados como valores propios de ese fragmento de programa. Algo muy importante de considerar es que para utilizar los parámetros en un procedimiento o función debemos declarar el tipo de dato y su identificador, de la misma forma que declaramos una variable. Además la cantidad de variables que se envían deben ser igual en cantidad, orden y tipo a las variables que reciben. Saber que la variable que se recibe tiene un ámbito local dentro del procedimiento, es decir solo la puede usar ese procedimiento, en la función cabe la posibilidad de retornar dicho valor. Si volvemos a mirar los ejemplos de procedimientos y funciones que calculan el área de un triangulo, se están pasando los parámetros _base y _altura, si nos percatamos delante de cada uno de estos parámetros definimos el tipo de dato a utilizar. Procedimiento {{{ void calculaareatriangulo(float _base, float _altura) }}} Función {{{ float calculaareatriangulo(float _base, float _altura) }}} Es muy importante respetar el orden del traspaso, de lo contrario esperaremos resultados inesperados o fuera de lugar. '''IMPORTANTE:''' los identificadores (variables, nombres, etc.) son palabras usadas por nosotros para orientarnos (lenguaje humano), el computador maneja celdas de memoria, por lo que para él, da igual como se llamen en el programa, en las funciones y en los procedimientos. Existen dos formas de pasar los parámetros a un procedimiento o función, por valor o por referencia. * Un paso de parámetros por valor significa reciben los valores indicados para poder trabajar con ellos, Ejemplo Para un procedimiento: {{{ void areatriangulo (float _base, float _altura) }}} Para una función: {{{ float areatriangulo (float _base, float _altura) }}} * Un paso de parámetro por referencia no contiene directamente sus datos; contiene una referencia a ellos. Al pasar una variable a una funcion por referencia lo que hacemos es pasar un puntero a la direccion en memoria en la que se localiza la variable en si, por lo que al modicar la informacion mediante el apuntador en el metodo al que fue enviada esta sera modificada en todos los ambitos ya que en realidad modificamos la variable original, de hecho la unica ya que mediante esta forma no se hace otra copia de la variable. {{{#!C #include #include int sumarXvalor(int a,int b); void sumarXreferencia(int a,int b,int *resultado); int main(){ int a=5; int b=2; int resultado=0; printf("Los valores son: %i y %i \n",a,b); printf("Paso de Parametros por Valor\n"); resultado = sumarXvalor(a,b); printf("Resultado: %i: \n",resultado); printf("\nPaso de Parametros por Referencia\n"); printf("Pasamos el valor de posicion en memoria de la variable resultado: %p\n",&resultado); sumarXreferencia(a,b,&resultado); printf("Resultado: %i: ",resultado); return 0; } int sumarXvalor(int a, int b){ return a+b; } void sumarXreferencia(int a,int b,int *resultado){ *resultado = a + b; } }}} [[attachment:parametros.c | Descarga el ejemplo]]