Publi

  • Reservar dinámicamente memoria para un array bidimensional en C

    led_array
    Uno de los grandes defectos de un array, es que en tiempo de codificación debemos definir el tamaño que tendrá en tiempo de ejecución. A veces, es lo más fácil y está bien, lo utilizamos, puede que malgastemos unos bytes, pero no pasa nada, otras veces es una variable de un tamaño justo y no nos excedemos. Pero muchas veces, el gran problema, es que no tenemos ni idea de cuánto tamaño darle; si le damos poco, porque nos quedamos cortos, si nos pasamos, porque malgastaremos varios Megabytes, y a veces sabemos que incluso aunque algunas veces se desperdicie gran cantidad de memoria habrá casos en los que nos quedamos cortos.… Leer artículo completo

  • Hallar información de un dispositivo de red en C

    Volviendo a un artículo anterior donde hallábamos la dirección IP de un dispositivo, he decidido extender un poco la funcionalidad para poder hallar más información acerca de un dispositivo de red.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/ioctl.h>
    #include <net/if.h>
    #include <string.h>

    #define get_addr(var) (*(struct in_addr *) &var.ifr_addr.sa_data[2])

    int getdevinfo(char * ifname) {
      int sock;
      struct ifreq ifr;

      sock=socket(AF_INET, SOCK_DGRAM, 0);
      if (sock<0)
        return -1;          /* No puedo crear el socket */

      ifr.
    Leer artículo completo
  • Hallar la IP de un dispositivo en C

    Puede que se nos haya presentado alguna vez la necesidad de saber la dirección de un dispositivo desde nuestro programa, y no es plan de ponernos a ejecutar ifconfig o algún programa parecido para hallar la dirección.

    Podemos hablar con ioctl() una función destinada a definir y obtener información de dispositivos. Hay cientos de llamadas, aquí comentaremos la llamada SIOCGIFADDR cuya función es la que comentábamos, obtener la dirección de un interfaz de red.… Leer artículo completo

  • Algoritmos: generar números aleatorios para la lotería

    Es un ejemplo típico y nos muestra el uso de rand() con arrays para generar varios números aleatorios y no repetidos.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    /**
    *************************************************************
    * @file loteria.c
    * @brief Saca números aleatorios para la lotería
    * Basado en el sorteo de la primitiva, hay que sacar 7 números
    * del 1 al 49, sin repetir
    *
    * @author Gaspar Fernández <blakeyed@totaki.com>
    * https://poesiabinaria.net/algoritmos/
    *************************************************************/


    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>       /* para time() */


    int numero_aleatorio(int desde, int hasta)
    {
      return desde+rand()%(hasta-desde+1);
    }

    short numero_repetido(int numeros[7], int n)
    {
      int i=0;

      while (i<n)
        {
          /* Si un número sacado anteriormente es igual al número
             en la posición n, decidido, está repetido.
    Leer artículo completo
  • Algoritmos: Validar un DNI en C

    En España, para identificar de forma única a cada ciudadano se utiliza el número del Documento Nacional de Identidad (DNI). Como es costumbre, en muchos datos numéricos, como este, un número de cuenta corriente, códigos ISBN, etc existe un algoritmo de verificación que comprueba que el número es válido. En este caso, la comprobación se realiza con la letra que acompaña el número.

    El algoritmo es sencillo, puede que a la hora de implementarlo no nos acordemos del orden de las letras (para eso lo pongo, y podemos hacer Copia y Pega rápidamente).… Leer artículo completo

  • Algoritmos: Probar la existencia de un fichero con open() en C

    Estos días a varios de mis alumnos les ha surgido la necesidad de probar la existencia de un archivo haciendo la llamada al sistema open(). Es bastante sencillo, sólo hay que probar si éste se ha podido abrir (como lectura, por ejemplo, para no tocar el fichero en la medida de lo posible).
    Una vez se abre el fichero pueden ocurrir varias cosas:

    • que la llamada a open() no devuelva error.
    Leer artículo completo
  • Algoritmos: Factorial y cálculo del seno por la serie de MacLaurin (Taylor alrededor de 0) en C

    Algo más matemático vuelvo cuando propongo lo siguiente. Vamos a calcular un seno con la serie de MacLaurin. Ésta es la fórmula, extraída de Wikipedia.sin_maclaurin

    Y este el algoritmo en C:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #define PI 3.141592653588

    unsigned factorial(int n)
    {
      if (n<1)
        return 1;
     
      return n*factorial(n-1);
    }

    double senoTaylor(double n)
    {
      double t=0;
      int i;

      short signo=(n>=0);
      n=fabs(n);            /* Calculamos el valor absoluto */

      while (n>PI)      /* Reducimos el ángulo, de dos en dos cuadrantes*/
        {
          n-=PI;            /* 1 vuelta = 2PI radianes */
          signo=!
    Leer artículo completo
  • Algoritmos: Año bisiesto y validación de fechas en C

    Para inaugurar la nueva sección de Algoritmos de este blog, empezaré presentando una función para calcular años bisiestos (lo podemos encontrar en Wikipedia en bastantes más lenguajes, pero, ¿por qué aquí no?

    1
    2
    3
    4
    function bisiesto(int year)
    {
      return (a%4==0) && ( (a%100!=0) || (a%400==0) );
    }

    Es decir, cada 4 años hay un año bisiesto, no cuando el año es múltiplo de 100, aunque sí cuando es múltiplo de 400.… Leer artículo completo

  • Generar texto e implantarlo en una imagen desde PHP

    En ocasiones, se puede presentar la necesidad de introducir en nuestros proyectos una imagen cuyo contenido sea un texto, y sobre todo necesitamos integrarlo dentro de nuestro contenido, intentando que no se note que es una imagen, a no se que seleccionen el contenido para copiarlo.

    Una de las principales utilidades de esto es evitar el SPAM al escribir nuestra dirección de e-mail en una web. Muchos clientes prefieren enviar un e-mail en lugar de utilizar un formulario de contacto y tenemos que satisfacerles, sin arriesgar la seguridad de nuestro sistema, en el sentido de que hay cientos de motores que se dedican a rastrear webs en busca de direcciones de e-mail (lo cual es muy sencillo de hacer con expresiones regulares, por ejemplo).… Leer artículo completo

  • ¿ Y tú qué eres ? Identificando clases heredadas en C++

    blogvision_estudios_small

    En ocasiones, sobre todo cuando estamos con temas de herencia entre clases, tenemos la necesidad de consultar de qué tipo es una instancia. Es decir, tenemos una clase Mascota, y clases Perro y Gato (subclases de la primera). Imaginad que en el código hay muchas funciones, que queremos que sean comunes para todas las mascotas, y por tanto, aceptarán como parámetro una instancia de Mascota, pero en su ejecución, necesitan en un momento saber de qué tipo concreto son (Perro o Gato).… Leer artículo completo