miércoles, 16 de junio de 2010

PRIMERA TAREA DEL CURSO

Bueno acá les dejo el programa de la primera tarea, el programa solo muestra una ventana que la dividen 2 páneles, el panel superior pintado de gris incluye 5 botones con sus respectivas leyendas, los botones tienen asignado un color distinto cada uno y el botón que está al final es el de salir. Al pulsar cualquier botón(excepto el de salir), el panel inferior cambiará a su respectivo color.

Acá les dejo unas imágenes del programa en ejecución (hagan click en las imagenes para verlas más grandes) :



































Por si quieren probar que el programa funciona acá les dejo el código para que lo puedan copiar:
// librerias usadas en este programa
import javax.swing.JFrame; // ventana
import javax.swing.JPanel; // agrupar y arreglar
import javax.swing.JButton; // boton
import javax.swing.JLabel; // texto no modificable
// clases que permiten acomodar componentes de distintas maneras
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Color;//Libreria para color
// escuchadores y eventos
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
// aqui comienza nuestra clase
public class Practica implements ActionListener {
// todo el codigo va aqui adentro
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();

if (cmd.equals("ROJO")) {// que hacer cuando uno pica al boton Rojo
this.miPanel.setBackground(Color.RED);
return;

}else if(cmd.equals("AZUL")){
this.miPanel.setBackground(Color.BLUE);
return;

}else if(cmd.equals("VERDE")){
this.miPanel.setBackground(Color.GREEN);
return;

}else if(cmd.equals("AMARILLO")){
this.miPanel.setBackground(Color.YELLOW);
return;

}else if (cmd.equals("SALIR")) {
System.exit(1); // salir
}
}
// atributos de la clase Practica
private JPanel miPanel;
private JLabel miTexto;

// constructor de Practica
public Practica(JPanel p, JLabel t) {
this.miPanel = p;
this.miTexto = t;
}

// el metodo principal
public static void main(String[] args) {

// creamos variables dentro del metodo main
JFrame f = new JFrame(); // una ventana nueva

// llamamos los metodos definidos en la libreria
f.setSize(800, 600); // que tan grande
f.setLocation(100, 200); // donde
f.setTitle("Ventana de Triana"); // como se llama

// que pasa cuando lo cierro
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// creamos unos paneles para agrupar elementos
JPanel pARRIBA = new JPanel();//pGridBag=ARRIBA
JPanel pABAJO = new JPanel();//pFlow=ABAJO
JPanel p = new JPanel(); // panel del fondo

// asignar los administradores de acomodo a cada panel
pARRIBA.setLayout(new GridBagLayout());
pABAJO.setLayout(new FlowLayout());
p.setLayout(new GridLayout(2, 2));

// asignar un color de fondo a cada panel para distinguirlos
pARRIBA.setBackground(Color.GRAY);
pABAJO.setBackground(Color.WHITE);
p.setBackground(Color.GRAY);

// manejo del layout gridbag
GridBagConstraints con = new GridBagConstraints();
con.gridx = 1;
con.gridy = 2;
con.gridwidth = 2;
con.gridheight = 3;

JLabel aviso = new JLabel();
JButton rojo = new JButton("Rojo");//Boton"pinta de rojo el panel"
Practica yo = new Practica(pABAJO, aviso);//"Panel que se pintará de rojo"
rojo.addActionListener(yo);
rojo.setActionCommand("ROJO");
pARRIBA.add(rojo, con);

con.gridx = 1;
con.gridy = 5;
con.gridwidth = 2;
con.gridheight = 2;
//---------------------------------------------------------------------
JButton azul = new JButton("Azul");//Boton"pinta de azul el panel"
azul.addActionListener(yo);
azul.setActionCommand("AZUL");
pARRIBA.add(azul, con);

con.gridx = 1;
con.gridy = 8;
con.gridwidth = 2;
con.gridheight = 2;

//----------------------------------------------------------------------

JButton amarillo = new JButton("Amarillo");//Boton"pinta de amarillo el panel"
amarillo.addActionListener(yo);
amarillo.setActionCommand("AMARILLO");
pARRIBA.add(amarillo, con);

con.gridx = 1;
con.gridy = 11;
con.gridwidth = 2;
con.gridheight = 2;
//----------------------------------------------------------------------

JButton verde = new JButton("Verde");//Boton"pinta de Verde el panel"
verde.addActionListener(yo);
verde.setActionCommand("VERDE");
pARRIBA.add(verde, con);

con.gridx = 1;
con.gridy = 14;
con.gridwidth = 2;
con.gridheight = 2;

//----------------------------------------------------------------------
JButton salir = new JButton("Salir");
salir.addActionListener(yo);
salir.setActionCommand("SALIR");
pARRIBA.add(salir, con);

con.gridx = 6;
con.gridy = 7;
con.gridwidth = 1;
con.gridheight = 1;


// poner los paneles auxiliares en el panel del fondo
p.add(pARRIBA);
p.add(pABAJO);

// hacer que este panel sea el contenido de la ventana
f.setContentPane(p);

// hacer que la ventana sea visible
f.setVisible(true);

// salir del programa
return;
} // termina main
} // termina la clase
Practica

martes, 1 de junio de 2010

PUNTOS EXTRA

GRAFO CONEXO.

Un grafo es conexo si y sólo si tiene una única componente conexa.
Un grafo es conexo si existe algún camino entre todo par de vértices.
El siguiente grafo es conexo ya que de cualquier vértice se puede llegar a cualquier otro através de un camino.


Por ejemplo para llegar del vértice u a x, tengo que ir forzosamente por w, luego puedo ir por z, y después directamente a x, pero imagínense que entre "w" y "z" no hay arista, entonces para llegar de u a x, pasaría igual forzosamente por w, luego podría ir a t, luego por w al final a x.











El siguiente grafo no es conexo porque no existe ningún camino entre los vértices a y c.
Aunque como podemos apreciar en la imagen, hay todavía varios vértices que no se unen.





PUNTOS EXTRA

ISOMORFISMO


Dos grafos son isomorfos cuando tienen la misma estrucura, es decir sus vértices están relacionados de igual forma aunque esten dibujados de manera distinta.

Condiciones necesarias para que dos grafos sean isomorfos:

-Deben tener la misma cantidad de vertices.

-Deben tener la misma cantidad de aristas.

-Deben tener los mismos grados de los vértices.

-Deben tener caminos de las mismas longitudes.

-Si uno tiene ciclos, el otro también debe tenerlos.


Analizaremos si los siguientes grafos son isomorfos:
(Para hacer más grande la imagen hacer click sobre ella)













Vemos que ambos tienen 4 vértices y 5 aristas.

Ahora vamos a definir la función biyectiva, haciendo corresponder los vértices con iguales grados:

f(A)=Y;

f(B)=Z;

f(C)=X;

f(D)=W;

Ahora la definición dice que si entre 2 vértices del primer grafo hay una arista,también debe haber arista entre los vértices del segundo grafo.

Por ejemplo vemos en la imagen anterior que en el G1(grafo 1) entre A y B hay una arista, y también hay una arista entre f(A) y f(B) en el G2(grafo 2).

Esto mismo habría que revisar para cada arista, ordenando convenientemente los vértices.

En la siguiente tabla se observa la cantidad de aristas que unen a cada par de vértices:
(Para ver más grande la imagne hacer click sobre ella)












Por ejemplo nosotros pusimos como función biyectiva f(A)=Y y f(B)=Z, y vemos que del vértice A al vértice B hay una arista, esto en el grafo 1; en el grafo 2 vemos que concuerda con su biyectiva porque del vértice Y al vértice Z también hay una arista.

Como las tablas con sus respectivos valores tienen las mismas cantidades de aristas, podemos asegurar que G1 es isomorfo a G2.

lunes, 31 de mayo de 2010

PUNTOS EXTRAS

Problema de puntos extras del examen ordinario.

Calcule con el algoritmo euclidiano el máximo común divisor de 987654321 y 12345. Presente cada fase del algoritmo e identifique el resultado.

Antes de resolver el máximo común divisor, vamos a ver que dice el algoritmo euclidiano:
Dados 2 segmentos AB y CD (vease a los segmentos como los valores iniciales que nos dieron) con AB>CD, restamos CD de AB tantas veces como sea posible, o lo que es lo mismo una división. Si no hay residuo, entoces CD es el máximo común divisor.

Si se obtiene un residuo EF, éste es menor que CD y podemos repetir el proceso: restamos EF tantas veces como sea posible de CD, o divimos CD entre EF. Si al final no queda un residuo, EF es el máximo común divisor. En caso contrario obtenemos un nuevo residuo GH menor a EF.

El proceso se repite hasta que en algun momento no se obtiene residuo.

Ahora podemos calcular el máximo común divisor de 987654321 y 12345.

Paso 1.
987654321/12345=80004 ---->Residuo=4941

Paso 2.
12345/4941=2---->Residuo=2463

Paso 3.
4941/2463=2---->Residuo=15

Paso 4.
2463/15=164---->Residuo=3

Paso 5.
15/3=5----->Residuo=0





Como vimos anteriormente, el resultado de los valores 15/3 arrojó un residuo =0, eso significa


que MCD(987654321,12345)=3.




Bueno aca les dejo las imágenes con los códigos que programé en c que les mencioné en las asesorías, determinan el MCD de 2 numeros.
Por si quieren probar que funcionan solo hagan click sobre las imágenes para verlas más grandes.


















PUNTOS EXTRAS

Problema 1 del examen de medio curso.

1.Pseudocódigo y diagrama de flujo.
Represente este pseudocódigo en un diagrama de flujo:

entrada n
si (n%2==0)
si (n==2)
imprime "sí"
en otro caso
imprime "no"
i=3
mientras i <=raíz (n)
si (n%i==0)
imprime "no"
sal
i += 2
imprime "sí"

Utlilizando una tabla de valores de variables, simule la ejecución del algoritmo para
las entradas 3,4,17,51,63. Luego, concluya qué hace el algorimto.

Este es el diagrama de flujo que realice en Visio (para verlo más grande hagan click sobre la imagen) :

















TABLA DE VALORES :
















¿Qué hace el algoritmo?

Este algoritmo determina si un número es primo o no.
Para probar el algoritmo realicé el código en dev-C++

Aquí una imagen para los que quieran copiarlo, a mi me funcionó muy bien.
(click a la imagen para hacerla más grande).

martes, 18 de mayo de 2010

PROYECTO #5

Distancias: Algoritmo de Bellman-Ford.

Hola soy Carlos Triana de clase de los jueves y el tema que escogí fue Algoritmo de Bellman-Ford.


DEFINICIÓN DEL ALGORITMO:

El algoritmo de Bellman-Ford genera el camino más corto en un grafo dirigido ponderado (en el que el peso de alguna de las aristas puede ser negativo). El algoritmo de Dijkstra resuelve este mismo problema en un tiempo menor, pero requiere que los pesos de las aristas no sean negativos. Por lo que el algoritmo Bellman-Ford normalmente se utiliza cuando hay aristas con peso negativo. Este algoritmo fue desarrollado por Richard Bellman, Samuel End y Lester Ford.

Si el grafo contiene un ciclo de coste negativo, el algoritmo lo detectará pero no encontrará el camino más corto que no repite ningún vértice, la complejidad de este problema es NP-completo.

EJEMPLO DEL ALGORITMO:

Procedimiento para hallar el camino mínimo de todos los vértices a un único vértice destino.

Grafo inicial





















En esta tabla están representados los nodos con los costos o distancias de sus respectivos nodos vecinos.

Como se ve en la tabla, los nodos que no son vecinos, se pone como costo el símbolo de infinito

















En esta otra tabla se muestran las soluciones parciales que se han ido obteniendo a través de la realización del algoritmo.

(Para que aprecien mejor la imagen hagan click sobre ella)

















En el paso 0, inicializamos todas las distancias o costos mínimos a infinito.

En el paso 1, actualizamos el paso anterior, aplicando las fórmulas. En este caso ponemos la distancia de los nodos que tienen accesos directos al vértice 1, y se la sumamos a la distancia mínima acumulada que hay hasta el vértice oportuno. Aquí esta distancia acumulada sería 0 para 1, debido que sería la distancia a él mismo, e infinito para el resto porque no han sido analizados todavía.

En el paso 2, al saber ya una distancia mínima acumulada desde los nodos 2 y 3 hasta 1, podemos actualizar las distancias mínimas de los nodos 4 y 5.

En los pasos sucesivos, se van actualizando las distancias mínimas acumuladas (D) de los distintos vértices hasta 1, y se van utilizando en los pasos siguientes para optimizar el camino mínimo. El final del algoritmo se da cuando no hay ningún cambio de un paso a otro, cuando ya no se puede encontrar un camino más corto.


Este es el grafo final, con los caminos de costo mínimo de cada nodo.


















PSEUDOCÓDIGO:

Algoritmo de Bellman-Ford (camino mínimo)

Bellman-Ford (G,s)

Inicializar
for cada V perteneciente a V[G]
do d[v]=infinito
p[v]=nulo
p[s]=0

for i=1 to V[G]-1
do for cada arco (u,v) perteneciente a A[G]
Relajacion
if d[v] > d[u] + w(u,v) then
d[v] = d[u] + w(u,v)
p(v) = u

for cada arco (u,v) chequea lazo de peso
negativo
do if d[v] > d[u] + w (u,v) then
return FALSO el algoritmo no converge
return VERDADERO


Recomiendo este applet hecho en java sobre el algoritmo de Bellman-Ford, lo pueden encontrar en la siguiente liga:

http://neo.lcc.uma.es/evirtual/cdd/applets/BellmanFord/Example3.html



APLICACIONES:


El algoritmo de Bellman-Ford se usa en protocolos encaminamiento basados en vector de distancias, por ejemplo el Protocolo de encaminamiento de información (RIP).

También se usa en conjuntos de redes y dispositivos router pc administrados típicamente por un proveedor de servicios de internet (ISP) un ejemplo sería Telmex.


BIBLIOGRAFÍA:

http://es.wikipedia.org/wiki/Algoritmo_de_Bellman-Ford
http://es.wikipedia.org/wiki/Anexo:Ejemplo_de_Algoritmo_de_Bellman_-_Ford
http://neo.lcc.uma.es/evirtual/cdd/tutorial/red/bellman.html
http://neo.lcc.uma.es/evirtual/cdd/applets/BellmanFord/Example3.html
http://personales.upv.es/arodrigu/grafos/Ford.htm


LIGA A LAS DIAPOSITIVAS:



domingo, 25 de abril de 2010

PROYECTO #4

Listas simplemente enlazadas (jueves).

Hola soy Carlos Triana (clase de los jueves) a mi y a mi equipo nos tocó el tema de Listas simplemente enlazadas.

¿Qué hice yo?


Yo me encargue de organizar el equipo, primero preguntamos ¿cuáles eran los temas que más dominábamos?
Según la respuesta nos repartimos las diferentes secciones de la clase.
Después de repartirnos, nos pusimos a trabajar con lo que nos había tocado,
en mi caso me tocó hacer el pseudocódigo y diagrama de flujo, además de las animaciones del algoritmo.

¿Cómo me salió?

La mayoría de los proyectos no me dejan satisfecho por que pienso que puedo hacerlo mejor
pero creo que he hecho bien al estar superando o mejorando cada proyecto, en cada proyecto voy corrigiendo mis errores y lo hago cada vez mejor.
En particular este proyecto #4 creo que lo hice bien y cubrí los aspectos que me tocaban como integrante del equipo.

¿En qué aspectos estoy bien en qué me hace falta mejorar?

Yo creo que estoy bien en los aspectos como la realización de pseudocódigos y diagramas de flujo, además de las explicaciones de aplicaciones reales, pero me hace mucha falta mejorar en el tema de análisis asintótico, hablando de los aspectos como equipo, estoy bien en la organización del mismo y en la discusión con mis compañeros, y me hace falta mejorar en aceptar las críticas de mis compañeros.

¿Ayudo a los demás o me apoyo en ellos?

En esta ocasión me toco ayudar a mis compañeros en los detalles de la presentación, y en la elaboración de algunos de sus temas.
Pero en proyectos pasados eh requerido de la ayuda de mis compañeros.

¿Quién se encarga de coordinar el trabajo?

En este proyecto me tocó a mi, porque era el que más tenía conocimiento de los temas y podía ayudar a mis compañeros si se les presentara algún problema.

¿Qué papel tomo yo?

Tomo el mismo papel que cualquiera de los integrantes de mi equipo, la única diferencia es que yo me encargué de coordinar el trabajo y recopilar la información de todos los miembros de mi equipo para después ponerla en las diapositivas de la clase.

Reflexión personal.

Es agradable trabajar en equipo siempre y cuando sus integrantes trabajen al parejo como en el caso de mi equipo, cuando desarrollas un trabajo en equipo, el resultado tienen los puntos de vista de todos los integrantes y así se enriquece.

Espero les haya gustado mi trabajo.

Bibliografía:

http://www.calcifer.org/documentos/librognome/glib-lists-queues.html
http://www.monografias.com/trabajos28/listas-enlazadas/listas-enlazadas.shtml
http://es.wikipedia.org/wiki/Lista_%28inform%C3%A1tica%29
http://html.rincondelvago.com/estructura-de-datos_7.html
http://www.youtube.com/watch?v=LsER7DVBY5I&feature=related

Enlaces a los blogs de mis compañeros de equipo.

http://raulelchupete.blogspot.com/
http://hiram-algoritmos.blogspot.com/
http://www.gussalas.blogspot.com/

Liga a la presentación.