Código+Morse

Volver a San Andrés 2010-01

=Traductor de código Morse= toc El Código Morse fue desarrollado por el norteamericano Samuel Morse, inventor del telégrafo. El código usa impulsos de corrientes cortos y largos denominados puntos y rayas. El número de impulsos necesarios para expresar un carácter dependen de su tipo:
 * Para expresar una letra se requieren de uno a cuatro impulsos
 * Para un número siempre son cinco
 * Para un carácter especial o signo son seis impulsos.

=Proyecto=

Integrantes
Osmond Pomaré Roy Suárez

Programa
Si traduce de Morse a español, deber digitar "+" después de ingresar una letra en su equivalente morse, y antes de traducir para que reconozca el ultimo código, deberá introducir nuevamente "+" media type="custom" key="7596725"

Código fuente
=Enunciado del problema= CÓDIGO MORSE

El Código Morse fue desarrollado por el norteamericano Samuel Morse, inventor del telégrafo. El código usa impulsos de corrientes cortos y largos denominados puntos y rayas. El número de impulsos necesarios para expresar un carácter dependen de su tipo:
 * Para expresar una letra se requieren de uno a cuatro impulsos
 * Para un número siempre son cinco
 * Para un carácter especial o signo son seis impulsos.

En unidades de tiempo, el punto dura una unidad y la raya tiene una duración de tres unidades. Entre un impulso y otro hay una unidad de tiempo, entre un carácter, número o signo y otro hay tres unidades. Por último entre una palabra y otra hay cinco unidades de tiempo.

El objetivo del proyecto es diseñar e implementar un algoritmo que lea una frase en español y la codifique en código Morse. Además de esto el programa debe leer una frase en Morse convertirla en el equivalente en español. La codificación en sistema Morse debe ser desplegada en pantalla y además debe ser oída por el usuario. El programa deberá además leer un mensaje desde archivo y traducirlo (Español-Morse y Morse-Español).

=Documento entregado= El código Morse es un lenguaje creado por Samuel Morse, con la intención de facilitar la comunicación a larga distancia, el telégrafo predecesor del actual teléfono era la herramienta por la cual se transmitían estos mensajes. El código Morse representa por medio de los sonidos simples lo que se desea comunicar, ya que el telégrafo podía recibir y enviar sonidos. El código Morse representa el alfabeto por medio de rayas y puntos. Este algoritmo hace posible la traducción de un mensaje a la representación grafica del código Morse, y la traducción de un mensaje codificado en Morse al alfabeto. El algoritmo fue diseñado en Processing, un programa que permite crear aplicaciones con una interfaz gráfica más amable para el usuario, lo cual facilita la comprensión del programa. Descripción del algoritmo En algoritmo general se divide en un procedimiento principal (Teclado Virtual), y tres clases (Boton, Teclado y Traductor). El propósito de nuestro algoritmo es traducir a su equivalente Morse las letras del abecedario. Para esto decidimos crear tres clases, además del procedimiento principal, para que facilitaran la creación del algoritmo. En el procedimiento principal, se declaramos una variable de clase Teclado, y una de clase Traductor, las cuales no sirven para recurrir a los procedimientos creados en cada uno. En el void setup, ajustamos el tamaño del teclado virtual, cargamos una imagen que usamos para el fondo del teclado virtual, determinamos el tipo de fuente que íbamos a usar para imprimir mensajes en pantalla, inicializamos una la matriz que contendría un mensaje en código Morse ingresado desde el teclado virtual para evitar que algún espacio contenga basura al momento de traducir, y le enviamos a la clase teclado la posición en x y en y necesarias para dibujarse. En el procedimiento dibujar, primero asignamos como fondo la imagen que cargamos. Activamos el procedimiento display dentro de nuestra variable de tipo Teclado para que se dibuje. También dibujamos un rectángulo de color blanco que servirá para mostrar tanto el mensaje en clave Morse o en español y un botón que activara la traducción Morse a español por medio de una variable booleana (amorse), que por defecto esta en falso para que traduzca de español a Morse. Estos botones utilizan una función booleana llamada overrect, que determinan si el puntero del mouse se encuentra encima de ellas. Esto le permite al botón saber cómo se debe colorear dependiendo de la situación en que se encuentre (presionada, no presionada, debajo del puntero). Aparte de los dos procedimientos anteriores, utilizamos 6 procedimientos y una función. El primer procedimiento, mouseReleased, lo utilizamos para determinar en qué posición es soltado el clic del puntero. Dentro de este procedimiento, recurrimos al procedimiento clic de la clase Teclado, que recibe como parámetros, la posición x y y donde el puntero fue soltado, y el valor de la variable amorse que determina en qué dirección deberá traducir el programa, si las variables booleanas detener y detener2, se encuentran en falso. Estas dos variables cambian de valor solo cuando el botón traducir es activado, de esta manera podemos evitar que sigan ingresándose datos que puedan afectar la traducción de un mensaje. El segundo procedimiento, asignar, lo utilizamos para asignar a un arreglo de tipo carácter cada símbolo que sea presionado del teclado virtual cuando estemos traduciendo a Morse, y almacenamos en una variable acumuladora las veces que un símbolo entra en el arreglo, a excepción del carácter ’!’ el cual cambia el valor de la variable detener, el que como dijimos anteriormente necesita estar en falso para permitir el ingreso de caracteres desde el teclado virtual. Cuando el mensaje este completado, lo enviara como parámetro al procedimiento encode por medio de la variable transform de clase Traductor. El tercer procedimiento, asign, lo utilizamos para guardar dentro una matriz de tipo carácter, el valor de un botón utilizado para traducir de código Morse a español, recibido como parámetro desde el procedimiento comprobar en la clase Boton. Luego de haber rellenado la matriz, ésta se enviara como parámetro junto con el número de filas de la misma, para poder ser traducida en su forma alfabética. El procedimiento show, recibe como parámetros de la clase Traductor, una matriz que contiene un mensaje traducido a Morse, y una variable entera que contiene la cantidad de filas de la misma, y las almacena en una en variables globales de su mismo tipo, permitiendo así ser impresas en la pantalla por medio del void draw. Así mismo, el procedimiento show2, recibe como parámetro de la clase Traductor, una cadena que contiene la traducción de un mensaje Morse a español, y lo asigna a una variable global para que pueda ser escrito en pantalla. Por último, utilizamos un procedimiento empieza, que inicializa matriz de caracteres (codematrix) que contendrá el mensaje escrito en Morse traducir, esto se hizo con el fin de prevenir que contenga basura que pueda alterar la traducción del código a español. Boton contiene tres variables enteras(x, y, t), tres variables de color (base, highlight, press), y una variable de tipo carácter (símbolo) que contiene un valor asignado al botón. El objetivo de esta clase es dibujar un botón en pantalla, para esto de recibe como parámetros, una posición en x, una posición en y, el tamaño del botón, y un símbolo, que será el valor del botón. Las tres variables de tipo color, le otorgan un color al botón para cada una de la siguientes situaciones, estar presionado, no estar presionado, y estar debajo del puntero. La clase botón usa tres procedimientos y una función. El primero, mostrar, que se encarga de mostrar el botón. El segundo, verificar, que se encarga de verificar si la posición del puntero se encuentra encima del botón, si esto ocurre enviara al procedimiento principal, el valor asignado al botón (simbolo). El tercero, comprobar se encarga de comprobar si la posición del puntero se encuentra encima del botón, si esto ocurre enviara al procedimiento principal el valor asignado al botón (simbolo). Por último, la función booleana, overbutton se encarga de verificar si el puntero se encuentra encima del botón, si sucede retorna verdadero sino falso, esta función se utiliza en el primer procedimiento para determinar qué color darle al botón. Teclado contiene dos variables enteras(x, y) que se en cargan de determinara la posición en que comenzara a dibujarse, 6 matrices de tipo Boton, que representaran, el alfabeto, los números, caracteres especiales, el espacio, caracteres del lenguaje Morse, el espacio, y un botón que activará la traducción, por ultimo una fuente de texto, que se utilizara para dibujar encima de cada botón en pantalla el valor que le corresponde al botón o para designar que hace un botón, este es el caso del los botones “ESPACIO” y “Traducir”. La clase Teclado utiliza dos procedimientos: El primero display, que se encargar de dibujar las diferentes iteraciones de clase Boton, y de dibujar encima de cada botón el carácter que se le ha asignado. El segundo y último procedimiento, recibe como parámetros del procedimiento principal la posición x, y del puntero y un booleano. Dependiendo del valor del booleano este procedimiento manda como parámetros, la posición del puntero al procedimiento verificar o comprobar, que se encargan de ver si la posición del mouse se encuentra en alguno de los botones designados para la traducción de español a Morse o para la traducción de Morse a español (caracteres del lenguaje Morse) respectivamente. Este último procedimiento es muy útil ya que permite o que se traduzca de español a Morse o de Morse a español. La clase Traductor utiliza dos procedimientos: El primero, encode, recibe como parámetros del procedimiento principal, un arreglo de entero que contiene un mensaje en español en ASCCI. Primero, se declaro una matriz de tipo carácter (converse), que es la que almacena la traducción del mensaje alfabético, después de la declaración, dentro de un ciclo Para que irá desde 0 hasta la longitud de la cadena recibida como parámetro, asignara a la variable temporal (trans) el valor que contiene el arreglo recibido en la posición de la iteración. Luego dentro de otro ciclo Para, que irá desde 0 hasta 6 (el máximo número de caracteres que contiene e código Morse) utilizara una estructura de selección que asignara a la matriz de caracteres el valor que le corresponde a trans en el código Morse. Cuando finalicen los ciclos, enviara la matriz de caracteres al procedimiento principal, para que esta sea escrita en pantalla. El segundo procedimiento, decode, se encarga de la traducción de un código Morse a español, este recibe como parámetros del procedimiento principal una matriz de tipo carácter, que contiene un mensaje en código Morse, y la cantidad de filas que tiene la matriz. En este procedimiento se declararon dos cadenas, a la primera (temporal) se le asignara dentro un ciclo Para anidado, el primero ira hasta el numero de filas recibido, y el segundo hasta 6, número que representa la mayor cantidad de caracteres que tiene un símbolo del código Morse. Luego se compara con dentro de varias condiciones cada una de las cuales contendrá la representación Morse de un simbolo, si encuentra uno que le corresponda, almacenara la letra numero o carácter especial que le corresponda en la segunda cadena declarada (decodificación). Una vez terminado el ciclo, se envía la cadena con la traducción completa al procedimiento principal para que pueda ser escrita en pantalla. Decisiones durante la creación el algoritmo La primera decisión fue la de programar en Processing, que usa lenguaje java en lugar de programar en C++. Esta o lo hicimos porque Processing ofrece resultados más gratificantes en el momento de ver los resultados. Esto aún sin antes haber programado e java y llevar todo el recorrido del semestre programando en C++, además de que supondría dedicarle mucho más tiempo al proyecto. Primero intentamos utilizar todo en el procedimiento principal, pero al darnos cuenta de complicado que sería esto y tomando en cuenta los beneficios de las clases en Processing, optamos por crear dos clases, una que denominamos Boton, en el que se dibujaría el botón y se almacenarían el valor del mismo y otra que llamamos Teclado, que al principio simplemente contendría matrices de Botones. Cuando logramos la primera parte que era la de crear la interfaz virtual, y procedimos a avanzar con la lógica del algoritmos, nos encontramos con el problema de almacenar la información. A diferencia de C++, en Processing es mucho más complicado la captura de la información desde el teclado, por eso decidimos capturar la información por medio del puntero. Durante el proceso nos dimos cuenta que no podríamos asignar valores directamente al botón, por esto fue que desde el Teclado, utilizando el ciclo Para, mandamos como parámetro a la clase Boton, junto con la posición y el tamaño el valor que tendría éste. Una vez superado el problema de la asignación de valores a los botones, el reto era almacenar el valor si el puntero era soltado encima de uno de ellos, para esto y como todo era controlado desde el procedimiento principal, enviamos la información de cada clic como parámetros, y ahí verificábamos que la información fuera la correcta utilizando el println, que nos permite visualizar los datos en la consola de Processing. Una vez superado el almacenamiento y la lectura decidimos crear una nueva clase que denominamos Traductor, el cual cumpliría la función de traducir d español a Morse y de Morse a español respectivamente. En el proceso de crear el algoritmo de traducción el convertir de español a Morse no supuso mayor problema, pero traducir de vuelta si fue mucho más difícil, ya que no se podía utilizar una cadena dentro de un seleccionar, lo que dificulto la resolución del problema. Para superar este impase utilizamos una matriz de caracteres, y en lugar de utilizar una estructura de selección utilizamos condicionales, en las que comparábamos dos cadenas de caracteres. La primera cadena que actuaria como variable temporal contendría una fila de la matriz recibida por parámetro por medio de la concatenación, al valor de la cadena se le sumaria la cadena y los caracteres contenidos en las columnas de la matriz fila por fila. Luego esa cadena obtenida de la primera fila, se compararía por medio de condicionales con otras cadenas, que serían la representación en puntos y rayas de cada letra, número o símbolo en el código Morse. Si la cadena coincidía con la representación de una letra o simbolo en código Morse, el programa lo almacenaría en otra cadena. Una vez completado el ciclo, lo enviaría al procedimiento principal para ser escrito en pantalla. Osmond Pomare, Salmo Suarez
 * Informe Proyecto Morse**
 * Procedimiento Principal**
 * Clase Boton:**
 * Clase Teclado:**
 * Clase Traductor:**
 * Diseñadores**,

=Póster=