Universidad Tecnológica de Santiago (UTESA)
Recinto Moca
Presentado a:
Manuel de Jesús Ramírez
Presentado por:
Madelin María Paulino Rodríguez
Matrícula:
2-16-0521
Asignatura:
Programación II
Trabajo sobre:
Funciones
Moca, Espaillat, Rep.Dom.
24 de julio del 2023.
Función
Una función es un bloque de código que realiza alguna operación. Una función 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. Las funciones son útiles
para encapsular las operaciones comunes en un solo bloque reutilizable, idealmente con un
nombre que describa claramente lo que hace la función.
Básicamente una función puede realizar las mismas acciones que un programa:
Aceptar datos.
Realizar unos cálculos determinados.
Devolver resultados.
Las funciones son invocadas desde otras funciones, con una excepción: la función global main(),
que tienen todos los programas en C++. Permite al compilador conocer donde está el punto
inicial de un programa. Por razones obvias, main() no puede ser invocada desde otras funciones.
Podemos distinguir 3 características de las funciones en C++:
La definición.
La declaración.
La llamada.
La sintaxis de una definición de función es:
tipo nombre_funcion(tipo_1 arg_1, ..., tipo_n arg_n)
{
sentencias;
return expresion; // optativo
}
tipo: indica el tipo de valor (int, float, etc.) devuelto por la función.
nombre_funcion: es el identificador usado para la función.
la lista de argumentos es una secuencia de declaración de parámetros separados por comas y
encerrados entre paréntesis. Son los llamados parámetros formales de la función.
return expresion es un salto incondicional que permite evaluar una expresión y devolver su valor
a la función llamante.
Ejemplo de función
#include <iostream>
using namespace std;
double calcula_media(double, double); // Declaración
int main()
double numero1, numero2;
cout << "Introduzca el primer número: ";
cin >> numero1;
cout << "Introduzca el segundo número: ";
cin >> numero2;
double resultado = calcula_media(numero1, numero2); // Llamada
cout << "La media de "<< numero1 << " y " << numero2
<< " es " << resultado << ".\n";
double calcula_media(double num1, double num2)
double media;
media = (num1+num2)/2.;
return media;
}
Paso de parámetros
Paso por valor
Los parámetros formales son variables locales a la función, es decir, solo accesibles en el ámbito
de ésta. Reciben como valores iniciales los valores de los parámetros actuales. Posteriores
modificaciones en la función de los parámetros formales, al ser locales, no afectan al valor de los
parámetros actuales.
Pasar parámetros por valor significa que a la función se le pasa una copia del valor que contiene
el parámetro actual.
Los valores de los parámetros de la llamada se copian en los parámetros de la cabecera de la
función. La función trabaja con una copia de los valores por lo que cualquier modificación en
estos valores no afecta al valor de las variables utilizadas en la llamada.
Aunque los parámetros actuales (los que aparecen en la llamada a la función) y los parámetros
formales (los que aparecen en la cabecera de la función) tengan el mismo nombre son variables
distintas que ocupan posiciones distintas de memoria.
Por defecto, todos los argumentos salvo los arrays se pasan por valor.
Ejemplo de paso de parámetros por valor
El siguiente programa lee un número entero y llama a una función que invierte las cifras del
número:
#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;
system("pause");
}
int invertir(int num)
{
int inverso = 0, cifra;
while (num != 0)
{
cifra = num % 10;
inverso = inverso * 10 + cifra;
num = num / 10;
}
return inverso;
}
Paso por referencia
Los parámetros formales no son variables locales a la función, sino alias de los propios
parámetros actuales. ¡No se crea ninguna nueva variable! Por tanto, cualquier modificación de
los parámetros formales afectará a los actuales.
Al igual que los punteros, las referencias son un tipo especial de variables que permiten alterar el
contenido de otra variable. Sin embargo, el mecanismo es mucho más sencillo: una variable
referencia actúa como un alias de la variable referenciada.
A diferencia de los punteros:
Las referencias deben inicializarse en el momento de su declaración, es decir, indicar a
qué variable referencian.
No pueden modificarse, es decir, cambiar la referencia a otra variable.
A efectos prácticos, el compilador sustituye implícitamente la variable referencia por la
variable referenciada: no es necesario usar los operadores unarios * ó &.
El formato general para la definición de una variable referencia es:
tipo_de_variable_referenciada& nombre_referencia{variable_referenciada};
En el siguiente fragmento de código, r_media es una referencia, un alias de la variable media. A
partir, de ese momento, el contenido de media puede modificarse usando r_media.
double media = 2.;
double& r_media{media};
r_media = 3.;
Ejemplo de paso de parámetros por referencia
#include <iostream>
using namespace std;
void intercambio(int *, int *);
int main( )
{
int a, b;
cout << "Introduce primer numero: ";
cin >> a;
cout << "Introduce segundo numero: ";
cin >> b;
cout << endl;
cout << "valor de a: " << a << " valor de b: " << b << endl;
intercambio(&a, &b);
cout << endl << "Despues del intercambio: " << endl << endl;
cout << "valor de a: " << a << " valor de b: " << b << endl;
system("pause");
}
void intercambio(int *x, int *y)
{
int z;
z = *x;
*x = *y;
*y = z;
}
Prototipo de Funciones
El prototipo tiene la misma forma que la definición de función, excepto que termina con un
punto y coma inmediatamente después del paréntesis de cierre y, por consiguiente, no tiene
ningún cuerpo. En cualquier caso, el tipo de valor devuelto debe coincidir con el tipo de valor
devuelto especificado en la definición de función.
Los prototipos de función tienen los siguientes usos importantes:
Establecen el tipo de valor devuelto para funciones que devuelven tipos diferentes de int.
Aunque las funciones que devuelven valores int no requieren prototipos, estos se
recomiendan.
Sin prototipos completos se realizan conversiones estándar, pero no se hace ningún
intento de comprobar el tipo o el número de argumentos con el número de parámetros.
Los prototipos se utilizan para inicializar punteros a funciones antes de que se definan
esas funciones.
La lista de parámetros se utiliza para comprobar que los argumentos de la llamada de
función coinciden con los parámetros de la definición de función.
El prototipo puede incluir tanto el tipo como el identificador de cada expresión que se pasa como
argumento. Pero tales identificadores solo están en ámbito hasta el final de la declaración. El
prototipo también puede reflejar el hecho de que el número de argumentos es variable o que no
se pasa ningún argumento. Sin esta lista es posible que las discordancias no se revelen, así que el
compilador no puede generar mensajes de diagnóstico relacionados con ellos.
Recursividad
En C, las funciones pueden llamarse a sí mismas. Si una expresión en el cuerpo de una función
llama a la propia función, se dice que ésta es recursiva. La recursividad es el proceso de definir
algo en términos de sí mismo y a veces se llama definición circular.
Los ejemplos de recursividad abundan.
Para que en lenguaje de computadora sea recursivo, una función debe ser capaz de llamarse a sí
misma.
Las funciones recursivas se definen definiendo:
1. caso base: son casos simples.Si la funci´on es llamada con el caso base la
función simplemente devuelve un resultado.
2. caso recursivo: la función es llamada con un problema más complejo. Para
hacer factible la recursión este último debe parecerse al problema original.
El paso de recursión puede dar como resultado muchas llamadas recursivas
a la función con problemas más sencillos que el original.
A fin de que la recursi´on en forma eventual se termine, cada vez que la función se llame a si
misma debe ser sobre una versión ligeramente más sencilla
que el problema original. Esta secuencia de problemas más pequeños deben de
converger en el paso base.
Ejemplo
Consideremos una función que recibe un número n e imprime los números
del n al 1:
void mi funcion(int cont)
{
if (cont==0) return;
else {
printf(” %d ”,cont);
mi funcion(–cont);
return;
Observar que llamamos recursivamente con - - cont. Si pusieramos en cambio
cont - -, la funci´on entraria en loop ya que llamaria con cont sin restar.