Guía funciones
-
Upload
ines-andara -
Category
Education
-
view
593 -
download
1
Transcript of Guía funciones
Universidad Nacional Experimental
“Francisco de Miranda”
Área Ciencias de la Educación
Departamento de Informática y Tecnología Educativa
Unidad Curricular: Computación II
UNIDAD II: FUNCIONES EN C++
Licda. Inés N. Andara Q. (2013)
Computación II. Unidad II: Funciones en C++
Página 2
La Programación Modular consta de varias secciones divididas de tal
forma que interactúan a través de llamadas a procedimientos, que integran el
programa en su totalidad. El programa principal (main) coordina las llamadas a
los módulos secundarios y pasa los datos necesarios en forma de parámetros. A
su vez cada módulo puede contener sus propios datos y llamar a otros módulos
o funciones.
Una función es un conjunto de líneas de código que realizan una tarea
específica y puede retornar un valor. Las funciones pueden tomar parámetros
que modifiquen su funcionamiento. Son utilizadas para descomponer grandes
problemas en tareas simples y para implementar operaciones que son
comúnmente utilizadas durante un programa y de esta manera reducir la
cantidad de código.
Las funciones son un conjunto de instrucciones que realizan una tarea
específica. En general toman unos valores de entrada, llamados parámetros y
proporcionan un valor de salida o valor de retorno; aunque tanto unos como el
otro pueden no existir.
Para utilizarlas es necesario declararlas previamente, definirlas e
invocarlas o llamarlas cuando se desee ejecutar la definición.
PROTOTIPO DE UNA FUNCIÓN
C ++ requiere que una función se declare o defina antes de su uso. La
declaración de una función se denomina prototipo. Específicamente consta
de los siguientes elementos:
Tipo de dato del valor que retorna la función
Nombre de la función
Lista de parámetros formales encerrados entre paréntesis
Punto y coma (;)
Los prototipos se sitúan normalmente al principio de un programa, antes
de la definición de la función main().
Sirve para indicar al compilador los tipos de retorno y parámetros de una
función, de modo que compruebe si son del tipo correcto cada vez que se use
esta función dentro del programa, o para hacer las conversiones de tipo
cuando sea necesario. Los nombres de los parámetros son opcionales, y se
tipo_retorno nombre-función (lista parámetros);
formales);
Computación II. Unidad II: Funciones en C++
Página 3
incluyen como documentación y ayuda en la interpretación y comprensión del
programa.
DEFINICIÓN DE UNA FUNCIÓN
En la definición, es dónde se realizan los procesos que se requieren, para
ello, se necesita la siguiente estructura:
Dónde:
Tipo_retorno: Es el tipo de dato que devuelve la función en C++. El tipo
debe ser de los tipos simples de C++, tales como int, float, char, bool,
entre otros. Si la función no devuelve ningún valor se utiliza la palabra
reservada void.
Nombre: Es el identificador de la función, que puede comenzar con una
letra o un subrayado (_) y puede contener tantas letras, números o
subrayados desee.
Lista de parámetros: Es una lista de parámetros con tipos que utiliza el
formato siguiente: tipo_parámetro nombre_parámetro.
Cuerpo de la función: Es el conjunto de instrucciones que debe estar
encerradas entre llaves de apertura ({) y cierre (}).
Declaración local: Las constantes, tipos de datos y variables declaradas
dentro de la función son locales a la misma y no perduran fuera de ellas.
Valor devuelto por una función: Una función puede devolver un único
valor mediante la palabra reservada return. Tan pronto como el
programa encuentra cualquiera de las sentencias return, se retorna la
sentencia llamadora.
Por ejemplo, una definición de una función que retorne el producto de
dos números enteros sería:
tipo_retorno nombre-función (lista de parámetros formales){
cuerpo de la función
return expresión; }
Computación II. Unidad II: Funciones en C++
Página 4
LLAMADO DE UNA FUNCIÓN
Cuando una función es invocada o llamada se le pasa el control a la
misma, una vez que esta finalizó con su tarea el control es devuelto al punto
desde el cual la función fue llamada.
Una llamada a una función redirigirá el control del programa a la función
nombrada. Debe ser una sentencia o una expresión de otra función que realiza
la llamada. Esta sentencia debe ser tal que debe haber coincidencia en
número, orden y tipo entre la lista de parámetros formales y actuales de la
función.
Su sintaxis es:
Si la función retorna un valor, se puede almacenar en una variable:
V = nombre_función ( arg1, arg2, … );
o también imprimirse directamente:
cout<<“El valor es:”<< nombre_función ( arg1, arg2, … );
Estudiemos los siguientes ejemplos:
Ejemplo 1. : cree un programa que lea los catetos de un triángulo rectángulo y
utilice una función para calcular la hipotenusa e imprimir el resultado.
#include <iostream>
#include <math.h>
using namespace std;
void hip(float ca, float co);
int main()
{
float a, b;
cout << "Introduzca valor del cateto opuesto: ";
cin >> a;
cout << "Introduzca valor del cateto adyacente: ";
cin >> b;
hip(a,b);
return 0;
}
Nombre_función (lista parámetros actuales);
Computación II. Unidad II: Funciones en C++
Página 5
void hip(float ca, float co)
{
float hipo;
hipo=pow(ca,2)+pow(co,2));
hip0=sqrt(hip);
cout << "El valor de la hipotenusa es: " << hip << "\n";
}
Ejemplo 2. Obtenga los factores primos de un número dado.
#include<iostream.h>
using namespace std;
void factores(int x);
int main()
{
int x;
cout<<"\t\tFACTORES PRIMOS"<<endl;
do {
cout<<"Ingrese el valor de x: ";
cin>>x;
if(x<1 || x>32767)
cout<<"Error!! debe ingresar No. entre 1 y 32677."<<endl;
}while(x<1 ||x>32767);
cout<<"Los factores primos de "<<x<<" son : \n";
factores(x);
return 0;
}
void factores(int x)
{
int V[25],i=2,j=0;
do{
if(x % i==0){
x=x/i;
V[j]=i;
j++;
}
else
i++;
}while(x!=1);
for(i=0;i<j;i++)
cout<<V[i]<<"\n";
}
Computación II. Unidad II: Funciones en C++
Página 6
Variables Locales y Globales:
Se pueden declarar variables en cualquier parte del programa y además
de pasar variables como parte del argumento de una función, también es
posible declarar variables dentro del cuerpo de una función, a este tipo de
variables se les llama locales ya que son útiles sólo dentro del cuerpo de la
función. Los parámetros utilizados en una función se consideran como variables
de tipo local y se utilizan exactamente de la misma manera, como se muestra a
continuación:
A las variables que declaramos fuera del cuerpo de cualquier función se
dice que tienen un alcance global y por lo tanto están disponibles para
cualquier función del programa, incluyendo a la función main( ).
#include<iostream>
using namespace std;
int s;//variable global
void suma(int, int);
int main(){
int a,b; //variables locales
cout<<"Suma de dos numeros\n";
cout<<"Valor 1: ";
cin>>a;
cout<<"Valor 2: ";
cin>>b;
suma(a,b);
cout<<"la suma es "<<s<<endl;
return 0;
}
void suma(int a, int b){
s=a+b;
}
int suma(int a, int b){
int s;
s=a+b;
return s;
}
Computación II. Unidad II: Funciones en C++
Página 7
Parámetros de una función
C++ proporciona dos métodos para pasar variables (parámetros) entre
funciones. Una función puede utilizar parámetros por valor y parámetros por
referencia, o puede no tener parámetros.
Paso por valor: también llamado pase por copia, significa que cuando se
compila la función y el código que llama a la misma, la función 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). Ejemplo:
#include<iostream>
using namespace std;
void paso_valor(int x);
int main(){
int x=20;
cout<<"Antes de la llamada a la funcion x= "<<x<<endl;
paso_valor(x);
cout<<"Despues de la llamada a la funcion x= "<<x<<endl;
return 0;
}
void paso_valor(int x)
{
x=x+6;
cout<<"Dentro de la funcion x= "<<x<<endl;
}
Paso por referencia: cuando una función debe modificar el valor del
parámetro pasado y devolver este valor modificado a la función llamadora, se
ha de utilizar el método de paso de parámetro por referencia o dirección.
Para declarar una variable que es parámetro formal, como paso por
referencia, el símbolo & debe preceder al nombre de la variable en la
cabecera de la función, y en la llamada el parámetro actual correspondiente
debe ser el nombre de una variable.
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 a la función llamadora la dirección
de la memoria donde se almacenó el parámetro contendrá el valor
modificado.
Computación II. Unidad II: Funciones en C++
Página 8
Ejemplo:
#include<iostream>
using namespace std;
void paso_valor(int &x);
int main(){
int x=20;
cout<<"Antes de la llamada a la funcion x= "<<x<<endl;
paso_valor(x);
cout<<"Despues de la llamada a la funcion x= "<<x<<endl;
return 0;
}
void paso_valor(int &x)
{
x=x+6;
cout<<"Dentro de la funcion x= "<<x<<endl;
}
RECURSIVIDAD
Es la propiedad de algunos lenguajes de programación de permitir que
un programa solicite su propia llamada repetidas veces hasta que se satisface
una condición específica. La llamada a sí mismo se conoce como llamada
recursiva.
Dicho de otra manera, una función recursiva se resuelve con una llamada
a sí misma, cambiando el valor de un parámetro en la llamada a la función. A
través de las sucesivas llamadas recursivas a la función se van obteniendo
valores que, computados, sirven para obtener el valor de la función llamada
originalmente. El proceso de llamadas recursivas siempre tiene que acabar en
una llamada a la función que se resuelve de manera directa, sin necesidad de
invocar de nuevo la función. Esto será siempre necesario, para que llegue un
momento que se corten las llamadas reiterativas a la función y no se entre en
un bucle infinito de invocaciones.
Sintaxis de la estructura de una función recursiva:
tipo_devuelto nombre_funcion(tipo(s)_argumento(s) nombre(s))
{
(declaración de datos y cuerpo de la función)
//condición de parada
//condición recursiva
Computación II. Unidad II: Funciones en C++
Página 9
return nombre_funcion(valor); /*Se coloca el nombre de la función,
donde se llama a ella misma, a esto se le conoce como
recursividad*/
}
Cuando se llama a una función, se crea un nuevo juego de variables
locales, de este modo, si la función hace una llamada a sí misma, se guardan
sus variables y parámetros en la pila, y la nueva instancia de la función
trabajará con su propia copia de las variables locales, cuando esta segunda
instancia de la función retorna, recupera las variables y los parámetros de la pila
y continua la ejecución en el punto en que había sido llamada.
Las funciones recursivas deben tener una forma para poder salir y así
evitar que éstas se estén llamando de manera infinita, ya que esto ocasionaría
un error conocido como desbordamiento de pila.
La recursividad y la iteración (ejecución en bucle) están muy
relacionadas, cualquier acción que pueda realizarse con iteración se puede
realizar con recursividad pero no viceversa.
Ejemplo 3.: Dado n par, encontrar la suma de los enteros pares hasta N:
2+4+6+...+(N-2)+N
#include<iostream>
using namespace std;
int suma(int n);
int main()
{
int n, s;
cout<<"Calculo de la suma de los enteros pares hasta N\n\n";
do{
cout<<"Ingrese el valor de n: ";
cin>>n;
if(n % 2 == 1)
cout<<"Error, el numero debe ser par!\n";
if(n<2)
cout<<"Error, el numero debe ser igual o mayor a 2\n";
}while(n%2==1 || n<2);
s=suma(n);
cout<<”La suma de los numeros pares hasta "<<n<<" es: "<<s<<"\n";
return 0;
}
Computación II. Unidad II: Funciones en C++
Página 10
int suma(int n)
{
if(n==2)
return 2;
else
return (n + suma(n-2) );
}
Ejemplo 4.: Cree un programa que calcule, usando una función recursiva, el
factorial de un número dado:
#include<iostream>
using namespace std;
double factorial(int);
int validar(int);
int main()
{
int n;
cout << "Obtener el Factorial de:\n";
cin >> n;
n=validar(n);
cout << "El Factorial de "<< n <<" es..."<<factorial(n);
cout << "\n";
return 0;
}
int validar(int n){
if(n<0){
cout<<”Error, ingrese el número nuevamente:”;
cin>>n;
return validar(n);
}
else
return n;
}
double factorial(int num)
{
if(num<=1)
return 1;
else
return(num*factorial(num-1)); //llamado interno de la función
}
Computación II. Unidad II: Funciones en C++
Página 11
TIPOS DE RECURSIVIDAD
Recursividad Simple: Aquella en cuya definición sólo aparece una
llamada recursiva.
double factorial(int num)
{
if(num<=1)
return 1;
else
return(num*factorial(num-1));
}
Corrida en frio de una Función Recursiva Simple
num (num<=1) Num*factorial(num-1) factorial(num-1) Retorna
3 No 3*factorial(2) 2 6
2 No 2*factorial(1) 1 2
1 Si - - 1
Recursividad Múltiple: cuando hay más de una llamada a si misma dentro
del cuerpo de la función.
int fibo (int n)
{
if(n<=1)
return 1;
else
return (fibo(n-1)+fibo(n-2));
}
Corrida en frio de una Función Recursiva Múltiple
n (n<=1) fibo(n-1)+fibo(n-2) fibo(n-1) fibo(n-2) Retorna
4 No fibo(3)+fibo(2) 3 2 5
3 No fibo(2)+fibo(1) 2 1 3
2 No fibo(1)+fibo(0) 1 1 2
1 Si - - - 1
Computación II. Unidad II: Funciones en C++
Página 12
Recursividad Anidada: En algunos de los argumentos de la llamada
recursiva hay una nueva llamada a sí misma.
int Ack( int n, int m )
{
if(n==0 )
return(m+1);
else{
if(m==0)
return(Ack(n-1,1));
else
return(Ack(n-1, Ack(n,m-1)));
}
}
Corrida (parcial) de una Función Recursiva Anidada
n m (n==0) (m==0) Ack(n-1,1) Ack(n-1, Ack(n,m-1)) Ack(n,m-1)) Retorna
1 1 No No - Ack(0, Ack(1,0)) Ack(1,0) -
1 0 No Si Ack(0,1) - - -
0 1 Si - - - - 2
Ack(0, 2)
0 2 Si - - - - 3
Recursividad Cruzada o Indirecta: son algoritmos donde una función
provoca llamada a si misma de forma indirecta a través de otras
funciones.
//Función 1
int par(int nump)
{
if(nump==0)
return 1;
else
return (impar(nump-1));
}
//Función 2
int impar (int numi)
{
if(numi==0)
return 0;
Computación II. Unidad II: Funciones en C++
Página 13
else
return(par(numi-1));
}
Corrida de una Función Recursiva Cruzada (valor Par)
nump numi (nump==0) (numi==0) impar(nump-1) par(numi-1) Retorna
4 - No - impar(3) - 1
- 3 - No - par(2) 1
2 - No - impar(1) - 1
- 1 - No - par(0) 1
0 - Si - - - 1
(verdadero)
Corrida de una Función Recursiva Cruzada (valor Impar)
nump numi (nump==0) (numi==0) impar(nump-1) par(numi-1) Retorna
3 - No - impar(2) -
- 2 - No - par(1)
1 - No - impar(0) -
- 0 - Si - - 0
(Falso)
Computación II. Unidad II: Funciones en C++
Página 14
EJERCICIOS PROPUESTOS
1. Escriba una función que tenga un argumento de tipo entero y que
devuelva un valor lógico (de tipo bool), true si el número es primo y false si
es compuesto.
2. Un número entero n se dice que es perfecto si la suma de sus divisores
incluyendo 1 y excluyéndose él coincide consigo mismo. Realizar un
programa con una función que determine si un número dado es
perfecto. Por ejemplo 6 es un número perfecto 1 + 2 + 3 = 6.
3. Un estudiante de geometría ha medido los lados de un prisma
rectangular y obtenido valores A, B, C. Hay que calcular la distancia D
que representa la longitud de una diagonal, de acuerdo con la fórmula:
D = A2 + B2 + C2 en una función.
4. Realice un programa que lea dos números complejos (a,b) y (c,d) y
emplee una función para calcular e imprimir el producto de los mismos.
(a,b)*(c,d)=(ac-bd,ad+bc)
5. Un vendedor desea calcular su comisión total sobre la venta de varios
artículos. Al vendedor le corresponde el 5% de la comisión sobre artículos
cuyo precio es menor a Bs.F. 50 y el 8% de comisión sobre aquellos
artículos cuyo precio es Bs.F. 50 o más.
6. Determinar y visualizar el número más grande de tres números dados,
mediante una función, suponiendo que los 3 son distintos.
7. Elaborar un programa que emplee varias funciones para efectuar el
cálculo del área de varias figuras geométricas (cilindro, cuadrado,
triángulo rectángulo, rombo), y muestre las distintas opciones a través de
un menú para que el usuario seleccione la figura geométrica de la que
desea saber el área.
8. Haga un programa utilizando funciones que lea el código de un
empleado, el salario básico por hora, el número de horas trabajadas
durante una semana. Calcular el salario neto, teniendo en cuenta que si
el número de horas trabajadas durante la semana es mayor de 36, esas
horas de más se consideran horas extras tienen un 30% de recarga.
Además se debe calcular la retención de 4% que se debe descontar del
salario neto. Imprima el código del empleado y el salario neto a cobrar.
9. Se define el número combinatorio ( )de la siguiente forma:
(
)
( )
Escribir un programa que lea los valores de m y n y calcule el valor de la
combinación.
10. Realice un programa que lea una vector de n elementos enteros:
a) Sumar los números positivos.
b) Contar los negativos.
c) Contar los múltiplos de 5.
Computación II. Unidad II: Funciones en C++
Página 15
d) Imprimir todos los resultados.
11. Elabore un programa que lea una matriz cuadrada A y calcule el
producto de los valores ubicados en la primera columna. Luego sume
todos los elementos de la diagonal principal y secundaria. Muestre el
resultado en pantalla.
12. Cree un programa que calcule el cociente de dos números, validando
previamente el divisor con una función recursiva.
13. Obtenga el resultado de la siguiente fórmula:
n!
x)(++
!
x+
!
x
!
x+xy
nn1...
4321
432
14. Existen números que leídos de izquierda a derecha y de derecha a
izquierda tienen el mismo valor. Ejemplo: 404, 111, 55, 323, 1045401; esta
clase de números se les denomina CAPICÚA, determine a través de una
función recursiva si un número dado es capicúa.
15. Escribir un programa que lea dos números x y n y calcule la suma de la
progresión aritmética:
16. Obtener el promedio de n elementos de un vector de enteros mediante
una función recursiva.
17. Calcular la suma de n números naturales, de la siguiente forma:
S=1+2+3+…+(n-1)+n