Funciones_240707_204322
Funciones_240707_204322
Funciones_240707_204322
Uno de los problemas habituales del programador ocurre cuando los programas
alcanzan un tamaño considerable en cuanto a líneas de códigos se trata. El problema se
puede volver tan complejo que fuera inabordable.
Las funciones son invocadas desde el código utilizando su nombre. Cuando desde el
código se invoca a una función, entonces el flujo del programa salta hasta el código de la
función invocada. Después de ejecutar el código de la función, el flujo del programa regresa
al código siguiente a la invocación.
Las funciones contienen varias sentencias bajo un mismo nombre, que un programa
puede utilizar una o mas veces para ejecutar dichas sentencias. Ahorran espacio, reduciendo
repeticiones y haciendo más fácil la programación, proporcionando un medio de dividir un
proyecto grande en módulos más manejables.
1
Las funciones pueden existir de modo autónomo. Como ya se ha trabajado
anteriormente, se sabe que cada programa en C++ tiene al menos una función main(); sin
embargo, cada programa C++ consta de muchas funciones en lugar de una función main()
grande. La división del código en funciones hace que las mismas se puedan reutilizar en su
programa y en otros programas. Después de que escriba, pruebe y depure su función, ésta
se puede utilizar nuevamente una y otra vez. Para reutilizar una función dentro de su
programa, sólo se necesita llamar a la función.
1. FUNCIONES.
1.1.Definición.
1.2.Declaración y Estructura.
El conjunto de líneas que conforman a la función tienen una estructura bien definida,
ésta está dividida en dos partes principales: el prototipo y el cuerpo de la función. C++
requiere que una función se declare o defina antes de su uso, por lo tanto esta se ubicará
antes de la función main.
2
Prototipo.
Cuerpo de la Función.
El cuerpo de la función se dispone, bien sea entre las palabras Inicio y Fin para
pseudocódigo o dentro de un conjunto de llaves { }, en C++. En esta sección se escribirán
las líneas de código, de los distintos tipos de instrucciones (declaración, entrada/salida,
asignación y cálculo y control) que darán vida a la función.
entero i, potencia
potencia= 1
Repetir desde i= 1 hasta i<= exponente
potencia= potencia*base
Fin_Repetir_Desde
Devolver (potencia)
Fin
int pot (int base, int exponente)
{
int i, potencia;
potencia= 1;
C++
3
indica es la que retornará el valor calculado dentro de la función, cuando dicha función es
utilizada.
Una vez que hemos declarado la función, la idea es hacer uso de ésta. El proceso de
utilizar o emplear a la función que hemos creado se denomina llamar a la función.
Este proceso no es algo nuevo, de manera inconsciente desde que comenzamos a
programar en C++ hemos utilizado funciones propias de este lenguaje de programación, para
refrescar un poco la memoria, analicemos el código del Ejemplo 02.
entero Radio
real Area
Mostrar (“Ingrese el Radio de la Circunferencia”)
Leer(Radio)
Area = 3,1416*Radio^2
Mostrar (“El Área es: ”, Area)
Fin
#include <iostream.h>
#include <math.h> // Libreria que contiene la función pow
#define PI 3.1416
void main()
{
int Radio;
C++
float Area;
cout<<“Ingrese el Radio de la Circunferencia: ”;
cin>>Radio;
Area = PI * pow(Radio,2);
cout<<“El Área es: ”<<Area;
system(“PAUSE”);
}
La instrucción pow, no es más que una función que calcula la potencia de un número
elevado a un exponente. Su definición se encuentra en la librería math.h, es por eso que si
no agregamos dicha librería, el compilador no reconoce a la función, arrojando un resultado
como el de la figura 2.
Figura 2. Error del Depurador por no incluir la Librería Math.h y usar la función pow en el
código.
4
Ahora bien, en el Ejemplo 01 hemos creado nuestra propia función pow, en el Ejemplo
03 utilizaremos la función pot creada por nosotros mismos.
Diseñe un programa que utilice la función pot del Ejemplo 01, para calcular
Ejemplo 03.
el área de una circunferencia, cuyo radio es introducido por el usuario.
Algoritmo Área de Circunferencia
//Función pot
entero pot (entero base, entero exponente)
Inicio
entero i, potencia
potencia= 1
Repetir desde i= 1 hasta i<= exponente
potencia= potencia*base
Pseudocódigo
Fin_Repetir_Desde
Devolver (potencia)
Fin
//Algoritmo Principal
Inicio
entero Radio
real Area
Mostrar (“Ingrese el Radio de la Circunferencia”)
Leer(Radio)
Area = 3,1416* pot(Radio, 2)
Mostrar (“El Área es: ”, Area)
Fin
#include <iostream.h>
#define PI 3.1416
//Programa Principal
void main()
{
int Radio;
float Area;
cout<<“Ingrese el Radio de la Circunferencia: ”;
cin>>Radio;
Area = PI * pot(Radio,2);
cout<<“El Área es: ”<<Area;
system(“PAUSE”);
}
5
Cuando se ejecuta el programa principal del Ejemplo 03, se llama a la función pot en
la instrucción donde se calcula el área de la circunferencia, cuando el computador interpreta
dicha instrucción se da cuenta que es una función y “salta” a la declaración de esa función,
allí ejecuta las instrucciones que pertenecen a ésta y cuando consigue una instrucción return,
sale de la función, retornando el valor que se indique en el punto donde fue llamada la
función en un principio. Para comprender un poco este proceso visualice la figura 3.
Para visualizar los parámetros de una función sea propia del usuario o pertenezca a
C++, el software de programación despliega una pestañita indicando los argumentos de la
función al escribir el paréntesis de apertura luego del nombre de la función. Lo anterior se
observa en la figura 4.
Figura 4.Ayuda del C++ Builder para visualizar los Parámetros de una Función.
Existen dos métodos para pasar variables (parámetros) al llamar funciones. Una
función puede utilizar paso de parámetros por valor o parámetros por referencia, así como
también puede no tener parámetros.
6
Paso por Valor.
También llamado paso por copia, significa que cuando se compila la función y el
código que llama a la misma, ésta recibe una copia de los valores de los parámetros
actuales. La función receptora no puede modificar la variable de la función (parámetro
pasado). En la siguiente figura se muestra un ejemplo de un programa que utiliza una función
llamada funcion1 con paso por valor.
void main ()
{
int x=6;
cout<<x<<endl; 6
funcion1(x);
cout<<x<<endl;
system(“PAUSE”); void funcion1 (int y)
{
} cout<<y<<endl;
y++;
cout<<y<<endl;
}
6
6
7
6
Trabajando las funciones como se ha hecho hasta ahora, se tiene una importante
limitación cuando de retornar valores al programa principal se trata, ya que la función
devolver o return está limitada a retornar un solo valor. El método de paso por referencia
permite solventar este inconveniente, ya que permite modificar directamente los valores que
están el programa principal.
El método de paso de parámetros por referencia también se conoce como paso por
dirección, en este caso los parámetros formales de la función (los que están en el prototipo),
se deben declarar incluyendo el símbolo & cómo primer carácter del identificador, y al usar la
función el parámetro actual (argumento que se pasa cuando se llama a la función) se sigue
pasando de la misma manera, es decir, con su correspondiente nombre. En la siguiente
unidad se estudiará más a fondo este tipo de paso, pero utilizando variables puntero.
Cuando se modifica el valor del parámetro formal de un parámetro por referencia (la
variable local), este valor queda almacenado en la misma dirección de memoria, por lo que al
retornar la función llamadora la dirección de la memoria donde se almacenó el parámetro
contendrá el valor modificado. Veamos el Ejemplo 04.
7
Diseñe un programa a través de una función o procedimiento calcule la
Ejemplo 04. superficie y el volumen de una esfera cuyo radio es introducido por el
usuario.
Pseudocódigo
Algoritmo Superficie y Volumen de Esfera
//Subrutina para calcular la superficie y el volumen
Procedimiento sup_vol (real radio, real &vol, real &sup)
Inicio
vol=(4/3)*3.1416*radio^3
sup=4*3.1416*radio^2
Fin
//Algoritmo Principal
Inicio
real Radio, Volumen, Superficie
Mostrar (“Ingrese el Radio de la Esfera”)
Leer(Radio)
Llamar a sup_vol( Radio, Volumen, Superficie)
Mostrar (“El Volumen es: ”, Volumen)
Mostrar (“La Superficie es: ”, Superficie)
Fin
C++
#include <iostream.h>
#include <math.h>
#define PI 3.1416
En el ejemplo 04, los valores para las variables Volumen y Superficie no son
retornados, sino que al ser modificadas dentro de la función, su valor varía indirectamente.
8
2. PROCEDIMIENTOS.
Fin
Código 3. Declaración de un Procedimiento en Pseudocódigo.
Las variables que tienen ámbito de programa pueden ser referenciadas por cualquier
función en el programa completo; tales variables se les llama variables globales. Para hacer
una variable global, declárela simplemente al principio de un programa, fuera de cualquier
función (inclusive la función main()), se recomienda declararlas al comienzo del programa
antes de las definiciones de las funciones.
El ámbito de estas variables es global, es decir, que son visibles por cualquier función
y cualquiera de ellas puede modificar su valor. La vida de estas variables va ligada a la del
programa, se crean cuando empieza la ejecución del programa y pueden ser utilizadas hasta
que se acabe el mismo.
9
3.2. Variables Locales.
Están declaradas dentro de la función, bien dentro del cuerpo o bien como parámetros
formales. El ámbito de la variable se reduce al de la función y fuera de esta no tienen
presencia, es decir, sólo puede ser utilizada por la función donde está declarada.
Variables Estáticas: A pesar de que sólo pueden ser utilizadas por la función donde han sido
declaradas, no son destruidas al terminar ésta. Por lo tanto, mantienen su valor para la
próxima vez en que sea llamada la función. Se declaran, precediendo el nombre del tipo por
la palabra "static".
En C++ todos los arreglos se pasan por referencia (dirección). C++ trata
automáticamente la llamada a la función como si hubiera situado el operador de dirección &
delante del nombre del arreglo.
Diseñe un programa que lea dos arreglos de 10 elementos, que los sume
término a término y los deposite en otro arrelgo. Diseñe tres funciones, la
Ejemplo 05.
primera debe ingresar los datos, la segunda sumar dos arreglos y la
tercera debe mostrar.
Pseudocódigo
Algoritmo Parámetros tipo Arreglo
10
Fin_Repetir_Desde
Fin
//Algoritmo Principal
Inicio
real A[10], B[10], C[10]
Llamar a lectura (A, 10)
Llamar a lectura (B, 10)
11
cin>>a[i];
}
}
void main()
{
float A[N], B[N], C[N];
cout<<"Ingreso del Arreglo A \n";
lectura(A, N);
cout<<"Ingreso del Arreglo B \n";
lectura(B, N);
clrscr();
cout<<"Estos fueron los Arreglos que ingreso: \n";
cout<<"\n Arreglo A \n";
muestra(A, N);
cout<<"\n Arreglo B \n";
muestra(B, N);
suma(A, B, C, N);
cout<<"\n Arreglo Resultante C \n";
muestra(C, N);
getch();
}
C++ permite pasar estructuras a funciones, bien por valor o bien por referencia,
utilizando el operador &. Si la estructura es grande, se debe usar el método de dirección.
12
Diseñe un programa que permita guardar los datos de una encuesta
realizada a 300 personas, sobre su índice de masa corporal. A los
Ejemplo 06.
encuestados se les pidió su nombre, cédula, estatura y peso. El programa
debe mediante un menú de opciones, realizar:
[1] Ingresar los datos de la Encuesta: se deben ingresar los datos que se les pidió a los
encuestados, calcular el correspondiente índice de masa corporal usando la fórmula: IMC =
Peso / Estatura2, y luego clasificar la evaluación según la tabla de Clasificación IMC (ver
abajo).
[2] Mostrar Datos Totales: Se debe visualizar la estructura con toda la información
completa.
IMC [300]
Nombre Cedula Estatura Peso imc eval Clasificación IMC
1 Infrapeso <18,50
2 Normal 18,50 a 24,99
: Sobrepeso ≥ 25
300 Obeso ≥ 30,00
Pseudocódigo.
Algoritmo Parámetros Tipo Registro
Registro Datos_IMC
caracter nombre[20], eval[15]
real peso, estatura, imc
entero cedula
Fin_Registro
//Procedimiento Validación
Procedimiento validacion (entero &valor, entero lim_inf, entero lim_sup)
Inicio
Repetir Mientras (valor<lim_inf || valor>lim_sup)
Mostrar ("Opcion invalida, reintroducir")
Leer (valor)
Fin_Repetir_Mientras
Fin
13
//Función Menú
entero menu ()
Inicio
entero opc
Mostrar ("Menu de Opciones: ")
Mostrar (“1)Ingresar Datos de la Encuesta”)
Mostrar ("2)Visualizar Datos ")
Mostrar ("3)Salir del Programa ")
Mostrar ("Escoja una Opcion: ")
Leer (opc)
validacion(opc, 1, 3)
Devolver (opc)
Fin
//Procedimiento Ingreso
Procedimiento ingreso (Datos_IMC ing_imc[ ], int n)
Inicio
int i
Repetir Desde i=1 hasta i<=n
Mostrar ("Ingrese el Nombre: ")
Leer(ing_imc[i].nombre)
Mostrar ("Ingrese la cedula: ")
Leer(ing_imc[i].cedula)
Mostrar ("Ingrese el peso: ")
Leer(ing_imc[i].peso)
Mostrar ("Ingrese la estatura: ")
Leer(ing_imc[i].estatura)
ing_imc[i].imc=ing_imc[i].peso/ing_imc[i].estatura^2
Fin_Repetir_Desde
Fin
//Procedimiento Evaluación
Procedimiento evaluacion (Datos_IMC eval_imc[ ], int n)
Inicio
int i
Repetir Desde i=1 hasta i<=n
Si(eval_imc[i].imc<18.5)
eval_imc[i].eval="Infrapeso"
Fin_Si
Si (eval_imc[i].imc>=18.5 && eval_imc[i].imc<25)
eval_imc[i].eval="Normal"
Fin_Si
Si (eval_imc[i].imc>=25 && eval_imc[i].imc<30)
eval_imc[i].eval="Sobrepeso"
Fin_Si
Si(eval_imc[i].imc>=30)
eval_imc[i].eval="Obeso"
Fin_Si
Fin_Repetir_Desde
14
Fin
//Procedimiento Muestra
Procedimiento mostrar (Datos_IMC most_imc[ ], int n)
Inicio
int i
Mostrar("Resultados de la Encuesta")
Mostrar (" Nombre Cedula IMC Evaluacion")
Repetir Desde i=1 hasta i<=n
Mostrar(most _imc[i].nombre," ")
Mostrar(most _imc[i].cedula," ")
Mostrar(most _imc[i].imc," ")
Mostrar(most _imc[i].eval, " ")
Fin_Repetir_Desde
Fin
//Programa Principal
Inicio
Datos_IMC Encuesta[300]
entero i, opcion=1
En Caso de (opcion)
caso 1:
Llamar a: ingreso (Encuesta, 300)
Llamar a: evaluacion (Encuesta, 300)
caso 2:
Llamar a: mostrar (Encuesta, 300)
case 3:
Mostrar (“Fin del Programa…”)
Fin_En_Caso_De
Fin _Repetir_Mientras
Fin
C++
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <iomanip.h>
#define N 3
15
//Declaración de Variables Globales
struct Datos_IMC
{
char nombre[25], eval[15];
float peso, estatura, imc;
int cedula;
};
//Procedimiento Validación
void validacion (int &valor, int lim_inf, int lim_sup)
{
while (valor<lim_inf || valor>lim_sup)
{
cout<<"Opcion invalida, reintroducir";
cin>>valor;
}
}
//Función Menu
int menu ()
{
int opc;
clrscr();
cout<<"Menu de Opciones: \n";
cout<<"1)Ingresar Datos de la Encuesta \n";
cout<<"2)Visualizar Datos \n";
cout<<"3)Salir del Programa \n";
cout<<"Escoja una Opcion: ";
cin>>opc;
validacion(opc, 1, 3);
return (opc);
}
//Procedimiento Ingreso
void ingreso (Datos_IMC ing_imc[ ], int n)
{
int i;
for(i=0; i<n; i++)
{
cout<<"Ingrese el Nombre: (Recuerde colocar un punto al final)\n";
cin.getline(ing_imc[i].nombre, 20, '.');
cout<<"Ingrese la cedula: \n";
cin>>ing_imc[i].cedula;
cout<<"Ingrese el peso: \n";
cin>>ing_imc[i].peso;
cout<<"Ingrese la estatura: \n";
cin>>ing_imc[i].estatura;
ing_imc[i].imc=ing_imc[i].peso/pow(ing_imc[i].estatura,2);
}
16
}
//Procedimiento Evaluación
void evaluacion (Datos_IMC eval_im[ ], int n)
{
int i;
for(i=0; i<n; i++)
{
if(eval_imc[i].imc<18.5)
strcpy(eval_imc[i].eval,"Infrapeso");
else if(eval_imc[i].imc>=30)
strcpy(eval_imc[i].eval,"Obeso");
}
}
// Procedimiento Mostrar
void mostrar (Datos_IMC ing_imc[ ], int n)
{
int i;
cout<<" Resultados de la Encuesta \n";
cout<<"Nombre"<<setw(20)<<"Cedula"<<setw(10)<<"IMC"<<setw(15)<<"Evaluacion"<<endl;
for(i=0; i<n; i++)
{
cout<<ing_imc[i].nombre<<" ";
cout<<left<<ing_imc[i].cedula<<setw(15);
cout<<left<<setprecision(2)<<ing_imc[i].imc<<setw(15);
cout<<left<<ing_imc[i].eval<<endl;
}
}
/*********************PROGRAMA PRINCIPAL*******************************/
void main ()
{
Datos_IMC Encuesta[N];
int i, opcion=1;
switch(opcion)
{
case 1:
clrscr();
ingreso (Encuesta, N);
17
evaluacion (Encuesta, N);
break;
case 2:
clrscr();
mostrar (Encuesta, N);
getch();
break;
case 3:
system ("PAUSE");
break;
}// Fin Switch
18