Muchas de estas operaciones, pueden ser necesitadas en más de un programa: para evitar tener que escribirlas de vuelta en cada programa que las necesita, existen las funciones o subprogramas.
Una función es un programa en sí mismo: tiene sus propias instrucciones, variables, etc. Puede ser ejecutada desde otro programa o función.
El C++ incluye cientos de funciones para realizar las operaciones más diversas, que puedan ser necesarias en nuestros programas. Estas funciones ya están programadas y no es necesario conocer sus instrucciones internas: Nos bastará con saber qué datos debemos enviarles y qué resultado nos devuelven.
Las ventajas de utilizar estas funciones, además del ahorro de tiempo al no tener que escribirlas, son:
- Libres de errores: Las funciones ya fueron probadas en millones de casos diferentes, y es altamente improbable que encontremos un error en ellas.
- Eficientes: Están programadas para realizar las operaciones de la forma más rápida posible.
Las funciones no son parte del núcleo del C++, esto significa que cada versión de C++ puede tener diferentes funciones, aunque la mayoría de las funciones son comunes a casi todas las versiones. Al no estar en el núcleo del C++, debemos agregarlas al momento de compilar el programa o no funcionará, al no poder entender el compilador la llamada a la función. Las funciones están en archivos aparte llamados bibliotecas (libraries en inglés, a veces traducido como "librerías")
Para utilizar algunas de estas funciones, debemos indicarle al compilador que incluya el archivo deseado en nuestro programa, con la directiva
#include <nombre del archivo>
Así, la instrucción #include <iostream> que agregamos al principio de cada programa, no es otra cosa que un aviso al compilador para que incluya el archivo iostream, que es el que contiene las definiciones de las funciones cin y cout
FUNCIONES MATEMÁTICAS
Las primeras funciones de biblioteca que vamos a ver son las llamadas funciones matemáticas, ya que se utilizan para resolver distintos cálculos. Estas funciones están incluidas en el archivo de C++ <cmath> y éste es el nombre que debemos incluir en nuestros programas para usar alguna de estas funciones:
#include <cmath>
La primera función que vamos a ver es sqrt(). Esta función permite calcular raíces cuadradas positivas (square roots en inglés, de ahí el nombre de la función.), y su prototipo es el siguiente:
double sqrt(double);
El prototipo de una función nos indica qué tipos de datos envía y recibe. Una función siempre envía como respuesta un único valor al programa que la llamó. En este caso ese dato es de tipo double (valor real de doble precisión) y lo indica la primera palabra del prototipo.
Luego viene el nombre de la función, y por último, entre paréntesis, la lista de parámetros, o valores que recibe la función. En este caso, es uno sólo y también de tipo double.
Para ver como funciona, veamos el siguiente ejemplo:
#include
"stdafx.h"
#include
<iostream>
using
namespace std;
#include
<cmath>
void
main()
{
double
a,b;
cout<<"Ingrese un
número:";
cin>>a;
b =
sqrt(a);
cout<<"Su raíz cuadrada es "<<b;
}
El programa define dos variables de tipo double, a y b; y luego pide al usuario que ingrese el valor de a. Una vez que se llega a la instrucción "b=sqrt(a)", se detiene momentáneamente la ejecución del programa principal (main) y se llama a la función sqrt con el valor de la variable a como parámetro.
La función realiza las operaciones que sean necesarias y devuelve al programa principal el valor de la raíz cuadrada del valor que recibió. Una vez allí, el programa principal reanuda su ejecución, guardando el valor recibido en la variable b. Luego muestra dicho valor y finaliza el programa.
- Se debe tener en cuenta que la función sqrt sólo puede calcular un resultado para los valores de parámetros para los que esté definida la raíz cuadrada matemática. Es decir, que si intentamos calcular la raíz cuadrada de un número negativo, la función dará un error y se interrumpirá la ejecución del programa. Es necesario validar el parámetro antes de llamar a la función.
- Como indicamos anteriormente la función sólo devuelve la raíz positiva, no la negativa.
Las siguiente función es la función pow:
double pow (double, double)
Esta función recibe dos parámetros que representan la base y el exponente y devuelve como resultado el valor de la base elevado al exponente indicado. Así, por ejemplo:
pow(5,2) dará como resultado 25.
pow(2,5) dará como resultado 32.
El exponente puede ser cualquier valor racional, por lo que se pueden calcular inversas y raíces de cualquier orden:
pow(16,1/4) dará como resultado 2.
pow(-49,1/2) dará un error.
La función pow permite calcular cualquier raíz, incluyendo raíces cuadradas. Entonces, ¿qué función conviene usar cuando queremos calcular una raíz cuadrada, sqrt() ó pow() ? La recomendación es usar sqrt(), que ha sido diseñada específicamente para raíces cuadradas y está optimizada para ello. La función pow() es más genérica y puede demorar más tiempo en calcular las raíces.
Las siguientes funciones que vamos a ver son:
double sin(double)
double cos(double)
double tan(double)
Estas funciones, como ya se imaginarán, devuelven los valores del seno, el coseno y la tangente del ángulo que reciben como parámetro. Se debe tener en cuenta que el valor del ángulo dado estará en radianes. (Recordemos que 3,14 radianes = 180 grados)
Entonces:
sin(0) dará como resultado 0,
sin(3.14/2) dará como resultado 1,
cos(3.14) dará como resultado -1,
El siguiente programa pide al usuario que ingrese el valor de un ángulo y calcula sus funciones trigonométricas:
#include
"stdafx.h"
#include
<cmath>
#include
<iostream>
using
namespace std;
#define
PI 3.1416
void
main()
{
float ag,
ar, s,c,t;
cout<< "Ingrese el
angulo en grados";
cin>>ag;
ar = ag * PI /180;
s = sin(ar);
c =
cos(ar);
t =
tan(ar);
cout<<"El seno es "<<s<<endl;
cout<<"El coseno es "<<c<<endl;
cout<<"La tangente es "<<t<<endl;
}
En la línea 5, vemos la directiva
#define
PI 3.1416
Esta directiva no es parte del programa sino que es una indicación al compilador (al igual que los #include) que le indica que siempre que en el programa aparezcan las letras PI las reemplace por 3.1416. Este reemplazo se hace al momento de compilar el programa. Así, si en el programa ponemos las letras PI, serán remplazadas por el valor numérico en todas las partes donde aparezcan.De esta manera podemos definir una constante, que no podrá cambiar de valor en todo el programa.
En el programa, el usuario ingresa el valor en grados de un ángulo en la variable ag. Luego, en la variable ar se calcula su equivalente en radianes, y con tres llamadas a las funciones sin( ), cos( ) y tan( ), se calculan los valores trigonométricos buscados.
Así como tenemos estas tres funciones, también existen en C++ las funciones:
double asin(double)
double acos(double)
double atan(double)
que son las inversas de las anteriores: reciben un valor numérico que represente el seno, coseno o tangente de un ángulo, y devuelven el valor del ángulo correspondiente en radianes.
Estas funciones nos permiten obtener el valor de pi con la mayor precisión posible: Si sabemos que cos(180) = -1 y que 180 grados es igual a pi radianes, entonces:
cout<<acos(-1.0)
Nos devolverá el mejor valor de pi que puede calcular la máquina.
Las últimas funciones que comentaremos aquí son:
double exp(double)
double log(double)
Estas funciones permite calcular e a la x (El número de Euler elevado a una potencia x), y el logaritmo en base e de un valor, respectivamente.
Se debe tener en cuenta que anuque se escriba log( ) no representa la función matemática de logaritmo en base 10, sino al logaritmo natural o neperiano.
Así, las instrucciones:
cout<<exp(1.0)<<endl;
cout<<log(10.0)<<endl;
cout<<log(exp(1.0))<<endl;
darán como resultados 2,7182; 2,3026 y 1 respectivamente.
Hay muchas otras funciones matemáticas en C++; su funcionamiento es siempre análogo a las ya vistas y su comprensión es muy sencilla. Se debe recordar siempre que en los valores para los que no está definida la función matemática, la función en C++ dará un error al ejecutarla.