Tipos de Abributos

Recordemos algo antes de empezar…

Principios de Encapsulamiento

Este principio dice que todos lo atributo que se relacionan a una clase tiene que estar declarados dentro de la misma clase.

cad

Hoy vamos ver un tema muy importante:

Ocultación de Información

En Java podemos tener varios tipos de atributos dependiendo de que tan disponibles están para nuestro programa.


Public

Es el característica por defecto en Java, que un atributo tenga esta propiedad significa que es posible acceder a el desde fuera  de la clase de la forma:

//Puedo hacer esto
Instancia.Atributo


Private

Que un atributo tenga esta propiedad significa que será imposible acceder a el desde fuera  de la clase de la forma:

//No Puedo hacer esto
Instancia.Atributo


Static

Que un atributo tenga esta propiedad significa que todos los objetos de su misma clase ahora tendrán el mismo valor en ese atributo o en ese método. Es decir que TODOS los objetos de esa clase tendrán un solo atributo.

  • Se coloca después de Public/Private.
  • Son muy comunes para comunicar a varios objetos de una clase.
  • Pueden crear métodos con esta característica y se pueden acceder incluso sin instanciar un objeto.
public static Atributo
private static Atributo

Final

Que un atributo tenga esta propiedad significa que no podrá modificarse el valor de este atributo una vez puesto.

  • Se coloca después de Public/Private.
public final Atributo
private final Atributo

Sin embargo si se coloca en un metodo este metodo ya no se podrá sobrescribir:

public final Metodo
private final Metodo

Protected

Que un atributo tenga esta propiedad significa que solo lo podrán modificar el ó las clases que hereden de el.

  • Se coloca después de Public/Private.
protected Atributo

 

 

 

btn1 btn
btn

Clases y Objetos en Java

Ahora si, hasta ahora Java no se veía muy diferente de C, pero eso esta por cambiar, vengan niños, les contare la historia de cuando Java conoció a POO…

hymym

¡¿No ven su cara de diversión?!


Clases

La clase es un forma de representar un objeto o concepto de la realidad, como una estructura en C. Se crea una clase con la sintaxis:

public class NombreDeClase{
  public  Atributo1;

  private Atributo2;
  private Atributo3;

  public void MuestraX(){
    ...
  }
}

Si tu generas una clase todos los métodos de la misma tendrán acceso a los atributos de la clase.

 

 


Objetos

También se las conoce como instancias.

Son las variables o instancias que creemos de una clase.

clases.png

//Sintaxis Crear un Objeto:
NombreDeClase Instancia;

//Crearlo e Inicializarlo:
NombreDeClase Instancia = new NombreDeClase();

Igualar 2 Objetos

Cuando se igualan 2 objets o que se igualan son sus direcciones de memoria y por lo tanto ahora están enlazados y si se cambia un valor a uno el otro tan sufre este cambio. La orden this.Algo1 hace referencia a su dirección de memoria yes debido a estar que se entrelazan los objetos.


Arrays de Objetos

Sintaxis:

NombreClase[] nombreVector = new NombreClase[tamaño];

 

 

btn1 btn
btn

Try Catch

try

Son una herramienta que evita que un programa se quede congelado o de un error.

 

//SINTAXIS SIMPLE
try {
   CodigoProblematico
   ...
}
catch(Exception Nombre){
   CodigoSolucion
}

//SINTAXIS COMPLEJA
try {
   CodigoProblematico
   ...
}
catch(TipoDeErrores Nombre){
   CodigoSolucion1
}
catch(Exception Nombre){
   CodigoSolucion2
}
finally{
   Código que siempre se ejecuta
}

Donde:

  • CodigoProblematico: Es el código  Peligroso o que daría problemas, al momento de dar problemas se accede a Catch
  • CodigoSolucion1: Si da un problema el código del Try, se deja de ejecutar y se procede a correr esta parte del código y todos felices.
  • CodigoSolucion2: Si da un problema el código del Try, se deja de ejecutar y se procede a correr esta parte del código y todos felices.
btn1 btn
btn

Arrays

Arrays o Vectores

Un vector sería algo muy similar a una lista, ademas que siempre se usan junto con bucles. En Java, un array unidimensional se declara como:

tipo[] nombreVector = new tipo[tamaño];

En Java, el primer elemento de un array es el que posee el índice 0, por lo tanto, un array de 20 elementos posee sus elementos numerados de 0 a 19.


Métodos

En Java los vectores son instancias de una clase, por lo tanto tienen diversos métodos muy útiles:

//Longitud del Vector
nombreVector.length()

String

Un string en Java es mucho más fácil de manejar que en C, incluso se puede:

  • Comparar directamente
  • Añadir más frases con algo tan simple como String + “bla”

Sintaxis:

String nombreDelString;

Métodos

En Java los  Strings son instancias de una clase, por lo tanto tienen diversos métodos muy útiles:

//LONGITUD
nombreDelString.length()

//REGRESAR CHAR EN X POSICION
nombreDelString.CharAt(x)

 

Hay algo curioso con Java, y es que sus strings son inmutables, es decir que no pueden cambiar, así para evitar que andemos creando objetos sin usar por todos lados, cambiamos string por estas clases, que para todo lo demás funcionan más o menos igual:

StringBuffer  //Mas seguro
StringBuilder //Mas rapido

 


Matrices

Es de la forma más sencilla un array de arrays

Sintaxis:

//DECLARACIÓN
tipo[][]nombreMatriz = new tipo[tamañoEnX][tamañoEnY];

//INICIALIZACION
tipo[][]nombreMatriz = {
   {1,2,3}
   {4,5,6}
   …
   {7,8,9}
};

Métodos

En Java las Matrices son instancias de una clase, por lo tanto tienen diversos métodos muy útiles:

//TAMAÑO EN X
nombreMatriz.length

//TAMAÑO EN Y
nombreMatriz[0].length


Tipo Vector

Sintaxis:

Vector<Objeto> Nombre = new Vector<Objeto>();

Métodos

En Java los vectores son instancias de una clase, por lo tanto tienen diversos métodos muy útiles:

//AÑADE AL FINAL DEL VECTOR
nombreVector.add(Atributo)

Tipo ArrayList

Las arraylist son como unos arrays en esteroides , nos permiten hacer mas cosas.

Sintaxis:

ArrayList<Objeto> Nombre = new ArrayList<Objeto>();

//O crearlo con una longitud
ArrayList<Objeto> Nombre = new ArrayList<Objeto>(Longitud);

Manejo de ArrayList

En Java los ArrayList son instancias de una clase, por lo tanto tienen diversos métodos muy útiles:

//Tamaño
listaNumeros.size();

//Obtener un Elemento
listaNumeros.get(i);

//Añade en Posición
listaNumeros.add(int index, Object Elemento);

//Clona un ArrayList
listaNumeros.clone();

//Coloca un Elemento en cierto Lugar
listaNumeros.set(int index, Object Elemento);

//Regresa su forma de Array
listaNumeros.toArray();
btn1 btn
btn

Funciones del Sistema

Para tener más métodos disponibles, es muy útil ver la API de Java


Imprimir por Pantalla

sistem

Se puede usar Print para imprimir o Println para añadir además una nueva línea al final.

System.out.println("Hola Mundo");

Para mostrar el valor de los atributos se usa un + :

System.out.println("El valor de X es "+x);
System.out.println("El valor de X es "+x+" y el de Y: "+y);

 

 


Scanner

scanner

Es una clase y permite obtener información desde el teclado y lo mete dentro de un atributo.

//Primero se importa:
import java.util.Scanner;

//Crear un objeto de la Clase Scanner:
Scanner NombreDelObjeto = new Scanner(system.in);

//Obtener datos con Scanner:
Atributo1 = NombreDelObjeto.nextDato();

 

Depende del tipo de dato que intentes ser el método que vas a usar:

Y nextDato será dependiendo del tipo de dato uno de los siguientes:

  • Int – NextInt();
  • Double – NextDouble();
  • String – NextLine();

 

 


Random

OLYMPUS DIGITAL CAMERA

Permite generar un número aleatorio.

//Primero se importa:
import java.util.Random;

//Crear un objeto de la Clase Random:
private Random NombreDelObjeto = new Random(system.nanotime());

//Obtener un Número Random entre 0 y X:
Atributo1 = NombreDelObjeto.nextInt(X);

 

 

 

btn1 btn
btn

Sentencias de Control

Las sentencias de control son una manera fancy de hablar de los bucles (secciones de nuestro código que se repiten muchas veces)  y las selectivas (cuando el programa decide ejecutar una u otra sección dependiendo de una decisiónasí que empecemos por la primera ¿va?

meme.jpeg

Sentencias Selectivas

IF

La más famosa y fundamental es los IF´s, estos permiten al programa con base si una condición es cierta ejecutar un bloque de código o no hacerlo.

Se ven así:

Diferentes sintaxis de IF

//FORMA BÁSICA
if(condicion){
  sentenciasSiEsVerdad;
}

//COMO OPERADOR TERNARIO
(condicion)? sentenciaVerdad:sentenciaFalsa;

//FORMA IF-ELSE
if(condicion){
  sentenciasSiEsVerdad;
}
else{
  sentenciasSiEsFalso;
}

//FORMA IF-ELSE IF- ELSE
if(condicion1){
  sentenciasSiEsVerdad1;
}
else if(condicion2){
  sentenciasSiEsVerdad2;
}
else if(condicion3){
  sentenciasSiEsVerdad3;
}
else{
  sentenciasSiEsFalsoTodo;
}

Operadores de Comparación

Lo que va dentro de condición, es muy fácil, es una pregunta que tu le harás a la máquina que podrá contestar como un sí o un no.

Deja primero mostrarte qué operadores pueden comparar:

  • != No igual
  • == Igual
  • < Menor que
  • > Mayor que
  • && And
  • || Or
  • <= Menor o igual que
  • >= Mayor o igual que

Otra cosa muy útil de saber es que para C, cualquier valor que sea distinto de cero es verdadero, siendo por tanto falso sólo si el valor cero.

Por lo tanto será verdad siempre que el valor de la variable x sea distinto de cero, sea cual sea el tipo de la variable x.

Por lo tanto podemos terminar con algunos ejemplos de condiciones:

//Ejemplo 1
double pi = 3;
int variableBasura;

if(pi < 4){
  variableBasura = 0;
}

//Ejemplo 2
int numero = 3;

if( numero != 3 ){
  printf("Nunca se va a ejecutar esto");
}

//Ejemplo 3
int condicion = 0;

if(condicion!){
  printf("Esto siempre se va a ejecutar");
}

Así es como la mayoría de los programas que conoces funcionan, veamos ahora la siguiente:


Switch

Son básicamente igual a los if, simplemente que con otra sintaxis (si, se que hay más diferencias técnicas pero no importa), aquí su sintaxis:

switch (variable){
  case const1:
    sentencia;
    ...
    break;

  case const2:
    sentencia;
    ...
    break;

  ...

  default:
   sentencia;
}

Y si, eso es un switch, (¿Ves que no muerde?), total, esta sintaxis de ahí arriba se puede entender muy fácil si te muestro un código con if´s que haría exactamente lo mismo, se vería así:

if(variable == const1){
    sentencia;
    ...
}
else if(variable == const1){
    sentencia;
    ...
}
else if(variable == const2){
    sentencia;
    ...
}
else{
    sentencia;
    ...
}

Ahora vamos a ver un segundo tipo de sentencias de control, los bucles : 3

 


Bubles

WHILE

Este es sin menor duda la forma más básica de un bucle, lo único que hace es que ejecuta un bloque de código una y otra vez mientras una condición sea verdad.

while (condicion){
  sentencias;
}

No puede ser tan fácil, ¿o sí?…
La verdad es que lo es, es por eso que es el bucle más poderoso, pero la verdad es que mucha gente lo acaba usando es un estilo más o menos así:

int i = 0;             //Este es nuestro contador
while (i < tope){      //Lo vamos a seguir haciendo tope veces
  sentencias;          //Ejecutamos algo
i++;                   //Aumentamos el contador en uno
}

Pero el problema es que como te das cuenta resulta poner mucho código para repetir cosas, por eso se inventó un nuevo bucle.


FOR

Este es lo mismo que el bucle while, simplemente con otra sintaxis, es más esta es la sintaxis:

for (inicialización; condición; incremento){
  sentencia;
}

Así el último código que vimos con los whiles, se vería así con for:

for (i=0; i < tope; i++){
  sentencia;
}

Mucho más bonito y organizado ¿verdad?

Perfecto, ya casi terminamos, ya solo falta el final, te mostraré el último bucle, el do while.


DO WHILE

Al contrario que los bucles for y while que comprueban la condición en lo alto de la misma, el bucle do/while comprueba la condición en la parte baja del mismo, lo cual provoca que el bucle se ejecute como mínimo una vez. La sintaxis del bucle do/while es:

do{
  sentencia;
}
while(condicion);


Break y Continue

Las sentencias de control break y continue permiten modificar y controlar la ejecución de los bucles anteriormente descritos.

  • La sentencia break provoca la salida del bucle en el cual se encuentra y la ejecución de la sentencia que se encuentra a continuación del bucle.
  • La sentencia continue provoca que el programa vaya directamente a comprobar la condición del bucle en los bucles while y do/while, o bien, que ejecute el incremento y después compruebe la condición en el caso del bucle for.

 

 

 

btn1 btn
btn

Sintaxis Básica de Java

Comentarios

Antes que nada (y ya para quitarme eso de encima), aquí esta como se escriben los comentarios en Java:

//Comentario de una línea para algo rápido

/** Comentario largo,
*ideal para la Documentación
*/

 


API de Java

Podemos entenderlo como un conjunto de muchísimas clases que ya trae hecha Java para ahorrarnos el trabajo. También las conocen como las librerías de Java.

import java.Bla.Bla

No se preocupen si no le encuentran ningún sentido a esto, solo sigan leyendo.

 


Atributos

En Java, hay varias clases de «variables» que podemos ocupar, por eso en Java se usa el término “Tipos de datos” para englobar a cualquier cosa que ocupa un espacio de memoria y que puede ir tomando distintos valores o características durante la ejecución del programa.

En Java diferenciamos dos tipos de datos:

  • Tipos primitivos, que se corresponden con los tipos de variables en lenguajes como C y que son los datos elementales que hemos citado.
  • Los Tipos Objeto, son mucho más inteligente y te permiten realizar muchas cosas más fácilmente.

También podemos dividir los atributos en dos tipos:

  • Estáticos (es decir que atributos que nunca van a cambiar, también los conocen como MACROS) .
  • Dinámicos (es un atributo que puede variar, así que lo consideramos, valga la originalidad, solo un atributo).

 


Tipos Primitivos

Sin métodos, no son objetos, no necesitan una invocación para ser creados. Fáciles y sencillitos.

A continuación te muestro todos los tipos de datos primitivos disponibles en Java:

Nombre Tipo Ocupa Rango
byte Entero 1 byte -128 a 127
short Entero 2 bytes -32768  a 32767
int Entero 4 bytes 2*109
long Entero 8 bytes Muy grande
float Decimal

simple

4 bytes Muy grande
double Decimal

doble

8 bytes Muy grande
char Carácter

Usa comillas simples

2 bytes
boolean Valor:

true o false

1 byte

 

Una vez que hayas decidido cual de todos estos vas a ocupar, tienes que seguir este sintaxis (si, es muy muy parecida a C).

 


Sintaxis

//FORMA BASICA
TipoDeDato NombreDeDato;

//FORMA DECLARAR VARIAS
TipoDeDato Dato1, Dato2, Dato3;

//FORMA DECLARAR Y INICIALIZAR
TipoDeDato Dato1 = Valor;
TipoDeDato Dato2 = Valor2, Dato3 = Valor3;

 


Tipos Objeto

Con métodos, necesitan una invocación para ser creados.

Tipos de la biblioteca estándar de Java String (cadenas de texto)

Muchos otros (p.ej. Scanner, TreeSet, ArrayList…)

Tipos definidos por el programador Cualquiera que se nos ocurra, por ejemplo Taxi, Autobus, Tranvia.
Arrays Serie de elementos o formación tipo vector o matriz.

Lo consideraremos un objeto especial que carece de métodos.

Tipos envoltorio o wrapper
(Equivalentes a los tipos primitivos pero como objetos…Cool)
Byte
Short
Integer
Long
Float
Double
Character
Boolean

 

 


Operadores

Matemáticos

Símbolo Operación
+ Suma
Resta
* Multiplicación
% Módulo

(Resto de división)

 

Simplificaciones

Forma Simple Forma Compleja
x += y x = x+y
x -= y x = x-y
x *= y x = x*y
x /= y x = x/y
x++ x = x+1
x– x = x-1

 

Lógicos

Operador Significado
!      NOT
>      Mayor que
<      Menor que
==     Igual
&&      AND
||      OR
^     XOR
>=      Mayor o igual que
<=      Menor igual que
!=      No igual

 

Y listo, hemos terminado con la parte más difícil de Java, bueno, al menos la más aburrida, así que para compensarlo, toma, un gatito :3

cat

 

btn1 btn
btn

Introducción a Java

El Lenguaje

java.pngLa principal característica de Java es la de ser un lenguaje compilado e interpretado.

Todo programa en Java ha de compilarse y el código que se genera: bytecodes es interpretado por una máquina virtual. De este modo se consigue la independencia de la máquina (ósea en teoría se puede ejecutar en cualquier Sistema Operativo) , el código compilado se ejecuta en máquinas virtuales que si son dependientes de la plataforma.

Osea…en español.. ¡Que Java no se ejecuta en tu computadora, sino en un programa especial, se «ejecuta» en una maquina virtual y como hay maquinas virtuales de Java para todos los sistemas operativos, Java te permite hacer aplicaciones que funcionen en cualquier computadora del mundo!

¿Para qué usarlo?

Java es un lenguaje orientado a objetos de propósito general. Aunque Java comenzará a ser conocido como un lenguaje de programación de applets que se ejecutan en el entorno de un navegador web, se puede utilizar para construir cualquier tipo de proyecto. 

Java y Seguridad ❤

security-in-javaEn el diseño de Java se prestó especial atención a la seguridad. Existen varios niveles de seguridad en Java, desde el ámbito del programador, hasta el ámbito de la ejecución en la máquina virtual. Con respecto al programador, Java realiza comprobación estricta de tipos durante la compilación, evitando con ello problemas tales como el desbordamiento de la pila. (¡bien!)

¿Qué necesito para empezar a Programar?

  • Muchas ganas y paciencia (en especial al principio)
  • Java JDK: Es las herramientas de desarrollo, puedes descargarlo aquí
  • IDE: Tu programa o «entorno» para programar, yo.. YO estoy enamorado de IntelliJ IDEA 

14693_1 java

 

¿Dudas con esto? Para eso esta Google, así que resuelve blanca palomita ¡Creo en ti! ; )

 

 


Hola Mundo

Antes que nada vamos a quitarnos esto de encima, así se ve un hola mundo en Java:

public class NombreDeClase{
  public static void main(String[] args) {
    System.out.println("Hola Mundo");
  }
}

 

No se ve sencillo ¿verdad? No te preocupes, esta bien, como te imaginas primero vamos a ver un poco de sintaxis para poder entender este desastre de palabras.

Así que es hora de ponernos con la sintaxis.

 

btn1 btn
btn

Fundamentos de POO

La mayoría de los lenguaje de programación creados en los últimos 30 años tiene algo en común, se basan en algo llamado: «Programación Orientada a Objetos»

Antes que nada, no POO (su abreviatura) no es un lenguaje, sino un paradigma.

Ok, ok, ¿Qué demonios es un paradigma?

Paradigma: Forma de Pensar. Así de fácil, POO (ó OOP en inglés, por si algún día te lo encuentras) es una forma de pensar  la programación de manera diferente a lo «tradicional».

¿Y qué es lo tradicional para empezar?

Pues lo tradicional es la Programación Estructurada, donde en general (y digo general porque si, tienen funciones y cosas así, pero no importa ahora) tu programa es como una receta de cocina: Un conjunto de instrucciones y nada más.

poo1

Tú le dictas a la computadora que quieres que haga y lo hace, sencillo, ¿no?

Pues POO no piensa que sea la manera más fácil (y esto es debatible pero eso queda para otro post) POO piensa que es mucho más fácil si hacemos que todo sea como las cosas de la vida real, si hacemos que todo en la computadora sea como …como objetos.

POO piensa diferente, así que agarrate de tu asiento, porque te voy a mostrar una nueva forma de programar completamente diferente a lo que viste arriba:


¿Qué es POO?

Los objetos de los que hablamos no representan cosas abstractas o «raras» su objetivo es representar cosas de la vida real, como los siguientes:

Se ve fácil, ¿no es así?

Bueno, para seguir adelante tenemos que traer a la mesa dos conceptos, y con ellos lo más difícil de memorizar de toda esta lección.


Clase

Una clase es un plano, es una idea, es una descripción, es una definición.

«Describe como es algo, pero no es ese algo en si»

Podemos tener una definición formal en la que una clase es un prototipo o del que contiene una colección de datos (atributos)  un conjunto de operaciones (métodos) con esos datos que manipulan ESOS datos.

Como por ejemplo el plano de una casa:

plano.png

Plano de una casa

O un ejemplo más común de clases son como los siguientes:

clases.png

Y TODA clase define dos cosas en esencia:

  • Atributos: Estas son las características de tu objeto, son sus cualidades en sí.
  • Comportamiento: Son lo que puede hacer, su forma de comportarse.

Por ejemplo si estuviéramos haciendo una clase de una persona podemos tener algo así:

c1

Pero como a los programadores siempre nos encanta darles nombres raros a las cosas, los nombre comunes con los que se describen esto son:

c2

  • Propiedades: Estas son las características de tu objeto, son sus cualidades en sí.
  • Métodos: Son lo que puede hacer, su forma de comportarse.

Una clase define características y comportamientos comunes compartidos por un tipo de objeto. Se parece más a una plantilla cuando se crea cierto tipo de objeto.

Por ejemplo, tenemos un objeto llamado Cris, y clasificamos a Cris como un humano. No sabemos quién es Cris, pero podemos decir que tiene manos, dedos, ojos, etc. porque sabemos que es humano. Lo mismo sucede con otros objetos del mundo real. Podemos decir cuáles son esas cosas apenas sabiendo sus clases.

Otro ejemplo sería Cris es un programador y su jefe es el gerente, pero podemos decir con seguridad que Cris y su jefe son empleados (en esta frase, hay otro conocimiento sobre OOP, hablaremos de esto más adelante), porque ellos Comparten una característica común, que es su descripción del trabajo.

Pero al final de la historia la clase esta describiendo estas cosas de forma abstracta, después de todo una clase solo es una descripción de algo, te dirá que una persona por ejemplo tiene un nombre o una edad pero no te dirá una edad en especial.

Tenemos una cápsula genérica, un prototipo , del cual parten todos las cápsulas u objetos.

plantilla.png

Esta clase es un nuevo tipo de dato.

De la misma manera que no tiene un mísero sentido hacer un plano si no quieres hacer una casa, no tiene sentido hacer una clase a menos que quieras crear un objeto.


Objetos

«La cosa en si pues»

Los objetos son creados a partir de una clase, de hecho otro nombre muy común de estos son instancias, son instancias de una clase.

casa.png

Plano-Clase y Casa-Objeto

Además podemos crear más de un objeto de una misma clase.

Ejemplo:

Vamos a tomar un ejemplo más detallado de una clase:

Clase: Pokemon

Propiedades:
  nombre
  tipo
  elemento
  tamaño
  sonido

Metodos:
  ataque
  llorar

A continuación, permite crear un objeto de estas características y comportamientos:

Propiedades:
  nombre: Pikachu
  tipo: tipo de ratón pokemon
  elemento: electric
  tamaño: pequeño
  sonido: pika, pika

Metodos:
  cry: Produce un "pika, pika"
  ataque: Ataca a otro pokemon.

La programación orientada a objetos (POO) es un método de implementación en el cual los programas están organizados como colecciones cooperativas de objetos, cada uno de los cuales representa una instancia de alguna clase, y cuyas clases son todas miembros de una jerarquía de clases las cuales están unidas a través de relaciones de herencia.


Puntos Clave de POO

Podemos resumir todas las ideas de POO en los siguientes puntos:

  • Encapsulamiento: Recuerda que las clases son como una caja cerrada, todos los métodos y las variables están dentro y toda la información solo puede ser accedido por medio de sus sistemas propios, esto hace que sea de verdad como una caja cerrada, su información solo entra y sale por las formas y de la forma en que la clase quiera. Puede incluso no importante como funciona por dentro, todo lo que necesitas saber es que funciona.

pildora

  • Herencia o Jerarquía:  Esto es clave, la herencia permite que una clase pueda servir como plantilla para la creación de futuras clases, no te preocupes, explicaremos esto a detalle después.

viejo

  • Polimorfismo: Un solo nombre de una clase o método puede representar diferentes implementaciones. Al igual que un Ferrari y un Porsche. Sabemos que los 2 coches tienen motores diferentes y mecanismos diferentes, pero se que ambos son coches y se conducirlos. Eso es polimorfismo, utilizando diferentes implementaciones pero solo una interfaz.

mariposa

 

Otra de las característica en POO en si se vinculan las funciones y los datos, cosa que no exista.

 

 


Principios de POO

columna

Principios son las Columnas en las que se sustenta POO

Toda esta filosofía se puede simplificar en varias columnas, son los pilares que fundamentan este paradigma.

  • Principio de Abstracción

Modelar, este principio dice que POO busca modelar los objetos, busca atraerse y simplificar un objeto de la vida real a solo un par de atributos. En otras palabras, buscaremos transformar un objeto de la vida real en atributos (características) y sus acciones (métodos). Consiste en encontrar las partes fundamentales de un sistema para describirlas de manera simple y precisa.

cat.png

  • Principio de Jerarquía

Todo conocimiento o modulo de tu programa puede ordenarse como un árbol como por ejemplo (transporte-raíz, y las hojas sean autos, barcos, caballos), de que el que esta más abajo hereda todas las características de los de arriba.

  • Principio de Tipificación 

Todo lenguaje en POO esta tipificado, es decir tenemos diferentes TIPOS de datos.

  • Principios de Encapsulamiento

Este principio dice que todos lo atributo que se relacionan a una clase tiene que estar declarados dentro de la misma clase.

poo2

poo1.png

  • Principios de Modularidad
    • Descomposición Modular: Descompón tu programa en módulos para que sea más fácil. Llamadas clases.
    • Composición Modular: Todos estos modelos tiene que estar conectados, son partes de un todo.
    • Comprensibilidad Modular: Tiene que ser posible entender un modulo sin necesidad de conocer los demás módulos.
    • Continuidad Modular: Si realizo cambios (mejoro o corrijo errores) en un módulo no debe de importarle en nada a los demás.
    • Protección Modular: Sin importar que haga, debería ser imposible para mi afectar negativamente a un módulo desde fuera de este.

Podemos también hablar de varias reglas:

Correspondencia Directa: Que podamos ser capaces de mejorar un modulo y el programa debe de funcionar de manera normal.

Pocas Interfaces: Busca que tus clases no se relacionen a menos que sea totalmente necesario, evitando así errores al actualizar un módulo.

Pequeñas Interfaces: Busca que la relación, que la cantidad de atributos sean los menores posibles, busca una mayor independencia de cada módulo.

Interfaces Explicitas: Evita que varios módulos modifiquen un mismo atributo para evitar conflicto de escritura o lectura.

Ocultación de la Información: Solo la clase misma debería poder ser capaz de modificar sus atributos.

 

Y si…no es ni de lejos todo lo que POO pero nos dará una idea bastante exacta de esta nueva idea a de entender la programación.

homer

Ya se POO

Así que listo, regresa por donde has venido y ve a aprender ese lenguaje que tanto quieres, Java, C++ o Python.

Grafos

Historia

El nacimiento del concepto GRAFOS se puede situar, por el año 1730, cuando Euler (matemático) se convirtió en el padre de la Teoría de Grafos al modelar un famoso problema no resuelto, llamado el «problema de los puentes de Königsberg».

g1

Un río con dos islas atraviesa la ciudad. Las islas están unidas, entre sí y con las orillas, a través de siete puentes. El problema consistía en establecer un recorrido que pasará una y solo una vez por cada uno de los siete puentes, partiendo de cualquier punto y regresando al mismo lugar.

Para probar que no era posible, Euler sustituyó cada zona de partida por un punto y cada puente por un arco, creando así un grafo, el primer grafo, diseñado para resolver un problema.

La eficacia de los grafos se basa en su gran poderío de abstracción y la muy clara representación de cualquier relación (de orden, precedencia, etc) lo que facilita enormemente tanto la fase de modelado como de resolución del problema. Gracias a la Teoría de Grafos se han desarrollado una gran variedad de algoritmos y métodos de resolución eficaces que nos permiten tomar una mejor decisión .


Grafo
g2

g3

Llamaremos grafo, G, al par ordenado formado por un conjunto finito no vacío, V , y un conjunto, E, de pares no ordenados de elementos del mismo.

E es una relación

g4

Vértice: Sea un vértice:

g5     

Arista: Llamaremos arista a

g6


Multigrafos

Llamaremos de esta forma a los grafos en los que haya pares de vértices unidos por más de una arista.

PseudoGrafos

Llamaremos pseudografos a los grafos en los que existan aristas cuyos extremos coinciden, es decir, aquellos en los que existan aristas que unen vértices consigo mismos. A tales aristas las llamaremos bucles o lazos.

g10.png


Tipos de Grafos

Grafo Dirigido

Es cuando la relación que la forma NO es simétrica

g11

Grafo No Dirigido

Cuando la relación que forma es simétrica entonces podemos evitar poner las flechas y ver a donde apuntan.

g12.jpg

Se anota entonces los elementos así: 

g13.png


Grafo Conexo

Es en el que para cualquier par de vértices, existe al menos una trayectoria (una sucesión de vértices adyacentes que no repite vértices) de V1  a V2.

g20


SubGrafo

Grafo Original

g21

Subgrafos

g22.jpgg28.jpg

Subgrafo Inducido

g23.jpg


Camino

Es una secuencia ordenada del estilo:

g25.png

también se puede poner como:

g26

Longitud

Podemos definir su longitud como el número de aristas que lo forman.


Recorrido

L es un recorrido si es un camino abierto y no pasa por la misma arista 2 veces.

  • Circuito

Es un camino cerrado y no pasa por la misma arista 2 veces

  • Camino Simple

Es un camino abierto de a  en el menor número de vértices posibles.

  • Ciclo Elemental

Es un circuito donde no se repite ningún vértice (salvo el primero que coincide con el último).


Grafo Asociado

Se puede definir como:

g30.png

Grafo Original

g32.jpg

Grafo Asociado

g31.jpg


Componentes

1

2

 g21  g32

Grado

g40.png

Llamaremos grado o valencia de un vértice al numero de aristas que inciden en  el.

Tenemos entonces:

  • Vértice Aislado, es aquel que no está unida a nada
  • Grafo Regular, cuando todos sus vértices tienen el mismo grado.

En cualquier grafo se verifica:

  • La suma de todos sus grados es igual al doble del numero de sus aristas.
  • El numero de vertices de grado impar es par.

 

Un lazo vale por 2 para los grados

 


Recorrido  y Circuito Euleriano

Es el recorrido o circuito donde pasa por todas las aristas sin repetir ningún vértice más que el inicial y el final.

Así definimos un que un grafo es euleriano si es que existe un recorrido euleriano.

Si un grafo es conexo entonces existe un:

  • Circuito Euleriano ssi todos sus vértices son de grado par.
  • Recorrido Euleriano ssi tiene exactamente 2 vértices de grado impar.

 


Grado de Entrada y Salida

Grado de salida de un grafo es la suma de los los grados individuales y así para la entrada.

Un grafo dirigido conexo tiene un:

  • Circuito Euleriano ssi:

Grado de Salida es igual al de entrada

  • Recorrido Euleriano ssi existe se cumplen estas 3 cosas:
    • Hay un vértice con un grado más de entrada que de salida
    • Hay un vértice con un grado más de salida que de entrada
    • Todos los demás tienen el mismo grado

 


Recorrido  y Circuito Hamiltoniano

Es el recorrido o circuito donde pasa por todas los vértices sin repetir ningún vértice más que el inicial y el final.

Así definimos un que un grafo es euleriano si es que existe un recorrido euleriano.

Si un grafo es conexo entonces existe un:

  • Ciclo Hamiltoniano: Un ciclo simple en un grafo o multigrafo G se dice que es de Hamilton, si contiene a todos los vértices de G.

Esto es un poco complejo de explicar, pero ahí vamos:

Vamos a quitar ciertos vértices, y vamos a ver el subgrafo inducido de los que faltan, el número de componentes de este nuevo grafo es debe ser igual o menor al número de vértices que quitamos.

Sea U un subconjunto no vacío de V  y sea c(G\U) el numero de componentes conexas del subgrafo G\U  entonces la condicion necesaria es c(G\U)  = |U|

 


Isoformismo

De manera compleja es:

Dos grafos se dice que son isomorfos cuando existe una relación biyectiva entre los conjuntos de sus vértices que conserva la adyacencia.

De manera coloquial:

Son los mismos, mismas aristas y mismos vértices

image28

 


Algoritmo de Camino más Corto

(Algoritmo de Dijkstra)
g51.gif

Los pasos son:

Inicializar todas las distancias en D con un valor infinito relativo ya que son desconocidas al principio, exceptuando la de x que se debe colocar en 0 debido a que la distancia de x a x sería 0.

  1. Sea a = x (tomamos a como nodo actual).
  2. Recorremos todos los nodos adyacentes de a, excepto los nodos marcados, llamaremos a estos nodos no marcados vi.
  3. Para el nodo actual, calculamos la distancia tentativa desde dicho nodo a sus vecinos con la siguiente fórmula: dt(vi) = Da + d(a,vi). Es decir, la distancia tentativa del nodo ‘vi’ es la distancia que actualmente tiene el nodo en el vector D más la distancia desde dicho el nodo ‘a’ (el actual) al nodo vi. Si la distancia tentativa es menor que la distancia almacenada en el vector, actualizamos el vector con esta distancia tentativa. Es decir: Si dvi) < Dvi → Dvi = dt(vi)
  4. Marcamos como completo el nodo a.
  5. Tomamos como próximo nodo actual el de menor valor en D (puede hacerse almacenando los valores en una cola de prioridad) y volvemos al paso 3 mientras existan nodos no marcados.

 

 


Árboles

 

Un árbol es un grafo que:

  • Es dirigio
  • Es conexo
  • Todos los vértices tienen grado de entrada 1 excepto  un vértice

g52.jpg

Árboles Binario

  • Máximo 2 hijos
  • Se distingue entre hijo derecho o izquierdo

g53.png

 


Recorridos

Podemos recorrer un árbol binario de muchas maneras:

Anchura

Procesamos todos los elementos a la vez un nivel y luego pasamos al siguiente nivel:

anchura

Pero hay otra forma, por profundidad, estos son muy interesantes y conocidos, así que se los dejo:

Profundidad

PreOrden

  1. Primero se procesa la raíz
  2. Procesamos el árbol izquierdo
  3. Procesar el árbol derecho
preorden

Proceso

arbol

Resultado


InOrden

  • Procesamos el árbol izquierdo
  • Primero se procesa la raíz
  • Procesar el árbol derecho
inorden

Proceso

arbol

Resultado


PostOrden

  • Procesamos el árbol izquierdo
  • Procesar el árbol derecho
  • Primero se procesa la raíz

postorden

arbol-34

 

 

 

btn1 btn
btn