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

                    Universidad de Costa Rica

 

 

 

 

 

Escuela de Ciencias de la Computación e Informática

 

 

Diego Vargas Arce

A45510

 

Manuel Marín Mora

A33018

 

 

 

Programación II

Prof. Adolfo Di Mare

 

 

 

Tarea Programada #5

 

 

 

4 de octubre de 2005


Índice

 

Introducción. 3

Descripción del Problema. 4

Planteo. 4

Objetivos. 5

Requerimientos. 6

Abstracción. 7

Especificación de las Clases. 7

Operaciones y Métodos. 8

Eficiencia. 9

Especificación del Programa. 9

 

Implementación. 11

Modelo de la clase. 11

Invariante de la clase. 11

Compilador Usado. 12

¿Como Compilar?. 12

Guía de Uso del Programa. 13

Datos de Prueba del Programa. 14

Casos de prueba. 14

Bibliografía. 16

 

 

Introducción

La presente documentación forma parte de la Tarea Programada # 5 del curso de Programación II de la escuela de Ciencias de la Computación e Informática de la Universidad de Costa Rica, el cual es impartido por el profesor Adolfo Di Mare H.

Toda la implementación presentada en este documento, esta escrita en el lenguaje C++ estándar, y diseñado básicamente para funcionar en Aplicaciones de consola para plataformas que corren bajo win32 (win32 console aplication).

La información adicional como lo es: el código fuente, la documentación interna y la documentación con Doxygen se encuentran disponibles en la siguiente dirección:

http://www.costarricense.cr/pagina/ea45510

http://www.angelfire.com/hero2/3m19

En este sitio se encuentra disponible una documentación mas detallada, junto con enlaces de ayuda, y todo el código fuente de las clases utilizadas para la solución del problema.

 


Descripción del Problema

Planteo

Listas de listas de hileras

 

El objetivo de esta tarea programada es que usted use las clases de la biblioteca STL de C++. Su trabajo consisten en diseñar e implementar una clase completa, junto con sus datos de prueba.

 

Como programador máximo de la firma spamTico.com usted ha conseguido varios miles de archivos de texto que contienen, además de otras cosas, cientos de miles de direcciones de correo electrónico. Usted necesita escribir un programa para extraer todas esas direcciones, y decide implementarlo en C++.

 

Explique cuáles hileras de un archivo de texto son direcciones de correo electrónico. Recuerde que es válido usar el guión "-", el carácter de subrayado "_" y también el punto ".". Lo que distingue a las direcciones de correo electrónico es la letra de arrobas "@". Recuerde que los archivos de entrada pueden contener cualesquiera caracteres ASCII válidos, para cuya codificación se usa el rango numérico [0..127], aunque su programa debe permitir manejar archivos con letras en el rango superior [128..255].

 

Algunas direcciones válidas son las siguientes:

 
71572.341@compuserve.com
koenraad_lecot@ecci.ucr.ac.cr
atorres@ic-itcr.ac.cr
e913570@32am.wap.ucr
mike.patrick@tecapro.com
francisco-jose@mata.names

     

En su implementación, lea cada archivo renglón por renglón. Utilice una lista STL, de tipo list<>, para almacenar cada una de las direcciones que encuentre. Además, junto a cada dirección almacené una lista con todos los renglones en los que esa dirección aparece, de manera que sea posible producir un listado que muestre cada dirección junto con los renglones que muestran el contexto para esa dirección. Una parte de ese listado podría ser la siguiente:

 
koenraad_lecot@ecci.ucr.ac.cr
- Hola, te envío de nuevo mi dirección koenraad_lecot@ecci.ucr.ac.cr porque ya la habías pedido
- No hemos sabido si el señor Lecot, koenraad_lecot@ecci.ucr.ac.cr, ha comenzado su
- "Koenraad Lecot" <koenraad_lecot@ecci.ucr.ac.cr>
- )(/&%%&%$·%$&%(/=)/(/%/&...- koenraad_lecot@ecci.ucr.ac.cr ----99(()/(/&/&%/
atorres@ic-itcr.ac.cr
- atorres@ic-itcr.ac.cr
- No es posible encontrar al usuario "atorres@ic-itcr.ac.cr" en la base de datos
- atorres@ic-itcr.ac.cr
- atorres@ic-itcr.ac.cr

No hace falta que la lista de renglones de contexto aparezca ordenada, o sin duplicados. Haga la documentación de su programa, e incluya un diagrama en que explique cómo usa los objetos que requiere para hacer el programa.

 

También puede obtener el planteo del programa en la siguiente dirección:

 

http://www.di-mare.com/adolfo/cursos/2005-2/p2-ta-5.htm

 

Objetivos

El objetivo principal de esta tarea el la creación de un programa completo, el cual sea capaz de leer desde un archivo de texto y encuentre las direcciones de correo electrónico en el mismo, además debe de imprimir la dirección y los respectivos renglones del texto donde se hace referencia al mismo.

 

Además de:

·        Familiarizarse con la correcta creación de software según se establece en la ingeniería de software y el análisis de sistemas, en los cuales para alcanzar un resultado óptimo se sigue un orden de Análisis, Diseño y Programación.

·        Desarrollar habilidades específicas en torno al análisis y diseño de soluciones en el ámbito del DOO (Diseño Orientado a Objetos).

·        Aprender más a profundidad el empleo del lenguaje de programación C++, sintaxis, utilización de librerías y fomento de la reutilización de código.

·        Usar la biblioteca STL de C++

 

Requerimientos

El programa debe de recibir un archivo de texto y ser capaz de devolver las direcciones de correo electrónico que se encuentran en el mismo.  Para esto se requiere una PC que tenga instalado el Visual Studio 6.0 y tener un archivo llamado prueba.txt en el mismo directorio del proyecto.

 


Abstracción

 

Especificación de las Clases

Clase list_email:

La clase list_email posee una clase email y una clase intermedia buscador. Además de encargarse de la construcción, copia y destrucción de la lista. También hay que decir que esta clase contiene otros métodos para el manejo de la lista como lo son: el de agregar y encontrar el email, aparte de un control con iteradores para encontrar el mismo.

Clase email:

La clase email tiene como propósito crear elementos de tipo email (direcciones de correo electrónico), se encarga de la construcción, copia y destrucción de elementos de tipo email, además de operaciones de comparación necesarios para list_email.

Clase buscador:

La clase buscador tiene el fin de encontrar una dirección de correo electrónico en un String o archivo de texto, en base a esta búsqueda es que se crea el objeto de tipo email y se guarda en una lista de email para luego ser mostrada.

Clase director:

Es la clase encargada de hacer la llamada para iniciar el programa.

 

 

 

Operaciones y Métodos

Clase list_email:

  • list_email(): m_LLE(0) {} è Constructor de vector
  • list_email(const list_email& LO): m_LLE(0) {*this = LO;} è Constructor de copia
  • ~list_email() {} è Destructor
  • void agregar_email(const string& correo, const string& reglon) è Inserta un email en la lista
  • friend std::ostream& operator<<(std::ostream& COUT, const list_email& L)è Graba el valor de L en el flujo COUT
  • inline std::ostream& operator<<(std::ostream& COUT, const list_email& L)è Retorna un ostream con todos los correos y sus respectivos reglones
  • std::list<email>::iterator& miembro(const string& correo) è Devuelve la dirección en la que está "correo"

Clase email:

  • email() : m_LR(0) { m_email = ""; }è Constructor de vector
  • email(const email& LO): m_LR(0) {*this = LO;}è Constructor de copia
  • email(const string& correo, const string& reglon) è Constructor a partir de dos Strings
  • ~email() {}è Destructor
  • friend bool operator==( const email& E, const string& S ) è Operador = = (email, String)
  • friend bool operator==( const string& S,const email& E ) è Operador = = (String, email)
  • friend std::ostream& operator<<(std::ostream& COUT, const email& E)è Operador <<

 

 

 

 

Clase buscador:

 

  • buscador() {linea = "";} è Constructor
  • void analizar_derecho();  è Analiza el lado derecho de la arroba
  • void analizar_izquierdo()  è Analiza el lado izquierdo de la arroba
  • bool hayArroba()è Retorna true si encuentra una arroba en la hilera
  • void set_linea( const string& l) è Actualiza la linea que va a ser procesada
  • void set_derecho(const string& derecho) è  Actualiza el lado derecho de la arroba
  • void set_izquierdo(const string& izquierdo) è Actualiza el lado izquierda de la arroba          
  • string& get_linea() { return linea; }è Retorna la linea
  • string& get_izquierdo(){ return l_izquierdo; }è Retorna el lado izquierdo del arroba
  • string& get_derecho(){ return l_derecho; } è Retorna el lado derecho del arroba

 

Eficiencia

El programa obtiene una buena optima al encontrar y desplegar las direcciones de correo electrónico de una manera acertada y eficiente.

 

Especificación del Programa

Para los objetos de tipo email hay constructores y destructores,  además de los métodos ya antes mencionados y la definición de las variables string m_email que es por decirlo así una etiqueta que guarda una dirección de email,  en si el programa es capaz de recibir un texto y devolver una lista con los email que se encuentran en el mismo texto, si encuentra un email que ya esta, lo agrega en la lista de email del mismo, sino crea un nuevo email y su respectiva lista.

Arquitectura del programa

 

Diagrama de "#include's"

 

<list>

<string>

<iostream>

 

<iostream>

<climits>

<string>

 

 

<fstream>

<string>

<iostream>

 

<list>

<algorithm>

 

list_email.h

 

buscador.h

 

email.h

 

email.cpp

 

list_email.cpp

 

buscador.cpp

 

director.cpp

 

email.obj

 

list_email.obj

 

buscador.obj

 

director.obj

 

Tarea5.exe

 
 

 

 

 

 

 

 

 

 

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


Implementación

 

Modelo de la clase

 

Invariante de la clase

 

Clase email

 

Un objeto de tipo email consta de dos partes, un string (dirección de correo) y una lista de strings (reglones en los que aparece la dirección de correo), por lo tanto un si un objeto email tiene ya un correo, la lista de reglones debe tener al menos un reglón, en caso contrario habría un error. Además si en la posición del correo no aparece ningún correo, la lista de reglones debe estar vacía.

 

Es imprescindible, para que un objeto de tipo email este correcto que todas sus partes estén correctas, o sea, que el string sea en realidad un correo, y que en cada reglón de la lista aparezca ese mismo correo. Un correo es correcto si es un string con una arroba (@) entre dos hileras de letras o números (también son válidos “.” y “_”), cada una de estas hileras debe tener al menos un carácter de los ya mencionados. Un reglón es correcto si es un string que al menos contenga su respectivo correo, un reglón no tiene límite de longitud.

 

 

Clase list_email

 

Un objeto de tipo list_email consta de una lista de objetos de tipo email, por lo tanto basta con que todos los emails almacenados estén correctos para que el objeto list_email este correcto. Un objeto de tipo list_email no debe tener emails vacíos, o sea, todos los emails insertados en la lista deben tener su dirección de correo y al menos un reglón.

 

Compilador Usado

Para la resolución de la tarea se utilizo el compilador del Visual Studio C++ v.6 y Visual Studio C++ v.7 (Microsoft Visual Studio.NET 2003), el cual no debería de generar problemas a la hora de compilar ni de crear el ejecutable.

 

¿Como Compilar?

Si se cuenta con el archivo Tarea5.dsp, basta con darle doble clic a este, luego entre en “Build” (Alt-b) y escoja “Rebuild All” y enseguida presione Ctrl-F5.

 

Si no cuenta con el archivo Tarea5.dsp, entre en “File > New”, en la ventana New escoja “Projects > Win32 Console Aplication”, además digite el nombre y dirección que desea, presione OK. En la ventana Win32 Console Aplication escoja “An Empty Project” y presione Finish y en la siguiente ventana OK.

 

Teniendo listo el proyecto, se debe proceder a incluir todos los archivos C++ respectivos, en este caso son 6:

 

 

·        director.cpp

·        list_email.h

·        list_email.cpp

·        email.h

·        buscador.h

·        buscador.cpp

 

Para lograrlo, se accesa la opción “Project > Add to Project > Files”. Se guardan los respectivos archivos en el medio deseado para así asegurar su pertenencia al proyecto (Opción “File > Save all”). Luego se compila el código presionando F7 en el teclado o bajo el menú “Build > Build All”.

 

Nota:

Debe existir un archivo llamado prueba.txt (no importa lo que contenga) en el mismo directorio del proyecto.

 

Guía de Uso del Programa

 

Este programa no tiene una guía de uso específica ya que lo único hace es tomar un archivo y buscar en él direcciones de correo electrónico, las guarda en una lista junto a los reglones en los que este aparece y seguidamente las imprime en pantalla. El usuario lo único que debe hacer es asegurarse que el archivo que va a ser procesado se encuentre en el mismo directorio que el  proyecto, y que la función buscar( ) tenga como primer parámetro el nombre del archivo con su extensión. La función buscar ( ) se encuentra en la función main( ), que está en el archivo director.cpp. Resumiendo, si se quiere procesar al archivo aaaaa.bbb, usted lo debe copiar en el directorio del proyecto, y en la línea 38 del archivo director.cpp cambie “prueba.txt” por “aaaaa.bbb”, o bien renombre aaaaa.bbb como prueba.txt. Por defecto, el programa busca al archivo el archivo prueba.txt, y si lo encuentra lo procesará. 

 

 

 

Nota:

El programa no puede procesar cualquier tipo de archivos, se recomienda probar su funcionamiento con archivos con extensiones txt, cpp o h, cuyo funcionamiento ya se verificó satisfactoriamente. Se verificó un mal funcionamiento con archivos con extensiones exe, doc y jpeg.

 

Datos de Prueba del Programa

Casos de prueba

 

Los casos de prueba serán archivos con extensión txt, con diferentes textos que presenten hileras que cumplan las características de un correo electrónico. También se le dará  mucho énfasis a las arrobas (@), o sea, se insertarán varias arrobas que estén junto a caracteres no válidos (por un lado o ambos) en los correos. Y por último se verificarán los resultados al insertar direcciones de correo electrónico repetidas.

 

Datos de prueba

 

El dato único dato de prueba es el archivo prueba.txt, que está en .zip enviado al profesor.

 

  • El archivo prueba.txt tiene el siguiente contenido:

 

Para carlos@ucr.ac.cr de manuel@intel.com.cr carlos@h.ucr

diegova16@gmail.com gsethyhjgyhik''¡'

aaaaaaaaaaaaaaaaaaaaaa@ sds@efe

yyyyyy diegova16@hotmail.com xxxxxx

adf@ rfwef  @dfac

 

atorres@ic-itcr.ac.cr     @fgdgdf      rtgferyjjjjjjjjjjjjj

adolfo@dimare.com

yyyyyy diegova16@hotmail.com xxx @ xxx

zzzzz diegova16@hotmail.com xxxxxx

aaaaaaaaaaaaaaaaaaaaaa

 

acacac@dffveev

 

Hola, te envío de nuevo mi dirección koenraad_lecot@ecci.ucr.ac.cr porque ya la habías pedido

No hemos sabido si el señor Lecot, koenraad_lecot@ecci.ucr.ac.cr, ha comezado su

"Koenraad Lecot" < koenraad_lecot@ecci.ucr.ac.cr >

)(/&%%&%$•%$&%(/=)/(/%/&...- koenraad_lecot@ecci.ucr.ac.cr ----99(()/(/&/&%/

 

atorres@ic-itcr.ac.cr

 

dsfffffffffffffffffffffffffffffffffffffffffffff%&%6rivendel@yahoo.es, rtrtetge

 

  • Y la salida fue la siguiente que dio el programa fue la siguiente:

 

carlos@ucr.ac.cr

- Para carlos@ucr.ac.cr de manuel@intel.com.cr carlos@h.ucr

**************************************************

 

manuel@intel.com.cr

- Para carlos@ucr.ac.cr de manuel@intel.com.cr carlos@h.ucr

**************************************************

 

carlos@h.ucr

- Para carlos@ucr.ac.cr de manuel@intel.com.cr carlos@h.ucr

**************************************************

 

diegova16@gmail.com

- diegova16@gmail.com gsethyhjgyhik''í'

**************************************************

 

sds@efe

- aaaaaaaaaaaaaaaaaaaaaa@ sds@efe

**************************************************

 

diegova16@hotmail.com

- yyyyyy diegova16@hotmail.com xxxxxx

- yyyyyy diegova16@hotmail.com xxx @ xxx

- zzzzz diegova16@hotmail.com xxxxxx

**************************************************

 

atorres@ic-itcr.ac.cr

- atorres@ic-itcr.ac.cr     @fgdgdf      rtgferyjjjjjjjjjjjjj

**************************************************

 

adolfo@dimare.com

- adolfo@dimare.com

**************************************************

 

acacac@dffveev

- acacac@dffveev

**************************************************

 

koenraad_lecot@ecci.ucr.ac.cr

- Hola, te envÝo de nuevo mi direcci¾n koenraad_lecot@ecci.ucr.ac.cr porque ya l

a habÝas pedido

- No hemos sabido si el se±or Lecot, koenraad_lecot@ecci.ucr.ac.cr, ha comezado

su

- "Koenraad Lecot" < koenraad_lecot@ecci.ucr.ac.cr >

- )(/&%%&%$ò%$&%(/=)/(/%/&...- koenraad_lecot@ecci.ucr.ac.cr ----99(()/(/&/&%/

**************************************************

 

atorres@ic-itcr.ac.cr

- atorres@ic-itcr.ac.cr

**************************************************

 

6rivendel@yahoo.es

- dsfffffffffffffffffffffffffffffffffffffffffffff%&%6rivendel@yahoo.es, rtrtetge

 

Bibliografía

Deitel & Deitel, Como Programar en C++, Cuarta Edición, Persons Education, México 2003

Stroustrup, Bjarne. The C++ Programming Language”. Edición especial en ingles. Addison Wesley, 2005.

http://www.di-mare.com/adolfo/cursos/2005-2/p2-ta-5.htm