Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Ejercicios de Cadenas

Universidad Nacional de Río Negro

Prerrequisitos y Entorno de Ejecución Requerido

Para compilar y verificar las soluciones de este módulo bajo el estándar C11 estricto de cátedra, se requiere:

Objetivos Pedagógicos y Competencias (Taxonomía de Bloom)

Capítulos de Apunte Correspondientes

Cuestiones de Estilo Aplicables


Análisis de Cadenas

Ejercicio 2.03b.01 - Contar Vocales ⭐⭐☆☆☆


(ej_b2_c03b_02)=
### Ejercicio 2.03b.02 - Contabilizador de Caracteres y Frecuencia ⭐⭐☆☆☆

:::{exercise}
:label: ej_b2_c03b_02_contabilizador

Implementá una función pura que compute el histograma de frecuencias de caracteres ASCII en una cadena:
```c
void contar_frecuencias_ascii(const char *cadena, size_t frecuencias[256]);
```

**Tabla de Vectores de Prueba:**

| Cadena de Entrada | Consulta de Frecuencia | Resultado Esperado |
| :--- | :--- | :--- |
| `"banana"` | `'a'`, `'n'`, `'b'` | `'a'=3, 'n'=2, 'b'=1` |
| `""` (vacía) | Cualquier carácter | `0` para todas las entradas |
| `NULL` | Cualquier carácter | Seguro ante `NULL`, sin alteraciones |

::::{solution}
```c
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#include <assert.h>

void contar_frecuencias_ascii(const char *cadena, size_t frecuencias[256]) {
    if (frecuencias == NULL) {
        return;
    }
    memset(frecuencias, 0, 256 * sizeof(size_t));
    if (cadena == NULL) {
        return;
    }
    for (size_t i = 0; cadena[i] != '\0'; ++i) {
        unsigned char c = (unsigned char)cadena[i];
        frecuencias[c]++;
    }
}

int main(void) {
    size_t f[256];
    contar_frecuencias_ascii("banana", f);
    assert(f[(unsigned char)'a'] == 3);
    assert(f[(unsigned char)'n'] == 2);
    assert(f[(unsigned char)'b'] == 1);
    assert(f[(unsigned char)'z'] == 0);

    contar_frecuencias_ascii("", f);
    for (size_t i = 0; i < 256; ++i) {
        assert(f[i] == 0);
    }

    contar_frecuencias_ascii(NULL, f);
    for (size_t i = 0; i < 256; ++i) {
        assert(f[i] == 0);
    }

    return 0;
}
```

(ej_b2_c03b_03)=
### Ejercicio 2.03b.03 - b.3 - ¿Es un número válido? ⭐⭐☆☆☆

#### Descripción
Desarrollar una función que verifique si una cadena de texto representa un
número de punto flotante válido. La validación debe seguir un conjunto de reglas
específicas.

:::{tip} Lógica y Consideraciones

-   **Reglas de Validación:**
    1.  Puede tener un signo opcional (`+` o `-`) únicamente al principio.
    2.  Debe contener al menos un dígito.
    3.  Puede contener como máximo un punto decimal (`.`).
    4.  Todos los demás caracteres deben ser dígitos (`0`-`9`).
-   **Proceso:**
    1.  Recorrer la cadena carácter por carácter.
    2.  Usar banderas (variables booleanas) para llevar un registro de si ya se
        encontró un punto decimal.
    3.  Manejar el signo solo en la primera posición.
    4.  Verificar que cada carácter sea un dígito o un punto (en la posición
        correcta).

Ejercicio 2.03b.04 - b.4 - ¿Es alfabética? ⭐⭐☆☆☆

Descripción

Crear una función que determine si una cadena contiene únicamente caracteres alfabéticos (de la ‘a’ a la ‘z’, mayúsculas o minúsculas).

Propiedades de Cadenas

Ejercicio 2.03b.05 - b.5 - Palíndromo ⭐⭐☆☆☆

Descripción

Implementar una función que verifique si una cadena es un palíndromo, es decir, si se lee igual de izquierda a derecha que de derecha a izquierda. La verificación debe ignorar espacios en blanco y no debe ser sensible a mayúsculas/minúsculas.

Ejercicio 2.03b.06 - b.6 - Anagrama ⭐⭐☆☆☆

Descripción

Escribir una función que determine si una cadena es un anagrama de otra (es decir, si ambas tienen los mismos caracteres con la misma frecuencia), ignorando mayúsculas/minúsculas y espacios.

Ejercicio 2.03b.07 - b.7 - Pangrama ⭐⭐☆☆☆

Descripción

Verificar si una cadena es un pangrama, es decir, si contiene todas las letras del alfabeto inglés al menos una vez. La verificación debe ser insensible a mayúsculas/minúsculas.

Manipulación y Transformación

Ejercicio 2.03b.08 - b.8 - Tokenización ⭐⭐☆☆☆

Descripción

Dividir una cadena en una secuencia de “tokens” (subcadenas) basándose en un carácter delimitador. La función strtok de C es un ejemplo clásico de esto.

Ejercicio 2.03b.09 - b.9 - Compresión RLE (Run-Length Encoding) ⭐⭐☆☆☆

Descripción

Implementar una forma simple de compresión de cadenas llamada Run-Length Encoding. Esta técnica compacta una cadena reemplazando secuencias de caracteres idénticos por el número de repeticiones seguido del carácter.

Ejercicio 2.03b.10 - b.10 - Desduplicador ⭐⭐☆☆☆

Descripción

Escribir una función que elimine los caracteres duplicados de una cadena, conservando únicamente la primera aparición de cada carácter. La modificación puede ser in-place.

Ejercicio 2.03b.11 - b.11 - Número a cadena con formato ⭐⭐⭐☆☆

Descripción

Transformar un número entero largo en una cadena de texto, insertando separadores de miles (puntos o comas) para mejorar la legibilidad.

Ejercicio 2.03b.12 - b.12 - Búsqueda de subcadena ⭐⭐⭐☆☆

Descripción

Implementar una función que busque la primera ocurrencia de una subcadena (needle o aguja) dentro de una cadena principal (haystack o pajar). Es una reimplementación de la función strstr.

Conversión de Base Numérica

Ejercicio 2.03b.13 - b.13 - Binario a decimal ⭐⭐⭐⭐☆

Descripción

Convertir una cadena que representa un número en formato binario (compuesta de '0’s y '1’s) a su valor entero decimal correspondiente.

Ejercicio 2.03b.14 - b.14 - Hexadecimal a decimal ⭐⭐☆☆☆

Descripción

Convertir una cadena que representa un número en formato hexadecimal (dígitos 0-9 y letras A-F, insensibles a mayúsculas) a su valor entero decimal.

Ejercicio 2.03b.15 - b.15 - Decimal a binario ⭐⭐⭐⭐☆

Descripción

Convertir un número entero decimal a su representación en una cadena de texto binaria.

Ejercicio 2.03b.16 - b.16 - Decimal a hexadecimal ⭐⭐☆☆☆

Descripción

Convertir un número entero decimal a su representación en una cadena de texto hexadecimal.

Más Ejercicios de Cadenas

Ejercicio 2.03b.17 - b.17 - Invertir palabras en una frase ⭐⭐☆☆☆

Descripción

Escribir una función que tome una frase y la modifique de tal manera que cada palabra individual quede invertida, pero el orden de las palabras en la frase se mantenga intacto.

Ejercicio 2.03b.18 - b.18 - Invertir orden de las palabras ⭐⭐☆☆☆

Descripción

Escribir una función que invierta el orden de las palabras en una frase. Por ejemplo, “Hola Mundo desde C” se convertiría en “C desde Mundo Hola”.

Ejercicio 2.03b.19 - b.19 - Capitalización (Title Case) ⭐⭐⭐⭐☆

Descripción

Implementar una función que convierta una cadena a “Title Case”, donde la primera letra de cada palabra está en mayúscula y el resto de las letras de la palabra están en minúscula.

Ejercicio 2.03b.20 - b.20 - Contar palabras ⭐⭐☆☆☆

Descripción

Desarrollar una función que cuente el número de palabras en una cadena. Se puede considerar que las palabras están separadas por uno o más espacios.

Ejercicio 2.03b.21 - b.21 - Eliminar espacios extra ⭐⭐☆☆☆

Descripción

Crear una función que elimine los espacios en blanco redundantes de una cadena: espacios al principio, al final y múltiples espacios entre palabras, dejando solo un espacio entre cada palabra.

Ejercicio 2.03b.22 - b.22 - Recorte de cadena (Trim) ⭐⭐⭐☆☆

Descripción

Implementar una función trim que modifique una cadena para eliminar todos los espacios en blanco (o cualquier otro carácter de espaciado como tabuladores o saltos de línea) que se encuentren al principio y al final de la misma.

Ejercicio 2.03b.23 - b.23 - Reemplazar subcadena ⭐⭐⭐☆☆

Descripción

Escribir una función que reemplace todas las ocurrencias de una subcadena por otra dentro de una cadena principal. La función debe manejar cambios en la longitud de la cadena, lo que usualmente requiere memoria dinámica.

Ejercicio 2.03b.24 - b.24 - Validación de email (Simple) ⭐☆☆☆☆

Descripción

Crear una función que verifique si una cadena tiene un formato de correo electrónico básico. No busca ser exhaustiva (lo cual es muy complejo), sino validar una estructura mínima.

Ejercicio 2.03b.25 - b.25 - Cifrado César ⭐⭐☆☆☆

Descripción

Implementar el Cifrado César, un tipo de cifrado por sustitución en el que cada letra en el texto original es reemplazada por una letra un número fijo de posiciones más adelante en el alfabeto, de forma circular.

Ejercicio 2.03b.26 - b.26 - Descifrado César ⭐⭐☆☆☆

Descripción

Escribir la función complementaria que descifre un mensaje cifrado con el Cifrado César, conociendo el desplazamiento. Es la operación inversa al ejercicio anterior.

Ejercicio 2.03b.27 - b.27 - Encontrar el carácter más frecuente ⭐⭐☆☆☆

Descripción

Desarrollar una función que encuentre y devuelva el carácter que aparece con más frecuencia en una cadena. Si hay empates, puede devolver cualquiera de los más frecuentes.

Ejercicio 2.03b.28 - b.28 - Comparación de cadenas (Ignorando mayúsculas) ⭐⭐⭐☆☆

Descripción

Implementar su propia versión de la función strcasecmp, que compara dos cadenas sin diferenciar entre mayúsculas y minúsculas.

Ejercicio 2.03b.29 - b.29 - Extraer subcadena ⭐⭐⭐☆☆

Descripción

Crear una función que extraiga una porción de una cadena. La función debe recibir la cadena original, una posición de inicio y una longitud, y devolver una nueva cadena con la subcadena extraída.

Ejercicio 2.03b.30 - b.30 - Justificar texto (Simple) ⭐☆☆☆☆

Descripción

Implementar una función que justifique una línea de texto a un ancho específico, insertando espacios adicionales entre las palabras de la manera más uniforme posible.

Ejercicio 2.03b.31 - b.31 - Acrónimo ⭐⭐☆☆☆

Descripción

Escribir una función que genere un acrónimo a partir de una frase, tomando la primera letra de cada palabra.

Cadenas y Algoritmos

Ejercicio 2.03b.32 - Distancia de Hamming entre Cadenas ⭐⭐☆☆☆


(ej_b2_c03b_33)=
### Ejercicio 2.03b.33 - b.33 - Subsecuencia común más larga (LCS) ⭐⭐☆☆☆

#### Descripción
Escribir una función que encuentre la longitud de la subsecuencia común más
larga (LCS) entre dos cadenas. Una subsecuencia no tiene por qué ser contigua.

:::{tip} Lógica y Consideraciones

-   **Algoritmo:** Este es un problema clásico de programación dinámica.
-   **Proceso:**
    1.  Crear una matriz 2D `dp` de tamaño `(longitud1+1) x (longitud2+1)`.
    2.  `dp[i][j]` almacenará la longitud de la LCS de `cadena1[0..i-1]` y
        `cadena2[0..j-1]`.
    3.  Llenar la matriz usando la recurrencia:
        -   Si `cadena1[i-1] == cadena2[j-1]`, entonces `dp[i][j] = 1 +
            dp[i-1][j-1]`.
        -   Si no, `dp[i][j] = MAXIMO(dp[i-1][j], dp[i][j-1])`.
-   **Salida:** El resultado es el valor en `dp[longitud1][longitud2]`.

Ejercicio 2.03b.34 - b.34 - Validación de IP simple ⭐☆☆☆☆

Descripción

Crear una función que verifique si una cadena representa una dirección IPv4 válida. Debe consistir en cuatro números entre 0 y 255, separados por puntos.

Ejercicio 2.03b.35 - b.35 - Convertir a snake_case ⭐⭐☆☆☆

Descripción

Implementar una función que convierta una cadena en camelCase o PascalCase a snake_case. Esto implica insertar un guion bajo antes de cada letra mayúscula y convertir toda la cadena a minúsculas.

Ejercicio 2.03b.36 - b.36 - Convertir a camelCase ⭐⭐☆☆☆

Descripción

Implementar una función que convierta una cadena en snake_case a camelCase. Esto implica eliminar los guiones bajos y poner en mayúscula la letra que les seguía.

Ejercicio 2.03b.37 - b.37 - Rotación de cadena ⭐⭐⭐☆☆

Descripción

Escribir una función que determine si una cadena s2 es una rotación de otra cadena s1.

Ejercicio 2.03b.38 - b.38 - Eliminar comentarios ⭐⭐☆☆☆

Descripción

Crear una función que reciba una cadena (que puede representar una o más líneas de código) y elimine los comentarios de estilo C (//... hasta el final de la línea y /*...*/ incluyendo el contenido).

Ejercicio 2.03b.39 - b.39 - Análisis de URL simple ⭐☆☆☆☆

Descripción

Dada una URL en formato de cadena, escribir una función que la analice y extraiga sus componentes principales: protocolo, host y ruta.

Ejercicio 2.03b.40 - b.40 - Generador de “Slugs” ⭐⭐☆☆☆

Descripción

Un “slug” es una versión de una cadena amigable para URLs. Escribir una función que convierta un título en un slug: debe estar en minúsculas, los espacios deben ser reemplazados por guiones y se deben eliminar todos los caracteres no alfanuméricos.

Ejercicio 2.03b.41 - b.41 - Primer carácter no repetido ⭐⭐☆☆☆

Descripción

Implementar una función que encuentre y devuelva el primer carácter en una cadena que no se repite en el resto de la cadena.


Ejercicio 2.03b.42 - Extracción Segura de Subcadena ⭐⭐⭐☆☆


Ejercicio 2.03b.43 - Tokenizador Dinámico de Cadenas ⭐⭐⭐☆☆