Site hosted by Angelfire.com: Build your free website today!

UNIVERSIDAD DE COSTA RICA

 

 

ESCUELA DE LAS CIENCIAS DE LA COMPUTACIÓN E INFORMÁTICA

(ECCI)

 

 

PROGRAMACIÓN II (CI-1201)

 

 

CENTRO UNIVERSITARIO:

SEDE CENTRAL RODRIGO FACIO

 

 

TAREA #6

 

USO DE DICCIONARIOS (Map)

(Obtener e-mail’s)

 

 

GRUPO: 01

 

 

PROFESOR:

ADOLFO DI MARE

 

 

ESTUDIANTES:

CARLOS BADILLA MEJÍA

JORGE A. MENOCAL ROJAS

 

 

CARNÉ:

A40617

A43354

 

 

14/10/2005

 

Tabla de contenidos

 

 

 

Introducción.. 2

Descripción del problema a resolver. 2

Planteo:. 2

Objetivos:. 2

Requerimientos:. 2

Abstracción.. 2

Especificación de las clases: 2

Clase Cbmap: 2

Especificación de los métodos: 2

Método de leer_archivo(): 2

Método Extractor(): 2

Método Insertar(): 2

Método ImprimirDiccionario(): 2

string ImprimirDiccionario() 2

Método ImprimirLista(): 2

Especificación del programa. 2

Eficiencia: 2

Arquitectura del Programa:. 2

Implementación.. 2

Compilador usado: 2

¿Cómo compilar el programa?. 2

Guía de uso del programa. 2

Conclusiones. 2

Bibliografía. 2

 

 

                                                      

 

Introducción

 

Esta tarea esta muy basada en la anterior, lo único que va a cambiar es que ya no hay que hacer una lista de emails que contengan una dirección y una lista de los renglones en los que aparecieron.    Ahora simplemente se hace un mapa que contenga las direcciones y la lista de los renglones,  como se puede observar esta tarea es más sencilla que la anterior e interesante.

El uso de mapas es muy beneficioso dependiendo de la situación, pero  por lo menos en programas en los que haya que utilizar algo asociado a otra cosa es de mucho provecho su uso.

Los documentos de este trabajo, se pueden encontrar en:  www.angelfire.com/cantina/colossus  y en: www.angelfire.com/rock4/a43354, documentaciones y archivos de compilación.

 

 

Descripción del problema a resolver

 

 

Planteo:

El objetivo es separar las direcciones de correo de entre información variada que recibimos de una gran cantidad de archivos de texto de la firma spamTico.com, posterior a la separación, debemos guardar un registro del renglón en el que aparece cada dirección.

Para almacenar las direcciones usaremos mapas biblioteca STL de C++, en ellos se almacenará un e-mail tipo string y como su par una lista que contiene los renglones respectivos en los que aparecieron las direcciones.

 

Objetivos:  

·        Investigar acerca del uso de las bibliotecas STL de C++.

·        Dividir el problema en módulos para su fácil implementación

·        Aprender a utilizar mapas

·        Reutilizar nuestro propio código para futuras tareas

·        Poder discernir entre el camino más simple para resolver un problema y el camino más difícil a seguir

·        Profundizar en el uso del software generador de especificaciones Doxygen.

 

 

Requerimientos:   

El programa requiere tener una plataforma de win32 valida con cualquier sistema operativo de Microsoft Windows; además de que requiere la existencia de los sub-directorios que se deseen ordenar.

Además de un archivo para leer, este archivo va a contener cientos de páginas en la que van escritas varias direcciones de correo.

 

 

Abstracción

Especificación de las clases:

 

         Clase Cbmap:

/** En esta clase se encuentra el \cmain, que hace llamado al método que analiza el archivo para verificar que hayan direcciones de correo,  luego extrae renglón por renglón para poder analizarlo y extraer los \cmails que contengan.

 

-          Inserta los renglones en una lista

-          Agrega los \cmails y las listas de \crenglones a un mapa.

-          Es la única clase que hay, pues sería   innecesario hacer otra.

**/

class Cbmap

 

 

 

Especificación de los métodos:

 

            Método de leer_archivo():

 

/** Este método lee un \carchivo.txt y lo va analizando hasta que el texto en el documento se termine, sin importar la longitud de este.

 

-          Si no posee direcciones de correo, no imprime nada y sale del archivo.

-          Si hay líneas en blanco, no las toma en cuenta

-          Hace llamado al \cExtractor cada vez que haya un correo electrónico y le envía por parámetros la línea en que lo encontró.

**/

void leer_archivo()

 

 

            Método Extractor():

 

/**     Hace una copia del renglón que recibe, luego sustituye por asteriscos los caracteres no válidos para poder conseguir las direcciones con mayor facilidad.

-          Si la no posee ningún correo sale del método para evaluar al siguiente.

-          Si el arroba esta en el último caracter no lo toma en cuenta.

-          Si posee menos de cuatro caracteres, no es válido para una dirección de correo.

**/

 

bool Extractor(const string &renglon)

 

            Método Insertar():

 

/**     Recibe la dirección de correo y el renglón donde esta se encuentra, luego inserta en un diccionario el \cmail y una lista de renglones

-          Si la dirección ya esta en el diccionario, hace una copia de la lista que le hace par e inserta el nuevo renglón.

-           Si no existe hace un nuevo espacio para el correo y una nueva lista que contenga su línea.

                     **/

 

void Insertar(const string &direccion, const string &renglon)

 

Método ImprimirDiccionario():

 

/**     Hace un recorrido por el diccionario y va imprimiendo sus \cmails con sus respectivas listas, para imprimir los valores de las listas hace llamado al método \cImprimirLista()

                     **/

 

string ImprimirDiccionario()

 

Método ImprimirLista():

 

/**     Recorre cada lista en la posición respectiva en el diccionario y va copiando sus valores para al final retornarlos.

                     **/

 

string ImprimirLista(const list<string> &listilla)

 

 

 

Especificación del programa

 

Éste programa sirve para extraer direcciones de correo electrónico de un texto y guardar un registro de cada renglón en el que aparece dicha dirección. Al final, imprime un mapa con direcciones de correo y listas con renglones. Se imprime de la siguiente forma:

 

cbadillam@yahoo.com:    

- Te envié el mensaje al correo cbadillam@yahoo.com pero no me has contestado…

           - …cuando me fijé no había escrito el .com de cbadillam@yahoo.com, ya yo…

adolfo@di-mare.com:

- … cuando el profesor Adolfo (adolfo@di-mare.com) envió el correo, yo estaba chateando con…

- …<adolfo@di-mare.com> Mail delivery failure, mailbox full or message is larger than…

 

 

Eficiencia:

 

Éste programa es muy eficiente en cuanto no interactúa con el usuario, por lo que no hay errores posibles a la hora de recibir la información.   También reconoce todos los caracteres aceptados en direcciones de correo electrónico(letras, números y los caracteres ‘-‘,’_’, ‘.’, ‘@’) por lo que no hay manera de que falte alguna dirección. Como usa las listas que proporciona la biblioteca STL de C++, además usa mapas; ambos crecen sin parar hasta que la memoria se agota, así que ése es el límite de pares y de renglones que soporta, y varía de una máquina a otra.

 

 

Arquitectura del Programa:

 

 

                                                                          DICCIONARIO

                                                                              ||

                                                                              \/

                                        . . .

                           +----------+-----------+           +-------------------+-------------------...

                           ¦  first   |   second  |    <=>    |adolfo@di-mare.com |renglon1|renglon10|...

                           +----------+-----------+           +-------------------+-------------------...

                                   . . .

                           +----------+-----------+           +-------------------+-------------------...

                           ¦  first   |   second  |   <=>    |anthonymr@gmail.com|renglon8|renglon2 |...

                           +----------+-----------+           +-------------------+-------------------...

                           +----------+-----------+           +-------------------+-------------------...

                           ¦  first   |   second  |   <=>    |cbadillam@yahoo.com|renglon3|   ...   |...

                           +----------+-----------+           +-------------------+-------------------...

                                   . . .                     

                           +----------+-----------+           +-------------------+-------------------...

                           ¦  first   |   second  |   <=>    |zz_zz.z@progra2.com|renglon1|   ...   |

                           +----------+-----------+           +-------------------+-------------------...

                              ||          ||                       ||                         ||

                             \/           \/                       \/                          \/

                           string      list<string>           llave de acceso          cada renglonX

                                                                                     representa un string

 

 

 

Implementación

 

Compilador usado:

 

El compilador utilizado fue Microsoft Visual C++ 7.0

 

 

 

¿Cómo compilar el programa?

 

La presentación del trabajo permite que el estudiante simplemente abra el proyecto que se encuentra en el archivo .ZIP y abra el proyecto para Visual C++, automáticamente se cargan los archivos necesarios para la compilación y ejecución del programa.

Luego se compila el programa y una vez hecho esto, estará listo para ser ejecutado.

 

Guía de uso del programa

 

En nuestro caso, simplemente se ejecuta el programa y él mismo carga el archivo que va a utilizar, extrae cada dirección y su respectivo renglón y finalmente imprime el resultado. Todo lo hace sin solicitar la asistencia del usuario, por lo que no hay mayores complicaciones.

 

 

Conclusiones

 

            En esta ocasión no nos fue tan complicada la realización del trabajo, solo que se nos presentaron igual número de inconvenientes que la tarea anterior, como lo son los errores de linking.   Pero lo mejor de todo fue que ya pudimos detectar cuales son esos errores que son propios del compilador: el compilar en la unidad z, hacer un nuevo proyecto jalando archivos que están en otra carpeta, o hacer llamado a un método que aún que está en las líneas de abajo aunque esté bien implementado, sabemos  que este último error es algo difícil de encontrar pues en java estábamos acostumbrados a implementar los métodos en cualquier parte del código sin que esto afectara a la hora de ejecución.

            Sabemos que con esta tarea se nos facilita el uso de mapas, pues en el libro solo vienen ejemplos con números y eso no es del todo claro a la hora de trabajar con objetos; ahora sí podemos decir que podemos usar mapas con objetos para cualquier tipo de aplicación.

 Luego de analizar nuestra documentación anterior, descubrimos huecos en el programa que no habíamos contemplado, lo que nos ayudó a aclarar la estructura que el software debía tener. Redefinimos los métodos mediante una modulación mejor planeada: implementamos métodos para agregar los renglones y eso aclaró la idea que teníamos del programa.    Esperamos generar código eficiente y fácil de leer, con especificaciones mejor elaboradas y con un profundo sentido de la simplicidad.

 

 

 

Bibliografía

 

-         Deitel Harvey M., Deitel Paul J. Como programar en C++. Segunda Edición. Pearson Educación, México, 2003. *