guía funciones

15
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)

Upload: ines-andara

Post on 12-Jul-2015

590 views

Category:

Education


1 download

TRANSCRIPT

Page 1: 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)

Page 2: Guía funciones

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);

Page 3: Guía funciones

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; }

Page 4: Guía funciones

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);

Page 5: Guía funciones

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";

}

Page 6: Guía funciones

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;

}

Page 7: Guía funciones

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.

Page 8: Guía funciones

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

Page 9: Guía funciones

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;

}

Page 10: Guía funciones

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

}

Page 11: Guía funciones

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

Page 12: Guía funciones

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;

Page 13: Guía funciones

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)

Page 14: Guía funciones

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.

Page 15: Guía funciones

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