codigo moorse en C


09 de Enero del 2020

Hola muy buenas, he empezado hace poco a programar y estoy intentando hacer un codigo en "C" que haga lo siguiente:

Teniendo un fichero llamado "morse.txt", el programa debe presentar
un menú al usuario con cuatro opciones: (1) codificar palabra, (2) codificar archivo, (3) descodificar archivo
y (0) salir.
La opción "codificar palabra" pide por el teclado una palabra con una longitud máxima de 15 caracteres.
Si la palabra supera esta longitud, se informa con un mensaje de error y se presenta el menú de
nuevo. Si no, se codifica la palabra y se muestra por pantalla, los puntos, rayas correspondientes y espacios.
La opción "codificar archivo" abrirá el archivo llamado "original.txt". Si el archivo no existe, se informará
con un mensaje de error y se presenta el menú de nuevo. Si existe, se lee el archivo carácter a
carácter y escribe en un fichero llamado "codificat.txt" la traducción correspondiente a puntos, rayas y
espacios.

La opción "descodificar archivo" abrirá el fichero "codificat.txt". Si el archivo no existe, se informará con un
mensaje de error. Si existe, se lee el archivo carácter a carácter y se guardará el resultado de la
decodificación en un fichero llamado "descodificat.txt".
La opción "salir" permite terminar el programa.

Si no puede hacerlo, por favor expliquenme como hacer la primera parte, gràcias:

"morse.txt" :

A .-*

B -...*

C -.-.*

D -..*

E .*

F ..-.*

G --.*

H ....*

I ..*

J .---*

K -.-*

L .-..*

M --*

N -.*

O ---*

P .--.*

Q --.-*

R .-.*

S ...*

T -*

U ..-*

V ...-*

W .--*

X -..-*

Y -.--*

Z --..*

0 -----*

1 .----*

2 ..---*

3 ...--*

4 ....-*

5 .....*

6 -....*

7 --...*

8 ---..*

9 ----.*

--------------------------------------------------------------------------------------------------------
"original.txt" : ESTA PRACTICA ES GENIAL SOS SOS SOS SOS SOMOS EL 2020 QUE BONITO ES PROGRAMAR 2 MAS 2 SON 4

David Carrero
12 de Agosto del 2026

Hola,

Te dejo montada la parte que pides explícitamente, «codificar palabra», y te explico cómo extender el mismo patrón a las otras dos opciones (archivo).

Lo más sencillo no es leer morse.txt en tiempo de ejecución (parsear ese formato añade complejidad extra sin aportar nada al ejercicio), sino guardar la tabla directamente en el código como un array indexado por letra:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

const char *morse[26] = {
    ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..",
    ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.",
    "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."
};

void codificarPalabra(const char *palabra) {
    for (int i = 0; palabra[i] != ''; i++) {
        char c = toupper(palabra[i]);
        if (c >= 'A' && c <= 'Z') {
            printf("%s ", morse[c - 'A']);
        }
    }
    printf("n");
}

int main() {
    int opcion;
    char palabra[16];

    do {
        printf("n1) Codificar palabran2) Codificar archivon3) Descodificar archivon0) SalirnOpcion: ");
        scanf("%d", &opcion);

        if (opcion == 1) {
            printf("Palabra (max 15 caracteres): ");
            scanf("%15s", palabra);
            if (strlen(palabra) > 15) {
                printf("Error: la palabra supera los 15 caracteres.n");
            } else {
                codificarPalabra(palabra);
            }
        }
    } while (opcion != 0);

    return 0;
}

El truco es que si tu alfabeto va de la A a la Z sin huecos, letra - 'A' te da directamente el índice 0-25 en el array, sin falta ningún if/switch gigante ni tocar el fichero morse.txt para nada.

Para codificar archivo, la idea es la misma pero en vez de printf escribes con fprintf a codificat.txt, y en vez de recorrer un char* vas leyendo original.txt carácter a carácter con fgetc hasta EOF. Antes de abrir el fichero, comprueba que fopen no devuelve NULL para mostrar el mensaje de error que pide el enunciado.

Para descodificar archivo necesitas la tabla al revés: dado un código morse (por ejemplo ".-"), encontrar qué letra le corresponde. Como el array de arriba está indexado por letra y no por código, aquí sí te toca recorrerlo entero comparando con strcmp hasta encontrar la coincidencia, leyendo el fichero token a token (separado por espacios) con fscanf(f, "%s", codigo).

Un saludo,
David Carrero