Você está na página 1de 9

Urnivesidad Nacional de Moquegua

Curso: Algoritmos y Estructura de Datos

Escuela Profesional de Ing. de Sistemas e Informtica

FUNCIONES
Al llegar a este tema, suponemos que es de nuestro conocimiento del entrenamiento lgico impartido
anteriormente, reconociendo y aplicando correctamente cada estructura de programacin de tal forma
que planteado un problema no tenga dudas en utilizarlas convenientemente, construyendo el algoritmo
que d solucin al problema.
Ahora de lo que se trata es de darle un entono, un ambiente, una forma, un lugar, a cualquier algoritmo
construido; al cual le llamaremos proceso o funcin (en otros lenguajes de programacin existen adems
de las funciones los procedimientos).

Definicin: Una funcin es un proceso que realiza una determinada tarea, por lo tanto tiene un nombre
y es capaz de recibir datos (entradas) y devolver resultados ( salidas ) a travs de variables especiales
que toman el nombre de parmetros e inclusive devolver el resultado de la tarea a travs de su propio
nombre.
En todo lenguaje de programacin ya existen una infinidad de funciones y/o procedimientos
(denominadas biblioteca/librera de funciones) que pueden ser utilizados por el programador. En el caso
de C++ los ms utilizados son los conocidos :
clrscr( ) : Cuya tarea es borrar pantalla.
getch( ) : Cuya tarea es esperar a que el usuario presione cualquier tecla. (en nuestro caso, pausa
para ver resultados).
Imagnese de no existir la funcin clrscr( ), el que limpia pantalla; entonces tendramos que programar
todas las veces que necesitemos borrar pantalla (esto significa doble trabajo). Como esta tarea es de
mucha demanda entonces la implementamos en una funcin y la REUTILIZAMOS cuantas veces sea
necesario (que es el objetivo principal de la creacin de funciones ).
Por lo tanto el programador debe implementar las funciones que no existan en la biblioteca de funciones
que viene con el propio lenguaje de programacin ( o simplemente si dichas funciones NO brindan
resultados que el programador desea )
Cabe mencionar que en C++ solamente existen funciones. Existen bsicamente dos tipos de funciones:

Funciones que despus de realizar una tarea especfica devuelven resultados.


Funciones que despus de realizar una tarea especfica NO devuelven resultados (en otros
lenguajes cuando una funcin no devuelve resultado se denomina Procedimiento), en todo caso
slo son terminologas utilizadas por los lenguajes, pero en s la filosofa es la misma.

DECLARACION DE FUNCIONES
Ubicacin:
En C++ una de las tantas formas de estructura general de un programa es el siguiente:

MSc. Ing. Euler Tito Chura

66

Urnivesidad Nacional de Moquegua


Curso: Algoritmos y Estructura de Datos

Escuela Profesional de Ing. de Sistemas e Informtica

// definicin de archivo de cabecera (*.h)


...
// declaracin de variables globales
...
void main()
{ // inicio de main
...
...
} // fin de main
// desarrollo de funciones propias
...
..
..

Como podemos observar las funciones se ubican al final de todo el cuerpo de main.

Sintaxis general en C++


Prototipo:

Tipo_de_dato_que_devuelve_la_funcin Nombre_de_la_funcin (Lista de parmetros)


{ // inicio de la funcin
// declaracin de variables locales (pertenecientes slo a la funcin)
// conjunto de instrucciones para ejecutar la tarea a realizar
return ( Variable que tiene el dato a devolver ) // slo si se devuelve un resultado
} // fin de la funcin

Donde:
Tipo_de_dato_que_devuelve_la_funcin identifica el valor que la funcin retornar como
resultado a travs de su nombre, se refiere al tipo de dato de la variable que contiene el dato a
devolver (que va acompaada con la sentencia return). Si la funcin no devolviera un resultado
entonces este tipo de dato es void y no ser necesario incluir la sentencia return.
Nombre_de_la_funcin que identifica unvocamente a la funcin y debe empezar con una
letra.
Lista de parmetros son los datos (variables) de Entrada y/o Salida respecto a la funcin.
Ahora cmo diferenciar si un parmetro es una variable de Entrada o Salida ?
Gran dilema para uno que recin se inicia en usar funciones:
Pues la respuesta es muy sencilla: En C++ el parmetro que solamente RECIBE datos se declara
como una variable cualquiera( ejm. int x), en cambio el parmetro que DEVUVELVE resultados
o RECIBE o DEVUELVE a la vez va precedido con el smbolo & ( ejm. int &x )
Tambin se puede utilizar el * (asterisco), pero esto requiere un poco del conocimiento del
concepto de punteros o apuntadores).
En buena cuenta es importante sealar que en cualquier lenguaje de programacin a los
parmetros de Entrada se conocen como parmetros por valor, en cambio los parmetros de
Entrada y/o Salida son llamados como parmetros por referencia
Variable que contiene el dato a devolver que va acompaado con la sentencia return.
Por lo tanto hay dos posibilidades para devolver resultados (parmetros de salida y la
instruccin return)
MSc. Ing. Euler Tito Chura

67

Urnivesidad Nacional de Moquegua


Curso: Algoritmos y Estructura de Datos

Escuela Profesional de Ing. de Sistemas e Informtica

Entonces Cul es la diferencia en usar parmetros de salida y el return ?


Depende de los objetivos:
Si la funcin solamente requiere devolver UN SOLO RESULTADO usaremos return (
la razn es que solamente se acepta una sola variable con esta instruccin)
Si la funcin requiere devolver MAS DE UN RESULTADO usaremos los parmetros
de Salida (en la lista de parmetros si podemos incluir todas las variables que sean
necesarias).
Sin embargo es posible combinar ambos enfoques.

Ejemplos de funciones cuyo tipo de dato es void


Significa que no debemos usar la instruccin return, pero tenemos la posibilidad de devolver resultados a
travs de los parmetros de salida ( es decir declaradas con el operador & ) si en caso se devolviera un
resultado.

Enunciado: Desarrollar una funcin que reciba un valor que represente cierta cantidad de horas y
devuelva su equivalente en minutos y segundos por separado.
Solucin:
Parmetros de Entrada/Salida:
Entrada: Horas (H) // parmetros por valor (variables de entrada)
Salidas: Minutos, Segundos (M, S) // parmetros por referencia (variables en este caso
slo de salida, por lo tanto irn precedidas por &).
Inplementacin:
void equivalente(float H, float &M, float &S)
{ // inicio de la funcin
M = H*60;
S = H*3600;
} // fin de la funcin

Importante:
Notar que la hora a convertir se recibe (Entrada) a travs de la variable H (parmetro por
valor).
Los resultados se devuelven (Salida) a travs las variables M y S (parmetros por referencia), es
decir su equivalente en minutos y segundos.

Enunciado: Desarrollar una funcin que determine la suma de los N primeros nmeros naturales, es
decir 1+2+3+4+...+N
Solucin:
Parmetros de Entrada/Salida:
Entrada: N // parmetros por valor (variables de entrada)
Salidas: Suma (Suma de los N primeros naturales) // parmetros por referencia
(variables en este caso slo de salida que ir precedida por &).
Inplementacin:
void Sumatoria (int N, int &Suma)
{ // inicio de la funcin
int x; // variable local de la funcin
Suma=0;
MSc. Ing. Euler Tito Chura

68

Urnivesidad Nacional de Moquegua


Curso: Algoritmos y Estructura de Datos

Escuela Profesional de Ing. de Sistemas e Informtica

for (x = 1 ; x <= N; x = x + 1)
{
Suma = Suma + x;
}
} // fin de la funcin
Importante:
N es el parmetro de Entrada (parmetro por valor).
La suma se devuelve a travs del parmetro Suma ( por referencia y va acompaada por &).

EJECUCION o LLAMADAS A FUNCIONES PROPIAS


Todo proceso o funcin en s mismo no es de utilidad, por lo tanto para poder explotar el servicio que
prestan dichas funciones deben ser llamadas desde otras funciones cuantas veces sea necesario.
Usualmente son invocadas (llamadas) desde main (que tambin es una funcin).
La funcin principal de todo programa en C++ es main. Es por eso que va acompaada de los parntesis
vacos, que simplemente significa que main usualmente no recibe nada. Adems main va precedida de int
o void, pues depende del programador.
Es por ello que en muchos textos podremos apreciar indistintamente una de estas modalidades.

....
void main( )
{
........
.........
.........
}

....
int main( )
{
...............
.............
...return( 0 );
}

Por lo tanto para invocar o llamar (requerir los servicios) a una funcin (de tipo void), es de la siguiente
manera:
Nombre_de_la_funcin ( Lista de parmetros );

Observaciones:
1.

2.

3.

4.

5.

Los parmetros que se utilizan al momento de la declaracin toman el nombre de parmetros


formales y los parmetros que se utilizan al momento de la ejecucin (CTRL+F9) toman el nombre
de parmetros actuales.
Los parmetros formales y los parmetros actuales deben tener correspondencia en nmero y en tipo
de dato, es decir que si se declararon 3 parmetros formales, deben utilizarse 3 parmetros actuales y
si el primer parmetro formal fuera de tipo float, el primer parmetro actual tambin debe ser de tipo
float.
A un parmetro actual que le corresponde un parmetro formal de ENTRADA se le conoce con el
nombre de parmetro valor y a un parmetro actual que le corresponde un parmetro formal de
SALIDA o ENTRADA/SALIDA se le conoce con el nombre de parmetro referencia.
Un parmetro valor no necesariamente debe ser una variable; en cambio un parmetro referencia si
necesariamente debe ser una variable ya que cuando termina la ejecucin del proceso los resultados
que devuelve son recibidos por los parmetros referencia correspondientes.
Finalmente, cuando se ejecuta una funcin el control de ejecucin del computador se dirige hacia el
lugar de desarrollo de dicha funcin, ejecuta las instrucciones que forman parte de ella y cuando
termina, el control de ejecucin regresa a la siguiente sentencia desde donde se le ejecut.

MSc. Ing. Euler Tito Chura

69

Urnivesidad Nacional de Moquegua


Curso: Algoritmos y Estructura de Datos

Escuela Profesional de Ing. de Sistemas e Informtica

Ejemplos de ejecucin (llamadas) de las funciones de tipo de dato void.


Veamos a continuacin la invocacin de funciones implementadas anteriormente.
// inclusin de archivos declaradas.
#include iostream.h
#include conio.h

//funcin principal
void main()
{ // inicio de main
float Minutos, Segundos;
clrscr( ); // borrar pantalla

equivalente( 6, Minutos, Segundos);


cout << 6 horas equivale a: << Minutos << minutos << endl;
cout << 6 horas equivale a: << Segundos << segundos << endl;

getch( ); // pausa para ver resultados

// Otra forma de invocacin de la funcin equivalente


float Horas;
cout << Ingrese el nro de horas: ; cin >> Horas;

equivalente (Horas, Minutos, Segundos);


cout << Horas << horas equivalen a : << Minutos << minutos. << endl;
cout << Horas << horas equivalen a : << Segundos << segundos. << endl;

// Invocacin a la funcin de la suma de los N primeros nmeros naturales.


int Numero, SumaTotal;
cout << Ingrese el nmero N (para sumar 1+2+3+4+...+N): ; cin >> Numero;

sumatoria(Numero, SumaTotal);
cout << La suma total es: << SumaTotal << endl;
getch( );

} // fin de main

// inclusin de las funciones propias


void equivalente(float H, float &M, float &S)
{ // inicio de la funcin
M = H*60;
S = H*3600;
MSc. Ing. Euler Tito Chura

70

Urnivesidad Nacional de Moquegua


Curso: Algoritmos y Estructura de Datos

Escuela Profesional de Ing. de Sistemas e Informtica

} // fin de la funcin

void Sumatoria (int N, int &Suma)


{ // inicio de la funcin
int x; // variable local de la funcin
Suma = 0;
for (x = 1 ; x <= N; x = x+1)
{
Suma = Suma + x;
}
} // fin de la funcin

Observacin:
Todo lo anterior (es decir desde el primer #include ... etc.) se graba como un solo archivo *.cpp y de no
tener errores de sintaxis se ejecutar correctamente.

Ejemplos de funciones cuyo tipo de dato NO es void


Enunciado: Implementar una funcin que devuelva el mayor de 3 nmeros enteros.
int Mayor (int a, int b, int c)
{ // inicio de la funcin
int Max; // variable local de la funcin
Max = a;
if ( b > Max )
Max = b;
if ( c > Max )
Max = c;
return( Max );
} // fin de la funcin

Enunciado: Implementar una funcin que devuelva el nombre correspondiente a un nmero de mes.
Entradas a la funcin:
nmero de mes ( NumMes )
Salida :
nombre del mes ( NombreMes )
Desarrollo:
char *NombreMes(int NumMes)
{ // inicio de la funcin
switch ( NumMes )
{
case 1 : return Enero;
case 2 : return Febrero;
case 3 : return Marzo;
case 4 : return Abril;
case 5 : return Mayo;
MSc. Ing. Euler Tito Chura

break;
break;
break;
break;
break;
71

Urnivesidad Nacional de Moquegua


Curso: Algoritmos y Estructura de Datos
case 6 : return Junio;
case 7 : return Julio;
case 8 : return Agosto;
case 9 : return Setiembre;
case 10 : return Octubre;
case 11 : return Noviembre;
case 12 : return Diciembre;
default :
return Desconocido ;

Escuela Profesional de Ing. de Sistemas e Informtica

break;
break;
break;
break;
break;
break;
break;

}
} // fin de la funcin

Ejecucin o Llamada de una funcin cuyo tipo de datos NO es void


Existen tres posibilidades:
a.) Como asignacin.
variable = Nombre_funcin (lista de parmetros);
cout << resultado de la funcin: << variable;
La variable debe ser del mismo tipo de dato que de la funcin.
b.) Como resultado:
cout << resultado de la funcin: << Nombre_funcin(lista de parmetros);
c.) Como envo de parmetro por valor a otra funcin en la llamada.
OtroNombre_funcin(..., Nombre_funcin(lista de parmetros), ....);

Observaciones:
Una funcin cuyo tipo de dato no sea void debe considerarse como un valor siempre; ya que de todas
maneras cuando se ejecute va a devolver un valor a travs de su nombre.

Ejemplos de ejecucin (llamadas) de las funciones cuyo tipo de dato NO ES void.


// inclusin de archivos declaradas.
#include iostream.h
#include conio.h
#include string.h
//funcin principal
void main()
{ // inicio de main
clrscr( ); // borrar pantalla

//como asignacin
int NumeroMayor;
cout << endl << Ingrese el primer nmero: ; cin >> Num1;
cout << endl << Ingrese el segundo nmero: ; cin >> Num2;
cout << endl << Ingrese el tercer nmero: ; cin >> Num3;
MSc. Ing. Euler Tito Chura

72

Urnivesidad Nacional de Moquegua


Curso: Algoritmos y Estructura de Datos

Escuela Profesional de Ing. de Sistemas e Informtica

NumeroMayor = Mayor(Num1, Num2, Num3);


cout << endl << El mayor de los 3 nmeros es: << NumeroMayor << endl;
getch( );

//como resultado
cout << endl << El mayor de los 3 nmeros es: << Mayor(Num1, Num2, Num3) << endl;
getch( ); // pausa para ver resultados
// invocacin a la funcin NombreMes
int mes;
char nombre[ 31]; // para almacenar el nombre del mes, es decir una cadena
clrscr( );
// como asignacin
cout << ingrese nmero de mes: ; cin >> mes;
strcpy(nombre, NombreMes( mes ) ); // asignacin de cadenas
cout << endl << El nombre del mes ingresado es: << nombre << endl;
getch( );
// como resultado
cout << endl << El nombre del mes ingresado es: << NombreMes( mes ) << endl;
getch( );
} // fin de main

// inclusin de las funciones propias


int Mayor (int a, int b, int c)
{ // inicio de la funcin
int Max; // variable local de la funcin
Max = a;
if ( b > Max )
Max = b;
if ( c > Max )
Max = c;
return( Max );
} // fin de la funcin
char *NombreMes(int NumMes)
{ // inicio de la funcin
switch ( NumMes )
{
case 1 : return Enero;
case 2 : return Febrero;
case 3 : return Marzo;
case 4 : return Abril;
case 5 : return Mayo;
MSc. Ing. Euler Tito Chura

break;
break;
break;
break;
break;
73

Urnivesidad Nacional de Moquegua


Curso: Algoritmos y Estructura de Datos
case 6 : return Junio;
case 7 : return Julio;
case 8 : return Agosto;
case 9 : return Setiembre;
case 10 : return Octubre;
case 11 : return Noviembre;
case 12 : return Diciembre;
default :
return Desconocido ;

Escuela Profesional de Ing. de Sistemas e Informtica

break;
break;
break;
break;
break;
break;
break;

}
} // fin de la funcin

Ntese que todas las llamadas a las funciones se han hecho desde la funcin principal (main); sin
embargo recuerde que tambin se puede hacer desde el desarrollo de cualquier funcin.
Ahora que ya sabemos ejecutar/invocar/llamar a una funcin, vimos que las funciones propias
implementadas por el programador que utiliza un programa pueden estar en el mismo programa (en un
solo archivo, como en los ejemplos anteriores) pero tambin pueden estar fuera del programa (es decir
en otros archivos) conformando as lo que se denominan Libreras o Bibliotecas (para luego ser
reutilizadas).
Entonces la pregunta es: Qu funciones deben estar en el mismo programa y qu funciones deben estar
en una librera/biblioteca?. La respuesta es que s las funciones van a poder ser utilizadas en otros
programas lo ms lgico y recomendable es que estn en una librera, en cambio si las funciones son
especficas y slo sirven a un programa pueden estar junto a todo el programa.
Cmo se construyen libreras/bibliotecas ?. Veremos en al apartado siguiente (PARTE TRES)

FUNCIONES PROPUESTAS
1.
2.
3.

4.

Funcin de nombre DIGITOS que reciba un nmero entero grande y devuelve el dgito mayor as
como el dgito menor contenido en dicho nmero.
Funcin de nombre SUMATORIA, que reciba un nmero entero y devuelva de los nmeros naturales
desde cero hasta el nmero dado.
Funcin de nombre BINARIO, que devuelva como cadena la representacin binaria de cualquier
nmero entero completado con CEROS a la izquierda, si fuera necesario, para que la cadena tenga
una longitud mltiplo de 8 de acuerdo al nmero recibido.
Funcin de nombre ALEATORIOENTRE, que reciba dos nmeros enteros que representan un rango
y devuelva un valor entero aleatorio comprendido en dicho rango.

MSc. Ing. Euler Tito Chura

74

Você também pode gostar