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:
Tiene algunos requisitos que son:
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.
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.
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ó.
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.
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.
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.
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.
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.
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.
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.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.