Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
FUNDAMENTOS
DE PROGRAMACIÓN
Asignatura correspondiente al plan de estudios
de la carrera de Ingeniería Informática
UNIDAD 8
FUNCIONES
UNIDAD 8
Funciones
Introducción
Para hallar la solución de un problema complejo, es conveniente dividirlo en
pequeños problemas más simples y buscar la solución de cada uno de ellos en
forma independiente.
En el diseño de algoritmos computacionales y programas esta subdivisión en
segmentos o módulos - que llamaremos subprogramas - constituye una
herramienta muy importante que nos permite modularizar problemas grandes o
complejos.
Programa A
acción 1
Subprograma B
acción 1
acción 2
acción 2
Llamada a B acción 3
acción n
Fin Subprograma B
Subprograma A Subprograma B
Programa P
Llamada a B
Fin Subprograma B
Llamada a A Fin Subprograma A
Llamada a C Subprograma C
Fin Subprograma C
Llamada a D
Subprograma D
Fin Subprograma D
Tipos de Subprogramas
Todos los lenguajes de programación admiten subprogramas. Se los denomina
funciones, procedimientos, subrutinas. C++ emplea el subprograma función.
Funciones en C++
En C++ emplearemos funciones siempre. Todo programa C++ consta de una o
más funciones y una de ellas debe llamarse main.
La ejecución de un programa C++ comienza por las acciones planteadas en
main.
#include <iostream.h>
#include<conio.h> Prototipo de la
#include<iomanip.h> función promedio
void main( )
{ int d1, d2, d3;
cout <<"Ingrese el primer dato:" ; cin >> d1;
cout <<"Ingrese el segundo dato:"; cin >> d2;
cout <<"Ingrese el tercer dato:" ; cin >> d3;
Llamada a la float p = promedio3(d1, d2, d3);
función promedio3 cout <<setprecision(3)<<"El promedio es:" << p;
getch();
}
Tipo de resultado
void muestra_mensaje( );
void main()
{.....
Función sin parámetros
muestra_mensaje( ); de resultado
.....
}
void muestra_mensaje( )
{ ..... }
int m=10;
int &q = m; // q es definido como alias de m
q++; // se incrementa q en 1 y también m
cout << m; // se obtiene 11 como salida
.....
Parámetros formales x, y, z, alias de
} d1,d2,d3 respectivamente
El uso de alias a través del operador & permiten a una función devolver otros
resultados además del correspondiente a la sentencia return( ).
Sobrecarga de Funciones
Dos funciones diferentes pueden tener el mismo nombre si el prototipo de sus
parámetros es distinto, esto significa que se puede nombrar de la misma manera
int main ()
{ int x=5,y=2;
float n=5.0,m=2.0;
cout << dividir (x,y);
cout << "\n";
cout << dividir (n,m);
return 0;
}
2
2.5
En este caso se ha definido dos funciones con el mismo nombre, pero una de
ellas acepta parámetros de tipo int y la otra acepta parámetros de tipo float. El
compilador sabe cual debe emplear pues los tipos de parámetros son
considerados previamente.
Por simplicidad, ambas funciones tienen el mismo código, pero esto no es
estrictamente necesario. Se pueden hacer dos funciones con el mismo nombre
pero con comportamientos totalmente diferentes.
float dividir(int,int);
Funciones inline
La directiva inline puede ser incluida antes de la declaración de una función
para especificar que esa función debe ser compilada como código en el mismo
punto en el que se encuentra la llamada a dicha función. Esto es equivalente a
declarar una macro, y sus ventajas sólo se aprecian en funciones muy cortas, en
las cuales el código resultante de compilar el programa puede ser más rápido, si
en ciertos casos, se evita llamar a esa función.
Recursividad
La recursividad es una técnica que permite a definir a una función en términos de
sí misma. En otras palabras: una función es recursiva cuando se invoca a sí
misma.
C++ admite el uso de funciones recursivas; cualquier función C++ puede incluir
en su código una invocación a sí misma, a excepción de main().
Para su implementación los compiladores utilizan una pila (stack) de memoria
temporal, la cual puede causar una interrupción del programa si se sobrepasa su
capacidad (stack overflow).
Como ventaja de esta técnica podemos destacar que permite en algunos casos
resolver elegantemente algoritmos complejos. Como desventaja debemos decir
que los procedimientos recursivos son menos eficientes –en términos de
velocidad de ejecución- que los no recursivos.
Obsérvese que en la función recursiva existe una condición (x==0) que permite
abandonar el proceso recursivo cuando la expresión relacional arroje verdadero;
de otro modo el proceso sería infinito.
Síntesis
1. Los subprogramas permiten modularizar el diseño de programas, con las
ventajas de posibilitar la reutilización de código, facilitar el trabajo en
equipo, agilizar la depuración de errores y optimizar administración de
recursos en una computadora.
9. Dos o más funciones pueden en C++ tener igual nombre y realizar distintas
tareas. Para ello deben operar con diferentes parámetros. Esta propiedad
se denomina sobrecarga de funciones. Al llamar a una función
sobrecargada, el compilador C++ reconoce cuál es la que debe ejecutar en
base a los parámetros utilizados en la llamada.
10. C++ admite que una función incluya en su código una o más llamadas a sí
misma para efectuar versiones reducidas de la misa tarea. En ese caso se
Actividades
Ejercicios
En los ejercicios que impliquen la codificación de un programa debe observar
los pasos siguientes:
i) Salvar el programa, compilar, --si es necesario-- depurar, y ejecutar el
programa propuesto.
ii) Proponer una adecuada interfaz hombre-máquina.
Ejercicio 8.1
Escriba los prototipos de funciones C++ que cumplan con las características
siguientes. Proponga Ud. los elementos no especificados en el enunciado:
a) Una función llamada division_entera() que devuelve el cociente entero y
el resto de la división entre 2 enteros (int).
b) Nombre de la función: facto(). Propósito: calcular el factorial de un
número (int).
c) Función hipot() que devuelve la hipotenusa de un triángulo rectángulo.
d) Función intercambio() que permite intercambiar los contenidos de 2
parámetros tipo char, modificando simultáneamente los 2 parámetros de
llamada. No devuelve otro resultado.
Ejercicio 8.2
Escriba un programa que ingrese como datos los coeficientes a,b,c de una
ecuación cuadrática de la forma ax2+bx+c=0. Determine el tipo de las raíces con
una función char tipo_raices( ) que devuelva ´C´, ´I´, o ´D´ (C: Complejas, I:
reales Iguales, D: reales Distintas). Además, si las raíces fueran reales obtener
e informar sus valores con una función única llamada resolvente( ). Proponga
Ud. los parámetros necesarios.
Ejercicio 8.3
Se ingresan los nombres y edades de los 457 miembros de una asociación
cooperadora. Determinar el nombre y la edad del mayor de los integrantes.
Validar la entrada de los datos correspondientes a las edades, los cuales deben
estar dentro el rango 12..90, con una función llamada validar_edad() en la
cual, al verificarse una edad fuera del rango, se debe indicar un mensaje de error
y permitir el reingreso del dato.
Ejercicio 8.4
Escriba 3 funciones sobrecargando el nombre intercambio(..) de modo que
cada una de ellas pueda ser invocada y produzca el intercambio de 2 datos que
se pasan como parámetros: 2 datos de tipo char, 2 datos enteros, dos arreglos
de flotantes.
Ejercicio 8.5
Escriba un programa que utilice una función llamada formalinea() que reciba
2 parámetros: uno de tipo entero y otro de tipo char. El programa debe escribir
una línea con tantos caracteres repetidos como indique el parámetro entero. El
2do parámetro es opcional; si no se lo especifica en la llamada debe emplear ‘#’
para formar la secuencia.
Ejemplo de llamadas:
formalinea(7,’-‘); debe mostrar: -------
formalinea(10); debe escribir: ##########
Ejercicio 8.6
a) Escriba una función C++ que determine el interés a obtener por un depósito
de dinero en un banco a interés compuesto. Se conoce el período en meses (n),
la tasa de interés mensual (i) y el monto inicial o capital a depositar (c).
b) Utilice la función en un programa que permita el ingreso del monto inicial del
depósito y la tasa de interés e informe para distintos períodos (2 a 24 meses) el
total que debe reintegrar el banco.
Ejercicio 8.7
Determine la salida de los 2 programas siguientes sin efectuar su ejecución:
//programa 8.7a ------------------------------------------
#include <iostream.h>
int calcula(int n)
{
if (n==0)
{ return 0; }
else
{ return n-calcula(n-1); }
} // fin de la función calcula
//-------------------------------
void main(int argc, char* argv[])
{
cout<<calcula(5);
}
//programa 8.7b------------------------------------------
#include <iostream.h>
#include <conio.h>
void opera(int n)
{
if (n==1)
{ cout<< "--"; }
else
{ if (n%2==0)
{cout<<"**"; }
else
{cout<<"--"; }
opera(n-1);
}
} // fin de la función opera
//-------------------------------
{
opera(5) ;
getch();
return 0;
}
Ejercicio 8.8
Escriba una función recursiva para calcular la potencia de exponente entero de
un número. Pruebe la función en un programa C++. Recuerde que an=a * an-1
Ejercicio 8.9
La serie de Fibonacci se calcula de la forma siguiente:
1 + 1 + 2 + 3 + 5 + 8 + 13 +…
Donde cada término i se calcula sumando los 2 anteriores: ti=ti-1+ti-2, y
los 2 términos iniciales valen 1.
Escriba una función recursiva para calcular la serie de Fibonacci y luego escriba
un programa cliente que la utilice.
Ejercicio 8.10
La función trascendente y=ex puede aproximarse mediante la serie infinita
y = 1+x+x2/2!+x3/3!+x4/4!+……
Escriba una función recursiva que calcule la suma de n términos de la serie.
Verifique el resultado en un programa C++ comparando el valor obtenido con el
valor que arroja la función de biblioteca de C++ para dicha función exponencial.
Ejercicio 8.11
La función H(x) se define como
4 * x......si...x < 4
H ( x) =
3 * H ( x − 2) + 1....si...x >= 4
Escriba una función C++ recursiva que la calcule y un programa cliente que
permita probarla obtener H(7), H( 5), H(12).
Ejercicio 8.12
Escriba una función recursiva para calcular el máximo común divisor (m.c.d.)de
dos números enteros dados aplicando las propiedades recurrentes.
Si a>b, entonces m.c.d.(a,b)=m.c.d.(a-b,b)
Si a<b, entonces m.c.d.(a,b)=m.c.d.(a, b-a)
Si a=b, entonces m.c.d.(a,b)=m.c.d.(b,a)=a=b
Ejercicio 8.13
Escriba un programa C++ que exhiba en pantalla el siguiente menú:
CALCULOS
A- Calcular el doble del dato.
B- Determinar si es par.
C- Determinar si es primo.
D- Salir.
Elija una Opción (A..DE): _
corresponde. Resuelva cada opción del menú con una función C++ creada por
Ud.
Ejercicio 8.14
Investigue como puede crear una librería de funciones C++ y almacenarla en un
archivo. Luego intente escribir un programa que incluya (#include..) la librería y
utilice las funciones propuestas en ella.
Cuestionario
8.1 Mencione las ventajas del empleo de subprogramas.
8.4 ¿Es posible que una función no devuelva resultados? ¿Cómo reconoce
una función C++ que no retorna un resultado?.
8.11 ¿Es posible llamar a una función con menos parámetros actuales que
los formales propuestos en el prototipo?
8.13 ¿Cuáles son las condiciones para que una función sea recursiva?