AnteriorPosterior

9.7. Algunas funciones predefinidas útiles

Por: Nacho Cabanes
Actualizado: 20-04-2019 10:32
Tiempo de lectura estimado: 9 min.

 

C++

9.7. Algunas funciones predefinidas útiles

En la bilioteca estándar de C++ existen muchas funciones ya credas, que nos pueden resultar útiles. Vamos a comentar algunas de ellas.

9.7.1. Funciones matemáticas

Dentro del fichero de cabecera "math.h" tenemos acceso a muchas funciones matemáticas predefinidas en C, como:

  • acos(x): Arco coseno
  • asin(x): Arco seno
  • atan(x): Arco tangente
  • atan2(y,x): Arco tangente de y/x (por si x o y son 0)
  • ceil(x): El valor entero superior a x y más cercano a él
  • cos(x): Coseno
  • cosh(x): Coseno hiperbólico
  • exp(x): Exponencial de x (e elevado a x)
  • fabs(x): Valor absoluto
  • floor(x): El mayor valor entero que es menor que x
  • fmod(x,y): Resto de la división x/y
  • log(x): Logaritmo natural (o neperiano, en base "e")
  • log10(x): Logaritmo en base 10
  • pow(x,y): x elevado a y
  • sin(x): Seno
  • sinh(x): Seno hiperbólico
  • sqrt(x): Raíz cuadrada
  • tan(x): Tangente
  • tanh(x): Tangente hiperbólica

(todos ellos usan parámetros X e Y de tipo "double")

y una serie de constantes como

  • M_E, el número "e", con un valor de 2.71828...
  • M_PI, el número "Pi", 3.14159...

La mayoría de ellas son específicas para ciertos problemas matemáticos, especialmente si interviene la trigonometría o si hay que usar logaritmos o exponenciales. Pero vamos a destacar las que sí pueden resultar útiles en situaciones más variadas:

  • La raiz cuadrada de 4 se calcularía haciendo x = sqrt(4);
  • La potencia: para elevar 2 al cubo haríamos y = pow(2, 3);
  • El valor absoluto: si queremos trabajar sólo con números positivos usaríamos n = fabs(x);

Así se podría calcular el coseño de un ángulo:

// Introducción a C++, Nacho Cabanes
// Ejemplo 09.12:
// Funciones matemáticas: coseno
 
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main() 
{
    float anguloGrados = 45;
 
    float PI = 3.14159265;
    float anguloRadianes = anguloGrados * PI / 180;
    cout << "El coseño de 45 grados es " 
        << cos(anguloRadianes) << endl;
 
    return 0;
}

Ejercicios propuestos:

  • (9.7.1.1) Crear un programa que halle cualquier raíz de un número. El usuario deberá indicar el número (por ejemplo, 2) y el índice de la raiz (por ejemplo, 3 para la raíz cúbica). Pista: hallar la raíz cúbica de 2 es lo mismo que elevar 2 a 1/3.
  • (9.7.1.2) Crear un programa que muestre el seno de los ángulos de 30 grados, 45 grados, 60 grados y 90 grados. Cuidado: la función "sin" espera que se le indique el ángulo en radianes, no en grados. Tendrás que recordar que 180 grados es lo mismo que Pi radianes (con Pi = 3,1415926535). Puedes crearte una función auxiliar que convierta de grados a radianes.

9.7.2. Números aleatorios

En un programa de gestión o una utilidad que nos ayuda a administrar un sistema, no es habitual que podamos permitir que las cosas ocurran al azar. Pero los juegos se encuentran muchas veces entre los ejercicios de programación más completos, y para un juego sí suele ser conveniente que haya algo de azar, para que una partida no sea exactamente igual a la anterior.

Generar números al azar ("números aleatorios") usando C no es difícil. Si nos ceñimos al estándar ANSI C, tenemos una función llamada "rand()", que nos devuelve un número entero entre 0 y el valor más alto que pueda tener un número entero en nuestro sistema. Generalmente, nos interesarán números mucho más pequeños (por ejemplo, del 1 al 100), por lo que "recortaremos" usando la operación módulo ("%", el resto de la división).

Vamos a verlo con algún ejemplo:

  • Para obtener un número del 0 al 9 haríamos x = rand() % 10;
  • Para obtener un número del 0 al 29 haríamos x = rand() % 30;
  • Para obtener un número del 10 al 29 haríamos x = rand() % 20 + 10;
  • Para obtener un número del 1 al 100 haríamos x = rand() % 100 + 1;
  • Para obtener un número del 50 al 60 haríamos x = rand() % 11 + 50;
  • Para obtener un número del 101 al 199 haríamos x = rand() % 100 + 101;

Pero todavía nos queda un detalle para que los números aleatorios que obtengamos sean "razonables": los números que genera un ordenador no son realmente al azar, sino "pseudo-aleatorios", cada uno calculado a partir del siguiente. Podemos elegir cual queremos que sea el primer número de esa serie (la "semilla"), pero si usamos uno prefijado, los números que se generarán serán siempre los mismos. Por eso, será conveniente que el primer número se base en el reloj interno del ordenador: como es casi imposible que el programa se ponga en marcha dos días exactamente a la misma hora (incluyendo milésimas de segundo), la serie de números al azar que obtengamos será distinta cada vez.

La "semilla" la indicamos con "srand", y si queremos basarnos en el reloj interno del ordenador, lo que haremos será srand(time(0)); antes de hacer ninguna llamada a "rand()".

Para usar "rand()" y "srand()", deberíamos añadir otro fichero a nuestra lista de "includes", el llamado "stdlib":

#include <cstdlib>

Si además queremos que la semilla se tome a partir del reloj interno del ordenador (que es lo más razonable), deberemos incluir también "time":

#include <ctime>

Vamos a ver un ejemplo, que muestre en pantalla un número al azar entre 1 y 10:

// Introducción a C++, Nacho Cabanes
// Ejemplo 09.13:
// Obtener un número al azar
 
#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
int main() 
{
    int n;
    srand(time(0));
    n = rand() % 10 + 1;
    cout << "Un número entre 1 y 10: " <<  n << endl;
 
    return 0;
}

Ejercicios propuestos:

  • (9.7.2.1) Crea un programa que escriba varias veces "Hola" (entre 5 y 10 veces, al azar).
  • (9.7.2.2) Crear un programa que genere un número al azar entre 1 y 100. El usuario tendrá 6 oportunidades para acertarlo.

  • (9.7.2.3) Crea un programa que muestre un "fondo estrellado" en pantalla: mostrará 24 líneas, cada una de las cuales contendrá entre 1 y 78 espacios (al azar) seguidos por un asterisco ("*").

1198 visitas desde el 20-04-2019

AnteriorPosterior