Está en la página 1de 37

Profesor: Victor Valenzuela

En cualquier lenguaje de programacin las


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.

/*
*ejemplo.c */

#include <stdio.h>
#include "suma.h"
#include "resta.h"
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();
}

/*
*ejemplo.c
*suma.h*/
extern float sumar(float, float);

=============================

/*
*ejemplo.c
*resta.h
*/
extern float restar(float, float);
/*
*ejemplo.c
*suma.c
*/
#include "suma.h"
float sumar(float dato1, float dato2)
{
return dato1 + dato2;
}


/*
*ejemplo.c
*resta.c
*/
#include "resta.h"
static float rest(float dato1, float dato2)
{
return dato1 - dato2;
}
extern float restar(float dato1, float dato2)
{
return rest(dato1, dato2);
}

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.

private void MetodoSuma(float numero1, float numero2){
float Suma=numero1+numero2;
System.out.println(Suma);
}

private float FuncionSuma(float numero1, float
numero2){
float Suma=numero1+numero2;
return Suma;
}

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:

def nombre_funcion(par1, par2,.):
# algoritmo
return retorno

Ejemplo:

def funcion():
return "Hola Mundo"

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

También podría gustarte