Indice
1.
Introduccion
2. Herencia y
polimorfismo
3. El Paradigma
Concurrente
4. El Paradigma Logico
5. El paradigma
funcional
1-programacion orientada a objetos (p.o.o.).
Un proyecto de
software es
complejo. Las gui, acceso transparente a datos y capacidad
de trabajo
En red, lo hacen mas
complejo aun. Para enfrentarse a esta complejidad nace la
poo.
2-que es la poo?.
Es una tecnica o estilo
de programacion que utiliza objetos como bloque fundamental de
Construccion.
3-elementos basicos de la poo.
Bloques
Son un conjunto complejo de datos (atributos)
y funciones
(metodos) que poseen una determinada
Estructura y
forman parte de una organizacion.
Los atributos definen el estado del
objeto; los metodos, su comportamiento.
Metodos
Es un programa
procedimental que esta asociado a un objeto determinado y cuya
ejecucion solo
Puede desencadenarse a traves del mensaje
correspondiente.
Mensajes
Es simplemente una peticion de un objeto a otro para que este se
comporte de una manera
Determinada, ejecutando uno de sus metodos.
Los mensajes comunican a los objetos con otros y con el mundo
exterior. A esta tecnica de
enviar
Mensajes se la conoce como paso de mensajes.
Clases
Es un tipo definido por el usuario que determina la estructura de
datos y las operaciones
Asociadas con ese tipo.
4-caracteristicas.
Abstraccion
Significa extraer las propiedades esenciales de un objeto que lo
distinguen de los demas tipos de
Objetos y proporciona fronteras conceptuales definidas respecto
al punto de vista del observador.
Es la capacidad para encapsular y aislar la informacion de diseno
y ejecucion.
Encapsulamiento
Es el proceso de
almacenar en un mismo compartimiento (una caja negra) los
elementos de una
Abstraccion (toda la informacion relacionada con un objeto) que
constituyen su estructura y
su
Comportamiento. Esta informacion permanece oculta
tanto para los usuarios como para otros objetos
Y puede ser accedida solo mediante la ejecucion de los metodos
adecuados.
Herencia
Es la propiedad que
permite a los objetos construirse a partir de otros objetos.
La clase base contiene todas las caracteristicas comunes. Las
sub-clases contienen las
Caracteristicas de la clase base mas las caracteristicas
particulares de la sub-clase.
Si la sub-clase hereda caracteristicas de una clase base, se
trata de herencia
simple.
Si hereda de dos o mas clases base, herencia
multiple.
Polimorfismo
Literalmente significa "cualidad de tener mas de una forma". En
poo, se refiere al hecho que una
Misma operacion puede tener diferente comportamiento en
diferentes objetos. En otras palabras,
Diferentes objetos reaccionan al mismo mensaje de modo
diferente.
5-ventajas.
Modelos
La poo permite realizar un modelo de
sistema casi
independientemente de los requisitos del
Proyecto. La
razon es que en la poo la jerarquia la establecen los datos, en
cambio en
la
Programacion
estructurada la jerarquia viene definida por los programas.
Este cambio hace
que los modelos se
establezcan de forma similar al razonamiento humano y, por lo
Tanto, resulte mas natural.
Modularidad
Un programa es
modular si se compone de modulos independientes y robustos. Esto
permite la
Reutilizacion y facilita la verificacion y depuracion de los
mismos. En poo, los modulos estan
Directamente relacionados con los objetos. Los objetos son
modulos naturales ya que corresponden
A una imagen logica de
la realidad.
Extensibilidad
Durante el desarrollo de
sistemas, ocurre
la aparicion de nuevos requisitos, por eso es deseable
Que las herramientas
de desarrollo
permitan anadirlos sin modificar la estructura basica del
Diseno. En poo es posible lograr esto siempre y cuando se hayan
definido de forma adecuada la
Jerarquia de clases, los atributos y metodos.
Eliminacion de redundancia
En el desarrollo de sistemas se desea
evitar la definicion multiple de datos y funciones
comunes.
En poo esto se logra mediante la herencia (evita la definicion
multiple de propiedades comunes a
Muchos objetos) y el polimorfismo (permite la modificacion de
metodos heredados). Solo hay que
Definir los atributos y los metodos en el antepasado mas lejano
que los comparte.
Reutilizacion
La poo proporciona un marco perfecto para la reutilizacion de las
clases. El encapsulamiento y la
Modularidad nos permiten utilizar una y otra vez las mismas
clases en aplicaciones distintas. En
Efecto, el aislamiento entre distintas clases significa que es
posible anadir una nueva clase o
Un modulo nuevo (extensibilidad) sin afectar al resto de la
aplicacion.
6-lenguajes en poo.
Puros
Son los que solo permiten realizar programacion orientada a
objetos. Ej: smalltalk, java.
Hibridos
Son los que permiten la poo con la programacion
estructurada. Ej: c++, pascal.
7-poo en c++ y java.
A)tipos de clases
Una de las principales decisiones al trabajar con poo es la de
seleccion de clases. Existen 4
Tipos:
De datos o estado. Se
reconocen como los sustantivos en la descripcion de un problema
y
Generalmente son los bloques de construccion mas importantes de
un diseno.
Adelante. A diferencia de los anteriores, estas clases
no retiene los datos por un periodo de
Tiempo sino
que los genera sobre demanda o los
procesa cuando se le llama.
La ejecucion de tareas complejas.
B)sintaxis de una clase
C++:
Class nombre_clase [: [public/protected/private] clase_madre]
{
[lista de atributos];
[lista de metodos];
};
Java:
[public] [final/abstract] class nombre_clase [extends
clase_madre]
[implements interface1, [interface2,...]...]
{
[lista de atributos];
[lista de metodos];
};
C)modificadores de acceso a miembros de clases
Existen 3 tipos de usuarios de una clase:
Cada usuario tiene distintos privilegios o niveles de acceso.
C++:
Private
Por defecto todo lo declarado dentro de la clase es privado y
solo puede ser accedido por
Funciones miembro o por funciones amigas.
Public
Pueden ser accedidos por funciones miembro y no miembro de una
clase.
Protected
Pueden ser accedidos por funciones miembro, por funciones amigas
o por funciones miembro de sus
Clases derivadas.
Java:
Private
Solo puede ser accedida por metodos propios de la clase.
Private-protected
Pueden ser accedidos por las sub-clases, sin importar el paquete
al que pertenezcan. Sin embargo,
Las sub-clases solo pueden modificar estos atributos para objetos
de la sub-clase, no de la clase
Madre.
Protected
Permite el acceso a las sub-clases y a las clases del mismo
paquete.
Friendly
Es el valor por
defecto. Permite el acceso solo a clases del mismo paquete.
Public
Pueden ser accedidas por todos.
D)atributos
Las variables
declaradas dentro de un metodo son locales a el; las declaradas
en el cuerpo de la
Clase son miembros de ella y son accesibles por todos los metodos
de la clase.
Los atributos miembros de la clase pueden ser: atributos de clase
(declarado como static) o
Atributos de instancia.
C++:
[static]tipo_dato nombre_dato; (no se puede inicializar un dato
miembro de una clase)
Java:
[modificador_de_acceso] [static] [final] [transient] [volatile]
tipo_dato nombre_dato [= valor];
Final
Implica que un atributo no puede ser sobreescrito o redefinido,
es decir que no se trata de una
Variable sino de una constante.
Transient
Son atributos que no se graban cuando se archiva un objeto, o sea
no forman parte permanente del
Estado de este.
Volatile
Se utiliza cuando la variable puede ser modificada por distintos
threads. Basicamente implica que
Varios threads pueden modificar la variable en forma simultanea,
y volatile asegura que se vuelva
A leer la variable, por si fue modificada, cada vez que se la
vaya a usar.
E)metodos
Dentro de los metodos pueden incluirse:
C++:
Se puede declarar y definir dentro de la clase:
Class nombre_clase
{
tipo_dato dato;
[modificador_de_acceso]:
tipodato_devuelto nombre_metodo(parametros)
{
cuerpo_metodo;
};
}
Tambien, se puede declarar dentro de la clase y
definirlo fuera:
Class nombre_clase
{
tipo_dato dato;
[modificador_de_acceso]:
tipodato_devuelto nombre_metodo(parametros);
};
Tipodato_devuelto nombre_clase :: nombre_metodo(parametros)
{
cuerpo_metodo;
}
Java:
En java se debe declarar y definir la funcion dentro de la
clase:
Class nombre_clase
{
tipo_dato dato;
[modificador_de_acceso] [static] [abstract] [final] [native]
[syncronized] tipodato_devuelto
nombre_metodo (parametros)[throws exepcion1 [,exepcion2]]
{
cuerpo_metodo;
}
}
Static
Al igual que con los atributos, un metodo declarado como
static es compartido por todas las
Instancias de la clase.
Abstract
Son aquellos de los que se da la declaracion pero no la
implementacion, para generar una clase
Abstracta.
Final
Es un metodo que no puede ser redefinido por las sub-clases
herederas.
Native
Es un metodo que esta escrito en otro lenguaje que
no es java.
Syncronized
Permite sincronizar varios threads para el caso en que dos o mas
quieran acceder en forma
Concurrente.
Throws
Sirve para indicar que la clase genera determinadas
execpciones.
Llamada a metodos
Se llama a un metodo de la misma clase simplemente con el nombre
del metodo y los parametros
Entre parentesis.
Cuando se necesita llamar a un metodo de un objeto de otra clase,
se utiliza:
Nombre_objeto.nombre_metodo(parametros)
F)metodos o funciones miembros
Funciones simples (c++ y java)
Son los vistos anteriormente, se pueden definir dentro o fuera de
la clase.
Funciones en linea (inline) (c++)
Se crean definiendo la funcion dentro de la clase (declaracion
implicita) o definiendo la funcion
Fuera de la clase pero anteponiendo la palabra reservada inline
(declaracion explicita).
Funciones constructores (c++ y java)
Es una funcion especial que sirve para inicializar objetos de una
clase. En general, tienen el
Mismo nombre de la clase que inicializa, no devuelven valores,
pueden admitir parametros, pueden
Existir mas de un constructor (e incluso no existir), si no se
define ningun constructor el
Compilador genera uno por defecto, se llaman al momento de crear
un objeto.
El compilador genera uno que asigna espacio de memoria y lo pone en cero.
Existir varios que se diferencian por la cantidad y tipo de argumentos.
Parametro otro objeto del mismo tipo. Si no se declara
el compilador genera uno por defecto
Asignandole al nuevo objeto los valores
del objeto a la izquierda del operador =.
En java se puede inicializar el objeto tras la creacion fisica
del mismo, asignandole los valores
Que se le dara.
Funcion destructor (c++)
Cumplen la funcion inversa a la del constructor eliminando el
espacio de almacenamiento
que
Ocupo el objeto al ser creado. Caracteristicas: tienen el mismo
nombre de la clase, van
Precedidos por el caracter ~, solo
existe un destructor por clase, no admiten argumentos, no
Retornan ningun valor, el compilador llama a un destructor cuando
el objeto sale fuera de ambito.
Funciones amigas (c++)
Es una funcion no miembro que puede acceder a las parte private
de una clase. Se declaran
Anteponiendo la palabra reservada friend.
Tambien se pueden declarar como amigas a las clases. En este caso
todas las funciones de la clase
Amiga pueden acceder a las partes privadas de la otra clase.
Funciones sobrecargadas (c++ y java)
Es una funcion que tiene mas de una definicion. Las funciones
sobrecargadas tienen el mismo
Nombre, pero deben tener un numero distinto de argumentos o
diferentes tipos de argumentos. Las
Definiciones operan sobre funciones distintas.
Las unicas funciones miembro que no se pueden sobrecarga son los
destructores.
Funciones operador (c++)
Permiten sobrecargar un operador existente (ej: suma) para
utilizarlos con objetos. Se declara
Poniendo la palabra reservada operator seguida por el operador
especifico y la lista de
Argumentos y el cuerpo de la funcion.
Restricciones:
G)objetos
C++:
Se pueden crear en forma estatica (nombre_clase objeto1) o
dinamica (nombre_clase *objeto2;
Objeto2= new nombre_clase;)
Java:
Solo se crean los objetos en forma dinamica: nombre_clase
objeto1=new nombre_clase();
H)arrays de objetos
Se pueden crear arrays de objetos de la misma forma que se crea
un array normal.
C++:
Estatico: nombre_clase objeto[10];
Dinamico: nombre_clase *objeto;
Objeto=new nombre_clase[10];
Java:
Nombre_clase objeto=new nombre_clase[10];
I)puntero this
Es un puntero al objeto asociado con la invocacion de una funcion
miembro. Normalmente no se
Explicita ya que el lenguaje
realiza esta operacion transparente y en forma automatica.
Igualmente hay casos en los que se debe usar el puntero this
explicitamente:
La invocacion de la funcion miembro.
Ej: f(this);
Ej: void t::g (t &a, t &b)
{ ...
a= *this;
...
*this= b;
}
Constructor.
Ej: t& t::f (int a)
{ ...
return *this;
}
C++:
This->nombre_objetomiembro
Java:
This.nombre_objetomiembro
1-herencia.
Herencia es la propiedad de
que los ejemplares de una clase hija extiendan el comportamiento
y los datos asociados a las clases paternas. La herencia es
siempre transitiva, es decir que una sub-clase hereda
caracteristicas de superclases alejadas muchos
niveles.
2-beneficios de la herencia.
Reusabilidad del software
Cuando el comportamiento se hereda de otra clase, no es necesario
reescribir el codigo que lo
define.
Comparticion de codigo}
Muchos usuarios o proyectos
distintos pueden usar las mismas clases. Por otro lado, la
herencia reduce el tiempo de
escritura y el
tamano final del programa.
Consistencia de la interfaz}
El comportamiento de una clase madre que heredan todas sus clases
hijas sera el mismo, de esta manera se asegura que las interfaces
para objetos seran similares y no solo un conjunto de objetos que
son parecidos pero que actuan e interactuan de forma
diferente.
Componentes de software
La herencia nos permite escribir componentes de software
reutilizables.
Modelado rapido de prototipos
Cuando un sistema se
construye casi totalmente de componentes reutilizables, se puede
dedicar mas tiempo a la realizacion de aquellas partes nuevas. A
este estilo de programacion se lo conoce como ‘modelado
rapide de prototipos’ o ‘programacion
exploratoria’.
Ocultacion de informacion
Un programador puede reutilizar un componente conociendo
solamente la naturaleza e
interfaz del mismo y sin la necesidad de conocer los detalles
tecnicos empleados para su realizacion.
Polimorfismo
Permite al programador generar componentes reutilizables de alto
nivel que puedan adaptarse a diferentes aplicaciones mediante el
cambio de sus partes de bajo nivel.
3-heuristicas para crear sub-clases.
Para saber si una clase debe convertirse en una subclase de otra
mediante la herencia hay que aplicar la regla del es-un y
es-parte-de.
Es-un
Se dan entre dos conceptos cuando el primero (la sub-clase) es un
ejemplar especificado del segundo (la clase base). Ej: un avion
es un transporte.
Es-parte-de
Se da entre dos conceptos cuando el primero (la sub-clase) es una
parte del segundo (la clase base), sin ser ninguno, en esencia,
la misma cosa. Ej: un motor es parte de
un auto.
Distintos tipos de herencia
A)especializacion
Es la forma de herencia mas comun y cumple en forma directa la
regla es-un.
B)especificacion
Se trata de un caso especial de sub-clasificaion por
especializacion, excepto que las sub-clases no son refinamientos
de un tipo existente, sino mas bien realizaciones de una
especificacion incompleta. Es decir, que la superclase describe
un comportamiento que sera implantado solo por las
sub-clases.
C)construccion
Se da cuando la sub-clase ha heredado casi completamente su
comportamiento de la superclase y solo tiene que modificar
algunos metodos o los argumentos de cierta manera.
D)generalizacion
Esta es la opuesta a la creacion de sub-clases por
especializacion. Se debe evitar; solo deben aplicarse cuando no
se pueden modificar las clases existentes o se deben anular
metodos de las mismas.
E)extension
Agrega una capacidad totalmente nueva a un objeto existente. Se
distingue de la generalizacion, ya que esta debe anular al menos
un metodo de la clase base, mientras que la extension solo agrega
metodos nuevos.
F)limitacion
Es una variante de la especificacion en donde el comportamiento
de la sub-clase es mas reducido o esta mas restringido que que el
comportamiento de la superclase. Tambien se da en situaciones en
las que las clases existentes no pueden modificarse.
G)variacion
Se da cuando do o mas clases tienen implantaciones similares,
pero no parece haber ninguna relacion jerarquica entre los
conceptos representados por las clases. Ej: codigo del mouse y de la
placa de video.
H)combinacion
Se da cuando una sub-clase resulta de la combinacion de
caracteristicas de dos o mas clases.
4-herencia y jerarquia de clases
C++ y java utilizan un sistema de herencia jerarquica.una clase
hereda de otra, creando asi muevas clases a partir de clases
existentes. Solo se pueden heredar clases, no funciones
ordinarias ni variables.
Una sub-clase deriva de una clase base. La clase derivada puede a
su vez ser utilizada como clase base para derivar mas clases,
conformandose asi la jerarquia de clases.
Caracteristicas de las clases derivadas
Una clase derivada o sub-clase:
Los siguientes elementos de la clase base no se heredan:
Sintaxis de una clase derivada
C++:
Class clase_derivada : [public / protected / private] clase_base
[, [public / protected / private]clase_base2]
{
cuerpo clase derivada;
};
Java:
Class nombre_derivada extends nombre_base
{
cuerpo clase derivada;
}
Especificadores de acceso
C++:
Si no se especifica el tipo de derivacion, c++ supone que el tipo de herencia es private.
Si en la derivacion especificamos:
Los miembros public pasan a ser public en la clase derivada. Los miembros protected pasan a ser protected. Y los privados permanecen privados en la clase base.
|
Clase base |
|
public |
|
protected |
|
Private |
|
Clase derivada |
|
Public |
|
Protected |
|
Private |
Todos los miembros public y protected de la clase base son miembros protected en la derivada.
|
Clase |
|
Public |
|
Protected |
|
Private |
|
Clase |
|
public |
|
protected |
|
Private |
Todos los miembros public y private son miembros private en la clase derivada.
|
Clase |
|
public |
|
protected |
|
Private |
|
Clase |
|
Public |
|
Protected |
|
Private |
Java:
Para analizar los tipos de herencia en java hay que tener en cuenta que existen 5 distintos tipos de clases:
|
Miembros declarados como… |
|
Private |
Private-protected |
Protected |
Friendly |
Public |
|
|
Clase base. |
S |
S |
S |
S |
S |
|
Clases derivadas del mismo paquete. |
N |
R |
S |
S |
S |
|
Clases del mismo paquete. |
N |
N |
S |
S |
S |
|
Clases derivadas en distinto paquete. |
N |
R |
R |
N |
S |
|
Clases en distinto paquete. |
N |
N |
N |
N |
S |
|
Tipo de acceso:
|
Redefinicion de metodos
Cuando se hace heredar una clase de otra, se pueden redefinir ciertos metodos a fin de refinarlos, o bien de modificarlos. El metodo lleva el mismo nombre y la misma signatura, pero solo se aplica a objetos de la sub-clase o sus descendientes.
Constructores
Cuando se construye una calse hija, es necesario tambien llamar
al constructor de la clase madre. Esta invocacion puede ser
implicita o explicita.
Es implicita si el constructor de la madre no toma parametros. En
este caso, ya sea que el constructor de la hija sea implicito o
no, la llamada al constructor de la madre es automatica.
Si el constructor de la madre necesita parametros, hay que
pasarselos. Es necesario definir un constructor en la hija y este
debe llamar al constructor de la madre enviando los
parametros.
Para realizarlo se sigue el siguiente ordem:
C++:
Derivada :: derivada (tipo1 x, tipo2 y) : base (x,y) [, base2 (x,y) ]
{
cuerpo del constructor;
}
En herencia multiple, el orden real de invocacion de constructores se da de acuerdo al orden en que fueron declaradas las clases. C++ utiliza el siguiente orden de inicializacion:
Java:
En la definicion del constructor de la clase derivada se utiliza la palabra super para simbolizar la llamada al constructor de la clase base.
Class hija extends madre
{
public hija (tipo1 x)
{
super (y);
cuerpo del constructor;
]
}
Destructores
Al contrario que con los constructores, una funcion destructor de
una clase derivada se ejecuta antes que el destructor de la clase
base. (los destructores no se heredan)
Clases bases virtuales
Es una clase que es compartida por otras clases base con independencia
del numero de veces que esta se produce en la jeraquia de
derivacion.
Supongamos que la clase base a, la cual tiene sus propios
miembros. Definimos dos clases derivadas de esta b y c, tambien
con sus propios metodos y los heredados. Definimos tambien una
clase d, derivada de b y c (derivacion multiple). Este tipo de
jerarquia puede dar lugar a problemas ya
que la clase d heredara las funciones miembro de b y c, pero
tambien derivara las de a dos veces.
Para evitar este problema, debemos definir a las clases clases
base como como clases vituales, lo cual significa que solo una
copia de los miembros ambiguos pasara a la clase
derivada.
Class a
{…}
Class b : virtual public a
{…}
Class c : virtual public a
{…}
Class d : public b , public c
{…}
5-polimorfismo
Consiste en llamar a un metodo segun el tipo estatico de una
variable, basandose en el nucleo para llamar a la version
correcta del metodo. El polimorfismo se realiza por estos
metodos:
En este caso el compilador determina que funcion debe
utilizarse en tiempo de compilacion ya que conocera el objeto
implicado. Este tipo de ligadura, se la conoce como ligadura
temprana, estatica o previa.
Cuando existen punteros implicados, el compilador no sabe a que
objeto se esta referenciando. En este caso se produce una
ligadura dinamica.
Cuando varias sub-clases derivan de una clase base, estas pueden emplear las funciones que heredan de la misma forma, pero otras pueden requerir elementos adicionales o incluso formatos totalmente nuevos. Para enfrentar esto, existen 3 soluciones posibles:
En este ultimo caso, la ligadura se lleva a cabo en
tiempo de ejecucion.
La funcion debe ser declarada como vitual en la primer clase en
la que esta presente. La palabra clave virtual permite definir la
funcion bajo el mismo nombre tanto en la clase base como en la
derivada. Al utilizar funciones virtuales se pueden utilizar
punteros a la clase base para referenciar objetos de una clase
derivada.
Funcion virtual pura
Es una funcio virtual declarada en una clase base que no esta
definida y no tiene cuerpo. Deben definirse luego en la clase
derivada.
C++:
Virtual tipo nombre_funcion (parametros) = 0;
Java:
Se llaman metodos abstractos y se declaran pero no se escribe su
implementacion.
Abstract metodoabstracto ();
Clases abstractas
Son clases que se disenan para ser heredadas y solo se pueden
utilizar como clases base. No pueden ser instanciadas.}
C++:
Una clase es abstracta si tiene al menos una funcion virtual
pura.
Java:
Deben declararse como abstract.
Abstract nombre_clase
{
abstract void metodo_abstracto ();
}
Pasos para obtener polimorfismo en c++
3. El Paradigma Concurrente
Concurrencia
Se dice que dos o mas procesos son
concurrentes si estan construidos de manera tal que pueden
ejecutarse al mismo tiempo y compartiendo rescursos.
Considerando un entorno multi-thread, cada hilo representa un
proceso
individual ejecutandose en un sistema. Generalmente, cada hilo
controla un unico aspecto dentro de un programa. Todos los hilos
comparten los mismos recursos.
Hay que distinguir multi-hilo de multi-proceso. El multi-proceso
se refiere a dos o mas programas que se
ejecutan "aparentemente" a la vez, bajo el control del
sitema operativo. Los programs no necesitan tener relacion unos
con otros. Multi-hilo se refiere a dos o mas tareas que se
ejecutan "aparentemente" a la vez, dentro de un mismo
programa.
Programas de flujo unico
Un programa de flujo unico (single-thread) utiliza un unico flujo
de control (thread) para controlar su ejecucion.
Programas de flujo multiple
La utilizacion de hilos en java permite una gran flexibilidad a
la hora de plantearse el desarrollo de aplicaciones. La
simplicidad para crear, configurar y ejecutar hilos de ejecucion
permite que se puedan implementar aplicaciones muy poderosas y
portables.
Mientras un programa de flujo unico realiza su tarea ejecutando
instrucciones en forma secuencial, un programa de flujo multiple
permite que cada hilo comience y termine tan pronto como sea
posible.
1-planificacion de hilos.
Cada hilo tiene asociada una prioridad que es utilizada por el
sistema (en tiempo de ejecucion)como ayuda para determinar que
hilo debe ejecutarse en un instante determinado.
Un hilo en ejecucion, continua ejecutandose hasta que realiza una operacion de bloqueo, o hasta que es desalojado. Un hilo puede ser desalojado por otro hilo de mayor prioridad que se hace ejecutable, o porque el planificador de hilos provoca un crecimiento en un hilo de baja prioridad para que este tome algunos ciclos del cpu, evitando asi la inanicion.
Un hilo tiene inicialmente la prioridad del hilo que lo creo. Estos valores pueden modificarse mediante: setpriority() con un valor de parametros entre las constantes min_priority y max_priority de la clase thread. El metodo getpriority() devuelve el valor de la prioridad de un hilo.
2-la clase thread.
Es la clase que encapsula todo el control necesario sobre los
hilos. Un objeto de la clase thread actua como el panel de control
de un hilo de ejecucion (el thread propiamente dicho).
Metodos de clase
Se utilizan para saber el estado del
hilo y para replanificarlo.
Public static void currentthread()
Devuelve el objeto thread que representa al hilo en
ejecucion.
Public static void sleep(long milisegs) throws
interruptedexception
Duerme al hilo por el tiempo indicado en ms. Si el hilo se
interrumpe mientras duerme, se lanza una excepcion.
Public static void yield()
Dice a la jvm que el hilo actual no necesita ejecutarse en el
presente momento. La maquina puede o no acatar esta
sugerencia.
Metodos de instancia
Thread objeto = new thread();
Luego de crear un hilo, se puede configurar seteando su prioridad inicial y nombre.
Objeto.start();
El metodo lanza un nuevo hilo basado en los datos del objeto thread. Luego llama al metodo run del hilo, con lo que el hilo se activa, y en donde se ejecutan todas las tareas del hilo.
Suspend()
Detiene al hilo sin destruirlo.
Resume()
Activa a un hilo suspendido.
Interrupt()
Se utiliza para detener a un hilo cuando se requiere gestionar su
finalizacion.
Setname(string)
Permite nombrar a un hilo.
Getname()
Devuelve un string con el nombre del hilo.
Isalive()
Devuelve un 1 si el hilo esta ejecutando su metodo run().
Como obtener hilos de ejecucion
Existen dos formas de hacerlo:
Class mihilo extends thread
{
atributos;
public void run()
{
se redefine el metodo run;
}
}
Las interfaces proporcionan un forma de agrupar el trabajo de infraestructura de una clase. La interfaz define el trabajo y la clase lo implementa. Una interfaz solo puede contener metodos abstractos y variables estaticas y finales. Tambien una interfaz tiene la propiedad de poder heredar en forma multiple de otras interfaces.
Interfaz runnable:
Public interface runnable
{
public abstract void run();
}
Una clase que implementa una interfaz debe implementar todos los metodos definidos en la interfaz.
La interfaz runnable fuerza a que
se redefina el metodo run().
Para poder ejecutar
el proceso como hilo, se requiere crear una instancia de thread
primero:
Public class mihilo implements runnable
{
thread h;
public void run()
{
redefinicion del metodo run();
}
}
A diferencia del primer caso, utilizando este metodo queda disponible la herencia simple (extends) que podemos utilizar para heredar alguna otra clase.
3-grupos de
hilos.
Todo hilo de ejecucion en java debe pertenecer a un grupo. Es la
clase threadgroup la que define e implementa la capacidad de un
grupo de
hilos.
Los grupos de hilo
permiten que se pueda manejar un conjunto de hilos como un solo
objeto.cuando se crea un hilo, es decir en el constructor, debe
indicarse el grupo al que pertenecera. Si no se indica un grupo,
el sistema asigna uno por defecto, el mismo grupo en que se
encuentra el hilo que lo creo. Si no se especifica ningun grupo,
todos seran miembros del grupo "main".
La clase thread cuenta con constructores que permiten especificar
el grupo del hilo que se esta creando en el mismo momento de
instanciarlo.
Tambien existe el metodo setthreadgroup().
4-scheduling.
Es un metodo que utiliza una lista de procesos que
monitoriza a todos los hilos que se estan ejecutando en todos los
programas y decide cuales deben ejecutarse y cuales deben
encontrarse preparados para su ejecucion. El scheduler utiliza
dos caracteristicas de los hilos para decidir: la prioridad del
hilo y el indicador de hilo demonio.
Existen dos tipos de scheduling:
Proporciona un periodo fijo de tiempo de cpu a los hilos que estan corriendo en el sistema. El scheduler decide cual sera el hilo a ejecutarse y lo llama con resume(). Cuando pasa su periodo de tiempo, llama a suspend() y ejecuta el siguiente hilo de la lista.
Decide que hilo debe correr y lo ejecuta hasta que finalice. El hilo tiene el control total del cpu mientras este en ejecucion.
Hilos demonios
Son hilos de prioridad baja y proporcionan un servicio
basico a los programas cuando la actividad de la maquina es
reducida. Son utiles cuando un hilo debe ejecutarse en segundo
plano durante largos periodos de tiempo.
Setdaemon()
Pone a un hilo de usuario como demonio.
Isdaemon()
Devuelve si un hilo es o no demonio.
Regla basica
Si solamente hay hilos demonios ejecutandose, la aplicacion
termina.
5-sincronizacion.
Cuando dos o mas hilos necesitan utiliza el mismo objeto, existe
la posibilidad de que sus operaciones se
interfieran y se corrompan los datos. Esas operaciones
potencialmente interferentes se denominan zonas criticas. La
interferencia puede evitarse sincronizando al acceso a esas zonas
criticas.
Todos los objetos tienen un bloqueo asociado que puede ser
adquirido y liberado para evitar la interferencia mediante el uso
de metodos y sentencias synchronized.
Metodos synchronized
Una clase cuyos objetos se deben proteger de interferencias en un
entorno con multiples hilos declara generalmente sus metodos
modificadores como synchronized.
Si un hilo invoca a un metodo synchronized sobre un objeto, en
primer lugar se adquiere el bloqueo de ese objeto, se ejecuta el
cuerpo del metodo y despues se libera el bloqueo. Si otro hilo
quiere invocar un metodo synchronized sobre un objeto bloqueado,
debe esperar (bloqueado) hasta que el bloqueo del objeto se
libere. La posesion de los bloqueos es unica por hilo. Esto
impide que un hilo se bloquee por un bloqueo que posee, es decir
cuando llama a un metodo synchronized sobre un objeto cuyo
bloqueo posee por haber invocado a otro metodo synchronized con
anterioridad.
El bloqueo se libera porque:
Public class ejemplo
{
tipo atrib1;
public synchronized tipo metodo1()
{
cuerpo metodo;
}
}
Metodos estaticos sincronizados
Es una segunda forma de obtener sincronizacion. Todos los objetos
tienen asociado un objeto class. Los metodos estaticos
sincronizados adquieren el bloqueo del objeto class de su clase.
Dos hilos no pueden ejecutar metodos estaticos sincronizados de
la misma clase al mismo tiempo. Si se comparten datos estaticos
entre hilos, su acceso debe ser protegido utilizando metodos
estaticos sincronizados.
El bloqueo entre metodos de instancia y estaticos es independiente, es decir que se puede seguir invocando a metodos sincronizados de un objeto mientras un hilo tiene el bloqueo del objeto class en un metodo estatico sincronizado.
La sentencia synchronized
Una tercera opcion. La sentencia synchronized nos permite ejecutar codigo sincronizado que adquiere el bloqueo de cualquier objeto. Tiene dos partes: un objeto cuyo bloqueo se va a adquirir y una sentencia que se ejecuta cuando se adquiere el bloqueo.
La forma general de la sentencia es:
Synchronized (expr)
{
sentencias;
}
La expresion expr debe tener el valor de una referencia
a objeto. Cuando se obtiene su bloqueo, se ejecutan las
sentencias y luego, al terminar el cuerpo, se libera. Si se
produce una excepcion en el interior, tambien se libera.
La sentencia synchronized tiene varias ventajas. En primer lugar,
permite definir una region de codigo sincronizada mas pequena que
un metodo sincronizado.
En segundo lugar, la sentencia synchronized permite
sincronizarnos sobre objetos distintos de this. Es decir, que
podemos trabajar sobre bloqueos distintos al actual.
Disenos de sincronizacion
Requiere que todos los clientes de un objeto compartido utilicen sentencias synchronized para adquirir el bloqueo del objeto compartido antes de acceder a el.
Es mejor hacer que los objetos compartidos protejan su propio acceso marcando sus metodos como synchronized. Esto hace imposible que un cliente utilice un objeto de forma no sincronizada.
6-comunicacion entre hilos.
Lo que torna posible la
comunicacion entre hilos es la sincronizacion al evitar la
interferencia. El mecanismo de bloqueo de synchronized es
suficiente para evitar que los hilos se interfieran y corrompan
objetos, pero tambien necesitamos una forma de comunicacion entre
ellos.
Wait, notify y notifyall
Con este fin, el metodo wait() deja a un hilo esperando hasta que
ocurre alguna condicion, y los metodos de notificacion notify() y
notifyall() indican a los hilos que esperan que ha ocurrido algo
que podria satisfacer esa condicion.
Estos tres metodos se definen en la clase object y son heredados
por todas las clases pero se aplican a objetos particulares.
Al aplicar estos metodos hay que tener en cuanta:
Al utilizar notifyall(), se despiertan todos los hilos en espera. Notify(), selecciona a un hilo solo para despertarlo.
Puede haber multiples hilos esperando sobre el mismo objeto. Si estos hilos esperan por condiciones diferentes, hay que utilizar notifyall(). Si usamos notify() corremos el riesgo de despertar a un hilo que esta esperando por una condicion diferente a la satisfecha por el hilo.
El uso de notify() es un optimizacion que solo se puede aplicar cuando:
7-finalizacion de la ejecucion de un hilo.
Un hilo que ha empezado a ejecutarse es un hilo vivo. Un hilo
continua vivo hasta que termina, lo cual puede ocurrir de 4
maneras:
Interrupcion de un hilo
Al interrumpir un hilo, mediante interrupt hacemos que
el hilo ponga atencion, generalmente para detener su ejecucion,
si bien una interrupcion no fuerza al hilo
a detenerse.
Interrumpir un hilo normalmente no afectara a lo que esta
haciendo, pero algunos metodos (como sleep y wait) lanzaran una
excepcion.
Espera a que un hilo finalice
Utilizando el metodo join logramos que un hilo espere a que otro
finalice para ejecutarse o continuar su ejecucion. Se usa
generalmente en el main para que este espere mientras se ejecutan
los hilos lanzados; una vez finalizados los hilos, se continua
con la secuencia del main.
8-applets.
Es una aplicacion accesible en un servidor de
internet, que se
transporta por la red, se instala
automaticamente y se ejecuta como parte de un documento web.
Appletviewer
Un applet es una minima aplicacion java disenada para ejecutarse
en un navegador web. Por lo
tanto, no necesita preocuparse por donde se realizan las
llamadas. El applet asume que el codigo se esta ejecutando dentro
de un navegador.
Appletviewer es el minimo navegador que crea un espacio de
navegacion en donde se ejecutara el applet. El navegador espera
como argumento el nombre del fichero html que debe
cargar, ya que no se le puede pasar un programa java
directamente. Este fichero contiene una marca en donde se
especifica el codigo que se debe cargar.
Ej:
<html>
<applet code=holamundo.class width=300 height=100>
</applet>
</html>
Ciclo de vida
de un applet
Primero se carga el applet en el navegador. Luego se carga la
clase que implementara el applet. Despues se crea el marco o el
area grafica en donde actuara el applet. Se llama a los metodos
que hacen funcionar al applet. Y por ultimo se destruye el
applet.
Metodos para escribir applets
Se llama al crearse el applet (solo una vez). La clase applet no hace nada con este metodo. Las clases derivadas deben sobrecargarlo para cambiar todos las inicializaciones que deban realizarse solo una vez. Estas pueden ser: cargar imagenes y sonido, el resize del tamano del applet, asignacion de valores a las variables globales, creacion de hilos, etc.
Las clases derivadas deberian sobrecargar este metodo para hacer una limpieza final. Los applet multithread debera usarlo para matar a los hilos que quedasen activos del applet.
Llamada para activar el applet. Se realiza cada vez que el usuario visita el applet o se cambia su tamano.
Llamada para detener definitivamente el applet. Se llama cuando el usuario sale de la pagina, reduce la ventana a un icono o cierra la ventana del navegador.
Se utiliza para modificar el tamano del applet.
Se llama para refrescar el area de dibujo del applet.
Se llama cuando se necesita actualizar la pantalla realmente. Se limpia el area y se llama a paint().
Se utiliza para redibujar la pantalla. El metodo no deberia ser sobrecargado, y puede o no llevar parametros. Si se encuentra sin parametro, se llama internamente al update(). Y si tiene parametros, se dibuja lo que digan.
Devuelve los valores cargados al applet via la marca applet de html.
Devuelve la ruta en donde se ha recogido el html que contiene al applet.
Indica la ruta en donde se ha cargado el codigo bytecode del applet.
Saca por impresora el mapa de bits del dibujo.
Componentes awt
El awt proporciona varios componentes utiles para construir una
gui para un applet o una aplicacion comun. Entre ellos: controles
basicos, manejo de texto,
despliegue de graficos e imagenes, toma de
decisiones, presentacion de menues y conduccion de dialogos,
entre otros.
Todos los componentes (excepto los menues) son subclases directas
o indirectas de la clase component de awt. Podemos clasificarlos
en :
Son integramente preelaborados y con un aspecto bien definido. Requieren de poco control para que realicen su tarea correctamente.
Pueden abarcar y controlar otros componentes colocados en ellos. Ej: scrollpane.
1-introduccion.
Una forma de razonar para resolver problemas en matematicas se fundamenta en la logica de primer orden. El conocimiento basico de las matematicas se puede representar en la logica en forma de axiomas, a los cuales se la agregan reglas formales para deducir cosas verdaderas (teoremas). Los lenguajes que utilizan esta logica se llaman lenguajes declarativos, porque todo lo que tiene que hacer el programador para solucionar un problema es describirlo via axiomas y reglas de deduccion.
Este concepto de programacion logica esta ligado historicamente a prolog (programmation en logique), desarrollado por la universidad de marseille en 1972. Prolog es utilizado para el desarrollo de aplicaciones de ia debido a su forma de representar el conocimiento, facilitando las busquedas en bd, la escritura de compiladores, la construccion de sistemas expertos, el procesamiento de lenguaje natural, busqueda de patrones y programacion automatica.
2-logica proposicional.
Utiliza una unica regla de inferencia llamada principio de
resolucion, mediante la cual la prueba de un teorema se puede
hacer automaticamente. Esta regla se aplica sobre las formulas
surgidas de la logica de primer orden (lpo) y la demostracion de
teoremas mediante esta regla de inferencia se lleva a cabo por la
reduccion al absurdo.
Esta logica utiliza preposiciones y nexos para expresar verdades o conocimiento. Cuenta con un lenguaje formal medianete el cual es posible representar los predicados, que describen fragmentos de comnocimiento; y cuenta con un conjunto de reglas de inferencia que aplicadas a los predicados permiten derivar en nuevo conocimiento.
3-conceptos elementales.
Constantes individuales
Son simbolos (nombres) que se usan para referir a un objeto
individual fijo. Tambien son llamados sujetos logicos y deben
cumplir que:
Simbolos de predicado
Denotan una propiedad o una relacion entre objetos.
Ej: juan es padre de ana.
Los sujetos logicos son llamados los argumentos del
predicado.
En prolog: es_padre_de(juan,ana)
Aridad
Numero de constantes individuales que necesita el predicado para
formar una oracion. Si la aridad es 1, entoces el predicado es
una propiedad.(ej: mujer(ana)). Si
la aridad es 2 o mas, el predicado es una relacion entre sus
argumentos.
Enunciados atomicos
Es un enunciado formado por un predicado de aridad n seguido por
n-argumentos.
Ej: mayor(juan, ana)
Enunciados atomicos combinados
Son enunciados atomicos simples unidos por conectivos logicos
para generar enunciados mas complejos. Los conectivos logicos
pueden ser: and, or, not, si…entonces
(implicacion).
Predicados con consecuente
Una conclusion s a partir de las premisas p, q, r,…es una
demostracion paso a paso que muestra que s
debe ser verdadera cuando p, q, r,…son todas
verdaderas.
4-introduccion a prolog.
Prolog es un lenguaje declarativo, no imperativo. Es decir, que cada linea del programa es una declaracion y no una orden. Fue hecho para representar y utilizar el conocimiento que se obtiene sobre determinado dominio.
Prolog forma un lenguaje a partir de un alfabeto que contiene solo dos tipos de simbolos:
Calculo de relaciones
Prolog trabaja con relaciones. Para definirlas se utilizan las clausulas de horn. Estas constan de dos partes: consecuente (representa el objetivo que se quiere probar o demostrar) y antecedente (la/s condicion/es que se tienen que verificar para que se cumpla el consecuente).
Afirmacion
s hecho
Solo tiene conclusion. Implica que estamos afirmando algo que no necesita ser probado.
Implicacion
s p, q, r,… regla
Es un predicado con consecuente. Cuando escribimos esto manifestamos que un objeto puede poseer cierta propiedad o que puede existir cierta relacion con otros objetos , si se cumple con la condicion.
Negacion
p, q, r,… objetivo
Es en realidad la clausula que queremos probar del conjunto de sentencias del programa. Para hacerlo, se niega la clausula que se desea probar y se la agrega a las clausulas del programa. Lugo se aplican las reglas de resolucion y, al derivarse una clausula nula, queda demostrado que la clausula original es verdadera.
5-control en prolog.
Por control se entiende la forma en que el lenguaje busca las respuestas. En prolog el control respeta 2 normas:
Para cumplir con cada submeta, estas son reemplazadas por todas y cada una de las reglas que la satisfagan.
Backtracking
Es un mecanismo de busque que utiliza prolog.
Para obtener las soluciones a los objetivos, prolog utiliza esta tecnica de borrado que consiste en reemplazar cada submeta por los consecuentes de todas las reglas que la satisfacen.
Lo que hace es lo siguiente: primero toma la submeta del extremo izquierdo (p) y la borra, esto quiere decir que la reemplaza por la primer regla aplicable que la satisfaga (p1). Luego toma la siguiente submeta (s) y la reemplaza por la primer regla aplicable (s1); y asi con todas las submetas hasta que se llega a un hecho o se alcanza una contradiccion (exito o fracaso). Si se llega a un exito, prolog devuelve ese resultado. Luego de esto, o si se produce un fracaso, prolog vuelve al paso anterior , es decir recupera la submeta original (s), y la reemplaza por la segunda regla aplicable que la satisfaga (s2). Cuando se terminan todas las reglas de esa submetas, prolog retrocede otro paso (vuelve a p) y comienza a aplicar todo el ciclo ahora con la segunda regla aplicable a p (p2).
p p1 s s1
s2
...
sn
p2 s s1
s2
...
sn
El corte
Prolog devuelve los resultados en forma no
determisnista, es decir que devuelve todos los resultados
posibles. Esto significa que se tienen en reserva en todo momento
los diversos puntos de eleccion que se superaron para unposible
retroceso posterior. El corte ( ! ) es una regla que permite
suprimir puntos de eleccion, e incluso, hacer un programa
totalmente determinista.
El borrado de la meta del corte
devuelve verdadero y suprime todos los puntos de eleccion que
estaban almacenados, impidiendo el backtracking a las submetas
anteriores a su aparicion.
6-estructura de un programa en prolog.
Domains
Aqui se definen los objetos y los tipos de datos
correspondientes.
Tipos de datos
Domains
persona=symbol
Predicates
Aqui se definen como seran las relaciones entre los objetos del
domain y el valor que se les asignara a las clauses
Predicates
sabe(persona)
trabaja(persona)
inteligente(persona)
Clauses
Aqui se definen las reglas y hechos que evaluara prolog para
encontrar las soluciones pedidas en el goal.
Clauses
sabe(jose)
sabe(ana)
inteligente(ana)
inteligente(carlos)
inteligente(silvia)
tiene_lindas_piernas(silvia)
trabaja(x) if sabe (x)
Goals
Es la meta u objetivo a buscar. Existen dos tipos"
Goal
trabaja (x) and write ("la persona que trabaja es: ", x) and n1
7-objetos compuestos.
Se usan cuando se requiere mas detalle o informacion. Los hechos
con objetos compuestos son de la forma:
Predicado(argumento, functor(componente1, componente2))
Un functor es un predicado que actua como argumento de otro
predicado. A los argumentos del functor se le dicen
componentes.
Trabaja(juan, panaderia(sucursal, 12))
Cuando se trabaja con objetos compuestos hay que declarar cada
functor y los dominios de todos sus componentes.
Ej:
Domains
lugar = panaderia(nombre_area, numero)
taller (nombre_area, numero, categoria)
nombre, nombre_area, categoria = symbol
numero = integer
Predicates
trabaja(nombre, lugar)
Clauses
trabaja(juan, panaderia(sucursal, 12))
trabaja (ricardo, taller (seccion, 97, c))
8-listas.
Es un conjunto de elementos encerrados entre corchetes y
separados por comas.
[elem1, elem2,..., Elem-n]
Tambien se la puede encontrar como: [h, t] en donde h (head)es el
primer elemento de la izquierda; y t (tail), el resto de la
lista. Asi las maneja prolog a las listas con h y t.
Identificacion de la cabeza y la cola
En un primer lugar el sistema busca una clausula que identifica
el objetivo. Debe coincidir el predicado, el numero de argumentos
tiene que ser el mismo y los propios argumentos deben coincidir
directamente o a traves de las instanciaciones correctas. Cuando
la encuentra, devuelve la clausula con los valores instanciados y
luego parte la lista en cabeza y cola.
Ej:
Empresa
([gerentes, contadores, secretarios])
Agregamos mas detalles...
Empresa([ruiz,
gomez, rodriguez], [wazowsky, baggins], [dupont, salinas,
lione])
Mas detalles...(utilizamos functores)
Empresa
(
gerentes ([ruiz, gomez, rodriguez])
contadores ([wazowsky, baggins])
secretarios ([dupont, salinas, lione])
)
Para manejar listas es conveniente usar funciones recursivas.
Funciones recursivas
Si del lado derecho de una clausula aparece un predicado que
tambien figura en el lado izquierdo, se dice que la clausula
tiene llamado recursivo, es decir se llama a si misma para
verificar que se cumple esa misma propiedad como parte de la
condicion que define la regla, y sobre algun valor posible de sus
variables.
Ej:
Ruta(ciudad1, ciudad2) :- ruta(ciudad2, ciudad1)
1-la programacion funcional en pocas palabras.
La programacion funcional tiene como objeto imitar las funciones
matematicas lo mas posible. Un lenguaje funcional posee la
propiedad matematica de transparencia referencial, lo que
significa que una expresion representa siempre el mismo valor.
Esto permite razonar sobre la ejecucion de un programa y
demostrar matematicamente que es correcto.
Las variables de un lenguaje funcional son como las variables en
algebra. Inicialmente representan un valor desconocido que, una
vez calculado, ya no cambia.
En un programa funcional, el orden de evaluacion de las
subexpresiones no afecta al resultado final, por lo tanto las
subexpresiones pueden ejecutarse en forma paralela para hacer mas
eficiente el programa.
Cuando se aplica una funcion, los argumentos que esta toma pueden
ser:
2-conceptos basicos del lenguaje scheme.
Es un lenguaje de alto nivel, de proposito general, que soporta
operaciones sobre datos estructurados, asi como operaciones sobre
datos convencionales. Es aplicado en ia, compiladores,
editores de pantalla, paquetes graficos, etc.
Esta formado por un pequeno nucleo de formas sintacticas
(una biblioteca de
procedimientos
primitivos) con las que se construyen todas las otras formas.
Cuenta con administracion automatica de memoria,
facilidades de alto nivel de e/s y un sistema de programacion
interactivo.
Los programas son de alta transportabilidad y ejecutables en
maquinas de poco poder.
3-bases de la programacion funcional.
Funciones matematicas
Son una correspondencia entre un dominio y un
rango. Una definicion de funcion especifica el dominio y rango,
de manera implicita o explicita, junto con una expresion que
describe lacorrespondencia.
Las funciones son aplicadas a un elemento del dominio y
devuelven, uno del rango.
Las funciones matematicas no producen efectos laterales. Dado un
un mismo conjunto de argumentos, una funcion matematica producira
siempre el mismo resultado.
Calculo lambda
Separa la tarea de definir una funcion de la de darle un nombre.
Una funcion lambda en una funcion anonima en la que se especifica
los parametros y la expresion de correspondencia.
Ej: la siguiente expresion representa el cubo de
2:
(λ(x)x.x.x)(2)
Funciones de orden mayor
En matematica, algunas funciones complejas se definen en base a
otras funciones. Se dice que una funcion es de orden mayor si
toma alguna funcion como argumento y/o regresa una funcion como
resultado.
Scheme soporta este tipo de expresiones ya que los procedimientos
son objetos de primera clase. Un objeto de primera clase es aquel
que cumple con lo siguiente:
Autor:
Trabajos relacionados
Ver mas trabajos de Programacion |
|
Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.
Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.
Ingrese el e-mail y contraseña con el que está registrado en Monografias.com
|
|