Está en la página 1de 9

a.

Marco teórico

a.1. Introducción

Una función es un bloque de código de programa autocontenido, diseñado para realizar una
tarea determinada. La razón principal para usar funciones es para evitar tediosas repeticiones
de programación. Escribiendo una sola vez la función apropiada, se la puede emplear cualquier
número de veces en un determinado programa, en diferentes situaciones, únicamente
llamándola por su nombre.

las funciones permiten automatizar tareas repetitivas, encapsular el código que utilizamos, e
incluso mejorar la seguridad, confiabilidad y estabilidad de nuestros programas. Dominar el uso
de funciones es de gran importancia, permiten modularizar nuestro código, separarlo según las
tareas que requerimos

puede definir opcionalmente parámetros de entrada que permiten a los llamadores pasar
argumentos a la función. Una función también puede devolver un valor como salida

a.2. Tipos de funciones}

son de tres tipos

FUNCIONES PURAS

Las funciones "puras" son diseñadas específicamente para realizar operaciones con sus
argumentos y devolver un valor en su nombre, basándose en esas operaciones.

FUNCIONES

Las funciones que manipulan la información y devuelven un valor por la función.

Ese valor indica simplemente el éxito o el fallo de la manipulación, es decir, estas funciones
producen acciones y suministran datos.

FUNCIONES SIN VALOR

Funciones que no tienen un valor de vuelta explícito, es decir, realizan una acción concreta y no
devuelven un valor en su nombre. Todas las funciones que no devuelven valores deben ser
declaradas de tipo void, por lo tanto se evita que se use esta función en una expresión.

a.3. Argumentos y parámetros de funciones

a.3.1. Argumentos
Son los valores que se envían a la función en el momento en que se realiza su llamada, estos
valores pueden ser de una constante, variable o expresión.

a.3.2. Parámetros formales

Los parámetros formales son los datos que recibe la función para operar con ellos. Una función
puede recibir cero o más parámetros. Se debe especificar para cada parámetro su tipo.
Una función puede devolver un dato a quien la ha llamado. Esto se realiza mediante la
instrucción return.
El tipo del dato devuelto debe coincidir con el tipo_devuelto que se ha indicado antes del
nombre de la función.
Cuando se realiza una llamada a la función, los "valores" pasados se denominan argumentos.
A veces se utilizan también las expresiones argumentos formales, para los parámetros y
argumentos actuales para los valores pasados.

a.4. Llamada por valor

copia el valor de un argumento en el parámetro formal de la función, en el momento de la


llamada. De esta forma, los cambios en los parámetros de la función no afectan a las variables
(argumentos) que se usan en la llamada. Esto significa que no se pueden alterar las variables de
los argumentos usadas para llamar a la función.

a.5.  Llamada por dirección

se copia la dirección del argumento en el parámetro formal, por lo que los parámetros deben
ser variables punteros y los argumentos deben ser direcciones de memoria a variables o
punteros.

dentro de la función se usa la dirección real de las variables usadas en la llamada, entonces, los
cambios hechos a los parámetros correspondientes afectan a dichas variables.

a.6. Prototipos de funciones

La forma general de un prototipo de función es similar a la declaración de las variables, es decir,


el especificador de tipo precede al nombre de la función con sus parámetros entre paréntesis, y
termina con punto y coma, para indicar que es una "sentencia de declaración"; como se
muestra a continuación:

tipo nombre_función (tipo par1, tipo par2, tipo parN);

a.7. Devolución de un valor en el nombre de la función: sentencia return


La instrucción de salto return es utilizada en lenguaje C para indicar el valor de retorno de una
función.

La sentencia return obliga a una salida inmediata de la función en la que se encuentra,


haciendo que el control del programa vuelva al punto de llamada de la función.

a.8. Devolución de un puntero en el nombre de la función

Para retornar punteros por la función se utiliza la sentencia return, porque los punteros no son
ni enteros ni enteros sin signo; son las direcciones de memoria de un cierto tipo de datos
expresado en entero hexadecimal.
Para indicar que una función retorna un puntero como valor, se debe colocar un asterisco (*)
antes del nombre de la función, igual a lo que sucede en la declaración de una variable puntero.

a.9. Punteros a función

Una función no es una variable, pero tiene una posición física en memoria cuya dirección puede
ser asignada a un puntero si un puntero contiene la dirección del punto de entrada a la función,
puede utilizarse dicho puntero para llamarla.

La dirección de la función se obtiene utilizando el nombre de la función sin paréntesis ni


argumentos.

a.10. Funciones recursivas

a.10.1. Definición

Una función recursiva es aquella que se llama a sí misma.

funcionan de forma similar a las iteraciones, pero debe encargarse de planificar el momento en
que dejan de llamarse a sí mismas o tendrá una función recursiva infinita.

"Una no recursiva", a pesar de parecer más sencilla y más frecuente, no puede dar solución a
todos los problemas.

"Una recursiva", da un programa más sencillo y más elegante. Además, hay muchos problemas
cuya respuesta se plantea solamente de forma recursiva.

a.10.2. Condiciones para crear las Funciones Recursivas

1) Debe haber una salida no recursiva de la función, es decir, algún caso trivial o "base"en
donde terminen las llamadas recursivas
2) Cada llamada a la función debe referirse a un caso más pequeño del problema, de tal manera
que se llegue al caso base. Este sería el caso recursivo llamado "general", definido en términos
de un caso cada vez más pequeño del mismo problema

a.10.3. Diferencias entre funciones recursivas e iterativas

1) Donde una rutina iterativa usa sentencias while, for o do-while, para controlar la repetición,
una rutina recursiva usa if-else o switch.

2) Las funciones recursivas tienen frecuentemente más parámetros y menos variables locales
que las funciones iterativas equivalentes. Porque los parámetros sirven para determinar el
tamaño del problema, para realizar la recursividad y para llegar al caso base.

a.11. Lista de parámetros variables 

Se puede especificar una función con un número variable de parámetros y tipos.

a.11.1. Paso de argumentos de longitud variable a funciones

En C la invocación de funciones implica que el paso de parámetros es, con carácter general y
predefinido, por valor. De acuerdo con lo que indicamos cuando hablamos de pseudocódigo,
esto impide que la variable transferida sea manipulada dentro de una función, ya que la función
únicamente recibe un valor (no manipulable) copia del contenido de la variable.

El procedimiento general para crear una función que pueda tomar un número variable de
argumentos es el siguiente:

1. La función debe tener al menos un parámetro conocido a la lista de parámetros variables,


pero puede tener más.

2. El parámetro más a la derecha de la lista de "parámetros conocidos" se llama ult_param.

3. Antes de que cualquiera de los parámetros de longitud variable pueda ser utilizados, el
puntero punt_arg debe estar inicializado por medio de una llamada a la macro va_start(), que
es la dirección del primer parámetro variable que se encuentra después del último parámetro
conocido ult_param.

4. Después, los parámetros se devuelven a través de llamadas a la macro va_arg() de acuerdo al


tipo que se especifica como parámetro de esta macro, siendo este tipo el siguiente del
parámetro de la lista. Es decir, esta macro, en cada llamada, retorna el siguiente parámetro
variable.
5. Finalmente, una vez que todos los parámetros han sido leídos y antes de volver de la función,
se debe hacer una llamada a la macro va_end() para asegurar que la pila está reconstruida
apropiadamente, entonces, si no se llama a va_end(), es muy común que el programa falle.

a.11.2. Función vprintf()

La función vprintf() es una función equivalente a printf(). La diferencia se encuentra en que la


lista de argumentos se sustituye por un puntero punt_arg a una lista de argumentos. Este
puntero tiene que ser de tipo va_list y está definido en el archivo de cabecera "stdarg.h".

a.12. Declaración de parámetros de funciones clásicas frente a las modernas.

El lenguaje C estándar ANSI soporta la declaración de parámetros en forma clásica y moderna,


pero se recomienda la forma moderna. Aunque muchos programas antiguos utilizan la forma
clásica

Forma clásica:

1) Una lista de parámetros, que van entre paréntesis y siguen al nombre de la función.
2) La declaración real de los parámetros va entre el paréntesis cerrado y la llave de
apertura de la función. Se puede poner más de un parámetro después del tipo, igual que
la declaración de cualquier variable.

a.13. Bibliotecas y archivos

A una función se puede ponerla en el mismo archivo que la función main(). En este caso, la
compilación se realizará de la misma forma que la compilación de una sola función.

También se puede ponerla en un archivo aparte con otras funciones compiladas por separado
que se hayan escrito, para luego realizar un encadenamiento.

Para ponerla en una biblioteca. En este caso, se utiliza la sentencia de preprocesador #include,
para incluirla en el programa en donde se vaya usar una biblioteca de funciones difiere de un
archivo de funciones compiladas por separado, porque:

Las rutinas de una biblioteca se unen al resto del programa, cargando y enlazando solo las
funciones que el programa utiliza realmente.

En un programa compilado por separado, todas las funciones de un archivo se cargan y se


enlazan con el programa.

En el caso de la biblioteca estándar de lenguaje C nunca se deberá tener todas las funciones
enlazadas en el programa, ya que el código objeto sería gigantesco.
b. Implementación de programas en Lenguaje C y Python relacionados con tipos de
parámetros, funciones que devuelven un puntero, punteros a función y funciones
recursivas.

Tipos de parametros

#include <iostream>

using namespace std;

int invertir (int);

int main()

{ int num;

int resultado;

cout << "Introduce un numero entero: ";

cin >> num;

resultado = invertir(num);

cout << "Numero introducido: " << num << endl;

cout << "Numero con las cifras invertidas: " << resultado << endl;

int invertir(int num)

int inverso = 0, cifra;

while (num != 0)

cifra = num % 10;


inverso = inverso * 10 + cifra;

num = num / 10;

return inverso;

2.- funciones que devuelven un puntero

función recibe como paramétro un puntero a función, el cual invoca cuando ha terminado su
ejecución. También muestra las direcciones de memoria que ocupan las funciones, que se
imprime con la opción %p de la función printf.

#include <stdio.h>

void imprimiendo_hola(int x)

printf( "[*HOLA__] Hola número %d\n", x);

void imprimiendo_adios(int x, void (*ptr_func)())

printf( "[*ADIOS_] Adios número %d\n", x);

if(ptr_func!=NULL)

ptr_func(); //Usando el puntero para retrollamar

}
}

void func_call_back()

printf( "[*RETRO_] Retrollamada llamada\n");

int main()

{ // Definimos dos punteros a funciones

void (*ptr_func_1)(int)=NULL;

void (*ptr_func_2)(int, void (*call_back_func)() )=NULL;

//Usamos el primero

ptr_func_1 = imprimiendo_hola;

printf("[*MAIN__] La dirección del primer puntero is %p\n",ptr_func_1);

ptr_func_1(3);

//Usamos el segundo

ptr_func_2 = imprimiendo_adios;

printf("[*MAIN__] Using a callback función \n",ptr_func_2);

ptr_func_2(3,func_call_back);

return 0;

c. Pruebas de escritorio de los programas del literal b.


d. Análisis de resultados 

e. Conclusiones y recomendaciones

f. Referencias

También podría gustarte