Funciones Programación básica. Definición una función es un bloque de código reconocido por un...

Post on 24-Jan-2016

238 views 0 download

Transcript of Funciones Programación básica. Definición una función es un bloque de código reconocido por un...

Funciones

Programación básica

Definiciónuna función es un bloque de código reconocido por un identificador que realiza un trabajo específico.

Su propósito es dividir los programas en módulos manejables separados (divide y vencerás).

El formato para la declaración de funciones es:

tipo-devuelto nombre-de-función(lista-de-parámetros)

{

declaraciones e instrucciones

}

Las funciones deben declararse antes de utilizarse.

Generalmente se definen mediante un prototipo que contiene solo el encabezado de la función.

Ejemplos de prototiposint f(int a, float x, float y);

double g(double a, int c);

short m(int n, char c);

float promedio3(float x1,float x2,float x3);

int cuentaNegativos(void);

int cuentaNegativos();

char leeCaracter();

Ejemplo de llamada a función

#include <iostream>Using namespace sd;int cuadrado( int ); // prototipo de la funciónint main(){ // repite 10 veces, calcula e imprime el cuadrado de x for ( int x = 1; x <= 10; x++ ) cout << cuadrado( x ) << " "; cout << endl; return 0;}

// definición de la función cuadradoint cuadrado( int y ) //y es una copia del argumento de la función{ return y * y; // devuelve el cuadrado de y como un int

} // fin de la función cuadrado

Prototipo de la función (puede omitirse)

Llamada a la función

Definición de la función

Área de una esfera#include <iostream>using namespace std;/*prototipo de función, devuelve un flotante y llevaun parámetro de tipo flotante*/float areaEsfera(float);main(){ float r,area; cout << "radio de la esfera: "; cin >> r; /*llamada a la función areaEsfera*/ area = areaEsfera(r); cout << "El area de la esfera es: " << area << endl; return 0;}/*definición de la función areaEsfera*/float areaEsfera(float radio){ return 4*3.14159265358979*radio*radio;}

Mayor de 3 númerosdouble maximo( double x, double y, double z ){ double max = x; // asume que x es el mayor if ( y > max ) // si y es mayor, max = y; // asigna y a max if ( z > max ) // si z es mayor, max = z; // asigna z a max return max; // max es el mayor}int main(){ double numero1; double numero2; double numero3;

cout << "Introduzca tres numeros de punto flotante: "; cin >> numero1 >> numero2 >> numero3;

// numero1, numero2 y numero3 son argumentos // de la función maximo cout << "El maximo es: " << maximo( numero1, numero2, numero3 ) << endl;

return 0;}

No necesita prototipo

Función senoidal decrecienteLa siguiente función implementa la fúrmula

tAe t sin

double ExpSenoidal(double A, double alfa, double f, double t){

return A*exp(-alfa*t)*sin(2*M_PI*f*t);

}

...

x = ExpSenoidal(2.0,50,2000,1e-3);

#include <iostream>#include <cmath>using namespace std;double ExpSenoidal(double A, double alfa, double f, double t){ return exp(-alfa*t)*A*sin(2*M_PI*f*t);}main(){ int i,n; double t,x,a,alfa,f,dt; cout <<"valor de A:"; cin >>a; cout <<"valor de alfa:"; cin >>alfa; cout <<"valor de f:"; cin >>f; cout <<"numero de ciclos (1-5):"; cin >>n; dt = n/20.0/f; t = 0; for(i=0;i<20;i++){ x = ExpSenoidal(a,alfa,f,t); cout <<"t = "<<t<<" x= "<<x<<endl; t += dt; } system("pause");}

Función factorialEl factorial se defino por: N! = 1*2*3* ... *(N-1)*N

double fact(int N){

double f =1;

for(int i=2; i<=N; i++)

f *= i;

return f;

}

double combi(int N, int M){

return fact(N)/fact(N-M)

/fact(M);

}

El número de combinaciones de N elementos tomados de M en M esta dado por:

C = N! /((N-M)!M!)

Variables locales

Uso de la función combidouble fact(int N){ double f =1; for(int i=2; i<=N; i++) f *= i; return f;}double combi(int N, int M){ return fact(N)/fact(N-M)/fact(M);}int main(){ int p; cout << "Teclee la potencia del binomio: "; cin >> p; cout << "Los coeficientes son: "; for(int i= 0; i<=p ; i++) cout << combi(p,i) << " "; cout << "\n"; getch(); return 0;}

Este programa calcula los coeficientes de la expansión de un binomio a la potencia N.

Funciones tipo voidSe utiliza el tipo void para indicar que la función no regresa ningún valor.

Una función tipo void no debe aparecer en una instrucción de asignación en.

Ejemplo:

void despliegaNombre(){ cout << “Programa hecho por Fulanito de Tal.\n”;}Llamada a la función:

despliegaNombre();

Ejemplo

#include <iostream.h>#include <conio.h>#include <iomanip.h>#include <math.h>void printReal(float r, int w, int d){ cout << fixed << setw(w) << setprecision(d) << r;}int main(){ double x; for(int i=0; i<=45 ; i+=2){ x = i*3.14159265/180.0; cout << "sen("; printReal(i,2,0); cout << ") = "; printReal(sin(x),8,6); cout << "\n"; } getch(); return 0;}

Despliega un número real con ancho w y d decimales

llamadas aprintReal

ancho 2decimales 0

ancho 8decimales 6

Diseño con funcionesComo ejemplo construyamos una aplicación basada en menús para hacer conversiones de unidades físicas.

Primero definiremos el esquema básico de la función main.

Supondremos que el programa se ejecutará hasta que el usuario elija la opción de terminar.

Una primera versión de la función main sería:

main(){ do{ desplegarMenu(); opcion=leerOpcion(); ejecutarOpcion(opcion); }while(opcion!=SALIR);}

void desplegarMenu(){ system(“cls”); cout << “\n\nCONVERSION DE UNIDADES\n\n”); cout << “1. Velocidad m/s a km/h\n”; cout << “2. Velocidad km/h a mi/hr\n”; cout << “3. Temperatura ºC a ºF\n”; cout << “4. Temperatura ºF a ºC\n”; cout << “5. Salir\n”; cout << “\n\n\n opcion: ”;}

void ejecutarOpcion(char opcion){ float v,t; switch(opcion){ case '1':cout << "Velocidad en mi/hr: "; cin >> v; cout<<"La velocidad en km/hr es:“z<< v*1.609; break; case '2':cout << "Velocidad en km/hr: "; cin >> v; cout<<"La velocidad en mi/hr es: "<<v/1.609; break; case '3':cout << "Temperatura en C: "; t = leerTemp(1); cout << "La Temperatura en F es: " << t; break; case '4':cout << "Temperatura en F: "; t = leerTemp(2); cout << "La Temperatura en C es: “ << t; break; }}

float leerTemp(int tipo){ float x; do{ cin >> x; if(tipo==1&&x<-273.0) cout<<"La temperatura debe ser mayor a -273!\nTemperatura en C: "; if(tipo==1&&x<-450.0) cout<<"La temperatura debe ser mayor a -450!\nTemperatura en F: "; }while((tipo==1&&x<-273.0)||(tipo==2&&x<-450.0)); return x;}

char leerOpcion(){ char c; do{ c = cin.get(); if(c>='1'&&c<='5') cout << c; }while(c<'1'||c>'5'); return c;}

Reglas de alcanceLas variables tiene un alcance dentro del bloque en que son declaradas.

Ver ejemplo: 3.12

Parámetros por referencia

Una función puede modificar los valores de los parámetros si estos se pasan por referencia.

Los parámetros por referencia se especifican con la siguiente notación

Tipo-función nombre-función (tipo &parámetro)

Ejemplo de paso por referencia

#include <iostream.h>#include <conio.h>

void test(int &x){ x = 5;}

int main(){ int a = 8; test(a); cout << a; getch(); return 0;}

El valor del parámetro a es modificado dentro de la función.

Se imprime

5

Ecuación cuadrática con funcionesvoid leer(double &a, double &b, double &c){ cout << "Tecle coeficientes a,b,c: "; cin >> a >> b >> c;}void calcularRaices(double a, double b, double c,double &x1, double &x2, int &caso){ double d = b*b-4*a*c; if(d>0){ x1 = (-b+sqrt(d))/2/a; x2 = (-b-sqrt(d))/2/a; caso = 1; }else if(d==0){ x1 = (-b+sqrt(d))/2/a; x2 = (-b-sqrt(d))/2/a; caso = 2; }else{ x1 = -b/2/a; x2 = sqrt(-d)/2/a; caso = 3; }}

Por referencia

Ecuación cuadrática con funciones

void imprime(double x1,double x2,int caso){ switch(caso){ case 1:cout <<"x1 = "<<x1<<" x2 = "<<x2<< endl;break; case 2:cout <<"x1 = x2 =" << x1 << endl;break; case 3:cout <<"re = "<<x1<<" im = "<<x2<< endl;break; }}int main(){ double a,b,c,x1,x2; int caso; leer(a,b,c); calcularRaices(a,b,c,x1,x2,caso); imprime(x1,x2,caso); getch(); return 0;}

Funciones recursivasUna función es recursiva si dentro del cuerpo de la función se hace una llamada a si misma.

Las funciones recursivas deben cumplir lo siguiente:

1. Debe existir un salida en la que no se haga la llamada recursiva

2. La llamada recursiva debe ser versión más simple que la llamada que la invocó.

Máximo Común Divisor

int gcd(int x, int y){ if((y<=x)&&(x%y == 0) return y; else if(x < y) return gcd(y,x); else return gcd(y,x % y);}

Definición:

1. el gcd(x,y) = y si y<x y el x mod y = 0

2. el gcd(x,y) = gcd(y,x) si x < y

3. el gcd(x,y) = gcd(y, x mod y)

Salida trivial

Llamadas recursivas

Calculo recursivo del factorialDefinición:

1. n! = 1 si n = 0

2. n! = n*(n-1)!

Salida trivial

Llamada recursiva

double fact(int n){ if(n==0) return 1; else return n*fact(n-1);}

Números de Fibonacci

int fib(int n){ if(n == 0 || n ==1 ) return n; else return fib(n-1)+fib(n-2);}

Los números de Fibonacci forman la secuencia: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … Es decir cada uno es la suma de los dos anteriores.

Definición:

1. Fib(n) = n si n = 0 o 1

2. Fib(n) = fib(n-1) + fib(n-2)

Salida trivial

Llamada recursiva

Solución no recursiva a los números de Fibonacci

int fib(int n){ int a = 0; int b = 1; int c = a + b; for(int i=2, i<=n; i++){ c = a + b; a = b; b = c; } return c;}

Funciones en líneaUna función en línea no genera sobrecarga en cada llamada.

Se optimiza el código generado por el compilador al sustituir la función en lugar de generar el código correspondiente a la llamada.

Las funciones en línea comienzan por la palabra reservada inline.

Las funciones en línea deben ser muy breves.

ejemplo de función en línea

inline double cubo( const double lado ) { return lado * lado * lado; // calcula el cubo} // fin de la función cuboint main(){ cout << "Introduzca la longitud del lado de su cubo: "; double valorLado; cin >> valorLado; // calcula el cubo de valorLado y despliega el resultado cout << "El volumen del cubo de lado " << valorLado << " es " << cubo( valorLado ) << endl; return 0; // indica terminación exitosa} // fin de main

función en línea