The Jair has you
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

Practica resuelta de 2006-2007

2 participantes

Ir abajo

Practica resuelta de 2006-2007 Empty Practica resuelta de 2006-2007

Mensaje por djcloud Lun 05 Nov 2007, 15:51

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
djcloud
Amo del foro
Amo del foro

Cantidad de envíos : 389
Edad : 39
Fecha de inscripción : 11/10/2007

Volver arriba Ir abajo

Practica resuelta de 2006-2007 Empty Re: Practica resuelta de 2006-2007

Mensaje por djcloud Lun 05 Nov 2007, 15:55

Solucion:

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
djcloud
Amo del foro
Amo del foro

Cantidad de envíos : 389
Edad : 39
Fecha de inscripción : 11/10/2007

Volver arriba Ir abajo

Practica resuelta de 2006-2007 Empty Re: Practica resuelta de 2006-2007

Mensaje por djcloud Lun 05 Nov 2007, 15:56

clase log
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
djcloud
Amo del foro
Amo del foro

Cantidad de envíos : 389
Edad : 39
Fecha de inscripción : 11/10/2007

Volver arriba Ir abajo

Practica resuelta de 2006-2007 Empty Re: Practica resuelta de 2006-2007

Mensaje por Garrosa Mar 06 Nov 2007, 01:08

Ya, lo has hecho para sumar posts... Elía, te lo ponen dificil eh?
Garrosa
Garrosa
Amo del foro
Amo del foro

Cantidad de envíos : 484
Edad : 35
Fecha de inscripción : 13/10/2007

http://www.fotolog.com/lincoln_garrous

Volver arriba Ir abajo

Practica resuelta de 2006-2007 Empty Re: Practica resuelta de 2006-2007

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.