Practica resuelta de 2006-2007
2 participantes
Página 1 de 1.
Practica resuelta de 2006-2007
Enunciado:
- Código:
Programación II. I.T. Informática de Gestión y Sistemas
Enunciado de la práctica
Curso 2006–07
1. El problema
El sistema informático de la escuela almacena diversos registros sobre sus usuarios y actividad. Así por
ejemplo jair dispone de un fichero /var/log/messages con información, entre otras cosas, sobre las descagas
realizadas del servidor ftp.lab.fi.uva.es.
Cada línea del fichero que se refiere a una descarga tiene un aspecto como el siguiente1:
Feb 6 12:13:08 jair pure-ftpd: (ftp@l118h1.lab.fi.uva.es) [NOTICE]
/home/ftp//pub/priii/ejemplos_gtk/hola/loadpath.se downloaded
(527 bytes, 8732.42KB/sec)
La dirección de la escuela desea analizar el servicio que proporciona el servidor ftp.
1.1. Fase1
Elaborar un conjunto de clases que modelen la información disponible sobre los accesos al servicio ftp.
Entre estas clases deberán estar obligatoriamente:
DESCARGA Con información sobre el momento en que se realizó la descarga, el usuario que la realizó y
el fichero descargado
USUARIO Con información sobre la máquina origen de una descarga (l118h1.lab.fi.uva.es en el
ejemplo), el login usado (ftp en el ejemplo) y todas las descargas que ha realizado
FICHERO Con información sobre el nombre del fichero (loadpath.se en el ejemplo) su localización en
el disco (/pub/priii/ejemplos_gtk/hola en el ejemplo) su tamaño y los usuarios que lo han descargado.
LOG Modela un fichero log. Dispone al menos de una lista de descargas, una de usuarios y otra de
ficheros.
1.2. Fase2
Elaborar una aplicación elemental de análisis de los datos del servidor. La aplicación recibirá como argumentos
el nombre del fichero log a analizar y un usuario con el formato <usuario>@<direccion>, devolviendo
por pantalla una salida como la siguiente:
Resumen de la actividad del usuario <usuario>@<direccion>:
<fichero> <tamaño>
<fichero> <tamaño>
....
Total: <m> bytes en <n> descargas.
La clase lanzadora de esta aplicación debe llamarse FASE2.
1Pero en una sola línea, claro
Universidad de Valladolid. Dpto. de Informática. Edificio de Tecnologías de la Información y las Telecomunicaciones,
Campus Miguel Delibes. 47011 Valladolid. Tfno. 983.423000 ext.5617/Fax 983.423671.
www.infor.uva.es/˜felix e-mail:felix@infor.uva.es
1.3. Fase3
Elaborar una aplicación de gestión de los datos del servidor que proporcione información más completa
que en la fase anterior. La ayuda de esta aplicación, que funcionará mediante opciones de la línea de
comandos, debe ser como la siguiente:
--help Muestra esta ayuda
--log <fichero> Hace el análisis sobre el fichero
indicado en lugar de sobre
/var/log/messages
--resumen Información de resumen, con total de
usuarios, descargas y ficheros
descargados, además de información sobre
todos los usuarios que han realizado el
máximo de descargas e información sobre
todos los ficheros que han sido
descargados el máximo número de veces.
--usuario <usuario>@direccion> Información sobre las descargas
realizadas por este usuario, con total de
descargas y bytes descargados
--fichero <fichero> Información sobre los usuarios que han
descargado este fichero, con total de
descargas realizadas sobre el mismo
La clase lanzadora de esta aplicación debe llamarse FASE3.
2. Condiciones de entrega y calificación de la práctica
Para la entrega de la práctica el código fuente será almacenado en el directorio $HOME/prii0607gestion1
$HOME/prii0607gestion2 $HOME/prii0607gestion3 $HOME/prii0607sistemas1, en función del grupo al
que se pertenezca, dentro de jair. Las clases lanzadoras a que se hace referencia en el enunciado debe
ser almacenada en ficheros fase2.e y fase3.e respectivamente. El sistema recogerá todos los ficheros con
extensión .e en este directorio, pero no ficheros con otras extensiones o almacenados en subdirectorios del
mismo.
Las prácticas que no se ajusten estrictamente2 a estas condiciones de entrega serán consideradas como
no presentadas.
Las puntuaciones máximas de cada una de las fases de la práctica son:
Fase1 + Fase2: 0,75 puntos
Fase3: 0,25 puntos
3. Fechas límite de entrega
La práctica será recogida el día del examen de la asignatura a partir de las ocho de la tarde.
4. La práctica en la convocatoria extraordinaria
Esta práctica es válida para la convocatoria extraordinaria, en las mismas condiciones y con límite de
entrega en el día del examen extraordinario de la asignatura. Si en esta convocatoria no se entrega una
nueva práctica, la nota considerada será la obtenida en la convocatoria ordinaria.
2Atención a las mayúsculas y minúsculas y nombres de directorios y ficheros
5. Preguntas frecuentes sobre el enunciado
Al leer un fichero me pasan «cosas raras» Antes de nada debieras revisar el bucle de lectura de fichero.
En SmartEiffel, como en muchos otros lenguajes, el final de fichero sólo es detectado después de una
lectura, de modo que el esquema general para leer un fichero expresado en seudocódigo tiene un
aspecto como el siguiente:
leer dato
mientras no final de fichero hacer
procesar dato
leer dato
fin_mientras
¿Todas las líneas que tienen «pure-ftpd:» como 5a palabra correspoden a una descarga? No, el servidor
genera muchos otros mensajes
¿Y si además tienen «[NOTICE]» como 7a palabra? Pues tampoco, el servidor genera mensajes de otro
tipo en esta categoría.
¿Qué líneas representan descargas del servidor? Las que tienen el
formato indicado en este enunciado.
¿El nombre de un usuario es su nombre en jair? No, el nombre de un usuario siempre tiene la forma
<usuario>@<maquina>, esa es la única información que almacena el servidor.
¿Todos los directorios de ficheros descargados empiezan por /home/ftp? No, en los ejemplos queda
claro que quitamos ese prefijo.
¿Cómo puedo leer en eiffel argumentos de la línea de comandos? Echa un vistazo a print_arguments.e
dentro del directorio tutorial de la distribución de SmartEiffel.
¿Es muy lento mi programa? Probablemente, pero para evaluar la velocidad del ejecutable hay que
tener en cuenta los parámetros de compilación utilizados.
SmartEiffel utiliza por defecto el parámetro −all_check lo que provoca un ejecutable lento que incorpora
todos los contratos y es ideal para las tareas de depuración. El parámetro −boost por el contrario
hace que el ejecutable carezca de contratos, pero incorpore diversas optimizaciones al código, lo que
lo hace mucho mas rápido.
En general los sistemas UNIX realizan mediciones del tiempo consumido por un programa mediante el
comando time «programa»
De todas formas si estás haciendo pruebas, quizás prefieras trabajar con contratos sobre una versión
«más reducida» del fichero a analizar.
Universidad
djcloud- Amo del foro
- Cantidad de envíos : 389
Edad : 39
Fecha de inscripción : 11/10/2007
Re: Practica resuelta de 2006-2007
Solucion:
Clase fase2:
Clase Utilidades
clase descarga
clase fichero
Clase fase2:
- Código:
indexing
description:"Clase lanzadora del programa fase2. Ene l con un nombre de log y un nombre de usuarios pasados como argumento genera un resumen de las descargas de los usuarios que haya en el log."
class FASE2
creation make
feature {ANY}
make is
--Metodo principal de la aplicacion
local
util:UTILIDADES--variable de utilidades para usar sus metodos
l:LOG--Log en el que se vuelcan los datos leidos del fichero
log_maquina:ARRAY[STRING]--Array para almacenar el nombr ey la maquina del usuario del que se va a hacer resumen
do
!! util
if argument_count<2 then --Si no se pasan los argumentos apropiados se informa de ello
std_output.put_string("El uso de este programa es para recibir un resumen adecuado. Por favor rellene todos los datos%N")
else-- se comprueba en que orden se han pasado los parametros, se recogen los datos del archivo log y se imprime el resumen del usuario pedido
if util.es_usuario_correcto(argument(1))then
l:=util.procesar_log(argument(2))
log_maquina:=util.separar_login_y_maquina(argument(1))
util.mostrar_resumen_usuario(l,log_maquina@1,log_maquina@2)
elseif util.es_usuario_correcto(argument(2)) then
l:=util.procesar_log(argument(1))
log_maquina:=util.separar_login_y_maquina(argument(2))
util.mostrar_resumen_usuario(l,log_maquina@1,log_maquina@2)
else
std_output.put_string("El usuario debe ser @. %N")
end
end
end
end
Clase Utilidades
- Código:
indexing
description:"Clase con metodos utiles. Estos metodos se usan comunmente en fase2 y fase3 y en otras clases, por lo que hago esta clase para no repetirlos. No tiene ningun atributo, solo metodos utiles"
class UTILIDADES
feature {ANY}
es_descarga(linea:STRING):BOOLEAN is
--Devuelve true si la linea pasada por parametro coindice con el patron de descarga
local
trozos:ARRAY[STRING]
do
trozos:=linea.split
if equal (trozos.item(trozos.upper-3),"downloaded") then
Result:=true
end
end
es_usuario_correcto(bruto:STRING):BOOLEAN is
--Devuelve true si e argumento pasado responde al patrin de usuario (uno o mas caracteres seguidos de una @ y de uno o mas caracteres mas)
do
if bruto.count > 2 then
if bruto.first_index_of('@')>1 and bruto.first_index_of('@')
Result:=true
end
end
end
es_fichero_correcto(bruto:STRING):BOOLEAN is
--Devuelve true si el argumento pasado cumple el patron de una ruta completa de un fichero (al menos '/' y una letra)
do
if bruto.count > 2 then
if bruto.item(1)='/' and bruto.item(2)/='/' then
Result:=True
end
end
end
separar_nombre_y_path(bruto:STRING):ARRAY[STRING]is
--Separa el nombre de archivo y su ruta del argumento pasado. Devuelve el nombre en la posicion 1 del array y la ruta en la posicion 2
do
create Result.make (1,0)
Result.add_last(bruto.substring(bruto.reverse_index_of('/',bruto.upper)+1,bruto.upper))
bruto.remove_substring(bruto.reverse_index_of('/',bruto.upper),bruto.upper)
Result.add_last(bruto)
end
separar_login_y_maquina(bruto:STRING):ARRAY[STRING]is
--Separa el nombre de usuario y la maquina del argumento pasado. Devuelve el nombre en la posicion 1 del array y la maquina en la posicion 2
do
bruto.replace_all('@',' ')
Result:=bruto.split
end
procesar_log(archivo:STRING):LOG is
--Conecta al fichero cuyo nombre sea el pasado por argumento, y lo recorre liena por linea creando un Log con los datos obtenidos. Este Log es loq ue devuelve la funcion. Esta funcion puede dar un error de ejecucion si el archivo no existe en el sistema
local
f: TEXT_FILE_READ
l:LOG
do
create l.make
create f.connect_to(archivo)--Aqui puede haber un error de ejecucion
from
f.read_line
until
f.end_of_input
loop
if es_descarga(f.last_string) then l.anadir_nueva_descarga (f.last_string)
end
f.read_line
end
f.disconnect
Result:=l
end
mostrar_resumen_usuario(l:LOG;login,maquina:STRING)is
--Muestra por pantalla un resumen de las descargas realizadas por el usuario cuyo login y maquina sean los pasados por parametro dentro del log l. Muestra todos los focheros que ha descargado, y el total de sus descargas y el tamaño total de esas descagas
local
i,tamano_total:integer
descargas:array[DESCARGA]
u:USUARIO
do
u:=l.buscar_usuario(login,maquina)
if u = void then
std_output.put_string("El usuario "+ login + "@" + maquina+ " no tiene descargas%N")
else
std_output.put_string("Resumen de la actividad del usuario "+u.get_login+"@"+u.get_maquina+"%N")
std_output.put_string("_______________________________________%N")
descargas:=u.get_descargas
from
i:=descargas.lower
until
i>descargas.upper
loop
std_output.put_string(" "+descargas.item(i).get_fichero.get_path+"/"+descargas.item(i).get_fichero.get_nombre+" "+descargas.item(i).get_fichero.get_tamano.to_string+" bytes"+"%N")
tamano_total:=tamano_total+descargas.item(i).get_fichero.get_tamano
i:=i+1
end
std_output.put_string("Total: "+tamano_total.to_string+" bytes en "+descargas.count.to_string + " descargas%N")
end
end
mostrar_resumen_fichero(l:LOG;nombre,path:STRING)is
--Escribe en la consola un resumen del fichero que este en el log l cuyo nombre y ruta sean los pasados por parametros. Muestra los usuarios que han descargado ese fichero, y su numero total.
local
i:INTEGER
usuarios:ARRAY[USUARIO]
f:FICHERO
do
f:=l.buscar_fichero(nombre,path)
if f = void then
std_output.put_string("El fichero "+ path + "/" + nombre+ " no tiene descargas%N")
else
std_output.put_string("%NResumen de la actividad del fichero "+f.get_path+"/"+f.get_nombre+"%N")
std_output.put_string("Usuarios que lo han descargado:%N")
std_output.put_string("------------------------------------------------------------%N")
usuarios:=f.get_usuarios
from
i:=usuarios.lower
until
i>usuarios.upper
loop
std_output.put_string(" "+usuarios.item(i).get_login+"@"+usuarios.item(i).get_maquina+"%N")
i:=i+1
end
std_output.put_string("Total: "+usuarios.count.to_string + " descargas%N")
end
end
mostrar_resumen_totales(l:LOG)is
--Imprime un resumen de los datos que hay en el log l, pasado por parametro. Muestra el total de descargas, usuarios y ficheros, el usuario / usuarios que han realizado un mayor numero de decsragas. Y el fichero / ficheros que han sido descargados mas veces.
local
i:INTEGER
usuarios:ARRAY[USUARIO]--Variable para referenciar al array de usuarios de log
ficheros:ARRAY[FICHERO]--Array para referenciar al array de ficheros del log
maximo_usuarios:ARRAY[USUARIO]--Para almacenar los usuarios que tengan el maximo numero de descargas
maximo_ficheros:ARRAY[FICHERO]--Para gusrdar los ficheros que tienen el maximo numero de descargas
maximo:INTEGER--Maximo numero de descargas para ficheros o usuarios
do
std_output.put_string("%NResumen total del log%N__________________%N")
std_output.put_string("Numero total de descargas: " + l.get_descargas.count.to_string + "%N")
std_output.put_string("Numero total de usuarios: " + l.get_usuarios.count.to_string + "%N")
std_output.put_string("Numero total de ficheros: " + l.get_ficheros.count.to_string + "%N")
usuarios:=l.get_usuarios
from --Recorre el array de usuarios, añadiendo al array de maximo los usuarios con el numero de descargas mas alto encontrado hasta el momento
i:=usuarios.lower
create maximo_usuarios.make(1,0)
until
i>usuarios.upper
loop
if usuarios.item(i).get_descargas.count = maximo then
maximo_usuarios.add_last(usuarios.item(i))
elseif usuarios.item(i).get_descargas.count > maximo then
maximo:=usuarios.item(i).get_descargas.count
maximo_usuarios.clear
maximo_usuarios.add_last(usuarios.item(i))
end
i:=i+1
end
std_output.put_string("%NUsuarios con el maximo numero de descargas ("+ maximo.to_string +"):%N")
from --imprime los usuarios con el numero mas alto de descargas
i:=maximo_usuarios.lower
until
i>maximo_usuarios.upper
loop
std_output.put_string(" " + maximo_usuarios.item(i).get_login+"@"+ maximo_usuarios.item(i).get_maquina+"%N")
i:=i+1
end
ficheros:=l.get_ficheros
from --Recorre el array de ficheros almacenando en el array de maximos los ficheros que han sido descargados un mayor numero de veces
i:=ficheros.lower
create maximo_ficheros.make(1,0)
maximo:=0
until
i>ficheros.upper
loop
if ficheros.item(i).get_usuarios.count = maximo then
maximo_ficheros.add_last(ficheros.item(i))
elseif ficheros.item(i).get_usuarios.count > maximo then
maximo:=ficheros.item(i).get_usuarios.count
maximo_ficheros.clear
maximo_ficheros.add_last(ficheros.item(i))
end
i:=i+1
end
std_output.put_string("%NFicheros con el maximo numero de descargas ("+ maximo.to_string +"):%N")
from--imprime los ficheros con un mayor numero de descargas
i:=maximo_ficheros.lower
until
i>maximo_ficheros.upper
loop
std_output.put_string(" " + maximo_ficheros.item(i).get_path+"/"+ maximo_ficheros.item(i).get_nombre+"%N")
i:=i+1
end
end
end -- class UTILIDADES
clase descarga
- Código:
indexing
description:"Clase que modela una descarga, con una fecha de descarga, el usuario que la realizo y el fichero descargado"
class DESCARGA
creation do_nothing, nuevo_linea
feature {NONE}
user:USUARIO--usuario que realizo la descarga
fich:FICHERO--Fichero descargado
fecha : STRING --fecha en la que se realizo la descarga (hora dia y mes)
feature {ANY}
nuevo_linea (linea:STRING;l:LOG) is
--Crea un nuevo objeto descarga a partir de una linea donde esten todos los datos en el formato oportuno. Deja en el log pasado opr argumento las clases usuario, ficheor y descarga creadas a partir de los datos extraidos de la linea.
local
trozos:ARRAY[STRING]--array donde se guardan temporalmente los distintos campos de la linea
subs:ARRAY[STRING]--otro array para gusrdar el nombre y maquina de 1 usuario una vez separado y el nombre y ruta del fichero
ut:UTILIDADES--ubjeto de utilidades para usar algunos metodos como separar_login_y_maquina
do
create ut
trozos:=linea.split
trozos.item(6).remove_first(1)
trozos.item(6).remove_last(1)
subs:=ut.separar_login_y_maquina(trozos.item(6))
user:=l.buscar_usuario(subs@1,subs@2)
if user=void then--si no se ha encontrado el usuario, significa todavia no esta en el log y lo creamos
create user.nuevo(subs@1,subs@2)
l.anadir_usuario(user)
end
trozos.item(trozos.count-4).remove_first(trozos.item(trozos.count-4).first_substring_index("//"))
subs:=ut.separar_nombre_y_path(trozos.item(trozos.count-4))
trozos.item(trozos.count-2).remove_first(1)
fich:=l.buscar_fichero(subs@1, subs@2)
if fich = void then--si no ha encontrado el fichero lo creamos nuevo
create fich.nuevo(subs@1, subs@2, trozos.item(trozos.count-2).to_integer)
l.anadir_fichero(fich)
end
fecha:=trozos@3 +" "+ trozos@2 + " " + trozos@1
user.anadir_descarga(current)
fich.anadir_usuario(user)
l.anadir_descarga(current)
end
set_user (us:USUARIO) is
--Cambia el usuario por el pasado por parametro. Metodo de encapsulamiento
do
user:=us
end
set_fichero (f:FICHERO) is
--Cambia el fichero por el pasado por parametro. Metodo de encapsulamiento
do
fich:=f
end
set_fecha (fech:string) is
--Cambia la fecha por la pasada por parametro. Metodo de encapsulamiento
do
fecha:=fech
end
get_user : USUARIO is
--Devuelve el usuario que realizo la descarga. Metodo de encapsulamiento
do
Result:=user
end
get_fichero : FICHERO is
--Devuelve el fichero que de la descarga. Metodo de encapsulamiento
do
Result:=fich
end
get_fecha : string is
--Devuelve la fecha en la que se realizo la descarga. Metodo de encapsulamiento
do
Result:=fecha
end
end --class DESCARGA
clase fichero
- Código:
indexing
description:"Clase que modela un fichero (que se haya descargado mediante ftp)"
class FICHERO
creation do_nothing ,nuevo
feature {NONE}
nombre:STRING --nombre del fichero
path:STRING --su ruta
tamano:INTEGER --tamaño del fichero en bytes
usuarios : ARRAY [USUARIO] --lista de usuatios
feature {ANY}
nuevo (nom:STRING;ruta:STRING;tam:INTEGER) is
--Constructor de la clase, se le pasa el nombre que va a tener el archivo, su ruta,y tamaño, ademas de inicializar el array
do
nombre:=nom
path:=ruta
tamano:=tam
create usuarios.make(1,0)
end
get_nombre:string is
--Devuelve el nombre, Metodo de encapsulamiento
do
Result:=nombre
end
get_path:string is
--Devuelve la ruta, Metodo de encapsulamiento
do
Result:=path
end
get_tamano:integer is
--Devuelve el tamaño, Metodo de encapsulamiento
do
Result:=tamano
end
get_usuarios :array [USUARIO] is
--Devuelve la lista de usuaros que han descargado este archivo, Metodo de encapsulamiento
do
Result:=usuarios
end
set_nombre (nom:string) is
--Cambia el nombre del fichero por el pasado por parámetro. Metodo de encapsulacion
do
nombre:=nom
end
set_path (p:string) is
--Cambia la ruta del fichero por la pasada por parámetro. Metodo de encapsulacion
do
path:=p
end
set_tamano (tam:integer) is
--Cambia el tamaño del fichero por el pasado por parámetro. Metodo de encapsulacion
do
tamano:=tam
end
anadir_usuario (u:USUARIO)is
--Añade el usuario pasado por parámetro al final de la lista de usuarios. Metodo de encapsulacion
do
usuarios.add_last(u)
end
es_mismo_fichero(n,p:string):boolean is
--compara el nombre y la ruta del fichero con los pasados por parametro, devuelve true si ambos son iguales (ya que un fichero es igual a otro si tiene la misma ruta y el mismo nombre). Devuelve false en caso contrario
do
if equal(nombre,n) and equal (path,p) then
Result:=true
end
end
end--class FICHERO
djcloud- Amo del foro
- Cantidad de envíos : 389
Edad : 39
Fecha de inscripción : 11/10/2007
Re: Practica resuelta de 2006-2007
clase log
clase usuario
Weno,
la practica recibio un 1/1, asi que aunque no sea el codigo que haria
un profesor, os podeis fiar, si hay alguna duda, preguntad, que lo
mismo me acuerdo y todo.
(He metido en dos post la solucion porque era demasiado largo para 1)
- Código:
indexing
description:"Clase que modela la
informacion recogida de un LOG. Aqui se guarda una lista de los
usuarios, ficheros y descargas listadas en el archivo log leido"
class LOG
creation make
feature {NONE}
descargas:ARRAY[DESCARGA]--Lista de las descargas realizadas
usuarios:ARRAY[USUARIO]--Lista de usuarios con descargas
ficheros:ARRAY[FICHERO]--Lista de ficheros descargados
feature{ANY}
make is
--Constructor de la clase, simplemente inicializa los arrays
do
create descargas.make(1,0)
create usuarios.make(1,0)
create ficheros.make(1,0)
end
anadir_nueva_descarga(linea:STRING)is
--Crea una nueva descarga a partir de la linea que se para como argumento y almacena sus valores en este log
local
d:DESCARGA
do
create d.nuevo_linea (linea,current)
end
anadir_usuario(u:USUARIO)is
--Añade el usuario pasado por parametro a la lista de usuarios. Metodo de encapsulamiento
do
usuarios.add_last(u)
end
anadir_descarga (d:DESCARGA)is
--Añade la descarga paaado por parametro a la lista de descargas. Metodo de encapsulamiento
do
descargas.add_last(d)
end
anadir_fichero (f:FICHERO)is
--Añade el fichero pasado por parametro a la lista de ficheros. Metodo de encapsulamiento
do
ficheros.add_last(f)
end
get_usuarios :array[USUARIO] is
--Devuelve la lista de los usuarios del log. Metodo de encapsulamiento
do
Result:=usuarios
end
get_ficheros :array[FICHERO] is
--Devuelve la lista de los ficheros del log. Metodo de encapsulamiento
do
Result:=ficheros
end
get_descargas :array[DESCARGA] is
--Devuelve la lista de las descargas del log. Metodo de encapsulamiento
do
Result:=descargas
end
buscar_usuario(l,m:string):USUARIO is
--Metodo
que busca un usuario con el login y la maquina pasados por parametro y
lo devuelve. Si no se encuentra el metodo devuleve void, porque que
despues de la llamada se debe comprovar si el resultado fue void para
saber si se encontro o no
local i:integer
encontrado:boolean
do
from
i:=usuarios.lower
until
i>usuarios.upper or encontrado=true
loop
if usuarios.item(i).es_mismo_usuario(l,m) then
encontrado:=true
Result:=usuarios.item(i)
end
i:=i+1
end
end
buscar_fichero (n,p:string):FICHERO is
--Metodo
que busca un fichero con el nombre y la ruta pasados por parametro y lo
devuelve. Si no se encuentra el metodo devuleve void, porque que
despues de la llamada se debe comprovar si el resultado fue void para
saber si se encontro o no
local i:integer
encontrado:boolean
do
from
i:=ficheros.lower
until
i>ficheros.upper or encontrado=true
loop
if ficheros.item(i).es_mismo_fichero(n,p) then
encontrado:=true
Result:=ficheros.item(i)
end
i:=i+1
end
end
end --class LOG
clase usuario
- Código:
indexing
description:"Clase que modela un usuario, como un login + una maquina
como identificador. Ademas mantiene una lista de las descargas
realizada por ese usuario"
class USUARIO
creation do_nothing, nuevo
feature {NONE}
login: STRING --Login del usuario (su nombre de usuario)
maquina : STRING --Maquina desde la que conecto el usuario
descargas : ARRAY [DESCARGA] --Lista de descargas realizadas por el usuario
feature {ANY}
nuevo (logn,maq:STRING) is
--Metodo constructor, crea un nuevo usuario a partir de un login y una maquina, tambien inicializa el array.
do
login:=logn
maquina:=maq
create descargas.make(1,0)
end
set_login (l:STRING) is
--Cambia el login por el pasado como argumento. Metodo de encapsulamiento
do
login:=l
end
set_maquina (maq:STRING) is
--Cambia la maquina por la pasada como argumento. Metodo de encapsulamiento
do
maquina:=maq
end
anadir_descarga (d:DESCARGA)is
--Añade la descarga pasada como parámetro a la lista de descargas del usuario. Metodo de encapsulamiento
do
descargas.add_last(d)
end
get_login :STRING is
--Devuelve el login. Metodo de encapsulamiento
do
Result:=login
end
get_maquina : STRING is
--Devuelve la maquina. Metodo de encapsulamiento
do
Result:=maquina
end
get_descargas : ARRAY [DESCARGA] is
--Devuelve la lista de descargas. Metodo de encapsulamiento
do
Result:=descargas
end
es_mismo_usuario(l,m:STRING):BOOLEAN is
--Compara el login y maquina del objeto con los pasados opr argumento, devuelve true si ambos son iguales.
do
if equal(current.login,l) and equal (current.maquina,m) then
Result:=true
end
end
end --class USUARIO
Weno,
la practica recibio un 1/1, asi que aunque no sea el codigo que haria
un profesor, os podeis fiar, si hay alguna duda, preguntad, que lo
mismo me acuerdo y todo.
(He metido en dos post la solucion porque era demasiado largo para 1)
djcloud- Amo del foro
- Cantidad de envíos : 389
Edad : 39
Fecha de inscripción : 11/10/2007
Re: Practica resuelta de 2006-2007
Ya, lo has hecho para sumar posts... Elía, te lo ponen dificil eh?
Temas similares
» Practicas de 2006-2007
» Primera Practica
» Sobre la practica
» Primera defensa de la practica
» 30-10-2007
» Primera Practica
» Sobre la practica
» Primera defensa de la practica
» 30-10-2007
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.
|
|