Sunteți pe pagina 1din 6

PROCEDIMIENTOS, FUNCIONES Y PASO DE PARAMETROS

Conforme seguimos desarrollando programas nos vamos dando cuenta de que el


tamao de stos va aumentando considerablemente, en cuanto realizamos una
aplicacin que haga tres o cuatro operaciones distintas tenemos un cdigo fuente
de un tamao considerable. Adems que a medida que vamos creando
aplicaciones tenemos que repetir muchas veces determinados trozos de cdigo.
En programacin esto se gestiona mediante procedimientos y funciones, muchos
de ellos los importamos en libreras (como la stdio.h) y otros podemos realizarlos
nosotros mismos.
Procedimiento
Un procedimiento es un fragmento de cdigo cuya funcin es la de realizar una tarea especfica independientemente del programa
en el que se encuentre. Con los procedimientos se pueden crear algoritmos de ordenacin de arrays, de modificacin de datos,
clculos paralelos a la aplicacin, activacin de servicios, etc. Prcticamente cualquier cosa puede realizarse desde procedimientos
independientes.
Funcin
Una funcin es exactamente lo mismo que un procedimiento salvo por un detalle, una funcin puede devolver un valor al programa
principal y un procedimiento no. Con las funciones podemos realizar todas las tareas que se hacen con los procedimientos pero
adems pudiendo devolver valores (como por ejemplo el rea de un tringulo).
Estructura y uso
Como se puede ver los conceptos de procedimiento y funcin son bastante similares, incluso podramos definir un procedimiento
como una funcin que no retorna ningn valor. Ambos poseen la misma estructura:
Tipo_Dato_Retorno Nombre (Parmetros){
sentencias;
retorno; (slo en el caso de las funciones)
}
Para un procedimiento el Tipo_Dato_Retorno es siempre void, o lo que es lo mismo, nada. En el caso de las funciones se puede
poner cualquier tipo de dato, int, float, char, etc.
Ahora vamos a plantear un algoritmo que calcule el rea de un tringulo, veamos como se podra hacer mediante un procedimiento
y una funcin:
Procedimiento:
#include <stdio.h>
#include <stdlib.h>

void areatriangulo (void) {
float base, altura;
printf("Introduce base: ");
scanf("%f",&base);
printf("Introduce altura: ");
scanf("%f",&altura);

printf("El rea es: %2.2f \n",(base*altura)/2);
}

int main(int argc, char *argv[]){
areatriangulo();
system("PAUSE");
return 0;
}
Funcin:
#include <stdio.h>
#include <stdlib.h>

float areatriangulo (void) {
float base, altura;
printf("Introduce base: ");
scanf("%f",&base);
printf("Introduce altura: ");
scanf("%f",&altura);
return (base*altura)/2;
}


int main(int argc, char *argv[]){
float area;
area=areatriangulo();
printf("El rea es: %2.2f \n",area);
system("PAUSE");
return 0;
}


Recordemos, un procedimiento siempre se declarar con valor de retorno void y una funcin se declarar con cualquier tipo de
dato como valor de retorno y en su cdigo se aadir la sentencia return y el valor que se desea devolver al programa que lo llama.
Es muy recomendable definir todos los procedimientos y funciones antes de la funcin principal main, el motivo de esto es que en
C todas las funciones y procedimientos deben definirse antes de la primera lnea de cdigo en que se usa. En caso de que
incumplamos sta norma a la hora de compilar tendremos errores.
Para llamar a un procedimiento o funcin debemos hacerlo de la siguiente forma:
En un procedimiento escribimos su nombre seguido de los parmetros entre parntesis:
areatriangulo();
En una funcin debemos declarar antes una variable que almacene el dato que la funcin va a devolver, la variable debe ser del
mismo tipo que el que retorna la funcin. Seguidamente llamamos a la funcin escribiendo la variable seguido del operador de
asignacin, el nombre de la funcin y los parmetros entre parntesis:
float area;
area=areatriangulo();

Implementar funciones y procedimientos en nuestros programas es una muy buena prctica que se debe hacer siempre que se
pueda, ayuda a mantener organizado el cdigo y nos permite reutilizar funcionalidades en otras secciones del programa.
Parmetros.
A la hora de crear funciones y procedimientos puede que sea necesario que trabajemos con datos que se encuentran alojados en el
programa que los llama, para eso existen los parmetros. Los parmetros son valores que se mandan a un procedimiento o
funcin para que stos puedan trabajar con ellos.
Para utilizar los parmetros en un procedimiento o funcin debemos declarar el tipo de dato y su identificador, exactamente igual
que si declaramos una variable.
Veamos el programa del rea del tringulo pasando por parmetros los datos de base y altura:
#include <stdio.h>
#include <stdlib.h>

void areatriangulo (float base, float altura) {
printf("El rea es: %2.2f \n",(base*altura)/2);
}

int main(int argc, char *argv[]){
float base, altura;
printf("Introduce base: ");
scanf("%f",&base);
printf("Introduce altura: ");
scanf("%f",&altura);
areatriangulo(base,altura);
system("PAUSE");
return 0;
}

Es muy importante que las variables se pasen en el mismo orden que como se han definido en los parmetros. En caso de que no
sea as podemos tener resultados inesperados en la ejecucin del programa. Recuerda que los identificadores son palabras en
lenguaje humano legible mediante el cual manejamos celdas de memoria, da igual como se llamen en el programa, en las funciones
y en los procedimientos.
Paso de parmetros por valor y por referencia.
El paso de parmetros a procedimientos y funciones es un recurso bastante potente de cara a trabajar con datos, adems tenemos
la posibilidad de pasar estos parmetros de varias formas, por valor o por referencia, esto lo especificamos cuando definimos el
procedimiento o funcin.
El paso por valor es el que acabamos de ver, mediante el paso por valor el procedimiento o funcin reciben los valores indicados
para poder trabajar con ellos, su declaracin es la siguiente:
Procedimiento - void areatriangulo (float base, float altura)
Funcin - float areatriangulo (float base, float altura)
A veces necesitaremos modificar varios de estos datos que hemos pasado en los parmetros, para ello es posible declarar los
parmetros de tal forma que se puedan modificar, a esto se le llama paso por referencia.
Gracias al paso por referencia un procedimiento o funcin no slo realiza unas operaciones y devuelve (en el caso de las funciones)
un valor, sino que tambin puede modificar los valores que se pasan como parmetros.
Para poder realizar el paso de parmetros por referencia es necesario que en la declaracin del procedimiento o funcin se
especifique el espacio de memoria donde se encuentra alojado el dato, esto se realiza as:
Procedimiento - void areatriangulo (float *base, float *altura)
Funcin - float areatriangulo (float *base, float *altura)
Lo que acabamos de definir como parmetros no son las variables en s, sino un puntero que apunta a la direccin de
memoria donde se encuentra alojado el valor, as podremos modificarlo.
Para llamar a un procedimiento o funcin pasando los parmetros por valor se hace de la forma que hemos visto:
Procedimiento - areatriangulo(base, altura);
Funcin - area=areatriangulo(base, altura);
Para llamar a un procedimiento o funcin pasando los parmetros por referencia se hace de la siguiente forma:
Procedimiento - areatriangulo(&base, &altura);
Funcin - area=areatriangulo(&base, &altura);
As lo que pasamos como parmetros no es el valor de la variable, sino la direccin de memoria donde se encuentra el dato, de sta
forma el procedimiento o funcin podr modificar su valor directamente.
Veamos el caso de un programa que intercambia los valores de dos variables, en uno utilizaremos parmetros por valor y en el otro
por referencia:
Por valor:
#include <stdio.h>
#include <stdlib.h>

void intercambio(int num1, int num2){
int aux;
aux=num1;
num1=num2;
num2=aux;
printf("El intercambio es: num1=%d
num2=%d\n",num1,num2);
}

int main(int argc, char *argv[]){
int num1=3, num2=5;
printf("Vamos a intercambiar: num1=%d
num2=%d\n",num1,num2);
intercambio(num1,num2);
printf("El resultado tras el intercambio es: num1=%d
num2=%d\n",num1,num2);
system("PAUSE");
return 0;
}

Por referencia:
#include <stdio.h>
#include <stdlib.h>

void intercambio(int *num1, int *num2){
int aux;
aux=*num1;
*num1=*num2;
*num2=aux;
printf("El intercambio es: num1=%d
num2=%d\n",*num1,*num2);
}

int main(int argc, char *argv[]){
int num1=3, num2=5;
printf("Vamos a intercambiar: num1=%d
num2=%d\n",num1,num2);
intercambio(&num1,&num2);
printf("El resultado tras el intercambio es: num1=%d
num2=%d\n",num1,num2);
system("PAUSE");
return 0;
}

Compila ambos cdigo y observa la diferencia, es en sta caracterstica donde radica el potencial del paso por valor y por referencia.
Variables locales y globales.
Gracias al concepto de procedimiento y funcin podemos tener dentro de un mismo programa varios subprogramas, los cuales se
irn llamando entre ellos para poder realizar las tareas pertinentes, esto est muy bien pero es posible que necesitemos realizar
tareas con variables alojadas en otros sitios, o necesitemos declarar nuevas, o simplemente no deseemos usar parmetros.
Para solucionar esto existe el concepto de variables locales y variables globales.
Las variables locales son aquellas que declaramos al principio del cuerpo de un procedimiento o funcin, esto incluye a las
declaradas en la funcin principal main.
Las variables globales son aquellas que las podemos definir en la zona de importacin de libreras #include y la definicin de
constantes con #define. Su utilidad radica en poder operar con su valor en cualquier procedimiento o funcin sin necesidad de
pasarla como parmetro.
Veamos el ejemplo del tringulo usando variables globales:
#include <stdio.h>
#include <stdlib.h>

float base, altura;
void areatriangulo (void) {
printf("El rea es: %2.2f \n",(base*altura)/2);
}

int main(int argc, char *argv[]){
printf("Introduce base: ");
scanf("%f",&base);
printf("Introduce altura: ");
scanf("%f",&altura);
areatriangulo();
system("PAUSE");
return 0;
}

Como se puede comprobar, el programa funciona exactamente igual que en su versin con parmetros, no obstante muchos
desarrolladores no recomiendan hacer uso de sta tcnica debido a que en proyectos medios o grandes puede resultar confuso
manejar variables globales sin un determinado estndar que regule su uso.
El modo ms comn de operar es mediante el uso de parmetros as que durante el curso y posteriormente seguiremos con esa
tcnica, no obstante si puede interesarte practicar los ejercicios que hemos visto hasta ahora usando variables globales.
Recursividad.
El ltimo punto de ste captulo se lo voy a dedicar a la recursividad, una tcnica bastante comn e importante para desarrollar
determinados algoritmos.
La recursividad no es ms que la tcnica de desarrollar una funcin que se llama a s misma.
La recursividad normalmente la veremos en funciones que realicen clculos matemticos, donde para realizar un clculo repetitivo
la funcin tendr que llamarse a s misma y as ir desarrollando el clculo.
Una cosa importante que hay que tener en cuenta es que para realizar funciones recursivas debemos tener muy claro que
queremos hacer, planificarlo bien y no complicarnos si no es necesario, para ello podemos hacer uso de todos los elementos que
conocemos, parmetros por referencia, funciones, bucles, variables que indiquen el fin del ciclo, etc.
El ejemplo ms tpico que se suele utilizar para explicar la recursividad es el de un programa que calcula el factorial de un nmero,
el factorial de un nmero responde a la siguiente frmula matemtica:
n! = n * (n-1)!
Es decir, que el factorial de un nmero es la multiplicacin de ese nmero por el factorial del nmero inmediatamente anterior.
As si queremos saber el factorial de 5 sera:
5! = 5 * 4!
O lo que es lo mismo:
5! = 5 * 4 * 3 * 2 * 1

Veamos esto primero mediante un programa normal usando un bucle while:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
int num, num2;
printf("Introduce nmero: ");
scanf("%d",&num);
num2=num;
while (num2!=1){
num2=num2-1;
num=num*num2;
}

printf("El factorial es: %d \n", num);
system("PAUSE");
return 0;
}

Ahora vemoslo mediante el uso de una funcin recursiva:
#include <stdio.h>
#include <stdlib.h>

int factorial(int num){
if (num==0) {
return 1;
}
else {
return num * factorial(num-1);
}
}

int main(void){
int num;
printf("Introduce nmero: ");
scanf("%d",&num);
printf("El factorial es: %d \n", factorial(num));
system("PAUSE");
return 0;
}
Como podis observar el resultado es el mismo pero el cdigo ha variado bastante, la funcin recursiva ha cumplido perfectamente
su cometido, no obstante si ves que te resulta un concepto demasiado abstracto y prefieres utilizar los bucles adelante, tu eres el
programador y eres completamente libre de dar la solucin que desees.
Conclusiones
Con el tema de la recursividad ponemos punto y final al sptimo captulo del curso bsico de C, un captulo bastante interesante y
que nos ofrece un abanico de posibilidades bastante amplio de cara a comenzar con desarrollos ms grandes.
El haber visto el concepto de procedimientos y funciones nos facilitar enormemente la tarea de organizar el cdigo, esto apoyado
en el paso de parmetros y, opcionalmente, las variables globales, nos asegura unas posibilidades casi ilimitadas.
En el siguiente captulo entrar en un tema tambin bastante importante, los punteros a memoria, iremos profundizando en ste
concepto de cara a aplicarlo a nuestros programas, comenzaremos a ver las listas dinmicas y as poder almacenar informacin de
forma masiva sin necesidad de limitarnos a un tamao concreto (como pasa en los arrays). Si me es posible comenzar con las listas
y algunas de las operaciones bsicas que se pueden hacer con ellas.

S-ar putea să vă placă și