funciones y/o procedimientos son fragmentos de cdigo independientes con nombre y entidad propia, y se agrupan en mdulos de programacin, que no son ms que archivos de cdigo independientes que se compilan por separado y luego se enlazan entre s para formar el programa completo. La forma de definir dichos mdulos con sus respectivas funciones difiere en cada lenguaje de programacin. tipo_retorno nombre ( lista de parametros ) { declaracin de variables locales sentencias }
El tipo_retorno es el tipo de dato correspondiente con el valor devuelto por la funcin. El nombre de la funcin puede ser cualquiera que elija el programador. Este nombre es el que se utilizar cuando se la llame desde la funcin principal (main) o desde otra funcin. Los parmetros o argumentos son los valores sobre los que acta la funcin
Si una funcin no devuelve ningn valor, se debe poner como tipo de retorno void, que significa nulo o vacio. Si no se indica ningn tipo de retorno el compilador supone que es int; no es una buena prctica de programacin confiar en el tipo de retorno por defecto y no indicarlo explcitamente ya que es propenso a fallos y complica la legibilidad del programa. Hay una sentencia que est ntimamente relacionada con el uso de funciones: return. Esta sentencia hace que la funcin termine y vuelva a la sentencia siguiente a la de llamada. Si se quiere devolver un valor, se pone al lado de return, de la forma:
return expresin;
Donde el resultado a devolver, debe ser del mismo tipo descrito al definir la funcin. Una funcin puede tener varias sentencias return, pero en un momento dado slo se ejecuta una de ellas, ya que en cuanto se ejecuta una, la funcin devuelve el control a aquella funcin que la llamo. Hay que especificar de forma separada el tipo de cada parmetro, aunque haya varios del mismo tipo. Si no se pone el tipo de un parmetro, el compilador supone que es int. Si una funcin no utiliza parmetros, se pone dentro de los parntesis la palabra void. Si no se pone nada entre los parntesis, la funcin no tiene parmetros, pero sin embargo el compilador no avisa con un error si se llama a la funcin pasndole algn parmetro. #include <stdio.h> #include <stdlib.h> #include <time.h> float multiplicar(float num1,float num2) { return num1*num2; } main() { float A,B, resultado; srand(time(NULL)); A = rand(); B = rand(); resultado=multiplicar(A,B); printf("La multiplicacin es %f \n",resultado); } #include <stdio.h> #include <stdlib.h> #include <time.h> void intercambia(int A, int B) { int aux; printf("\nA=%i y B=%i en la funcin\n",A,B); aux=A; A=B; B=aux; printf("\nA=%i y B=%i en la funcin\n",A,B); } main() { int A,B; srand(time(NULL)); A = rand(); B = rand(); printf("\nA=%i y B=%i \n",A,B); intercambia(A,B); printf("\nAhora valen A=%i y B=%i \n",A,B); } Esta funcin no hace absolutamente nada, ya que est jugando con una copia de los valores que se le pasaron como parmetros. Este sera el comportamiento del main y de la funcin: #include <stdio.h> #include <stdlib.h> #include <time.h> void intercambia(int *A, int *B) { int aux; printf("\nA=%i y B=%i en la funcin\n",*A,*B); aux=*A; *A=*B; *B=aux; printf("\nA=%i y B=%i en la funcin\n",*A,*B); } main() { int A,B; srand(time(NULL)); A = rand(); B = rand(); printf("\nA=%i y B=%i \n",A,B); intercambia(&A,&B); printf("\nAhora valen A=%i y B=%i \n",A,B); } Esto si intercambia los valores de las variables pasadas como parmetros, ya que se sabe exactamente en qu posicin de memoria est el dato y se trabaja directamente con esa memoria. Es decir: Vamos a convenir que en los programas de ahora en adelante no se usarn variables globales, es decir, no se usarn variables que estn fuera de las funciones (excepto que sea un caso en el que sea absolutamente necesario). Esto debido a que terminan siendo un problema en cuanto a orden del programa y pueden generar errores indeseados en programas de gran magnitud. Slo como recordatorio, main tambin es una funcin. En general, siempre hemos escrito las funciones antes del cdigo que las usa (por eso el main siempre es la ltima funcin que escribimos). De este modo al compilar el programa la funcin desarrollada por el programador est definida antes de que aparezca el primer acceso a la misma. Sin embargo, se pueden poner las definiciones de las funciones despus del cdigo que accede a ellas. Para ello es necesario incluir una declaracin de la funcin antes de su primer acceso. #include <stdio.h> long factorial(int n) { ...... /* codigo de la funcion factorial */ } main() { ....... x=factorial(3); }
#include <stdio.h> long factorial(int); main() { ....... x=factorial(3); } long factorial(int n) { ...... /* codigo de la funcion factorial */ }
Ntese que en el prototipo se puede omitir el nombre de los argumentos. Slo es necesario incluir el tipo que devuelve la funcin y el tipo de los argumentos, pero no sus nombres.
En C un solo programa puede constar de varios archivos. De este modo se da soporte a la programacin modular: cada archivo puede representar un mdulo; habr un mdulo principal (aqul que contiene la funcin main) que arranca la ejecucin del programa y ste va delegando sus tareas en otros mdulos (archivos), los cuales a su vez pueden apoyarse en ms mdulos. Cada uno de estos mdulos est compuesto por un conjunto de variables y funciones. Es posible decidir qu variables y qu funciones de un mdulo sern visibles para los dems; esto es, podemos determinar cul ser la interfaz que este mdulo ofrezca a los dems. El resto del contenido del mdulo ser una caja negra que los programadores de los dems mdulos no necesitan conocer para realizar su trabajo. Una funcin puede ser tanto esttica como externa. Una funcin externa podr ser accedida desde cualquier mdulo del programa, mientas que la funcin esttica slo podr ser accedida desde el archivo en el cual se define. Para determinar el tipo de almacenamiento de una funcin se emplea la palabra "extern" o "static", segn corresponda, al principio de la definicin de la funcin: static float rest(float dato1, float dato2) { return dato1 - dato2; } extern float restar(float dato1, float dato2) { return rest(dato1, dato2); } Cuando se define una funcin en archivo y se accede a ella desde otro en el segundo se debe incluir una declaracin de la funcin. stas declaraciones se suelen colocar al principio del archivo y es recomendable (aunque no imprescindible) que lleven el modificador extern para indicar que esa funcin no se encuentra definida en este archivo, sino en otro externo. #include <stdio.h> extern float sumar(float, float); extern float restar(float, float); main() { float suma, resta, dato1=15, dato2=20; suma = sumar(dato1, dato2); resta = restar(dato1,dato2); printf("La suma es %f y la resta %f", suma, resta); getch(); } Observacin: Es recomendable crear cabeceras que contienen el prototipo de las funciones a usar que estn en otros archivos, para simplificar el acceso. Esto lo veremos en este ejemplo.
El incluir el archivo cabecera que describe la interfaz de un archivo en el propio archivo descrito no es imprescindible, pero le simplifica la labor al compilador y le permite comprobar que las definiciones del archivo cabecera son correctas. La utilizacin de funciones en java es muy similar a la vista en C. An as, vamos a dejar en claro ciertos conceptos:
Todo en java es un mtodo o trabaja con ellos. An as, se puede ver una sobre-clasificacin entre estos mtodos que es usada abiertamente, que sera la siguiente:
Un mtodo es un conjunto de cdigo reutilizable del cual se puede hacer un uso continuo que se encuentra disponible en cualquier momento deseado dentro de la aplicacin.
Las funciones son similares a los mtodos la diferencia es que estas retornan un resultado lo cual puede ser almacenado dentro de una variable o impreso directamente en pantalla, mientras que los mtodos no retornan ningn tipo de dato pero a si mismo podran meterse variables al mismo mtodo lo cual podra usarse como un tipo de retorno aunque no sera lo mismo.
Como se puede observar, es una separacin odiosa y un poco innecesaria, meramente conceptual, por lo que se referencia para que no haya problemas de entendimiento. Como java es un lenguaje orientado a objetos, de manera general se tiende a pensar que se requiere crear un objeto con propiedades y mtodos propios para realizar operaciones(lo cual se ver en otras clases) En cualquier caso la programacin secuencial es permitida y funcionara prcticamente de la misma forma que en c. Hay que tener en cuenta que esta no es la forma ms efectiva de utilizar un lenguaje orientado a objetos. An as, y por estructura, todo debe ir siempre dentro de una clase: public class ShowMeTheMoney2{ static double interesCompuesto(double monto, float tasa, int perodos){ for(int n = 1; n <= perodos; n++ ){ monto += monto * tasa / 100; } return monto; } public static void main(String args[]){ int meses = 12; float interesBanco1 = 1f; float bonificBanco1 = 5f; float interesBanco2 = 1.5f; double monto = 10000; double montoBanco1 = monto; double montoBanco2 = monto; montoBanco1 = interesCompuesto( montoBanco1, interesBanco1, meses ); montoBanco1 += montoBanco1 * bonificBanco1 /100; montoBanco2 = interesCompuesto( montoBanco2, interesBanco2, meses ); System.out.println("Importe final del banco1 : " + montoBanco1); System.out.println("Importe final del banco2 : " + montoBanco2); } } Normalmente si se quiere usar otra clase (que correspondera a otro archivo) basta con que estn dentro del mismo paquete de software, o coleccin de archivos del programa. Para esto se usa la siguiente lnea de cdigo:
package nombreDelPaquete;
As, todos los archivos que tengan acceso unos a otros, deberan tener esta lnea al inicio del cdigo y estar dentro de la misma carpeta, que debera tener el nombre del paquete. Puede ser requerido indicar qu clase especfica se quiere usar en el programa que se escribe (puede ser por un tema de compatibilidad). Por ejemplo:
package TiposBasicos; public class Persona { private String nombre; }
Si se quisiera usar la clase anterior para una nueva clase, haramos lo siguiente:
package Directivos; import TiposBasicos.*; class JefeDeAdministracion { private Persona jefeAdmin; . . . }
Esto en python debera ser trivial ya visto lo visto:
frase = funcion() print frase El uso de mltiples archivos de cdigo en python es sencillo lo veremos con un ejemplo: # mdulo de nmeros Fibonacci
def fib(n): # escribe la serie Fibonacci hasta n a, b = 0, 1 while b < n: print b, a, b = b, a+b
def fib2(n): # devuelve la serie Fibonacci hasta n resultado = [] a, b = 0, 1 while b < n: resultado.append(b) a, b = b, a+b return resultado Si quisieramos usar el archivo anterior, llamado fibo.py en otro programa, comenzaramos con esta lnea:
import fibo
Igual al nombre del archivo, sin extensin. Luego lo podemos usar naturalmente de la siguiente manera:
a=fibo.fib(1000)
Lo que retornara una lista de este tipo:
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 Las funciones de tiempo en los lenguajes a revisar son funciones comunes, por lo que no debera haber problema en que las revisen por si mismos, de todas maneras, algunas fuentes: C/C++: Time.h : http://es.wikipedia.org/wiki/Time.h Medir tiempo de ejecucin: http://diagramas-de- flujo.blogspot.com/2013/01/medir-tiempo-ejecucion-funcion-en-c.html Java: Timer: http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html TimerTask: http://docs.oracle.com/javase/7/docs/api/java/util/TimerTask.html Medir tiempo de ejecucin (simple de sistema): http://deerme.org/java/medir- tiempo-de-ejecucion-en-java Medir tiempo de ejecucin (con date): http://java-white- box.blogspot.com/2013/07/java-code-como-calcular-el-tiempo-que.html Medir tiempo de ejecucin de tarea (timer y timertask): http://totaki.com/poesiabinaria/2014/01/intro-timertask-java/ Python: Timer: https://docs.python.org/2/library/time.html Medir tiempo de ejecucin: http://elviajedelnavegante.blogspot.com/2010/06/calcular-tiempos-de-ejecucion- en-python.html