Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



miércoles, 22 de junio de 2011

Gambas2: Implementacion de FIFO y LiFO

Hola amigos, hoy hemos estado viendo en el curso de Analista Funcional un ejercicio de Java, sobre implementar FIFO y LIFO:

Según la wiki: http://es.wikipedia.org/wiki/FIFO_y_LIFO_%28contabilidad%29


FIFO y LIFO son métodos contables diseñados para valorar inventarios y asuntos financieros que involucran dinero que una compañía asocia con inventario de bienes producidos, materia prima, partes o componentes.

Esto es lo que me piden en el ejercicio:

Citar:
Desarrollar la implementación de una lista del tipo pila o LIFO (Last Input First Output) y de una lista del tipo cola o FIFO (First Input First Output). Las implementaciones deben ser genéricas, es decir, deben aceptar cualquier tipo de objeto.


Además, definir un tipo genérico Pila que imponga el API genérico de una lista (añadir y extraer elementos).


La clase Actividad4 tiene un método main en el que se crearán los dos tipos de lista, se les añadirá los mismos elementos y en el mismo orden. Se comprobará el orden en el que se extraen los elementos en cada lista.


En la siguiente pagina web viene la solucion para Java

https://docs.google.com/document/pub?id=1TdCH71pyhdKELmwVo4IwQnqUtVErn85KMfOaO4ZZEAk&pli=1

La ventaja de esta solución es que no usa las colecciones "prefabricadas" que ya incorpora Java, con lo cual el código puede ser implementado a  Gambas "facilmente".

Aquí podeis ver el diagrama de clases de UML, de esta solución:


Bien lo he implementado a Gambas, (gambas2: en vez de Objeto lo he implementado a Variant).

Clase ApiLista:
Código:
PUBLIC SUB anadir(Obj AS Variant)
END

PUBLIC FUNCTION extraer() AS Variant
END

PUBLIC FUNCTION getlongitud() AS Integer
END



Clase colaFifo:
Código:
' Gambas class file

INHERITS ApiLista

PRIVATE primero AS Nodo
PRIVATE ultimo AS Nodo
PRIVATE longitud AS Integer


PUBLIC SUB anadir(obj AS Variant)

DIM aux AS NEW Nodo
aux.objeto = obj
IF longitud = 0 THEN
primero = aux
ELSE
ultimo.siguiente = aux
ENDIF

ultimo = aux
longitud += 1

END


PUBLIC FUNCTION extraer() AS Variant

DIM obj AS Variant
IF longitud = 0 THEN
RETURN -111 'cola vacia
ELSE
obj = primero.objeto
primero = primero.siguiente
longitud -= 1
RETURN obj
ENDIF

END

PUBLIC FUNCTION getlongitud() AS Integer

RETURN longitud

END



Clase pilaLiFo:
Código:
' Gambas class file

INHERITS ApiLista

PRIVATE top AS Nodo
PRIVATE longitud AS Integer



PUBLIC SUB anadir(obj AS Variant)

DIM aux AS NEW Nodo
aux.objeto = obj
aux.siguiente = top
top = aux
longitud += 1

END



PUBLIC FUNCTION extraer() AS Variant
DIM obj AS Variant

IF top = NULL THEN
RETURN NULL ' lista vacia
ENDIF

obj = top.objeto
top = top.siguiente
longitud -= 1
RETURN obj


END

PUBLIC FUNCTION getlongitud() AS Integer

RETURN longitud

END




Clase Nodo:
Código:
PUBLIC objeto AS Variant
PUBLIC siguiente AS Nodo




En el Formulario FMain: (añadimos un textarea, para ver el resultado)
Código:
PUBLIC SUB Form_Open()
' obtenido de:
'https://docs.google.com/document/pub?id=1TdCH71pyhdKELmwVo4IwQnqUtVErn85KMfOaO4ZZEAk&pli=1
'java-FIFO-LIFO
DIM i AS Integer
DIM elementos AS Integer

DIM pila AS NEW pilaLiFO[]
DIM cola AS NEW colaFifo[]



' Añadimos los mismos elementos a la pila y la cola.
FOR i = 0 TO 9
pila.anadir("AB" & Str$(I))
cola.anadir("AC" & Str$(I))
NEXT

' Extraer Pila
TextArea1.text = "Orden de Extraccion de la pila LIFO:\n"


elementos = pila.getlongitud()

FOR i = 0 TO elementos - 1
TextArea1.text &= " [" & pila.extraer() & "] "
NEXT

TextArea1.text &= "\n-------\n"
'Extraer en Cola
TextArea1.text &= "Orden de Extraccion de la cola FIFO:\n"


elementos = cola.getlongitud()

FOR i = 0 TO elementos - 1
TextArea1.text &= " [" & cola.extraer() & "] "
NEXT


END

Aqui podeis ver la salida generada por el programa: