Memoria dinámica

Nota

En los ejercicios a continuación se pedirá retornar datos de funciones ya sea por el nombre, por la interfaz o ambos. En los casos en los que no se piden ambos, se recomienda evaluar y/o implementar la función faltante. Es decir, si se pide únicamente por la interfaz, implementar también la que retorna los datos por el nombre. En las funciones que retornan por la interfaz y por el nombre retornan un bool el mismo indica el estado de ejecución: true la operación se realizó, false no pudo realizarse.

Funciones con cadenas

    1. Implementá una función que reciba una cadena y retorne una copia de la misma, utilizando memoria dinámica, por el nombre. Si por algún motivo no se puede, retornar NULL.

    2. Ahora implementá una función equivalente, pero en vez de retornar la copia por el nombre, que lo haga por la interfaz, mientras que por el nombre retorna un estado, bool, indicando el resultado de la operación.

  1. Implementá 2 funciones equivalentes a las 2 funciones del punto anterior, pero en lugar de copiar una cadena, copian un arreglo de números.

  2. Implementá una función que reciba una cadena de caracteres y un carácter. La función retorna una copia de la cadena, pero elimina todo lo que esté después del carácter recibido. Utilizá memoria dinámica. Ejemplo

    .                                 _______________
                                     |               |
    ("Esto va ; esto no va", ';') -->| strip_comment |--> "Esto va "
                                     |_______________|
    
    1. Implementá una función que reciba una cadena de caracteres que comienza con espacios y retorna, por la interfaz, una copia de la cadena sin los espacios del comienzo. Realizar las validaciones necesarias.

      .                         ___________
                               |           |
      "     la izquierda  " -->| left_trim |--> "la izquierda  "
                               |___________|
      
    2. Ahora implementá una función similar, pero que retorna una copia de la cadena original, eliminando los espacios al final.

      .                         ____________
                               |            |
      "  la derecha       " -->| right_trim |--> "  la derecha"
                               |____________|
      
    3. Ahora implementá una que borre los espacios a izquierda y a derecha.

      .                         ___________
                               |           |
      "     el centro     " -->| full_trim |--> "el centro"
                               |___________|
      
  3. Implementá una función que reciba una cadena de caracteres, un carácter y una longitud. La misma retorna una copia dinámica de la cadena original, centrada en la longitud especificada y rellenando con el carácter pedido.

    .                         _________
                             |         |
    (" cadena ", '*', 12) -->| centrar |--> "** cadena **"
                             |_________|
    
  4. Implementá una función que reciba un número y retorne una cadena que lo represente, al revés que strtoX(). Se puede usar sprintf().

    .        ________
            |        |
    9511 -->| ltostr |--> "9511"
            |________|
    

    ¿Qué diferencias puede haber entre la función que convierte enteros y aquella que hace lo mismo con números de punto flotante?

  5. Implementá una función que reciba una cadena de caracteres que contenga varios campos, en formato de campos de ancho fijo (ver este ejercicio) y un vector con los anchos de cada campo. La función debe retornar un vector de cadenas con cada campo extraído.

    .                          _______
                              |       |
    ("unodostres",{3,3,4}) -->| split |-->{"uno", "dos", "tres"}
                              |_______|
    

    Seguí los siguientes prototipos, es decir, son 2 funciones :)

    char ** split(const char * s, const int * anchos, size_t ncampos);
    bool split(const char * s, const int * anchos, size_t ncampos, char *** campos);
    
  6. Implementá una función que reciba una cadena de caracteres que contenga varios campos, en formato CSV (ver este ejercicio) y un carácter delimitador de los campos. La función debe retornar un vector de cadenas con cada campo extraído y la cantidad de campos.

    .                    _______
                        |       |
    ("uno,dos,tres") -->| split |-->({"uno", "dos", "tres"}, 3)
                        |_______|
    
  7. Implementá una función que reciba un vector de cadenas, su longitud y una cadena delimitadora y retorne una cadena uniendo todas las cadenas del vector, agregando la delimitadora entre ellas.

    .                                ______
                                    |      |
    ({"uno", "dos", "tres"}, ",")-->| join |-->"uno,dos,tres"
                                    |______|
    
  8. Implementá una función que lea, de stdin, una cadena de caracteres de largo indefinido y la retorne por el nombre. Implementar otra función que realice lo mismo, pero retornando la cadena leída por la interfaz. Prototipos:

    char * readline(void);
    char * readline(FILE *);
    bool readline(char **);
    bool readline(FILE *, char **);
    

    La función se puede implementar tanto con fgetc() como con fgets(). Hacerlo de ambas maneras.

Funciones con vectores y matrices

  1. Implementá una función que reciba el inicio de un intervalo, el final y la cantidad de puntos y retorne un arreglo de números linealmente espaciados entre el inicio y el final.

    double * linspace(double inicio, double fin, size_t nelems);
    bool linspace(double inicio, double fin, size_t nelemes, double ** valores);
    
  2. Implementá una función que reciba dos vectores de números y retorne un nuevo vector con los números de ambos vectores concatenados.

  3. Implementá una función similar a la del ejercicio anterior, pero en lugar de retornar un nuevo vector, modifica el primero pegándole el segundo.

  4. Implementá una función que retorne una matriz dinámica, de un tamaño pasado como argumento, siendo la misma inicializada con:

    1. ceros,

    2. unos,

    3. la identidad,

    4. números aleatorios.

  5. Implementá los incisos d) y g) del ejercicio de matrices, retornando matrices dinámicas.

  6. Implementá funciones que retornen dinámicamente, cada unas de las estructuras definidas en los ejercicios este, este y este.