You are on page 1of 9

UNIVERSIDAD DE SANTIAGO DE CHILE

FACULTAD DE INGENIERÍA
DEPARTAMENTO DE INGENIERÍA EN INFORMÁTICA

LABORATORIO N°1 PARADIGMA IMPERATIVO-PROCEDURAL


PARADIGMAS DE PROGRAMACIÓN

PATRICIA MELO FUENZALIDA

Profesor: Victor Flores


Fecha Entrega: 14/09/2017

Santiago de Chile
2 - 2017
TABLA DE CONTENIDOS
CAPÍTULO 1: INTRODUCCIÓN 1
MARCO TEÓRICO 2
Paradigmas de Programación 2
Paradigma Imperativo-Procedural 2
OBJETIVOS 2
CAPÍTULO 2: ANÁLISIS DE LA SOLUCIÓN 3
Obtener Documentos 3
Crear Índice 3
Guardar Índice 3
Cargar Índice 3
Buscar frase 3
Mostrar resultados 3
Menú 4
CAPÍTULO 3: DESARROLLO DE LA SOLUCIÓN 4
LIBRERÍAS UTILIZADAS 4
ESTRUCTURAS CREADAS 4
FUNCIONES CREADAS 5
StopWords* loadStopWords(char* pathStopWordsFile, code *statusCode) 5
Index* createIndex(char* pathDocumentsFile, StopWords *sw, code* statusCode) 6
void saveIndex(Index *i, int *id, code *statusCode) 6
Index* loadIndex(int id, code *statusCode) 6
Ranking* query(Index *i, StopWords *sw, char* text, code *statusCode) 6
void displayResults(Ranking *r, int TopK, code *statusCode) 7
void menu(code statusCode) 7
CAPÍTULO 4: RESULTADOS 7
POSIBLES ERRORES 7
CAPÍTULO 5: CONCLUSIONES 7
CAPÍTULO 6: BIBLIOGRAFÍA 8

CAPÍTULO 1: INTRODUCCIÓN

En términos de la programación existe una amplia variedad de lenguajes, éstos a su


vez van enfocados principalmente a ciertos paradigmas de programación. Esta experiencia
tratará principalmente de cómo resolver un problema utilizando el paradigma Imperativo -
Procedural, para ello se utilizará el lenguaje de programación C.

1
La problemática consta de implementar un sistema de recuperación de información,
como lo es Google o Bing, pero de manera más simplificada. Para ello se solicita crear
funciones obligatorias, que representan los subproblemas a llevar, junto con una serie de
propuestas a implementar.

Dicho problema se verá representado como una búsqueda de documentos, en donde el


usuario ingresará una frase y como respuesta obtendrá una lista de documentos donde
aparezcan las palabras de la frase que ingresó. Por ende el objetivo general es lograr obtener
dichos documentos y entregarlos al usuario.

Para llevar a cabo la solución se hizo uso de ciertas herramientas, como el editor de
texto Sublime Text 2 y Google Drive como controlador de versiones.

A continuación se darán a conocer ciertos términos para entender mejor el desarrollo


de esta entrega, luego se plantean los objetivos específicos. Después se verá cómo se da
solución a la problemática, seguido de la conclusión y bibliografía.
/*
1.4.3 Alcances
*/

MARCO TEÓRICO

Paradigmas de Programación
Es un modelo para resolver problemas. Los lenguajes de programación
necesariamente utilizan uno o varios paradigmas.

Paradigma Imperativo-Procedural
Describe la programación como una secuencia de instrucciones que cambian el estado
de un programa. Estas instrucciones se leen en orden en que aparecen.

OBJETIVOS
Como anteriormente se mencionó el objetivo general consta de obtener los
documentos donde se encuentran las palabras que el usuario ingresó. Para lograr cumplir este
objetivo es necesario plantearse objetivos específicos, los cuales se presentan a continuación.

● Obtener Documentos.
● Crear Índice.
● Guardar Índice.
● Cargar Índice.

2
● Buscar frase.
● Mostrar resultados.
● Menú.

CAPÍTULO 2: ANÁLISIS DE LA SOLUCIÓN


En este capítulo se detalla la forma de llevar cada uno de los objetivos específicos
planteados en el capítulo anteror.

1. Obtener Documentos
Es necesario recibir un archivo donde se encuentren los documentos almacenados,
además de recibir otro archivo que incluya las StopWords las cuales serán palabras que no se
deben tomar en cuenta para la búsqueda de la frase ingresada por el usuario.

2. Crear Índice
Luego de recibir los documentos se debe crear un índice donde se obtenga por cada
palabra leída de los documentos (y que no se encuentren en el StopWords) una lista de
documentos con su ID donde aparezca dicha palabra.

3. Guardar Índice
Permite almacenar la información recolectada por el índice creado en un archivo de
texto, además debe autogenerar un ID del archivo e incluir la fecha y hora de cuando se
almacena esta información.

4. Cargar Índice
A partir de un archivo de texto ya creado donde se encuentre almacenado algún índice
se debe obtener dicho índice. Para ello es necesario primero obtener la ID del archivo y
verificar si es que éste existe.

5. Buscar frase
Se debe permitir al usuario ingresar una frase y que se busque a partir de ésta en el
índice cargado todos los documentos encontrados por palabra y ordenarlos de mayor a menor
incidencia, utilizando un ranking.

6. Mostrar resultados
Luego de obtener los documentos encontrados y las palabras ordenadas se debe
mostrar al usuario dichos resultados.

3
7. Menú
Se debe permitir al usuario elegir la opción que desea ejecutar.

CAPÍTULO 3: DESARROLLO DE LA SOLUCIÓN

Dada la problemática mencionada en el capítulo 1 se presentarán a continuación cómo


se fue desarrollando paso a paso la solución a esta.

Primero se crearon dos archivos, uno con extensión .c y otro con extensión .h, el
primero correspondiente a las funciones del programa y el segundo a las cabeceras,
estructuras y librerías importadas. A continuación se presentarán de manera más específica
lo recientemente mencionado.

LIBRERÍAS UTILIZADAS
Cada una de las librerías que se presentan otorgan funciones que fueron utilizadas en
el proyecto, tales como malloc, strcpy, time_t, etc.

● stdio.h
● stdlib.h
● string.h
● time.h

ESTRUCTURAS CREADAS
Las estructuras que se mencionan a continuación son parte fundamental para obtener
la solución a la problemática, y serán utilizadas en la mayoría de las funciones que resuelven
los objetivos específicos.

● Documento, se compone por:


- int id, la ID del documento.
- char autor[TAM_LINEA], donde se almacena el autor del documento.
- char titulo[TAM_LINEA], donde se almacena el título del documento.
- char bibliografia[TAM_LINEA], donde se almacena la bibliografía del
documento.
- int contador, la cantidad de veces que aparece la palabra en ese documento.

4
- struct Documento *sgte, un puntero a otro documento.

● Index, se compone por:


- char palabra[TAM_PALABRA], donde se almacena la palabra del
documento.
- Documento *lista_docs, contiene una lista de documentos donde aparece la
palabra.
- int contador, corresponde al largo del arreglo del indice

● StopWords, se compone por:


- char *stopW, donde se almacena una palabra del StopWords.
- int contador, indica cuantas StopWords hay.

● Ranking, se compone por:


- char palabra[TAM_PALABRA], guarda la palabra encontrada en los
documentos.
- int valorFinal, almacena el valor final de la palabra dado por el ranking.
- int apariciones, son las veces que el usuario ingresó la palabra en la frase.
- int contadorFinal, cantidad total de veces que la palabra apareció en los
documentos.
- int docTotal, total de documentos donde aparece la palabra.
- Documento *lista_docs, lista de documentos donde aparece la palabra.

● Result, se compone por:


- char palabra[TAM_PALABRA], almacena la palabra encontrada.
- int valorRanking, contiene el valor de la palabra dado por el ranking.
- int *topKDocs, contiene los topK documentos de la palabra.

FUNCIONES CREADAS
Para lograr cumplir cada uno de los objetivos específicos, y a su vez el general, se
utilizaron las funciones que se encuentran a continuación.

StopWords* loadStopWords(char* pathStopWordsFile, code *statusCode)


Se encarga de leer y almacenar las StopWords a partir de un archivo de texto
entregados por el usuario ubicado en pathStopWordsFile. Por ende recibe el nombre del
archivo y el statusCode, y retorna un arreglo de StopWords, donde en cada posición de este
arreglo se encuentra un StopWords.
En el proceso de esta función primero se abre el archivo de las StopWords, cuenta
cuantas palabras contiene en su interior y luego con un for va almacenando en cada posición
una StopWords, luego cierra el archivo y retorna.

5
Index* createIndex(char* pathDocumentsFile, StopWords *sw, code* statusCode)
Crea un índice a partir de un archivo de texto entregado por el usuario, el cual
contiene todos los documentos, este es ubicado en pathDocumentsFile. Esta función recibe
como parámetros el archivo, el arreglo de las StopWords y el statusCode, retorna un arreglo
de Index, donde en cada posición se encuentra la palabra indexada con su lista de documentos
y el largo del arreglo.
En el procedimiento primero abre el archivo contenedor de los documentos, luego
obtiene la cantidad de palabras del archivo y crea un arreglo de Index del tamaño de cantidad
de palabras. Luego lee el archivo y va viendo en qué parte del texto se encuentra, es decir,
índice, título, autor, bibliografía o texto del documento. Con estos datos procede a almacenar
correspondientemente en el interior del índice las palabras y la lista de documentos. Para
crear la lista de documentos se utiliza una lista enlazada. Finalmente cierra el archivo.

void saveIndex(Index *i, int *id, code *statusCode)


Es quien almacena la información recolectada por el createIndex o loadIndex, donde a
partir de los datos que tiene los guarda en un archivo de texto que crea. Como nombre de
archivo es la ID que le asigna y en su interior guarda en el siguiente orden los datos: primera
línea la ID del índice, segunda línea la fecha y hora que se guarda el archivo, y el resto de las
líneas incluye la palabra, con su lista de documentos y la cantidad de veces que aparece en
cada uno, separado por un .- para diferenciar cuando inicia la siguiente palabra. Recibe un
índice, la ID del índice y el statusCode.
El procedimiento de esta función cuenta con crear un nuevo archivo, obtener la fecha
y hora del momento e imprimir en este archivo los datos mencionados con anterioridad.

Index* loadIndex(int id, code *statusCode)


Permite recibir una ID dada por el usuario que corresponde a la ID de un índice, y
retornarlo como un nuevo arreglo de índice, en caso de no encontrar dicha ID se retorna nulo.
Recibe como parámetros la ID ingresada y el statusCode.
En esta función su procedimiento es el siguiente, cuenta las líneas del archivo leído y
crea con un for un nuevo índice, obtiene los datos principalmente desde que aparece la
primera palabra, y va guardando en cada posición del índice la palabra con su lista de
documento y las veces que aparece en cada uno de ellos. Luego cierra el archivo y retorna.

Ranking* query(Index *i, StopWords *sw, char* text, code *statusCode)


Permite que el usuario consulte por una frase, para luego ver por cada palabra si se
encuentra en el índice, a partir de esto genera una arreglo con los resultados, luego los ordena
de mayor a menor incidencia dependiendo del valor que le asigne el ranking. Recibe el
índice en donde evaluar, el arreglo de StopWords para ver que la frase no contenga palabras
de ese arreglo, y si las tiene no incluirlas en los resultados, la frase ingresada por el usuario y
el statusCode.
El procedimiento de ésta consta en crear un arreglo del texto ingresado por el usuario,
separando la frase palabra por palabra y almacenando la en este arreglo, luego crea un arreglo
de tipo Ranking. Después recorre el arreglo del texto y ve si se encuentra la palabra en

6
StopWords e índice, si encuentra coincidencia con el último la agrega al arreglo ranking junto
con sus otros datos (lista documentos, cantidad total que se encuentra en esa lista, veces que
el usuario ingresó la palabra y total documentos encontrados). Luego calcula el valor final
que queda en el ranking y lo agrega. Finalmente ordena por ranking el arreglo y lo retorna.

void displayResults(Ranking *r, int TopK, code *statusCode)


Permite mostrar los resultados obtenidos por la consulta, dando la opción de elegir los
TopK documentos a mostrar. Recibe el arreglo ranking, el número de documentos a mostrar
y el statusCode. Como procedimiento crea un nuevo arreglo de tipo Result, de tamaño total
palabras encontradas, en este arreglo va guardando la palabra, su valor de ranking y un nuevo
arreglo con los TopK documentos, luego los muestra por pantalla.

void menu(code statusCode)


Permite probar cada una de las funciones mencionadas anteriormente. Esta función es
llamada en el main.

CAPÍTULO 4: RESULTADOS
El resultado final de esta entrega corresponde al buscador de documentos creado en
lenguaje de programación C, con paradigma Imperativo-Procedural. El código fuente del
buscador (llamado “ELGOOG”) puede ser compilado para su ejecución tanto en Windows
como en Linux, debido a que el código cuenta con las normas del ANSI C.
Al ejecutar el programa se muestra por pantalla el menú con las opciones a elegir.
Con respecto a los requerimientos extras, no fueron implementados debido a la falta
de tiempo, ni algunos requerimientos funcionales por el mismo motivo .

POSIBLES ERRORES
En el desarrollo del programa, se tiene contemplado varios posibles errores, los cuales
fueron evitados con verificaciones, pero eso no evita que quizás se pase más de alguna
verificación. Por ejemplo si se ingresa un archivo, y este no existe, se le da a saber al
usuario.

CAPÍTULO 5: CONCLUSIONES
Para lograr obtener el buscador ELGOOG fueron muchas horas de arduo trabajo,
donde se tuvo que analizar el problema y luego programar. Debido a un mal análisis en un
inicio se perdió tiempo valioso, ya que se tuvo que partir desde cero luego de darse cuenta de
este mal análisis.

7
Sin embargo, después de corregir lo anterior se logró avanzar con mucha más rapidez
y se alcanzó a cumplir con todos los pedidos obligatorios.
Los conocimientos vistos en cátedra fueron utilizados en esta experiencia, como por
ejemplo el paso por referencia. Además se logró cumplir con los objetivos propuestos en un
inicio.
En futuras entregas se debe realizar el mismo proyecto, con la diferencia de que los
lenguajes a utilizar ocupan otros paradigmas.

CAPÍTULO 6: BIBLIOGRAFÍA
- Qué es un índice invertido
http://copro.com.ar/Indice_invertido.html

- Sentencia switch
http://blog.espol.edu.ec/programando/sentencia-switch-lenguaje-c/

- Leer lineas de texto del teclado


https://batchdrake.wordpress.com/2008/03/03/como-leer-lineas-de-texto-del-teclado-en-c/

- Obtener fecha y hora actual


http://www.holamundo.es/lenguaje/c/articulos/fecha-hora-c.html

- Proyecto semestral de laboratorio (versión preliminar). Paradigmas de Programación.


Departamento de Ingeniería Informática. Universidad de Santiago de Chile (2-2017)
https://docs.google.com/document/d/1Fo3-
xcdk7BBd55uzeujcqeyY3LfAHy3RYRJPvhVyyIE/edit

You might also like