Algoritmos

C – Ejercicio con código Morse y archivos de texto

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:

  1. Cada código Morse va separado por 3 espacios
  2. 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:

Traduciendo palabra en texto plano a Morse en C

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:

Código Morse en C – Ejercicio con archivos de texto

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

5 días hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.