Lab 9: Morse Code Decoder

Learning Outcomes

Overview

Morse Code is a method for communicating using two symbols: dots and dashes. Each character has a code, consisting of zero or more dots and zero or more dashes. The following table describes the mapping for many popular characters:

SymbolCodeSymbolCodeSymbolCodeSymbolCode
A.-L.-..W.--7--...
B-...M--X-..-8---..
C-.-.N-.Y-.--9----.
D-..O---Z--....-.-.-
E.P.--.0-----,--..--
F..-.Q--.-1.----/-..-.
G--.R.-.2..---?..--..
H....S...3...--SPACE.-...
I..T-4....-NEW LINE.-.-
J.---U..-5.....
K-.-V...-6-....

In this assignment, you will create a Morse Code decoder. You will write and test two classes: MorseDecoder and MorseTree<E>.

In order to decode each series of dots and dashes, you must build a binary tree. A partially constructed tree is shown below. The tree contains the letters A to E in the alphabet.

Morse Code Tree
Figure 1: Morse Code Tree

Notice that the resulting binary tree provides a decoding path. For example, the letter D can be decoded from its Morse Code: -... To accomplish this, we start at the root of the tree and traverse to the left or right depending on whether the code begins with a dot or a dash respectively. In this case, -.. begins with a dash followed by two dots, so we would traverse from the root of the tree once to the right and then twice to the left. Doing so causes us to arrive at a node in the tree with the value D.

In fact, once the tree is fully populated, all symbols in it can be decoded by visiting the left child when a dot is encountered and visiting the right child when a dash is encountered. When all of the dots/dashes in the code have been processed, the resulting node in the tree contains the symbol represented by the code.

Procedure

Your program must read in a file consisting of characters that have been encoded in Morse Code. In the encoded file, each character is translated into its morse code. Each code is separated by a space. For example, HI THERE would appear in an encoded file as: .... .. .-... - .... . .-. .. Your MorseDecoder class must read an encoded file and write the decoded result to an output file. Your program must make use of a MorseTree<E> class to store the Morse Code in a binary tree.

The MorseTree<E> class must define a private Node class that uses generics to denote the type of data stored in the tree. Each node will contain the instance variable symbol as an E as well as its left and right children. If the node does not contain a symbol, it should be null. The MorseTree<E> will have a single instance variable, root.

The MorseTree<E> class must have the following public methods:

The logic of your program should be implemented in the MorseDecoder utility class. The design for this class is your responsibility; however, you are required to have two methods. The first is loadDecoder(Path path) that accepts a Path object containing the Morse Code file as an argument. The method calls the add() from the MorseTree<E> class multiple times in order to populate the tree. Each line of the file contains one codeword mapping. The first character is the symbol (e.g., D) immediately followed by the corresponding morse codeword (e.g., -..). The method will return a completed MorseTree object.

The second required method is decodeMessage(File input, MorseTree<Character> tree) which decodes the contents of the file using the MorseTree. It will traverse one symbol at a time through the encoded file and translate the symbol into a character, returning a String contaiing the decoded message.

The newline character is a special case in that it requires two characters to represent the symbol (\n). When reading the file, if the line begins with a backslash character, the symbol takes two characters and the codeword begins at the third character on the line. You will need to handle this as a special case in your code.

Notes:

Interface

Your program should use a clean GUI that automatically loads the dictionary file of morse code and builds the MorseTree. When a user loads an encoded file, the program should decode the file and present it to the user below the original, encoded file. Below is an example interface: Interface

Running your program on this file:

.- .-... ... .--. .- -.-. . .-... ... .... --- ..- .-.. -.. .-... -... . .-... .--. .-.. .- -.-. . -.. .-... -... . - .-- . . -. .-... . .- -.-. .... .-... . -. -.-. --- -.. . -.. .-... -.-. .... .- .-. .- -.-. - . .-. .-.-.- .-.-
.-.-
.- .-... * .-... ... .... --- ..- .-.. -.. .-... -... . .-... .--. .-.. .- -.-. . -.. .-... -... . - .-- . . -. .-... . .- -.-. .... .-... .-- --- .-. -.. .-.-.- .-.-
.-.-
.-.. .. -. . .-... -... .-. . .- -.- ... .-... .. -. .-... - .... . .-... .. -. .--. ..- - .-... ..-. .. .-.. . .-... ... .... --- ..- .-.. -.. .-... -... . .-... .-. . .--. .-.. .. -.-. .- - . -.. .-... .. -. .-... - .... . .-... . -. -.-. --- -.. . -.. .-... ..-. .. .-.. . .-.-.-  .-.-

should display this decoded message:

A SPACE SHOULD BE PLACED BETWEEN EACH ENCODED CHARACTER.

A  SHOULD BE PLACED BETWEEN EACH WORD.

LINE BREAKS IN THE INPUT FILE SHOULD BE REPLICATED IN THE ENCODED FILE.

Additionally, if there were any illegal characters found during decoding, an alert listing all of the characters skipped should pop up when the decoding is complete. Alert

See your professor's instructions for details on submission guidelines and due dates.

Acknowledgements

This assignment was originally developed by Dr. Jay Urbain.