PROGRAMACION ORIENTADA A OBJETOS.




En el mundo de la programación orientada a objetos (POO), un objeto es el resultado de la instanciación de una clase. Una clase es el anteproyecto que ofrece la funcionalidad en ella definida, pero ésta queda implementada sólo al crear una instancia de la clase, en la forma de un objeto. Por ejemplo: dado un plano para construir sillas (una clase de nombre clase_silla), entonces una silla concreta, en la que podemos sentarnos, construida a partir de este plano, sería un objeto de clase_silla. Es posible crear (construir) múltiples objetos (sillas) utilizando la definición de la clase (plano) anterior. Los conceptos de clase y objetos son análogos a los de tipo de datos y variable, es decir, definida una clase podemos crear objetos de esa clase, igual que disponiendo de un determinado tipo de dato (por ejemplo el tipo entero), podemos definir variables de dicho tipo:
int a,b;
( 'int' es un tipo de dato y 'a' y 'b' son variables de tipo entero con las que podemos operar)
Para utilizar la funcionalidad definida en una clase en particular (salvo en las clases abstractas), primeramente es necesario crear un objeto de esa clase. De la misma manera para una persona que desea sentarse, las especificaciones para construir una silla serán de poca utilidad; lo que se necesita es una silla real construida a partir de esas especificaciones. Siguiendo con la analogía anterior, también se puede decir que para hacer operaciones aritméticas, de nada sirve por sí solo el tipo entero (int); para ello necesitamos variables (o constantes) con las que operar.
Estos conceptos son parte de la base teórica de la idea de objeto y clase utilizados en la POO. Los objetos tienen características fundamentales que nos permiten conocerlos mediante la observación, identificación y el estudio posterior de su comportamiento; estas características son:
  • Identidad
  • Comportamiento
  • Estado
En las ramas de las ciencias de la computación más estrictamente matemáticas, el término objeto es usado en sentido puramente matemático para referirse a cualquier "cosa". Esta interpretación resulta útil para discutir sobre teorías abstractas, pero no es suficientemente concreta para servir como definición de un tipo primitivo en discusiones de ramas más específicas como en la programación, que está más cerca de cálculos reales y el procesamiento de información.

 Identidad.

La identidad es la propiedad que permite a un objeto diferenciarse de otros. Generalmente esta propiedad es tal, que da nombre al objeto. Tomemos por ejemplo el "verde" como un objeto concreto de una clase color; la propiedad que da identidad única a este objeto es precisamente su "color" verde. Tanto es así que para nosotros no tiene sentido usar otro nombre para el objeto que no sea el valor de la propiedad que lo identifica.
En programación la identidad de los objetos sirve para comparar si dos objetos son iguales o no. No es raro encontrar que en muchos lenguajes de programación la identidad de un objeto esté determinada por la dirección de memoria de la computadora en la que se encuentra el objeto, pero este comportamiento puede ser variado redefiniendo la identidad del objeto a otra propiedad.

 Comportamiento.

El comportamiento de un objeto está directamente relacionado con su funcionalidad y determina las operaciones que este puede realizar o a las que puede responder ante mensajes enviados por otros objetos. La funcionalidad de un objeto está determinada, primariamente, por su responsabilidad. Una de las ventajas fundamentales de la POO es la reusabilidad del código; un objeto es más fácil de reutilizarse en tanto su responsabilidad sea mejor definida y más concreta.
Una tarea fundamental a la hora de diseñar una aplicación informática es definir el comportamiento que tendrán los objetos de las clases involucradas en la aplicación, asociando la funcionalidad requerida por la aplicación a las clases adecuadas.

 Estado.

El estado de un objeto se refiere al conjunto de los valores de sus atributos en un instante de tiempo dado. El comportamiento de un objeto puede modificar el estado de este. Cuando una operación de un objeto modifica su estado se dice que esta tiene "efecto colateral".
Esto tiene especial importancia en aplicaciones que crean varios hilos de ejecución. Si un objeto es compartido por varios hilos y en el transcurso de sus operaciones estas modifican el estado del objeto, es posible que se deriven errores del hecho de que alguno de los hilos asuma que el estado del objeto no cambiará.

CLASE.
Las clases son declaraciones o abstracciones de objetos, lo que significa, que una clase es la definición de un objeto. Cuando se programa un objeto y se definen sus características y funcionalidades, realmente se programa una clase.
Una clase es un contenedor de uno o más datos (variables o propiedades miembro) junto a las operaciones de manipulación de dichos datos (funciones/métodos). Las clases pueden definirse como estructuras (struct), uniones (union) o clases (class) pudiendo existir diferencias entre cada una de las definiciones según el lenguaje.
La sintaxis típica de una clase es:
class Nombre {
// Variables miembro (habitualmente privadas)

    miembro_1; //lista de miembros 

    miembro_2; 

    miembro_3; 



    // Funciones o métodos (habitualmente públicas)

    funcion_miembro_1( ); // funciones miembro conocidas 

    funcion_miembro_2 ( ); // funciones como métodos 



    // Propiedades (habitualmente públicas)

    propiedad_1;

    propiedad_2;

    propiedad_3;

    propiedad_4;
}



HERENCIA.
Es un mecanismo que permite definir nuevas clases a partir de otras ya definidas de modo que si en la definición de una clase indicamos que ésta deriva de otra, entonces la primera -a la que se le suele llamar clase hija- será tratada por el compilador automáticamente como si su definición incluyese la definición de la segunda –a la que se le suele llamar clase padre o clase base.
Un ejemplo que pone de manifiesto cómo funciona la herencia es el siguiente:
using System;
class Persona
 {
    // Campo de cada objeto Persona que almacena su nombre

    public string Nombre; 
    // Campo de cada objeto Persona que almacena su edad
    public int Edad;     
    // Campo de cada objeto Persona que almacena su NIF

    public string NIF;    

    void Cumpleaños()   // Incrementa en uno de edad del objeto Persona
    {
       Edad++;
    }

    // Constructor de Persona
    public Persona (string nombre, int edad, string nif) 
    {
       Nombre = nombre;
       Edad = edad;
       NIF = nif;
    }
 }

 class Trabajador: Persona
 {

    // Campo de cada objeto Trabajador que almacena cuánto gana
    public int Sueldo;

 Trabajador(string nombre, int edad, string nif, int sueldo)
     : base(nombre, edad, nif)
    {  // Inicializamos cada Trabajador en base al constructor de Persona
       Sueldo = sueldo; 
    }

    public static void Main()
    {
       Trabajador p = new Trabajador(“Josan”, 22, “77588260-Z”, 100000);    
       Console.Write Line? (“Nombre=“+p.Nombre);
       Console.Write Line (“Edad=“+p.Edad);
       Console.Write Line (“NIF=“+p.NIF);
       Console.Write Line (“Sueldo=“+p.Sueldo);
    }
 }
                                          

POLIMORFISMO.


En programación orientada a objetos se denomina polimorfismo a la capacidad del código de un programa para ser utilizado con diferentes tipos de datos u objetos. También se puede aplicar a la propiedad que poseen algunas operaciones de tener un comportamiento diferente dependiendo del objeto (o tipo de dato) sobre el que se aplican.
El concepto de polimorismo se puede aplicar tanto a funciones como a tipos de datos. Así nacen los conceptos de funciones polimórficas y tipos polimórficos. Las primeras son aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de datos de forma indistinta; los tipos polimórficos, por su parte, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no está especificado.
Se puede clasificar el polimorfismo en dos grandes clases:
• Polimorfismo dinámico (o polimorfismo ad hoc) es aquél en el que el código no incluye ningún tipo de especificación sobre el tipo de datos sobre el que se trabaja. Así, puede ser utilizado a todo tipo de datos compatible.
• Polimorfismo estático (o polimorfismo paramétrico) es aquél en el que los tipos a los que se aplica el polimorfismo deben ser explicitados y declarados uno por uno antes de poder ser utilizados.
















BUSQUEDA SECUENCIAL

EXPOSICION.
                                DEFINICION.

Está diseñada para localizar un elemento con ciertas propiedades dentro de una estructura de datos; por ejemplo, ubicar el registro correspondiente a cierta persona en una base de datos, o el mejor movimiento en una partida de ajedrez.

*UTILIZACION*


Si tenemos un vector ya definido con los siguientes datos:

["
aarona","aashta","abelarda","abelia","abigail","abril"] , todos de

tipo String y queremos saber si ya existe el nombre : "Abigail" en nuestro vector entonces tenemos que hacer lo siguiente:

public class BSecuencial {

public static void main(String[] args)
throws IOException {

BufferedReader entrada = new BufferedReader (new InputStreamReader(System.in));
int encontrados=0;
String [] VectorNombres = {"Aarona","Aash

vSe utiliza cuando algún elemento no está ordenado o no puede ser ordenado previamente.
v Consiste en buscar el elemento comparándolo secuencialmente (de ahí su nombre) con cada elemento del arreglo hasta encontrarlo, o hasta que se llegue al final.
v La existencia se puede asegurar cuando el elemento es localizado, pero no podemos asegurar la no existencia hasta no haber analizado todos los elementos del arreglo .
*VENTAJAS Y DESVENTAJAS*
 
v DESVENTAJA.- en un vector de N posiciones este algoritmo va a buscar posición a posición hasta dar con el dato solicitado y en el caso de que no exista pues también va a recorrer todo el arreglo.
v VENTAJA.- Lo bueno de este tipo de búsqueda es que es muy sencillo de implementar.
 
******EJEMPLO********
 
Si tenemos un vector ya definido con los siguientes datos:

["
aarona","aashta","abelarda","abelia","abigail","abril"] , todos de

tipo String y queremos saber si ya existe el nombre : "Abigail" en nuestro vector entonces tenemos que hacer lo siguiente:

public class BSecuencial {

public static void main(String[] args)
throws IOException {

BufferedReader entrada = new BufferedReader (new InputStreamReader(System.in));
int encontrados=0;
String [] VectorNombres = {"Aarona","Aashta","Abelarda","Abelia","Abigail ",
"Abril"};

System.out.print("Digite el nombre que desea buscar: ");
String nombre = entrada.readLine();
// entrada de dato a buscar
 
for (int i=0; i<VectorNombres.length;i++){

if(
nombre.equalsIgnoreCase(VectorNombres[i])){

JOptionPane.showMessageDialog(
null,"Elemento encontrado "+VectorNombres[i],"Encontrado",
JOptionPane.INFORMATION_MESSAGE);
encontrados++;
continue;
}
}

if(encontrados == 1 ){
System.out.println("Fin de busqueda, encontrado "+encontrados+" elemento igual");
}
else{System.out.println("Fin de busqueda, encontrados "+encontrados+" elementos iguales");
}
}
}

METODOS DE ORDENACION.

BURBUJA.
Este método puede trabajar de dos maneras diferentes. Llevando los elementos mas pequeños hacia la parte izquierda del arreglo o bien llevando los elementos mas grandes hacia la parte derecha del mismo.
La idea básica de este algoritmo consiste en comparar pares de elementos adyacentes e intercambiarlos entre si hasta que todos se encuentren ordenados. Se realizan (n-1)pasadas, transportando en cada una de las mismas el menor o mayor elemento a su pocision ideal. Al final de las (n-1)pasadas los elementos del arreglo estarán ordenados.




ORDENACIÓN POR INSERCIÓN DIRECTA.
Es el que generalmente utilizan los jugadores de cartas cuando ordenan estas, de ahí que también se le conoce con el nombre del método de la baraja.
La idea central de este algoritmo consiste en insetar un elemento del arreglo en la parte izquierda del mismo, que ya se encuentra ordenada. Este proceso este proceso se repite desde el segundo hasta el n-esimo elemento.




ORDENACIÓN POR EL MÉTODO SHELL.
Shell propone que las comparaciones entre elementos se efectúen con saltos de mayor tamaño pero con incrementos decrecientes, así, los elementos quedaran ordenados en el arreglo mas rápidamente.


ANÁLISIS DE EFICIENCIA DEL MÉTODO SHELL.
No se ha podido establecer hasta el momento la mejor secuencia de incrementos cuando n es grande. Cabe recordar que cada vez que se propone una secuencia de intervalos es necesario correr el algoritmo para analizar el tiempo de ejecución.

                               

ORDENACIÓN POR EL MÉTODO QUICKSORT.
La idea central de este algoritmo consiste en lo siguiente:
1-. Se toma un elemento x de  una pocision cualquiera de un arreglo.
2-. Se trata de ubicar a X en  la pocision correcta del arreglo, de tal forma que todos elementos que se encuentren  a su izquierda sean menor o iguales a X y todos los elementos que se encuentren a su derecha sean mayor o iguales.
3-. Se repiten los pasos anteriores pero ahora para los conjuntos de datos que se encuentran a la izquierda y a la derecha de la pocision correcta de X en el arreglo.
4-. El proceso termina cuando todos los elementos se encuentran en su pocision correcta en el arreglo.



GRAFOS.

GRAFOS.
Informalmente, un grafo es un conjunto de objetos llamados vértices o nodos unidos por enlaces llamados aristas o arcos, que permiten representar relaciones binarios entre elementos de un conjunto.
Típicamente, un grafo se representa gráficamente como un conjunto de puntos (vértices o nodos) unidos por líneas (aristas).
Desde un punto de vista práctico, los grafos permiten estudiar las interrelaciones entre unidades que interactúan unas con otras. Por ejemplo, una red de computadoras puede representarse y estudiarse mediante un grafo, en el cual los vértices representan terminales y las aristas representan conexiones (las cuales, a su vez, pueden ser cables o conexiones inalámbricas).
Prácticamente cualquier problema puede representarse mediante un grafo, y su estudio trasciende a las diversas áreas de las ciencias exactas y las ciencias sociales.




Tipos de grafos.
Existen dos tipos de grafos los no dirigidos y los dirigidos.
• No dirigidos: son aquellos en los cuales los lados no están orientados (No son flechas). Cada lado se representa entre paréntesis, separando sus vértices por comas, y teniendo en cuenta (Vi,Vj)=(Vj,Vi).
• Dirigidos: son aquellos en los cuales los lados están orientados (flechas). Cada lado se representa entre ángulos, separando sus vértices por comas y teniendo en cuenta <Vi ,Vj>!=<Vj ,Vi>. En grafos dirigidos, para cada lado <A,B>, A, el cual es el vértice origen, se conoce como la cola del lado y B, el cual es el vértice destino, se conoce como cabeza del lado.


                                                   grafo dirigido

grafo no dirigido                                            










ARBOLES EN GENERAL.

Un árbol se puede definir como una estructura jerárquica aplicada sobre una colección de elementos u objetos llamados nodos, uno de los cuales es conocido como raíz. Además se crea una relación o parentesco entre los nodos dando lugar a términos como padre, hijo, antecesor, sucesor, ancestro etc.
Formalmente se define un árbol de tipo T como una estructura homogenea resultado de concatenación de un elemento de tipo T con un numero finito de arboles
disjuntos, llamados subárboles. Una forma particular de un árbol es el árbol vació.








APLICACIONES.
Los arboles se pueden aplicar para la solución de una gran cantidad de problemas. Se pueden utilizar para representar formulas matemáticas, para registrar la historia de un campeonato de tenis,para construir un árbol genealógico etc.
                            




PROPIEDADES.
Todos los nodos son descendientes directos hijos de un mismo nodo padre, son hermanos.
  • Todo nodo que no tiene ramificaciones hijo se conoce con el nombre de terminal u hoja.
  • Grado. Numero de descendientes directos de un determinado nodo.
  • Grado de árbol. Es el max grado de todos los nodos del árbol.
  • Nivel. Es el numero de arcos que pueden ser recurridos para llegar a un determinado nodo.


LONGITUD DE CAMINO INTERNO.
Es la suma de longitudes de camino de todos los nodos de el árbol.
i= nivel del árbol.
h=altura
ni=numero de nodos en el nivel.
LCI= 1*1+2*2+3*4+4*4=33.


LONGITUD DE CAMINO EXTERNO.
X árbol extendido: Es aquel en el que el numero de hijos de cada nodo es igual al grado del árbol de no cumplir con estas características se deben incorporar nodos especiales.

Nodo especiales: reemplazan las ramas vacías o nulas.
LCE: es la suma de tos los nodos especiales.







 Árboles binarios.
Los árboles de grado 2 tienen una especial importancia. Se les conoce con el nombre de árboles binarios. Se define un árbol binario como un conjunto finito de elementos (nodos) que bien está vació o está formado por una raíz con dos árboles binarios disjuntos, llamados subárbol izquierdo y derecho de la raíz.
En los apartados que siguen se considerarán únicamente árboles binarios y, por lo tanto, se utilizará la palabra árbol para referirse a árbol binario. Los árboles de grado superior a 2 reciben el nombre de árboles multicamino.
Árbol binario de búsqueda.- Los árboles binarios se utilizan frecuentemente para representar
conjuntos de datos cuyos elementos se identifican por una clave única. Si el árbol está organizado de tal manera que la clave de cada nodo es mayor que todas las claves su subárbol izquierdo, y menor que todas las claves del subárbol derecho se dice que este árbol es un árbol binario de búsqueda.
Ejemplo:

Operaciones básicas.- Una tarea muy común a realizar con un árbol es ejecutar una determinada operación con cada uno de los elementos del árbol.Esta operación se considera entonces como un parámetro de una tarea más general que es la visita de todos los nodos o, como se denomina usualmente, del recorrido del árbol.
Si se considera la tarea como un
proceso secuencial, entonces los nodos individuales se visitan en un orden específico, y pueden considerarse como organizados según una estructura lineal. De hecho, se simplifica considerablemente la descripción de muchos algoritmos si puede hablarse del proceso del siguiente elemento en el árbol, según un cierto orden subyacente.
Hay dos formas básicas de recorrer un árbol: El recorrido en amplitud y el recorrido en profundidad.
Recorrido en amplitud.- Es aquel recorrido que recorre el árbol por niveles, en el último ejemplo sería:
12 - 8,17 - 5,9,15
Recorrido en profundidad.- Recorre el árbol por subárboles. Hay tres formas: Preorden, orden central y postorden.
Preorden: Raíz, subárbol izquierdo y subárbol derecho.
Orden central: Subárbol izquierdo, raíz, subárbol derecho.
Postorden: Subárbol izquierdo, subárbol derecho, raíz.
Ejemplo:
Preorden: 20 - 12 - 5 - 2 - 7 - 13 - 15 - 40 - 30 - 35 - 47
Orden central: 2 - 5 - 7 - 12 - 13 - 15 - 20 - 30 - 35 - 40 - 47
Postorden: 2 - 7 - 5 - 15 - 13 - 12 - 35 - 30 - 47 - 40 - 20
Ejemplo:
Preorden: / + a b * c d Notación polaca
Orden central: a + b / c * d Notación infija
Postorden: a b + c d * / Notación polaca inversa
Estructura de datos
Variables
Las variables son estructura de datos usados para almacenar información. Hay dos tipos de información que puede ser almacenada: Números y
texto. Antes de usar una variable ésta, deberá primero ser definida:
Dim nombre_de_variable As Tipo
Ejemplo:
Dim
precio As Long
Dim nombre_de_articulo As String





 Transformación de un Árbol Gral. en un Árbol Binario.


  1. Enlazar los hijos de cada nodo en forma horizontal (los hermanos).
  2. Enlazar en forma vertical el nodo padre con el nodo hijo que se encuentra más a la izquierda. Además, debe eliminarse el vínculo de ese padre con el resto de sus hijos.
  3. Rotar el diagrama resultante aproximadamente 45 grados hacia la izquierda, y así se obtendrá el árbol binario correspondiente.




BOSQUE.
Rpresentacion de un conjunto normalmente ordenado de uno o mas arboles generales.





PILAS.


PILA.
Una pila representa una estructura lineal de datos en la que se puede agregar o quitar elementos únicamente por uno de los extremos. En consecuencia, los elementos de una pila se eliminan en orden inverso al que se insertaron; es decir, el ultimo elemento que se mete a la pila es el primero que se saca. Debido a esta característica, se le conoce como estructura LIFO, (el ultimo en entrar es el primero en salir).
Existen numerosos casos prácticos en los que se utiliza el concepto de pila; por ejemplo, una pila de platos, una pila de latas, una pila de libros etc.
Una pila se define formalmente como una colección de datos a los cuáles se puede acceder mediante un extremo, que se conoce generalmente como tope.

OPERACIONES CON PILAS.
La definición de una estructura de datos queda completa al incluir las operaciones que se pueden realizar en ella. Para el caso de las pilas, las operaciones básicas que se pueden llevar a cabo son:
  • Insertar un elemento---push---en la pila.
  • Eliminar un elemento---pop---en la pila.
Y las operaciones auxiliares:
  • pila_vacía.
  • pila_llena.

 Pila_vacía (PILA, TOPE, BAND)
{Este algoritmo verifica si una estructura tipo pila esta vacía, asignando a BAND el valor de verdad correspondiente. La pila se implementa en un arreglo unidimensional. TOPE es un parámetro de tipo entero. BAND es un parámetro de tipo booleano}
  1. si (TOPE=0) {verifica si no hay elementos almacenados en la pila}
 entonces
                Hacer BAND--verdadero {la pila esta vacía}
si no
               Hacer BAND--falso {la pila no esta llena}
     2. { fin del condicional del paso 1} 
  
pila_llena (PILA, TOPE, MAX, BAND)
{ Este algoritmo verifica si una estructura tipo pila esta llena, asignando a BAND el valor de verdad correspondiente. La pila se implementa en un arreglo unidimensional de MAX elementos. TOPE es un parámetro de tipo entero. BAND es un parámetro de tipo booleano}

1. si (TOPE=MAX)
         entonces
                     Hacer BAND----verdadero {la pila esta llena}
          si no
                  Hacer BAND---falso{la pila no esta llena}
2. {fin del condicional del paso 1}





Llamada a Subprogramas.

Cuando se tiene un programa que llama a subprograma, también conocido como modulo o función, internamente se usan pilas para guardar el estado de las variables del programa, así como las instrucciones pendientes de ejecución del subprograma, los valorea almacenados en la pila se recuperan  para continuar con la ejecución del programa en el punto en el cual fue interrumpido.  Además de las variables se recupera la dirección del programa en la que se hizo la llamada, por que a esa pocisión se regresa el control del proceso.

 


RECURSIVIDAD.
La recursion es un recurso muy poderoso que permite expresar soluciones simples y naturales a ciertos tipos de problemas. Es importante recordad que no todos los problemas son naturales recursivos; algunos si lo son y otros no.
La recursion se puede presentar de dos maneras diferentes:
a)  Directa: el programa o subprograma se llama directamente así mismo.
b) Indirecta: el subprograma llama a otro subprograma y este en algún momento, llama nuevamente a primero.


TRATAMIENTO DE EXPRESIONES ARITMÉTICAS.

Un problema interesante en computación consiste en convertir expresiones en notación infija a su equivalente en notación prefija o postfija o prefija.

* Dada la expresión A+B se dice que esta se encuentra en notación infija, porque el operador (+) se encuentra entre dos operadores ( A y B).

* Dada la expresión AB+ se dice que esta se encuentra en notación postfija, porque el operador (+) se encuentra después de los operadores (A y B).

* Dada la expresión +AB se dice que esta se encuentra en notación prefija, porque el operador (+) esta precediendo a los dos operandos.










ORDENACIÓN.

Ordenar significa reagrupar o reorganizar un conjunto de datos u objetos en una secuencia especifica.




PROGRAMA PILA ESTÁTICA.

Import java. util.scanner;
public classs pilaestatica{
public static void main (string argss []){
   int dato;
   int pila []= new int [5];
scanner captura= new scanner (system.in);
for (int tope=0; tope<4; tope++
{
system.out.print\n (proporciones de datos para pila);
dato=captura.next\n+();
pila[tope]=dato;
}
for (int tope=4; tope>4; tope-
system.out.print\n (la pila tiene los siguientes datos¨+ pila
[tope]);
}
}