lunes, 19 de octubre de 2009

Examen!



El conjunto de las palabras en {a, b} tales que toda a est´a precedida por alguna
b, como por ejemplo “"”, “b”, “bba”, “babaa”, etc.


Este programa acepta palabras que contengan solo a y b en su lenguaje, con la unica condicion es que por cada a que coloquemos siempre debe de haber una b:





Palabras aceptadas: b, ba, bab, baba, bababa, bbabbabb etc.




No aceptadas: a, ab, abb, ababaa, abbba, etc.




Con el siguiente automata finito:







Y la Tabla de Transiciones:


Estado a b FC


1 2 3 A

2 2 2 E

3 4 3 A

4 2 3 A





public class Lexico {
public String comprueba(String palabra)
{
String nuevacadena=palabra+ '%';
int tam=nuevacadena.length();
String resultado=null;
int mat [][]=new int [5][3];

// TABLA DE TRANSICIONES

// A B FC
mat[0][0]=2; mat[0][1]=3; mat[0][2]=90;
mat[1][0]=2; mat[1][1]=2; mat[1][2]=90;
mat[2][0]=4; mat[2][1]=3; mat[2][2]=100;
mat[3][0]=2; mat[3][1]=3; mat[3][2]=100;


//comienza el ciclo, donde compara cada una de las letras de la palabra.
int reng=1, colu=0;
try
{
for(int i=0;i {
reng=reng-1;



if(nuevacadena.charAt(i)=='a')
{
colu=0;
reng=mat[reng][colu];

}

if(nuevacadena.charAt(i)=='b')
{
colu=1;
reng=mat[reng][colu];

}


if(nuevacadena.charAt(i)=='%') //Marca el fin de cadena
{
nuevacadena=palabra;
colu=2;
if(mat[reng][colu]==100)
{
resultado= "Cadena Valida";
}
else
resultado= "Cadena Invalida";

}
}
}catch (ArrayIndexOutOfBoundsException exc)
{
}
return resultado;
}

}


Programación del botón:


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
JOptionPane.showMessageDialog(null, jTextField1.getText());
Lexico app= new Lexico();
jTextField2.setText(app.comprueba(jTextField1.getText()));
}


Tarea

Hacer el atomata finito y programa de la siguiente expresion regular:

ER (_ letra) (letra numero _)*
Ademas debe aceptar palabras reservadas como el for, while do, break.




package Javaapplet2;

import javax.swing.JOptionPane;

/**
*
* @author Carlos Alfredo
*/
public class Lexico2 {
public String comprueba(String palabra)
{
String nuevacadena=palabra+ '%';
int tam=nuevacadena.length();
String resultado=null;

int mat [][]=new int [5][4];

// TABLA DE TRANSICIONES

// l N - FC
mat[1][0]=2; mat[1][1]=4; mat[1][2]=2; mat[1][3]=90;
mat[2][0]=3; mat[2][1]=3; mat[2][2]=3; mat[2][3]=100;
mat[3][0]=3; mat[3][1]=3; mat[3][2]=3; mat[3][3]=100;
mat[4][0]=4; mat[4][1]=4; mat[4][2]=4; mat[4][3]=90;


//comienza el ciclo, donde compara cada una de las letras de la palabra.
int x=0,y=0,z;

for(int i=0;i<1;i++) z="i;" z="z+1;" z="z+1;" x="1;" z="i;" z="z+1;" x="2;" z="i;" z="z+1;" z="z+1;" z="z+1;" z="z+1;" x="3;" k="k+1;}" z="i;" z="z+1;" z="z+1;" z="z+1;" z="z+1;" x="4;" ren="1," col="0;" y="0;" reng="1,colu=" i="0;i {

if(Character.isLetter(nuevacadena.charAt(i)))
{
colu=0;
reng=mat[reng][colu];
}
if(Character.isDigit(nuevacadena.charAt(i)))
{
colu=1;
reng=mat[reng][colu];
}
if(nuevacadena.charAt(i)=='-')
{
colu=2;
reng=mat[reng][colu];
}

if(nuevacadena.charAt(i)=='%') //Marca el fin de cadena
{
nuevacadena=palabra;
colu=3;
if(mat[reng][colu]==100)
{
resultado= "Cadena Valida";
}
else
resultado= "Cadena Invalida";

}
}
}
}catch (ArrayIndexOutOfBoundsException exc)
{
}
return resultado;
}

}

Creacion del applet :

Programacion del boton:


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
JOptionPane.showMessageDialog(null, jTextField1.getText());
Lexico2 app= new Lexico2();
jTextField2.setText(app.comprueba(jTextField1.getText()));
}





miércoles, 14 de octubre de 2009

Programa automata

Bueno aqui les dejo el codigo de un atomata, este solo lee palabras comenzadas con letras separadas por signos como el * y el +.


/*
* To change this template, choose Tools Templates
* and open the template in the editor.
*/

package automata;
import java.io.*;

/*
* @author Carlos Alfredo
*/

public class automata
{
public static void main(String args[]) throws IOException
{
String cadena;
String cadena2;

try
{

BufferedReader n=new BufferedReader(new FileReader("Palabra.txt")); //Aqui lee el archivo donde se almacena las palabras
while((cadena=n.readLine())!=null){
//cadena=n.readLine();
comprueba(cadena);
}

}
catch(FileNotFoundException e)
{
System.out.println("No se pudo leer el archivo");
}
}

public static void comprueba(String palabra)
{
String nuevacadena=palabra+ '%';
int tam=nuevacadena.length();

int mat [][]=new int [8][5];

// TABLA DE TRANSICIONES

// L N + * FC
mat[1][0]=2; mat[1][1]=2; mat[1][2]=4; mat[1][3]=4; mat[1][4]=90;
mat[2][0]=5; mat[2][1]=6; mat[2][2]=3; mat[2][3]=3; mat[2][4]=100;
mat[3][0]=2; mat[3][1]=2; mat[3][2]=7; mat[3][3]=7; mat[3][4]=90;
mat[4][0]=4; mat[4][1]=4; mat[4][2]=4; mat[4][3]=4; mat[4][4]=90;
mat[5][0]=5; mat[5][1]=5; mat[5][2]=5; mat[5][3]=5; mat[5][4]=90;
mat[6][0]=6; mat[6][1]=6; mat[6][2]=6; mat[6][3]=6; mat[6][4]=90;
mat[7][0]=7; mat[7][1]=7; mat[7][2]=7; mat[7][3]=7; mat[7][4]=90;

//comienza el ciclo, donde compara cada una de las letras de la palabra.
int reng=1,colu=0;
try
{
for(int i=0;i {
if(Character.isLetter(nuevacadena.charAt(i)))
{
colu=0;
reng=mat[reng][colu];
}
if(Character.isDigit(nuevacadena.charAt(i)))
{
colu=1;
reng=mat[reng][colu];
}
if(nuevacadena.charAt(i)=='+')
{
colu=2;
reng=mat[reng][colu];
}
if(nuevacadena.charAt(i)=='*')
{
colu=3;
reng=mat[reng][colu];
}
if(nuevacadena.charAt(i)=='%') //Marca el fin de cadena
{
nuevacadena=palabra;
colu=4;
if(mat[reng][colu]==100)
{
System.out.print(nuevacadena+"\tCadena Valida\n");
}
else
System.out.print(nuevacadena+"\tCadena Invalida\n");
}
}
}catch (ArrayIndexOutOfBoundsException exc)
{
}
}
}

domingo, 20 de septiembre de 2009

Tutorial para la cracion de un applet



Primeramente abriremos el IDE de java, en este caso yo utilice el NetBeans 6.7.1, creamos un proyecto nuevo, seleccionamos Java Application . Despues del lado derecho donde te aparece el glosario de archivos, seleccionaremos donde dice Source Packages y daremos un clic derecho, seleccionaremos New y a continuación seleccionamos el Empty Java File. Después seleccionamos y escribiremos el código correspondiente. En este caso el código fue el siguiente:
import java.awt.Graphics;
import java.applet.Applet;
public class holamundo extends Applet {
public void paint( Graphics g ) {
g.drawString( "Hola Mundo!",25,25 ) ;
}
Este código por sí mismo no funcionara correctamente ya que como no se estableció una clase principal, el programa no sabrá que es lo que debe ejecutar, por lo que deberemos agregarle este código donde realizamos la instancia.
public static void main(String args[]){
holamundo app = new holamundo();
A continuación presionamos el botón Run Main Project para compilar el proyecto, si lo hemos hecho correctamente deberá de aparecer lo siguiente en la parte inferior de nuestro proyecto:


Ahora que nuestro archivo .class ha sido creado con el Applet correspondiente es el momento de crear nuestro archivo en HTML. Primeramente nos dirigiremos hasta la carpeta donde está ubicado nuestro archivo .class para facilitarnos la ruta para enlazar los dos archivos en este caso es:
C:\Documents and Settings\Carlos Alfredo\My Documents\NetBeansProjects\lasthope\build\classes
El nombre de mi archivo .class es holamundo.class. A continuación abriremos nuestro blog de notas y escribiremos el siguiente código:



Ahora nos dirigiremos a la pestaña de archivo y selecciónanos la opción Guardar Como y guardaremos nuestro archivo en la ubicación ya antes mencionada, le asignamos un nombre al archivo y le damos la terminación .HTML.
Y listo, ejecutamos nuestro archivo de HTML y el Applet deberá funcionar correctamente.

domingo, 30 de agosto de 2009

Algoritmos y su compleijidad (Tarea 1)

¿Qué es la compleijidad de los Algoritmos computacionales?

Desde el punto de vista computacional, es necesario disponer de alguna forma de comparar una solución algorítmica con otra, para conocer cómo se comportarán cuando las implementemos, especialmente al atacar problemas "grandes".
La complejidad algorítmica es una métrica teórica que se aplica a los algoritmos en este sentido. Es un concepto que fundamental para todos los programadores, pero sin embargo, a menudo se desconoce por completo. En muchos cursos y libros se elude el tema porque a menudo se considera farragoso.
Pero eso no es necesariamente cierto. La complejidad de un algoritmo es un concepto complicado pero sólo desde un punto de vista estrictamente formal. La obtención y el estudio de la complejidad de un algoritmo requiere ciertamente de unas cuantas destrezas matemáticas que no todos tenemos y la aplicación de una serie de técnicas bastante particulares. Sin embargo, no es un concepto difícil de entender.
Por hacer una similitud acerca de lo complicado que es este concepto, la dificultad de la complejidad es -salvando las distancias- como la de la predicción meteorológica: todos intuimos lo complicado que es hacer una predicción meteorológica... miles de datos, fórmulas, modelos y cálculos... sin embargo, cuando un meteorólogo nos explica con algo de gracia la predicción del tiempo, la podemos entender bastante bien. Ya estamos muy acostumbrados a cosas como borrasca, anticiclón, marejadilla, cota de nieve... Lo mismo pasa en cierto modo con la complejidad: enfrentarnos a un algoritmo para hacer un estudio de su complejidad requiere de un gran esfuerzo. Sin embargo, cuando alguien estudia un algoritmo y nos habla de su complejidad, entender el concepto no es tan complicado.
Entender la complejidad es importante porque a la hora de resolver muchos problemas, utilizamos algoritmos ya diseñados. Saber valorar su valor de complejidad puede ayudarnos mucho a conocer cómo se va a comportar el algoritmo e incluso a escoger uno u otro.
Así que en este artículo, nos vamos a dedicar a intentar exponer qué es la complejidad de un algoritmo desde un punto de vista sencillo y sin pretensiones, intentado distinguir qué impacto tiene el que un algoritmo tenga una u otra complejidad. Y, como de costumbre, adoptamos grandes simplificaciones, con el único ánimo de obtener una visión general de los conceptos. En cuanto a cómo obtener la complejidad de un algoritmo... no nos vamos a meter mucho: los formalismos necesarios quedan totalmente fuera del alcance de éste breve artículo divulgativo. No obstante, si estás interesad@, al final te proponemos algunos artículos y libros sobre el tema.
Primeramente, debemos tener claro qué es un algoritmo. Podemos entender por algoritmo una secuencia de intrucciones cuyo objetivo es la resolución de un problema. El término clave aquí es el de problema.
Existen multitud de problemas de computación que se pueden resolver mediante un algoritmo (aunque algunos pocos no tienen un algoritmo que los solucione :-o )
Bueno... pues para resolver cada problema, podemos obtener más de un algoritmo (propio, por supuesto) que lo solucione... pero... ¿Cuál de ellos es el mejor? Sería conveniente poder aplicar algún tipo de "puntuación" a los algoritmos, y que cuanta más puntuación sacara un algoritmo, pues supondremos que es mejor. Eso es, en cierto modo, la complejidad.
Saber si un algoritmo es mejor que otro puede estudiarse desde dos puntos de vista: un algoritmo es mejor cuanto menos tarde en resolver un problema, o bien es tanto mejor cuanta menos memoria necesite.
A la idea del tiempo que consume un algoritmo para resolver un problema le llamamos complejidad temporal y a la idea de la memoria que necesita el algoritmo le llamamos complejidad espacial.
La complejidad espacial, en general, tiene mucho menos interés. El tiempo es un recurso mucho más valioso que el espacio. (Esto lo podemos ver también en el mundo real: si tienes dinero puedes comprarte una casa más grande, pero no puedes comprarte unos cuantos años más de vida).
Así que cuando hablamos de complejidad a secas, nos estamos refiriendo prácticamente siempre a complejidad temporal.
Bueno... pues ya hemos presentado de manera intuitiva esto de la complejidad: la complejidad de un algoritmo es un "valor", por así decirlo, que nos da una idea de cuánto va a tardar un algoritmo en resolver el problema para el que fue diseñado.

Los diferentes tipos de complejidad:

Sean f y g dos funciones definidas sobre el conjunto de números naturales, f; g : N 􀀀! N.
Definición: El orden de crecimiento de g es menor o igual que el de f, lo cual se denota por
g = O(f), si existe una constante k > 0 tal que g(n) _ kf(n), para todo n 2 N (excepto a
lo sumo un numero _nito de valores).
Ejemplo: si g(n) = 2n2 + 3n 􀀀 5 entonces g = O(n2).
Jerarquía de _ordenes (en orden creciente):
O(1); O(log n); O(n); O(n log n); O(n2); O(n3); O(2n); O(n!); O(nn):
Comparación de tiempos de ejecución (1 segundo por operación elemental):

Un algoritmo de complejidad f es más eficiente que un algoritmo de complejidad g si
f = O(g) y g 6= O(f).
Un algoritmo es eficiente si su complejidad es poli nómica, es decir, O(nk), donde k 2 N.
La complejidad de un problema computacional es la menor de las complejidades de los
Algoritmos que lo resuelven. (Generalmente solo se conocen cotas de la complejidad).
Un problema decisional se clásica como:
Problema de la clase P, si se ha encontrado un algoritmo eficiente (de coste polinomico)
que lo resuelve.
Problema de la clase NP (Nondeterministic Polynomial) si:
En el supósito de tener una prueba o `certificado' de su solución esta puede verificarse en
tiempo polinomico.
La búsqueda de dicha prueba puede que requiera un tiempo exponencial.
P NP pero no se sabe si P = NP (se conjetura que no).

Un problema pi admite una reducción polinomica a un problema _, lo cual se denota por
´ , si toda instancia de _0 puede convertirse en tiempo polinomico en una instancia del
problema.
Un problema decisionales de la clase NP-completo si:
El problema es de la clase NP;
Para todo problema pi de la clase NP se cumple que ´ .
Si se hallase un algoritmo eficiente para resolver un problema de la clase NP-completo
entonces P = NP (se `sospecha' que tal algoritmo no existe).

¿Cómo se mide la complejidad de un algortimo?

En vez de calcular el tiempo exacto que va a tardar nuestro algoritmo… se calcula la cantidad de operaciones en función del tamaño (n).
Por lo general para estimar el tiempo de ejecución, esta función de crecimiento se multiplica por una constante c que representa una estimación del tiempo que la computadora se tarda en realizar una operación.
Como se mide?


En estos tiempos podemos asumir que una PC de escritorio puede realizar aproximadamente 10 a la 9operaciones por segundo. Sin embargo, este indicador no es absoluto dado que unas operaciones son más lentas que otras.