Funciones Programacin bsica Definicin una funcin es un
Funciones Programación básica
Definición una 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 prototipos int f(int a, float x, float y); double g(double a, int c); short m(int n, char c); float promedio 3(float x 1, float x 2, float x 3); int cuenta. Negativos(void); int cuenta. Negativos(); char lee. Caracter();
Ejemplo de llamada a función Prototipo de la función (puede omitirse) #include <iostream> Using namespace sd; int cuadrado( int ); // prototipo de la función int main() { // repite 10 veces, calcula e imprime el cuadrado de x for ( int x = 1; x <= 10; x++ ) cout << cuadrado( x ) << " "; Llamada a la función cout << endl; return 0; } Definición de la función // definición de la función cuadrado int 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
Área de una esfera #include <iostream> using namespace std; /*prototipo de función, devuelve un flotante y lleva un parámetro de tipo flotante*/ float area. Esfera(float); main(){ float r, area; cout << "radio de la esfera: "; cin >> r; /*llamada a la función area. Esfera*/ area = area. Esfera(r); cout << "El area de la esfera es: " << area << endl; return 0; } /*definición de la función area. Esfera*/ float area. Esfera(float radio){ return 4*3. 14159265358979*radio; }
Mayor de 3 números No necesita prototipo double 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 numero 1; double numero 2; double numero 3; cout << "Introduzca tres numeros de punto flotante: "; cin >> numero 1 >> numero 2 >> numero 3; // numero 1, numero 2 y numero 3 son argumentos // de la función maximo cout << "El maximo es: " << maximo( numero 1, numero 2, numero 3 ) << endl; return 0; }
Función senoidal decreciente La siguiente función implementa la fúrmula double Exp. Senoidal(double A, double alfa, double f, double t){ return A*exp(-alfa*t)*sin(2*M_PI*f*t); }. . . x = Exp. Senoidal(2. 0, 50, 2000, 1 e-3);
#include <iostream> #include <cmath> using namespace std; double Exp. Senoidal(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 = Exp. Senoidal(a, alfa, f, t); cout <<"t = "<<t<<" x= "<<x<<endl; t += dt; } system("pause"); }
Función factorial El factorial se defino por: N! = 1*2*3*. . . *(N -1)*N double fact(int N){ double f =1; El número de combinaciones de N elementos tomados de M en M esta dado por: C = N! /((N-M)!M!) for(int i=2; i<=N; i++) double combi(int N, int M){ f *= i; return fact(N)/fact(N-M) return f; /fact(M); } Variables locales }
Uso de la función combi Este programa calcula los coeficientes de la expansión de un binomio a la potencia 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); } 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; }
Funciones tipo void Se 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 despliega. Nombre(){ cout << “Programa hecho por Fulanito de Tal. n”; } Llamada a la función: despliega. Nombre();
Ejemplo Despliega un número real con ancho w yd decimales llamadas a print. Real #include <iostream. h> #include <conio. h> #include <iomanip. h> #include <math. h> void print. Real(float r, int w, int d){ cout << fixed << setw(w) << setprecision(d) << r; } int main(){ double x; ancho 2 for(int i=0; i<=45 ; i+=2){ decimales 0 x = i*3. 14159265/180. 0; cout << "sen("; print. Real(i, 2, 0); cout << ") = "; print. Real(sin(x), 8, 6); ancho 8 cout << "n"; decimales 6 } getch(); return 0; }
Diseño con funciones Como 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{ desplegar. Menu(); opcion=leer. Opcion(); ejecutar. Opcion(opcion); }while(opcion!=SALIR); }
void desplegar. Menu(){ system(“cls”); cout << “nn. CONVERSION DE UNIDADESnn”); cout << “ 1. Velocidad m/s a km/hn”; cout << “ 2. Velocidad km/h a mi/hrn”; cout << “ 3. Temperatura ºC a ºFn”; cout << “ 4. Temperatura ºF a ºCn”; cout << “ 5. Salirn”; cout << “nnn opcion: ”; }
void ejecutar. Opcion(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 = leer. Temp(1); cout << "La Temperatura en F es: " << t; break; case '4': cout << "Temperatura en F: "; t = leer. Temp(2); cout << "La Temperatura en C es: “ << t; break; } }
float leer. Temp(int tipo){ float x; do{ cin >> x; if(tipo==1&&x<-273. 0) cout<<"La temperatura debe ser mayor a -273!n. Temperatura en C: "; if(tipo==1&&x<-450. 0) cout<<"La temperatura debe ser mayor a -450!n. Temperatura en F: "; }while((tipo==1&&x<-273. 0)||(tipo==2&&x<450. 0)); return x; }
char leer. Opcion(){ char c; do{ c = cin. get(); if(c>='1'&&c<='5') cout << c; }while(c<'1'||c>'5'); return c; }
Reglas de alcance Las 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 El valor del parámetro a es modificado dentro de la función. Se imprime 5 #include <iostream. h> #include <conio. h> void test(int &x){ x = 5; } int main(){ int a = 8; test(a); cout << a; getch(); return 0; }
Ecuación cuadrática con funciones void leer(double &a, double &b, double &c){ cout << "Tecle coeficientes a, b, c: "; cin >> a >> b >> c; Por referencia } void calcular. Raices(double a, double b, double c, double &x 1, double &x 2, int &caso){ double d = b*b-4*a*c; if(d>0){ x 1 = (-b+sqrt(d))/2/a; x 2 = (-b-sqrt(d))/2/a; caso = 1; }else if(d==0){ x 1 = (-b+sqrt(d))/2/a; x 2 = (-b-sqrt(d))/2/a; caso = 2; }else{ x 1 = -b/2/a; x 2 = sqrt(-d)/2/a; caso = 3; } }
Ecuación cuadrática con funciones void imprime(double x 1, double x 2, int caso){ switch(caso){ case 1: cout <<"x 1 = "<<x 1<<" x 2 = "<<x 2<< endl; break; case 2: cout <<"x 1 = x 2 =" << x 1 << endl; break; case 3: cout <<"re = "<<x 1<<" im = "<<x 2<< endl; break; } } int main(){ double a, b, c, x 1, x 2; int caso; leer(a, b, c); calcular. Raices(a, b, c, x 1, x 2, caso); imprime(x 1, x 2, caso); getch(); return 0; }
Funciones recursivas Una 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 Definición: Salida trivial 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) Llamadas recursivas 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); }
Calculo recursivo del factorial Definición: Salida trivial 1. n! = 1 si n = 0 2. n! = n*(n-1)! Llamada recursiva double fact(int n){ if(n==0) return 1; else return n*fact(n-1); }
Números de Fibonacci 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. Salida trivial Definición: 1. Fib(n) = n si n = 0 o 1 Llamada recursiva 2. Fib(n) = fib(n-1) + fib(n-2) int fib(int n){ if(n == 0 || n ==1 ) return n; else return fib(n-1)+fib(n-2); }
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ínea Una 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; // calcula el cubo } // fin de la función cubo int main(){ cout << "Introduzca la longitud del lado de su cubo: "; double valor. Lado; cin >> valor. Lado; // calcula el cubo de valor. Lado y despliega el resultado cout << "El volumen del cubo de lado " << valor. Lado << " es " << cubo( valor. Lado ) << endl; return 0; // indica terminación exitosa } // fin de main
- Slides: 29