En esta ocasión vamos a ver un ejercicio en ANSI C que trata sobre código Morse y persistencia de datos en un archivo. Se trata de algunas opciones que son:
- Cargar las traducciones en memoria usando una pila, leyendo el archivo de texto
- Leer una cadena y mostrar su traducción en Morse
- Leer un archivo de texto y escribir su contenido en otro archivo, pero traducido a Morse
- Leer un archivo codificado y escribir su contenido en un archivo, pero traducido a texto plano
Tiene algunos requisitos que son:
- Cada código Morse va separado por 3 espacios
- Los espacios entre palabras se codifican como 5 espacios
Veremos paso por paso, lo que más vamos a practicar será el parseo de cadenas así como el trabajo con cadenas, que son un verdadero dolor de cabeza en C pero que al aprender a usarlas son relativamente sencillas.
La pila
Uno de los puntos importantes es leer el archivo de traducciones y colocarlo en memoria. Veamos primero el archivo de traducciones:
Para cargarlo a memoria he utilizado una pila de structs. Cada struct
guarda la traducción y el original:
De este modo podemos recorrer toda la pila y buscar ya sea el texto plano o el texto en Morse.
Cargar traducción
Tengo una función que le añade un struct a la pila y que se usará al cargar la traducción. Es la siguiente:
Por favor notar el uso de strcpy
, esta función es muy importante para asignar la cadena al struct
. Sin ella, no se podría continuar.
Ahora que tenemos la función es momento de cargar el archivo de traducciones:
Esto fue un poco complejo porque tenía que quitar el salto de línea y el asterisco de la línea. Además, tenía que separar por espacios para obtener el texto plano y la traducción, pero al final funcionó.
Buscar texto plano o Morse en traducción
Debo definir dos funciones. Una de ellas recibirá el carácter en texto plano y devolverá su traducción en Morse. La otra recibirá el código Morse y devolverá el texto plano.
Ambas funciones recorren la pila buscando y comparando cadenas con strcmp:
Gracias a estos métodos vamos a poder buscar la traducción de cualquier texto plano o Morse.
Codificar una palabra
Este es el requisito más sencillo. Se trata de leer una palabra introducida por el usuario (de una longitud definida) y traducirla a Morse.
Si la probamos todo va bien:
Una cosa muy importante es respetar los espacios entre símbolos.
Codificar archivo
Ahora veamos cómo codificar un archivo y escribir el código Morse en otro archivo. Para ello definimos el archivo original:
Se debe leer línea por línea y escribir el contenido en otro archivo, pero en código Morse. La función que lo realiza es la siguiente:
Mira cómo es que estamos usando las funciones anteriormente mencionadas. Además, estamos tomando en cuenta la cantidad de espacios. Al seleccionar la opción se habrá creado un archivo codificado cuyo contenido es:
Presta atención al archivo porque después lo vamos a decodificar.
Decodificar archivo
Veamos el proceso inverso, ahora vamos a leer el código Morse de un archivo y lo vamos a traducir a texto plano de manera que quede en otro archivo de texto.
La función que lo hace es la siguiente:
Y el contenido debe ser el mismo que el del archivo original. Todo funciona de maravilla.
Menú de opciones
El ejercicio requería que se dieran las opciones mostradas aquí en un menú. Ese menú debería mostrarse de manera infinita. El código del menú en C es:
Hacemos un ciclo infinito que se detendrá solo si se selecciona una opción determinada.
Poniendo todo junto
El código completo de este ejercicio queda como se ve a continuación:
Al ejecutarlo aparece lo siguiente:
Si quieres ejecutarlo instala gcc y descarga (además del código fuente) el archivo morse.txt así como original.txt presentados anteriormente.
Un poco de historia
Este ejercicio me llevó casi un día. El requisito era terminarlo antes de determinada hora en ese mismo día, y por la presión del tiempo me confundí en algunos aspectos.
Además, fue muy complejo trabajar con las cadenas; me ayudaron bastante las funciones strtok
así como strcpy
y strcat
.
Sin embargo lo más complejo fue parsear los espacios, pues strtok
no permite hacer un split de 5 espacios o 3 espacios ya que toma los 5 o 3 como uno solo.
En fin, es uno de los ejercicios que más me ha costado y quería comentarlo. Si el post te gustó probablemente quieras aprender más sobre C o ver otro ejercicio de Morse en ANSI C.