Acerca de¶
La manipulación de cadenas es una de las tareas más comunes y, en C, una de las
más propensas a errores. Estos ejercicios están diseñados para construir una
base sólida en el manejo de cadenas de caracteres (estilo C, terminadas en
nulo), enfocándose en la implementación de algoritmos comunes desde cero. Es
crucial que al resolverlos, se apliquen los principios de manejo de “cadenas
seguras” (Regla 0x5003h: Utilizá guardas de inclusión en todos los archivos de cabecera), pasando siempre la capacidad del búfer para evitar
desbordamientos.
Para profundizar en los conceptos teóricos, podés consultar el siguiente capítulo del apunte:
Análisis de Cadenas¶
Ejercicio 11.1 - b.1 - Contar vocales ⭐⭐☆☆☆¶
Descripción¶
Escribir una función que cuente el número total de vocales (a, e, i, o, u) en una cadena de texto. La función no debe distinguir entre mayúsculas y minúsculas.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14FUNCION contar_vocales(cadena) VARIABLES: contador (entero) caracter_actual (caracter) INICIO contador = 0 PARA cada caracter_actual en cadena HACER c = convertir_a_minuscula(caracter_actual) SI c == 'a' O c == 'e' O c == 'i' O c == 'o' O c == 'u' ENTONCES contador = contador + 1 FIN SI FIN PARA RETORNAR contador FIN FUNCION
Ejercicio 11.2 - b.2 - Contabilizador de caracteres ⭐⭐☆☆☆¶
Descripción¶
Implementar una función que calcule la frecuencia de aparición de cada carácter dentro de una cadena y muestre el resultado para aquellos caracteres que aparecen al menos una vez.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16PROCEDIMIENTO contabilizar_caracteres(cadena) VARIABLES: frecuencias (arreglo de 256 enteros) INICIO INICIALIZAR frecuencias con ceros PARA cada caracter c en cadena HACER frecuencias[CODIGO_ASCII(c)] = frecuencias[CODIGO_ASCII(c)] + 1 FIN PARA PARA i DESDE 0 HASTA 255 HACER SI frecuencias[i] > 0 ENTONCES ESCRIBIR "Carácter '", CARACTER(i), "': ", frecuencias[i], " veces" FIN SI FIN PARA FIN PROCEDIMIENTO
Ejercicio 11.3 - 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.
Ayuda (pseudocódigo)
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 29FUNCION es_numero_valido(cadena) VARIABLES: tiene_punto (booleano) tiene_digito (booleano) i (entero) INICIO tiene_punto = FALSO, tiene_digito = FALSO i = 0 // Comprobar signo opcional SI cadena[0] == '+' O cadena[0] == '-' ENTONCES i = 1 FIN SI // Recorrer el resto de la cadena MIENTRAS cadena[i] != FIN_DE_CADENA HACER SI es_digito(cadena[i]) ENTONCES tiene_digito = VERDADERO SINO SI cadena[i] == '.' ENTONCES SI tiene_punto ENTONCES RETORNAR FALSO // Más de un punto tiene_punto = VERDADERO SINO RETORNAR FALSO // Carácter no válido FIN SI i = i + 1 FIN MIENTRAS RETORNAR tiene_digito // Debe tener al menos un dígito FIN FUNCION
Ejercicio 11.4 - 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).
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9FUNCION es_alfabetica(cadena) INICIO PARA cada caracter c en cadena HACER SI NO es_letra(c) ENTONCES RETORNAR FALSO FIN SI FIN PARA RETORNAR VERDADERO FIN FUNCION
Propiedades de Cadenas¶
Ejercicio 11.5 - 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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21FUNCION es_palindromo_complejo(cadena) VARIABLES: izquierda, derecha (enteros) INICIO izquierda = 0, derecha = LONGITUD(cadena) - 1 MIENTRAS izquierda < derecha HACER MIENTRAS NO es_alfabetico(cadena[izquierda]) Y izquierda < derecha HACER izquierda = izquierda + 1 FIN MIENTRAS MIENTRAS NO es_alfabetico(cadena[derecha]) Y izquierda < derecha HACER derecha = derecha - 1 FIN MIENTRAS SI convertir_a_minuscula(cadena[izquierda]) != convertir_a_minuscula(cadena[derecha]) ENTONCES RETORNAR FALSO FIN SI izquierda = izquierda + 1 derecha = derecha - 1 FIN MIENTRAS RETORNAR VERDADERO FIN FUNCION
Ejercicio 11.6 - 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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24FUNCION son_anagramas(cadena1, cadena2) VARIABLES: frecuencias (arreglo de 26 enteros) INICIO INICIALIZAR frecuencias con ceros PARA cada caracter c en cadena1 HACER SI es_alfabetico(c) ENTONCES frecuencias[posicion_alfabeto(c)]++ FIN SI FIN PARA PARA cada caracter c en cadena2 HACER SI es_alfabetico(c) ENTONCES frecuencias[posicion_alfabeto(c)]-- FIN SI FIN PARA PARA i DESDE 0 HASTA 25 HACER SI frecuencias[i] != 0 RETORNAR FALSO FIN PARA RETORNAR VERDADERO FIN FUNCION
Ejercicio 11.7 - 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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18FUNCION es_pangrama(cadena) VARIABLES: letras_vistas (arreglo booleano de 26 posiciones) INICIO INICIALIZAR letras_vistas con FALSO PARA cada caracter c en cadena HACER SI es_alfabetico(c) ENTONCES letras_vistas[posicion_alfabeto(c)] = VERDADERO FIN SI FIN PARA PARA i DESDE 0 HASTA 25 HACER SI letras_vistas[i] == FALSO RETORNAR FALSO FIN PARA RETORNAR VERDADERO FIN FUNCION
Manipulación y Transformación¶
Ejercicio 11.8 - 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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22FUNCION mi_strtok(cadena, delimitador) VARIABLES ESTATICAS: ultimo_puntero INICIO SI cadena != NULL ENTONCES ultimo_puntero = cadena FIN SI SI *ultimo_puntero == FIN_DE_CADENA RETORNAR NULL token_inicio = ultimo_puntero MIENTRAS *ultimo_puntero != delimitador Y *ultimo_puntero != FIN_DE_CADENA HACER ultimo_puntero++ FIN MIENTRAS SI *ultimo_puntero != FIN_DE_CADENA ENTONCES *ultimo_puntero = '\0' ultimo_puntero++ FIN SI RETORNAR token_inicio FIN FUNCION
Ejercicio 11.9 - 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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17FUNCION comprimir_rle(cadena) VARIABLES: resultado (cadena) contador, i (enteros) INICIO i = 0 MIENTRAS i < LONGITUD(cadena) HACER contador = 1 MIENTRAS i+1 < LONGITUD(cadena) Y cadena[i] == cadena[i+1] HACER contador++, i++ FIN MIENTRAS AÑADIR numero_a_cadena(contador) a resultado AÑADIR cadena[i] a resultado i++ FIN MIENTRAS RETORNAR resultado FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19PROCEDIMIENTO desduplicar(REF cadena) VARIABLES: vistos (arreglo booleano de 256) p_lectura, p_escritura (enteros) INICIO INICIALIZAR vistos con FALSO p_lectura = 0, p_escritura = 0 MIENTRAS cadena[p_lectura] != FIN_DE_CADENA HACER caracter_actual = cadena[p_lectura] SI vistos[CODIGO_ASCII(caracter_actual)] == FALSO ENTONCES vistos[CODIGO_ASCII(caracter_actual)] = VERDADERO cadena[p_escritura] = caracter_actual p_escritura++ FIN SI p_lectura++ FIN MIENTRAS cadena[p_escritura] = FIN_DE_CADENA FIN PROCEDIMIENTO
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19FUNCION formatear_numero(numero) VARIABLES: cadena_simple, cadena_formateada (cadenas) longitud, num_separadores, j (enteros) INICIO cadena_simple = convertir_a_cadena(numero) longitud = LONGITUD(cadena_simple) // ... calcular num_separadores ... // ... reservar memoria para cadena_formateada ... j = 0 PARA i DESDE 0 HASTA longitud-1 HACER // Lógica para insertar separador cada 3 dígitos desde la derecha // ... AÑADIR cadena_simple[i] a cadena_formateada FIN PARA RETORNAR cadena_formateada FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20FUNCION buscar_subcadena(haystack, needle) VARIABLES: n, m, i, j (enteros) INICIO n = LONGITUD(haystack) m = LONGITUD(needle) PARA i DESDE 0 HASTA n - m HACER j = 0 MIENTRAS j < m Y haystack[i+j] == needle[j] HACER j = j + 1 FIN MIENTRAS SI j == m ENTONCES RETORNAR i // Subcadena encontrada en el índice i FIN SI FIN PARA RETORNAR -1 // No encontrada FIN FUNCION
Conversión de Base Numérica¶
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10FUNCION binario_a_decimal(cadena_binaria) VARIABLES: decimal (entero) INICIO decimal = 0 PARA cada caracter c en cadena_binaria HACER decimal = (decimal * 2) + (c - '0') FIN PARA RETORNAR decimal FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18FUNCION hexadecimal_a_decimal(cadena_hex) VARIABLES: decimal (entero) valor_digito (entero) INICIO decimal = 0 PARA cada caracter c en cadena_hex HACER SI c >= '0' Y c <= '9' ENTONCES valor_digito = c - '0' SINO SI c >= 'a' Y c <= 'f' ENTONCES valor_digito = c - 'a' + 10 SINO SI c >= 'A' Y c <= 'F' ENTONCES valor_digito = c - 'A' + 10 FIN SI decimal = (decimal * 16) + valor_digito FIN PARA RETORNAR decimal FIN FUNCION
Ejercicio 11.15 - b.15 - Decimal a binario ⭐⭐⭐⭐☆¶
Descripción¶
Convertir un número entero decimal a su representación en una cadena de texto binaria.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15FUNCION decimal_a_binario(n) VARIABLES: cadena_inversa, cadena_final (cadenas) INICIO SI n == 0 RETORNAR "0" MIENTRAS n > 0 HACER resto = n MOD 2 AÑADIR caracter(resto) a cadena_inversa n = n / 2 FIN MIENTRAS cadena_final = invertir_cadena(cadena_inversa) RETORNAR cadena_final FIN FUNCION
Ejercicio 11.16 - b.16 - Decimal a hexadecimal ⭐⭐☆☆☆¶
Descripción¶
Convertir un número entero decimal a su representación en una cadena de texto hexadecimal.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16FUNCION decimal_a_hexadecimal(n) VARIABLES: cadena_inversa, cadena_final (cadenas) mapa_hex = "0123456789ABCDEF" INICIO SI n == 0 RETORNAR "0" MIENTRAS n > 0 HACER resto = n MOD 16 AÑADIR mapa_hex[resto] a cadena_inversa n = n / 16 FIN MIENTRAS cadena_final = invertir_cadena(cadena_inversa) RETORNAR cadena_final FIN FUNCION
Más Ejercicios de Cadenas¶
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20PROCEDIMIENTO invertir_subcadena(REF cadena, inicio, fin) MIENTRAS inicio < fin HACER INTERCAMBIAR(cadena[inicio], cadena[fin]) inicio++, fin-- FIN MIENTRAS FIN PROCEDIMIENTO PROCEDIMIENTO invertir_palabras(REF frase) VARIABLES: inicio_palabra, i (enteros) INICIO inicio_palabra = 0 PARA i DESDE 0 HASTA LONGITUD(frase) HACER SI frase[i] == ' ' O frase[i] == FIN_DE_CADENA ENTONCES // Se encontró el final de una palabra invertir_subcadena(frase, inicio_palabra, i - 1) inicio_palabra = i + 1 FIN SI FIN PARA FIN PROCEDIMIENTO
Ejercicio 11.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”.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8PROCEDIMIENTO invertir_orden_palabras(REF frase) INICIO // Paso 1: Invertir toda la frase invertir_subcadena(frase, 0, LONGITUD(frase) - 1) // Paso 2: Invertir cada palabra individualmente invertir_palabras(frase) FIN PROCEDIMIENTO
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11PROCEDIMIENTO a_title_case(REF cadena) INICIO convertir_a_minuscula_toda_la_cadena(cadena) capitalizar(cadena[0]) PARA i DESDE 1 HASTA LONGITUD(cadena)-1 HACER SI cadena[i-1] == ' ' ENTONCES capitalizar(cadena[i]) FIN SI FIN PARA FIN PROCEDIMIENTO
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17FUNCION contar_palabras(cadena) VARIABLES: contador, estado (enteros) INICIO contador = 0 estado = FUERA_DE_PALABRA PARA cada caracter c en cadena HACER SI c == ' ' O c == '\n' O c == '\t' ENTONCES estado = FUERA_DE_PALABRA SINO SI estado == FUERA_DE_PALABRA ENTONCES estado = DENTRO_DE_PALABRA contador = contador + 1 FIN SI FIN PARA RETORNAR contador FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21PROCEDIMIENTO eliminar_espacios_extra(REF cadena) VARIABLES: p_lectura, p_escritura (enteros) INICIO p_lectura = 0, p_escritura = 0 MIENTRAS cadena[p_lectura] != FIN_DE_CADENA HACER // Copiar caracteres que no son espacios MIENTRAS cadena[p_lectura] != ' ' Y cadena[p_lectura] != FIN_DE_CADENA HACER cadena[p_escritura++] = cadena[p_lectura++] FIN MIENTRAS // Omitir múltiples espacios MIENTRAS cadena[p_lectura] == ' ' HACER p_lectura++ FIN MIENTRAS // Añadir un solo espacio si no estamos al final SI cadena[p_lectura] != FIN_DE_CADENA ENTONCES cadena[p_escritura++] = ' ' FIN SI FIN MIENTRAS cadena[p_escritura] = FIN_DE_CADENA FIN PROCEDIMIENTO
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24PROCEDIMIENTO trim(REF cadena) VARIABLES: longitud, i, inicio (enteros) INICIO longitud = LONGITUD(cadena) // Recortar final i = longitud - 1 MIENTRAS i >= 0 Y es_espacio(cadena[i]) HACER i-- FIN MIENTRAS cadena[i + 1] = FIN_DE_CADENA // Recortar inicio inicio = 0 MIENTRAS cadena[inicio] != FIN_DE_CADENA Y es_espacio(cadena[inicio]) HACER inicio++ FIN MIENTRAS // Mover la cadena si es necesario SI inicio > 0 ENTONCES mover_bloque_memoria(cadena, cadena + inicio, LONGITUD(cadena) - inicio + 1) FIN SI FIN PROCEDIMIENTO
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20FUNCION reemplazar_subcadena(original, buscar, reemplazar) VARIABLES: nueva_cadena (cadena) i, j (enteros) INICIO // ... calcular tamaño de nueva_cadena y reservar memoria ... i = 0, j = 0 MIENTRAS i < LONGITUD(original) HACER SI subcadena_en(original, i) == buscar ENTONCES COPIAR reemplazar en nueva_cadena en la posición j i = i + LONGITUD(buscar) j = j + LONGITUD(reemplazar) SINO nueva_cadena[j] = original[i] i++, j++ FIN SI FIN MIENTRAS nueva_cadena[j] = FIN_DE_CADENA RETORNAR nueva_cadena FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19FUNCION es_email_simple_valido(email) VARIABLES: pos_arroba, pos_ultimo_punto (enteros) INICIO pos_arroba = encontrar_caracter(email, '@') SI pos_arroba == NO_ENCONTRADO O pos_arroba == 0 ENTONCES RETORNAR FALSO FIN SI // Verificar que no haya más de un @ // ... pos_ultimo_punto = encontrar_ultima_posicion(email, '.') SI pos_ultimo_punto == NO_ENCONTRADO O pos_ultimo_punto < pos_arroba + 2 ENTONCES RETORNAR FALSO FIN SI RETORNAR VERDADERO FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17FUNCION cifrado_cesar(cadena, desplazamiento) VARIABLES: resultado (cadena) INICIO PARA cada caracter c en cadena HACER SI es_letra_minuscula(c) ENTONCES nuevo_car = 'a' + (c - 'a' + desplazamiento) MOD 26 AÑADIR nuevo_car a resultado SINO SI es_letra_mayuscula(c) ENTONCES nuevo_car = 'A' + (c - 'A' + desplazamiento) MOD 26 AÑADIR nuevo_car a resultado SINO AÑADIR c a resultado FIN SI FIN PARA RETORNAR resultado FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
FUNCION descifrado_cesar(cadena, desplazamiento)
INICIO
// La lógica es la misma que el cifrado, pero con -desplazamiento
RETORNAR cifrado_cesar(cadena, 26 - desplazamiento)
FIN FUNCIONEjercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16FUNCION caracter_mas_frecuente(cadena) VARIABLES: frecuencias (arreglo de 256 enteros) max_frecuencia, char_mas_frecuente (enteros) INICIO // ... llenar arreglo de frecuencias ... max_frecuencia = -1 PARA i DESDE 0 HASTA 255 HACER SI frecuencias[i] > max_frecuencia ENTONCES max_frecuencia = frecuencias[i] char_mas_frecuente = i FIN SI FIN PARA RETORNAR CARACTER(char_mas_frecuente) FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12FUNCION comparar_sin_caso(s1, s2) INICIO MIENTRAS *s1 != FIN_DE_CADENA Y *s2 != FIN_DE_CADENA HACER c1 = convertir_a_minuscula(*s1) c2 = convertir_a_minuscula(*s2) SI c1 != c2 ENTONCES RETORNAR c1 - c2 FIN SI s1++, s2++ FIN MIENTRAS RETORNAR convertir_a_minuscula(*s1) - convertir_a_minuscula(*s2) FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9FUNCION extraer_subcadena(cadena, inicio, longitud) VARIABLES: subcadena (cadena) INICIO // ... reservar memoria para subcadena ... COPIAR_MEMORIA(subcadena, cadena + inicio, longitud) subcadena[longitud] = FIN_DE_CADENA RETORNAR subcadena FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10FUNCION justificar_texto(linea, ancho) VARIABLES: num_palabras, num_espacios, espacios_por_hueco, espacios_extra INICIO // ... contar palabras y caracteres ... // ... calcular espacios a insertar ... // ... construir la nueva cadena ... RETORNAR cadena_justificada FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18FUNCION generar_acronimo(frase) VARIABLES: acronimo (cadena) es_inicio_de_palabra (booleano) INICIO acronimo = "" es_inicio_de_palabra = VERDADERO PARA cada caracter c en frase HACER SI es_letra(c) Y es_inicio_de_palabra ENTONCES AÑADIR convertir_a_mayuscula(c) a acronimo es_inicio_de_palabra = FALSO SINO SI c == ' ' ENTONCES es_inicio_de_palabra = VERDADERO FIN SI FIN PARA RETORNAR acronimo FIN FUNCION
Cadenas y Algoritmos¶
Ejercicio 11.32 - b.32 - Distancia de Hamming ⭐⭐☆☆☆¶
Descripción¶
Implementar una función que calcule la distancia de Hamming entre dos cadenas de igual longitud. Esta distancia es el número de posiciones en las que los caracteres correspondientes son diferentes.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14FUNCION distancia_hamming(cadena1, cadena2) VARIABLES: distancia (entero) INICIO SI LONGITUD(cadena1) != LONGITUD(cadena2) RETORNAR -1 // Error distancia = 0 PARA i DESDE 0 HASTA LONGITUD(cadena1)-1 HACER SI cadena1[i] != cadena2[i] ENTONCES distancia++ FIN SI FIN PARA RETORNAR distancia FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7FUNCION lcs(cadena1, cadena2) VARIABLES: dp (matriz 2D) INICIO // ... inicializar y llenar la matriz dp ... RETORNAR dp[LONGITUD(cadena1)][LONGITUD(cadena2)] FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16FUNCION es_ipv4_valida(cadena) VARIABLES: tokens (arreglo de cadenas) num (entero) INICIO tokens = dividir_cadena(cadena, '.') SI LONGITUD(tokens) != 4 RETORNAR FALSO PARA cada token en tokens HACER SI token está vacío O NO es_numero(token) RETORNAR FALSO num = convertir_a_entero(token) SI num < 0 O num > 255 RETORNAR FALSO FIN PARA RETORNAR VERDADERO FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12FUNCION a_snake_case(cadena) VARIABLES: resultado (cadena) INICIO PARA cada caracter c en cadena HACER SI es_mayuscula(c) Y resultado NO está vacío ENTONCES AÑADIR '_' a resultado FIN SI AÑADIR convertir_a_minuscula(c) a resultado FIN PARA RETORNAR resultado FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18FUNCION a_camel_case(cadena) VARIABLES: resultado (cadena) capitalizar (booleano) INICIO capitalizar = FALSO PARA cada caracter c en cadena HACER SI c == '_' ENTONCES capitalizar = VERDADERO SINO SI capitalizar ENTONCES AÑADIR convertir_a_mayuscula(c) a resultado capitalizar = FALSO SINO AÑADIR c a resultado FIN SI FIN PARA RETORNAR resultado FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11FUNCION es_rotacion(s1, s2) INICIO SI LONGITUD(s1) != LONGITUD(s2) RETORNAR FALSO temp = s1 + s1 // Concatenación SI buscar_subcadena(temp, s2) != NO_ENCONTRADO ENTONCES RETORNAR VERDADERO SINO RETORNAR FALSO FIN SI FIN FUNCION
Ejercicio 11.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).
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23FUNCION eliminar_comentarios(codigo) VARIABLES: resultado (cadena) estado (entero) INICIO estado = NORMAL PARA i DESDE 0 HASTA LONGITUD(codigo)-1 HACER SI estado == NORMAL Y codigo[i] == '/' Y codigo[i+1] == '/' ENTONCES estado = DENTRO_DE_COMENTARIO_LINEA SINO SI estado == NORMAL Y codigo[i] == '/' Y codigo[i+1] == '*' ENTONCES estado = DENTRO_DE_COMENTARIO_BLOQUE SINO SI estado == DENTRO_DE_COMENTARIO_LINEA Y codigo[i] == '\n' ENTONCES estado = NORMAL AÑADIR '\n' a resultado SINO SI estado == DENTRO_DE_COMENTARIO_BLOQUE Y codigo[i] == '*' Y codigo[i+1] == '/' ENTONCES estado = NORMAL i++ // Saltar el '/' SINO SI estado == NORMAL ENTONCES AÑADIR codigo[i] a resultado FIN SI FIN PARA RETORNAR resultado FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9PROCEDIMIENTO analizar_url(url, REF protocolo, REF host, REF ruta) VARIABLES: pos_protocolo, pos_host_inicio, pos_ruta_inicio (enteros) INICIO pos_protocolo = encontrar_caracter(url, ':') protocolo = extraer_subcadena(url, 0, pos_protocolo) // ... lógica similar para host y ruta ... FIN PROCEDIMIENTO
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14FUNCION generar_slug(titulo) VARIABLES: slug (cadena) INICIO PARA cada caracter c en titulo HACER c_min = convertir_a_minuscula(c) SI es_alfanumerico(c_min) ENTONCES AÑADIR c_min a slug SINO SI es_espacio(c_min) Y ultimo_char(slug) != '-' ENTONCES AÑADIR '-' a slug FIN SI FIN PARA RETORNAR slug FIN FUNCION
Ejercicio 11.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.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14FUNCION primer_no_repetido(cadena) VARIABLES: frecuencias (arreglo de 256 enteros) INICIO // ... llenar arreglo de frecuencias ... PARA cada caracter c en cadena HACER SI frecuencias[CODIGO_ASCII(c)] == 1 ENTONCES RETORNAR c FIN SI FIN PARA RETORNAR CARACTER_NULO // No se encontró ninguno FIN FUNCION