“Mi estilo, es el arte de luchar sin luchar”

Aprendiendo C (7ma. Parte)

2007-11-27 12:55:09-06

Software

El lenguaje de programación C permite el uso de funciones, estas son la base de lo que se llama programación modular y que permite la reutilización del software. Así pues veremos como implementar nuestras propias funciones. Hasta el momento solo hemos usado funciones definidas en las bibliotecas estándar como printf(), scanf(), getc(), toupper(), etc. Veremos unos ejemplos sencillos:

/*Programa que recibe un arreglo de valores float y devuelve su potencia n*/
#include<stdio.h>

float SuperPower(float base, int potencia);//Prototipo de la funcion

int main()
{
int i,j,tam;
printf("dame el tamanio del arreglo\n");
scanf("%d",&tam);

float A[tam];

printf("Dame los valores del arreglo\n");
for(i=0;i<tam;i++)
    scanf("%f", &A[i]);

printf("dame la potencia\n");
scanf("%d",&j);

for(i=0;i<tam;i++)
    printf("%f\t%f\n", A[i],SuperPower(A[i],j)); //Llamada a la funcion

return 0;
}

float SuperPower(float base,int potencia)//definicion
{
int i;
float acumulador=1;
if(potencia>0)
    {
    for(i=0;i<potencia;i++)
        acumulador*=base;
    }
else
    acumulador=1/SuperPower(base,-potencia);//pequenia recursion

printf("%f^%d ->", base, potencia);

return acumulador;
}


Como podemos ver en la tenemos algo que se llama “prototipo” de la función definido antes de la función main(), esta es una notación heredada del lenguaje c++ y que se adopto para el estándar ANSI C. Normalmente una función como en matemáticas solo regresa un valor o ninguno (Tipo void), este valor tiene asociado un tipo que puede ser char, int, float, etc. En el ejemplo es un tipo double, tenemos además el nombre con el que se invocara a la función “SuperPower()” entre paréntesis tenemos la lista de parámetros que se definen por su tipo y un nombre, el nombre es opcional, sin embargo, es importante ponerlo con fines de documentación y claridad del código, tambien puede no tener parametros en cuyo caso se especifica como void. El prototipo termina siempre en punto y coma ‘;’.

Dentro de la función main() tenemos las invocaciones a la función “SuperPower()” con sus respectivos argumentos, ordenados por el tipo y orden que esta especificada en el prototipo de la función, exactamente la función de dicho prototipo es indicar al compilador el orden y numero de parámetros que deberá tener una función, esto facilita la detección de errores por parte del compilador.

Tenemos también la definición de la función, esto incluye los parámetros descritos en el prototipo y el cuerpo de la función, el cuerpo incluye las instrucciones que se realizaran cuando esta es llamada. La ubicación de dicha definición es arbitraria, los viejos hackers en UNIX solían ubicarlas al inicio antes de la función main(), esto por sus costumbres heredadas del ENSAMBLER. Actualmente la literatura especializada en el tema suele ubicar las definiciones de las funciones después del a función main.

Dentro de la definición vemos la siguiente instrucción:
    acumulador*=base;
El operador "*=" se usa para abreviar la operación
    acumulador =acumulador * base;
Existen las corespondientes abreviasiones para los operadores de suma,resta, división, modulo, etc. estos operadores se llaman oficialmente operadores de asignación

También tenemos una segunda llamada ala funcion dentro de si misma, este tecnica de programacion se llama recursión y hare una nota breve sobre ella en la próxima entrada, sin embargo, es importante que notes que la funcion hace una llamada a si misma con alguna modificacion en los argumentos, a la hora de correr el programa tendras una salida con valores y una flecha que te muestra cuantas llamadas se hicieron antes de regresar el valor final despues de la tabulacion. para el caso particular de la potencias solo se hacen 2 máximo, pero en otros programas usaremos estas "banderas" para fines explicativos.

La utilidad de las funciones es grande, pero es mí deber mencionar que la existencia de muchas funciones dentro de un programa facilita su depuración, sin embargo, disminuye su velocidad. Además es un tema amplio, tratare de explicar la mayoría de los asuntos de interés. Veamos algo distinto y que es importante cuando se trabaja en grupos y se requiere que un grupo de programadores trabajen sobre una misma serie de funciones. Se volvería tedioso tener que escribir cada función dentro del mismo archivo, aun cuando solo sea un “copy&paste”, para esto podemos crear nuestras propias bibliotecas y permitir que el resto de los programadores solo las enlacen. Vemos como se hace, la verdad no tiene mucho chiste, pero habrá que explicarlo con un ejemplo:


/*/home/vendaval/funcion.c*/
/*Programa que recibe un arreglo de valores float y devuelve su potencia n*/
#include <stdio.h>
#include "vendaval.h"

int main()
{
int i,j,tam;
printf("dame el tamanio del arreglo\n");
scanf("%d",&tam);

float A[tam];

printf("Dame los valores del arreglo\n");
for(i=0;i<tam;i++)
    scanf("%f", &A[i]);

printf("dame la potencia\n");
scanf("%d",&j);

for(i=0;i<tam;i++)
    printf("%f\t%f\n", A[i],SuperPower(A[i],j));

return 0;
}

------------------------------------------------------------------------------------------------------------------------

/*/home/vendaval/vendaval.h*/
#include<stdio.h>

float SuperPower(float base, int potencia);//Prototipo de la funcion

float SuperPower(float base,int potencia)//definicion
{
int i;
float acumulador=1;
if(potencia>0)
    {
    for(i=0;i<potencia;i++)
        acumulador*=base;
    }
else
    acumulador=1/SuperPower(base,-potencia);//pequenia recursion

printf("%f^%d ->", base, potencia);

return acumulador;
}


Como notaras solo habrá que listar los prototipos y después las definiciones de cada función. Simple ¿no?, luego solo lo metemos a un archivo cuyo postfijo o extensión sea “.h”.

Otro asunto es cuando se hace la inclusión de la biblioteca por medio de la directiva #include, en este caso usamos comillas dobles, esto es por que la biblioteca esta en el mismo directorio que el archivo con la función principal,
Usualmente en Linux hay un directorio "/usr/include" que tiene todas las bibliotecas estandar -desconozco como sea para los BSDs, Solaris 9 (el de la UAM) lo tiene- el hecho es que si quieres invocar tu biblioteca con '<' y '>' necesitas moverlo a la ubicación de las demás bibliotecas, en linux la antes citada.

Breviario cultural: La palabra “parámetros” solo se usa cuando hacemos referencia al prototipo o definición de la función, cuando hacemos referencia a la función cuando esta es llamada usamos “argumentos”.

Hoy aprendimos:
1.-Prototipo, definición y llamada de una función.
 2.-Creación y uso de bibliotecas de funciones.

En la siguiente entrada hablaremos mas detalladamente de las funciones, incluyendo una breve nota de recursión.

Permalink: http://www.mononeurona.org/users/entry/vendaval/975


Comments Comentblogs:

New Comentblog

Captcha



Login



Remember me:
vendaval
Alberto Rodriguez Sanchez Estudiante de Ingenieria en Computacion en la UAM-A, programo en C, C#, Python y Haskell. Uso Debian GNU/Linux, Mac-OS X, OpenSolaris, NetBSD y Win2. Pienso especializarme en computo cientifico y criptografia que son mis grandes pasiones.

Tambien pienso que la programacion computacional es un Arte y que un programa de computadora puede llegar a ser realmente bello si cumple con algunas caracteristicas, prefiero la Sintaxis Avanzada en los programas por que muestra un dominio del lenguaje y un buen grado de abstraccion.

NetBSD, C, Enlightenment y VI(M) son mis SO, Lenguaje de programación, manejador de ventanas y editor favoritos.

Practico Limalama y JKD (soy seguidor de la filosofía de Bruce Lee) y tambien escribo con cierta regularidad en este blog.

"Se como el agua, pero piensa como el fuego"
alchemy corn pop cryptography dark side education hacking humor ladies mathematics music my life nanoblogging no more triviality programming martial arts
Powered by:
Despabilando la MonoNeurona.org
Livechat

<-Nombre
vendaval wrote:
Con una mentira suele irse muy lejos, pero sin esperanzas de volver
on 24/7/08

asarch wrote:
Simon. De preferencia ponle una nalga pa' que llame la atencion
on 25/6/08

vendaval wrote:
hola roberto, lo mejor seria poner lo que quieres comunicarnos como una noticia en portada
on 28/3/08

roberto wrote:
como envio un email a todos los miembros de mononeurona
on 26/3/08

vendaval wrote:
pienso que debria crear una version viva para ms necesidades
on 28/1/08

asarch wrote:
O tambien en: http://www.openbsd.org/ en la forma más pura que puedas encontrar en la red
on 26/1/08

¿Qué estuve haciendo?
Estudio a fondo un asunto sobre la nueva red de la uam
17 hours, 11 minutes ago
@asarch: hablales bonito de mi. que voy a oaxaca en enero.
4 days, 16 hours ago
Pero en la biblioteca Central no estaban, aunque tienen sus tesoros =)
1 week, 1 day ago
Me di una vuelta a CU a ver si tenian algunos libros que ocupo.
1 week, 1 day ago
Deberas Der_teufel donde queda la biblioteca de la Fac. de Ciencias,
1 week, 1 day ago
fijate si Ese Firefox tiene noScript o algun add-on por el estilo
1 week, 1 day ago
Me voy a trabajar. =(
1 week, 6 days ago
58kg
2 weeks, 1 day ago
yo no...O-O pero voy a visitar al oculista en diciembre
2 weeks, 3 days ago
Celebrando mis 23 primaveras.
3 weeks, 3 days ago
Galerias
FirefoxjEdit.orgGimpOpenOffice.orgHacker
Top
Colectivo MonoNeurona.org © 2002-2008.