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.
/*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
Comentblogs:









