You are on page 1of 20

INFORMTICA II INGENIERIA ELCTRICA

TP N1
Listas Enlazadas

Alumnos: Nicols Stroili, Facundo Mario y Fernando Lambri.


Profesores: Laura Angelone y Alfonso Pons.
Comisin: 560
Ao: 2013

ndice de contenido
1) Consigna del trabajo prctico: .................................................................................................................. 2
2) Datos, metodologa y resultados. ............................................................................................................. 4
3) Programa codificado en lenguaje C.......................................................................................................... 7
4) Salidas en pantalla del programa. ......................................................................................................... 14
5) Ideas adicionales: ..................................................................................................................................... 18

Stroili-Mario-Lambri

Informtica II

Pgina 1

1) Consigna del trabajo prctico:


Introduccin
Proxy/Cach
En que consiste el servicio Proxy/Cache?
Consiste, bsicamente, en almacenar los objetos de Internet solicitados por clientes web, a travs de
protocolos como HTTP y FTP, en un sistema ms cercano al cliente (el servidor proxy/cache), de forma
que posteriores peticiones de los mismos objetos puedan ser atendidas directamente por este servidor,
sin necesidad de traerlo en ese instante desde su origen en Internet, reduciendo el tiempo necesario
para cargar la informacin y aumentando la velocidad de cargas de pginas y transferencias de ficheros.
Otra utilidad es la obtencin de informacin para estadsticas de acceso a sitios y de seguridad.
Cmo funciona?
La idea de su funcionamiento es la siguiente:
Quien va a buscar las pginas pedidas no es el cliente -el navegador- sino el propio servidor
proxy/cach. Esto le da la posibilidad de mantener una cach (copia) de las pginas ms consultadas
ltimamente. Por tanto, la segunda vez que el mismo u otro cliente o navegador le pida alguna de estas
pginas, ya la tendr almacenada y no necesitar conectarse con el nodo remoto; la suministrar l
mismo. El incremento de velocidad en la transferencia es importante.
Por qu se usa y que ventajas tiene?
Al acceder a la WWW a travs de una cach se obtiene un acceso ms rpido a los documentos en un
gran porcentaje de los accesos. Una cach puede llega a dar porcentajes de acierto cercanos e incluso
superiores al 50%. El porcentaje de aciertos viene dado por el nmero total de documentos que la cach
puede servir sin realizar consultas al original frente al nmero total de accesos.

Situacin problemtica:
Se desea crear un programa que almacene informacin de los sitios visitados por los clientes de una
empresa. Los datos que se registran de cada sitio son:

Direccin IP: 4 enteros comprendidos entre 0 y 255 c/u de ellos.


URL: String de 128 caracteres
Visitas: Cuenta las veces que fue visitada la URL
Fecha: Fecha en que se registr el ltimo acceso (Tres enteros: ao, mes y da)
Cada vez que se visite un sitio, el mismo ser puesto en cola en la tabla del Proxy, en caso de no existir,
pero si el sitio ya fue dado de alta, se debe incrementar el contador de visitas de dicho sitio y actualizar
la fecha. Luego reordenar la tabla en orden decreciente por cantidad de visitas y decreciente por fechas.
Cada vez que se desee dar de baja un sitio, se debe eliminar el sitio ms antiguo y menos visitado (el
ltimo).

Stroili-Mario-Lambri

Informtica II

Pgina 2

Mostrar un men con las siguientes opciones:


1- Mostrar
2- Simular
3- Borrar
4- Nuevo
5- Salir
Al iniciar el programa se debe crear una lista y cargar en ella los datos del archivo DATOS.TXT
1- Mostrar: debe mostrar por pantalla los datos de la lista
2- Simular: debe simular la visita de sitios web. Para ello tomar los datos del archivo PRUEBA.TXT.
3- Borrar: Elimina el sitio menos visitado y ms antiguo.
4- Nuevo. Debe solicitar una IP ( Nueva ) y todos los datos para agregarla a la lista.
5- Salir: Guarda la lista en un nuevo archivo (NUEVO.TXT).

Stroili-Mario-Lambri

Informtica II

Pgina 3

2) Datos, metodologa y resultados.


Datos:

Un archivo (datos.txt) que contiene el n de IP, URL, cantidad de visitas y la fecha de paginas
web que se cargaran en la lista enlazada para su posterior muestra, ordenamiento y
almacenamiento en un archivo de salida nuevo.txt.

Un archivo (prueba.txt) que contiene el n de IP, URL y fecha de pginas web que se utilizaran
para simular la visita de sitios.
La forma de ingreso de nodos a la lista: una lista tipo cola (FIFO:First-In-First-Out).
La forma de ordenamiento de la lista, un ordenamiento compuesto, primero por visitas en
decreciente y a partir de all ordenar en forma decreciente por el campo fecha.

Metodologa:
Siguiendo la consigna del trabajo practico, se pens al programa creado mediante un diagrama de
bloques, para idealizar el flujo de la informacin que maneja el programa.
Utilizamos diferentes funciones para realizar cada una de las opciones del men:

char men (): Muestra el men con las opciones disponibles y se le pide al usuario que ingrese
una opcin valida. Esta funcin devuelve la opcin al main.
nodo *carga (nodo*p): Con los datos que se encuentran en el archivo datos.txt, esta funcin
carga la lista aadiendo los nodos al principio de la lista. Devuelve al main, el puntero al inicio de
la lista cargada.
nodo *ordena (nodo*p): Esta funcin recibe como parmetro el puntero al inicio de la lista
cargada y la ordena: primero por visitas en forma decreciente y si las visitas son iguales, ordena
en forma decreciente por fecha. Devuelve al main el puntero al inicio de la lista ordenada.
void mostrar (nodo*p): Recibe como parmetro el puntero al inicio de la lista ordenada y la
muestra en pantalla.
void simula (nodo*p): Recibe como parmetro el puntero al inicio de la lista cargada y con los
datos que se encuentran en el archivo prueba.txt. Mientras no se encuentre el EOF de prueba.txt,
lee los datos de cada lnea y compara por el campo IP. Cuando una IP leda sea igual a una IP
presente en la lista, incrementa las visitas y actualiza la fecha de ese nodo.
nodo *new1 (nodo*p): Recibe como parmetro el puntero al inicio de la lista cargada. Pide al
usuario que ingrese por teclado los campos: IP, URL y fecha del nuevo sitio visitado. Devuelve al
main el puntero al inicio de la lista con el nuevo nodo aadido al final de la misma.
nodo *borra (nodo*p): Recibe como parmetro el puntero al inicio de la lista ordenada y
elimina el ultimo nodo (el mas antiguo y menos visitado). Devuelve al main un puntero al inicio
de la lista actualizada.
void guardar (nodo*p): Luego de las modificaciones realizadas a la lista, recibe como
parmetro el puntero al inicio de la misma y creando un archivo nuevo.txt, guarda la lista
ordenada y actualizada en este.

El siguiente diagrama de bloques indica la relacin entre programa principal, men y funciones,
marcando el tipo de dato y la variable con la cual se invoca a la funcin.

Stroili-Mario-Lambri

Informtica II

Pgina 4

Stroili-Mario-Lambri

Informtica II

Pgina 5

Resultados:

Opcin 1: salida en pantalla de la lista cargada y ordenada.


Opcin 2: salida en pantalla de la lista actualizada por visitas y fecha, y ordenada.
Opcin 3: actualizacin de la lista, borrando el sitio ms antiguo y menos visitado.
Opcin 4: actualizacin de la lista, aadiendo un nuevo sitio cuyos datos se ingresan por
teclado.
Opcin 5: creacin de un nuevo archivo llamado nuevo.txt, con la lista ordenada y actualizada.

Stroili-Mario-Lambri

Informtica II

Pgina 6

3) Programa codificado en lenguaje C


El siguiente algoritmo codificado en C, se realizo ntegramente en Windows 7, utilizando el software
Code-Blocks v12.11.

#include<stdio.h>
#include<stdlib.h>
typedef struct {
int a,m,d;
}fecha;
typedef struct sitio {
int ip[4];
char url[128];
int visitas;
fecha f;
struct sitio *sig;
}nodo;

//*Puntero al elemento siguiente de la lista*//

int main()
{
char menu(),opcion;
nodo *p=NULL; //p es el puntero de inicio de la lista, se crea la lista
void mostrar(nodo*p);
void simula(nodo*p);
void guardar(nodo*p);
nodo *ordena(nodo*p);
nodo *carga(nodo*p);
nodo *new1(nodo*p);
nodo *borra(nodo*p);
p=carga(p); //Carga la lista
opcion=menu();
while (opcion!='5')
{ switch (opcion) {
case ('1'): {p=ordena(p);
mostrar(p);};break;
case ('2'): {simula(p);};break;
case ('3'): {p=borra(p);};break;
case ('4'): {p=new1(p);
mostrar(p);};break;
}
guardar(p);
printf("Esperando respuesta...\n");
scanf("%c",&opcion);
}
printf("\n\nARCHIVO nuevo.txt CREADO!");
getch();
return(0);
} //Fin del programa principal
Stroili-Mario-Lambri

Informtica II

Pgina 7

//DECLARACION DE LAS FUNCIONES UTILIZADAS


char menu ()//OK
{
char opcion;
printf("*---------------------------------------------------------------------*\n");
printf("|-----------------SIMULADOR DE SERVIDOR PROXY/CACHE-------------------|\n");
printf("|---------------------------------------------------------------------|\n");
printf("|
F.C.E.I.A || U.N.R
|\n");
printf("|---------------------------------------------------------------------|\n");
printf("|
INFORMATICA II -- INGENIERIA ELECTRICA
|\n");
printf("|---------------------------------------------------------------------|\n");
printf("|---------------------------------------------------------------------|\n");
printf("*---------------------------------------------------------------------*\n\n\n");
printf("************************* Menu de opciones *************************\n\n");
printf("---->1-Mostrar\n");
printf("---->2-Simular\n");
printf("---->3-Borrar\n");
printf("---->4-Nuevo\n");
printf("---->5-Salir\n");
scanf("%c",&opcion);
return opcion;
}
//Declaracin de la funcin carga
nodo *carga(nodo*p)//OK
{ FILE *fp;
int fin;
nodo *nuevo,*t;
fp=fopen("datos.txt","r");
if(fp==NULL) {printf("No se puede acceder al archivo");}
else {while(!feof(fp))
{
nuevo=(nodo*)malloc(sizeof(nodo));
fscanf(fp,"%d %d %d %d %s %d %d %d %d",&nuevo->ip[0],&nuevo->ip[1],&nuevo>ip[2],&nuevo->ip[3],nuevo->url,&nuevo->visitas,&nuevo->f.a,&nuevo->f.m,&nuevo->f.d);
nuevo->sig=p;
p=nuevo;
}
}
fclose(fp);
return(p);
}

Stroili-Mario-Lambri

Informtica II

Pgina 8

//Declaracin de la funcin ordena


nodo *ordena (nodo*p) //OK
{
nodo *t, *d, *ant, *aux, *free,*nueva;
int may;
t=p;
if(t==NULL)
{
printf("La lista esta vacia");
return (p);
}
else
{nueva=NULL;
while(t!=NULL)
{t=p;
free=t;
may=t->visitas;
while(t->sig!=NULL) //El mtodo comienza por ordenar la lista por el campo "visitas"//
{ant=t;
t=t->sig;
if(may<=t->visitas)
{
if(may<t->visitas)
{free=t;
may=t->visitas;
aux=ant;
}
else //Si las visitas son iguales, ordena por fecha//
{if(free->f.a<=t->f.a)
{ if(free->f.a<t->f.a)
{free=t;
may=t->visitas;
aux=ant;
}
else //Si el ao es igual, ordena por mes//
{ if(free->f.m<=t->f.m)
{ if(free->f.m<t->f.m)
{ free=t;
may=t->visitas;
aux=ant;
}
else//Si el mes es igual, ordena por dia//
{ if(free->f.d<=t->f.d)
{ free=t;
may=t->visitas;
aux=ant;
}
}
}
}
}
}
Stroili-Mario-Lambri

Informtica II

Pgina 9

}
}
if(free==p) //Elimina el nodo a insertar en la nueva lista
{
p=p->sig;
}
else
{
aux->sig=free->sig;
}
if(nueva==NULL) //Inserta el nodo en la nueva lista
{
nueva=free;
}
else
{d=nueva;
while(d->sig!=NULL)
{
d=d->sig;
}
d->sig=free;
free->sig=NULL;
}
t=p;
}
}
p=nueva; //Reemplaza la lista por la lista nueva ordenada por ambos campos
return(p);
}
//Declaracin de la funcin mostrar
void mostrar(nodo *p) //OK
{
nodo *t;
int i=0;
printf("--------------------------IP|||URL|||VISITAS|||A/M/D--------------------------\n");
t=p;
while(t->sig!=NULL)
{
printf("%d.%d.%d.%d ||| %s ||| %d ||| %d/%d/%d\n",t->ip[0],t->ip[1],t->ip[2],t->ip[3],t->url,t>visitas,t->f.a,t->f.m,t->f.d);
t=t->sig;
i++;
}
printf("\n\nCantidad de registros: %d\n",i);
}

Stroili-Mario-Lambri

Informtica II

Pgina 10

//Declaracion de la funcion simular


void simula(nodo *p) //En esta funcin no pudimos hallar el error por el cual el programa queda tildado
{ nodo *t;
int ip[4];
FILE *fp1;
void mostrar(nodo*p);
nodo *ordena(nodo*p);
char url[128];
fecha f1;
t=p;
printf("********************Simulacion de visita de sitios web********************\n");
fp1=fopen("prueba.txt","r");
if (fp1==NULL){printf("Error al abrir el archivo");}
else {
while (!feof(fp1))
{
fscanf(fp1,"%d\t%d\t %d\t %d\t %s\t%d\t %d\t
%d\t",&ip[0],&ip[1],&ip[2],&ip[3],url,&f1.a,&f1.m,&f1.d);
while (t->sig!=NULL && t->ip[0]!=ip[0] || t->ip[1]!=ip[1] || t->ip[2]!=ip[2] || t->ip[3]!=ip[3])
{
t=t->sig;
}
if (t->ip[0]==ip[0] && t->ip[1]==ip[1] && t->ip[2]==ip[2] && t->ip[3]==ip[3]) //Se actualiza la lista
si las IP coinciden
{
t->visitas++;
t->f.a=f1.a;
t->f.m=f1.m;
t->f.d=f1.d;
}
}
p=ordena(p); //Devuelve la lista ordenada
}
fclose(fp1);
mostrar(p);//Muestra la lista ordenada y actualizada
return;
}
//Declaracion de la funcion new1
nodo *new1(nodo*p)//OK//
{
nodo *nuev,*t;
int i=0,ip[4];
nuev=(nodo*)malloc(sizeof(nodo));
printf("Ingrese la IP\n");
Stroili-Mario-Lambri

Informtica II

Pgina 11

for(i=0;i<4;i++)
{
printf("\nIP(%d):",i+1);
scanf("%d",&nuev->ip[i]);
}
printf("\nURL:");
scanf("%s",nuev->url);
nuev->visitas=1;
printf("\nAAAA de visita:");
scanf("%d",&nuev->f.a);
printf("\nMM de visita:");
scanf("%d",&nuev->f.m);
printf("\nDD de visita:");
scanf("%d",&nuev->f.d);
t=p;
while(t->sig!=NULL)
{
t=t->sig;
}
t->sig=nuev; //El nuevo nodo se inserta al final de la lista
nuev->sig=NULL;
return(p);
}
//Declaracion de la funcion borra
nodo *borra(nodo*p) //OK//
{
nodo *t,*ant;
ant=p;
t=p;
if(t==NULL)
{
return(p);
}
else
{
while(t->sig!=NULL) //Busca el ultimo nodo de la lista
{
ant=t;
t=t->sig;
}
ant->sig=NULL; //Borra el ultimo nodo
free(t); //Libera el espacio de memoria que ocupaba el ultimo nodo
p=ordena(p);
}
}

Stroili-Mario-Lambri

Informtica II

Pgina 12

//Declaracion de la funcion guardar


void guardar(nodo*p) //OK//
{
nodo *t;
t=p;
FILE *fp;
fp=fopen ("nuevo.txt", "w");
if(fp==NULL)
{
printf("No se puede acceder al archivo");
}
else {
while(t->sig!=NULL)
{
fprintf(fp,"%d.%d.%d.%d\t%s\t\t%d\t\t%d\t%d\t%d\n",t->ip[0],t->ip[1],t->ip[2],t->ip[3],t>url,t->visitas,t->f.a,t->f.m,t->f.d);
t=t->sig;
}
}
fclose(fp);
}
Observacin: La funcin de simulacin de visitas de sitios web, no funciona correctamente. No pudimos
encontrar el error que evita que se actualice la lista por visitas y fecha.

Stroili-Mario-Lambri

Informtica II

Pgina 13

4) Salidas en pantalla del programa.


Men + Cartel:

Opcin 1:

Stroili-Mario-Lambri

Informtica II

Pgina 14

Opcin 2: No realizamos captura de pantalla, porque el programa queda tildado.


Opcin 3:

Stroili-Mario-Lambri

Informtica II

Pgina 15

Opcin 4:

Stroili-Mario-Lambri

Informtica II

Pgina 16

Opcin 5:

Stroili-Mario-Lambri

Informtica II

Pgina 17

5) Ideas adicionales:
Durante la realizacin de este trabajo practico se plantearon diversas ideas para la metodologa de
ordenamiento, es decir, de la funcin nodo *ordena (nodo *p).
Una de estas ideas nos resulto interesante, pero no la utilizamos debido a que no logramos que
devuelva los resultados esperados, pero que seguramente corrigiendo algn error de programacin
puede ser interesante. La funcin ordena presente en el cdigo fuente del programa funciona de manera
correcta, devolviendo los resultados esperados, esto es solo una versin alternativa de dicha funcin.
Dejamos constancia de esto, adjuntando el cdigo de la funcin alternativa de ordenamiento, que se
puede ver aqu abajo:
Versin alternativa a la funcin nodo *ordena(nodo*p)
nodo *ordena2(nodo *p)
{
nodo *t, *d, *ant, *aux, *free,*nueva;
int may;
char fre[15],te[15];
t=p;
if(t==NULL)
{
printf("La lista esta vacia");
return (p);
}
else
{nueva=NULL;
while(t!=NULL)
{free=t;
may=t->visitas;
sprintf(fre,"%d%d%d",free->f.a,free->f.m,free->f.d); //Guarda en la cadena los tres enteros de la
fecha//*Ver al final
while(t->sig!=NULL) //El metodo comienza por ordenar la lista por el campo "visitas"//
{ant=t;
t=t->sig;
sprintf(te,"%d%d%d",t->f.a,t->f.m,t->f.d);
if(may<=t->visitas)
{
if(may<t->visitas)
{free=t;
may=t->visitas;
aux=ant;
}
else //Si las visitas son iguales, ordena por fecha//
{
if(strcmp(fre,te)<=0) //Es decir, si fre<te
{ if(strcmp(fre,te)<0)
{free=t;
may=t->visitas;
aux=ant;
strcpy(fre,te);
}
}
Stroili-Mario-Lambri

Informtica II

Pgina 18

}
}
}
if(free==p) //Elimina el nodo a insertar en la nueva lista
{
p=p->sig;
}
else
{
aux->sig=free->sig;
}
if(nueva==NULL) //Inserta el nodo en la nueva lista
{
nueva=free;
}
else
{d=nueva;
while(d->sig!=NULL)
{
d=d->sig;
}
d->sig=free;
free->sig=NULL;
}
t=p;
}
}
p=nueva; //Reemplaza la lista por la lista nueva ordenada por ambos campos
return(p);
}
Nota: la llamada a la funcin ordena2 es igual a la llamada de la funcin ordena usada en el programa
principal.
*Para mas informacin sobre la funcin sprintf presente en la biblioteca estndar stdio de ANSI C,
visitar el sitio http://c.conclase.net/librerias/?ansifun=sprintf

Stroili-Mario-Lambri

Informtica II

Pgina 19

You might also like