Top Menu

10 de junio de 2013

C++ Mapeo LexicoGrafico Multidimensional

Mapeo Lexico Grafico Multidimensional

Anallicemos la siguiente matriz:

 \begin{bmatrix}
1 & 2 & 3 \\
4 & 5 & 6 \end{bmatrix}

Podemos representarla como :

int A[2][3] = { {1, 2, 3}, {4, 5, 6} };


Una matriz de 2 filas y 3 columnas, es decir 2 dimensiones.

Para obtener la posicion en memoria de cualquiera de sus elementos tenemos la siguiente formula :

A[ i_{1} ,i_{2}] =
base(A) + [ ( (i_{1}-L_{i1})R_1 + (i_{2}-L_{i2}) )*W]

donde :

base(A) Base del Areglo
i_1 Indice del  Arreglo 1
 i_{2} Indice del  Arreglo 2
L_{i1}Limite inferior Arreglo 1
L_{i2}    Limite inferior Arreglo 2
W Tamano en bytes de los elementos

R_1 = ((ls_1 - li_1 )+1) (limite superior 1 - limite inferior 1 ) +1

Para un arreglo multidimensional, es decir con n dimensiones tenemos:

A[ i_{1} ,i_{2},...i_n ] = base(A) + [ ( (i_{3}-L_{i3})R_3*R_2*R_1
                                       + (i_{2}-L_{i2})R_2*R_1+ (i_{1}-L_{i1})R_1
                                                                     +...+(i_{n}-L_{n}))*W]
Ahora veamos el codigo:
Para correrlo (Linux), simplemente crea un archivo llamado MapeoLexicoGrafico.cpp y copia el codigo anterior.
Compilamos el Archivo con el siguiente comando:
g++ MapeoLexicoGrafico.cpp -o Mapeo.out
Corremos el archivo .out con el comando :
 ./Mapeo.out
La Ejecucion se vera asi:

Ingresa la dimension del vector en un intervalo de 1...n
5
Ingresa la base
100
Ingresa el tamano de bytes
1
Ingresa los datos del vector
2
3
2
4
2
Se procesara el siguiente vector : [ 2, 3, 2, 4, 2, ]
Ingresa la imite inferior para el vector 1
1
Ingresa la imite superior para el vector 1
5
Ingresa la imite inferior para el vector 2
1
Ingresa la imite superior para el vector 2
5
Ingresa la imite inferior para el vector 3
1
Ingresa la imite superior para el vector 3
5
Ingresa la imite inferior para el vector 4
1
Ingresa la imite superior para el vector 4
5
Ingresa la imite inferior para el vector 5
1
Ingresa la imite superior para el vector 5
5
 El Resultado es: 1016






24 de abril de 2013

Java: Graficar funciones Matemáticas

Java nos concede una gran variedad de funciones matematicas con su clase Math. Entre estas funciones tenemos valores absolutos, seno, coseno, etc. El siguiente ejemplo muestra como graficar estas funciones en un JFrame.


Lo primero es crear una clase que extienda del JFrame. Al hacer esto se puede sobreescribir el método paint( Graphics g) el cual nos permite dibujar dentro del JFrame. El código para realizar la graficar la funcion seno es el siguiente (la descripción del código se encuentra mas abajo):


La funcion initComponents() simplemente inicializa la ventana, init2() inicializa los valores numericos de la funcion. 

Una función mas importante es la de ValorY() que nos devuelve la posición en Y en la que deberia estar un punto dado una posición X. Finalmente el método paint( Graphics g) el cual sobreescribimos del JFrame simula una serie de puntos en X con un for, obteniendo sus valores en Y con la función anterior y graficandola al dibujar varias lineas pequeñas consecutivamente. 

Para finalizar, al instanciar la clase que extiende de JFrame en el método main se llama automaticamente al metodo paint() el cual permite que se mueste la grafica de nuestra función matematica.

21 de abril de 2013

{Java} Crear Array y Matriz de Objetos

En este post realizaremos lo que es crear un Array o Matriz de Objetos aunque es sencillo a veces se tiende a cometer un pequeño. Pero comencemos:

Como sabemos una arreglo es utilizado para almacenamiento y creo que una imagen vale mas que mil palabras:
Imagen tomada de: http://commons.wikimedia.org
Esto lo podemos usar si queremos un conjunto de objeto que tienen una misma función o caracteristica. 

Por ejemplo si queremos crear un array de 5 botones debemos hacerlo de la siguiente manera.
JButton []botones = new JButton[ 5 ];
Si lo vemos de un aspecto más generalizado sería:
NombreObjeto [] nombreVariable = new NombreObjeto[ cantidad ]; 
cantidad es cualquier valor número que puede ser dado por una variable, método o un valor númerico como tal. El [ ] indica que es un arreglo.

Ahora esto lo único que hace es crear un almacenamiento, ¿cómo así? podras decir, esto es de lo que comentaba al inicio del post, lo anterior crea un lugar para almacernar, en este caso botones pero no tiene botones. Es como si crearamos una caja con divisiones dentro de ella y esos espacios que tenemos dentro de la caja se coloca lo que queremos.
Imagen tomada de: http://bimg2.mlstatic.com/
Espero que con la imagen haya quedado claro :D.

Ahora para agregar botones al array lo haremos de la siguiente manera:
botones[0] = new JButton("Boton 1");
botones[1] = new JButton("Boton 2");
botones[2] = new JButton("Boton 3");
botones[3] = new JButton("Boton 4");
botones[4] = new JButton("Boton 5");
O por medio de un for:
for(int i = 0 ; i < 5 ; i++ ){
    botones[i] = new JButton("Boton " + (i+1));
}
Para una matriz de dos dimensiones de 3x2 es muy similar a un array:
JButton [][]botones = new JButton[ 3 ][ 2 ];
Donde  el primer [ ] (el 3) son las filas y el segundo [ ] son las columnas.
Si fuese la matriz de 3 dimensiones de 5x5x5:
JButton [][][]botones = new JButton[ 5 ][ 5 ][ 5 ];
Donde  el primer [ ] son las filas y el segundo son las columnas y el tercer [ ] es la profundidad.
Imagen tomada de: http://www.wikilearning.com
Para llenar la matriz con el objeto que queremos en este caso un boton es de la siguiente manera:
Para una matriz de 5x5:
botones[0][2] = new JButton(" Boton 0,2 ");
Si lo queremos hacer por medio de un for y llenar todos los espacios con botones es de la siguiente manera:
for(int fila = 0 ; fila < 3 ; fila++ ){
    for(int columna = 0 ; columna < 2 ; columna++ ){
        botones[fila][columna] = new JButton("Boton "+ fila + "," + columna);
    }
}
Y para finalizar un ejemplo:

Lo que hace el ejemplo es que se ingresa cuantas filas y columnas se quieren y al presionar al botón crear, crea una matriz de filas x columas. Y al dar clic al botón creado cambia de color.
 
Descargar ejemplo


Y si quieren ver el código:
Espero que les sea de utilidad. Dios te bendiga.

15 de abril de 2013

C/C++: Ejemplo Sencillo

En la actualidad, el C++ es un lenguaje versátil, potente y general. Su éxito entre los programadores profesionales le ha llevado a ocupar el primer puesto como herramienta de desarrollo de aplicaciones. C++ mantiene las ventajas del C en cuanto a riqueza de operadores y expresiones, flexibilidad, concisión y eficiencia. Además, ha eliminado algunas de las dificultades y limitaciones del C original. El siguiente ejemplo busca guiar a los principiantes con un programa sencillo.

Se usarán los archivos:
  • operaciones.h
  • operanciones.cpp
  • main.cpp
Los archivos *.h son conocidos como headers y contienen todas las definiciones de las variables, métodos y procedimientos tanto publicos, privados y protegidos que se utilizaran dentro de la clase. Si se desea hacer uso de la clase se debe importar el archivo *.h. El siguiente código muestra la definición de este archivo con los metodos de operaciones básicas.


Dentro del archivo operaciones.cpp se codifican los metodos que se definieron el el archivo anterior. Se debe hacer referencia a este archivo haciendole un include. La programación en este caso es basica


Finalmente el archivo main.cpp se manda a llamar a las funciones definidas y codificadas para hacer uso de ellas. Para hacer esto se hace un include a la clase operaciones.h.

Finalmente para obtener el ejecutable solamente se debe compilar con:

g++ operaciones.cpp main.cpp -o archivo.exe        - en el caso de windows si usan Mingw

ó

g++ operaciones.cpp main.cpp -o archivo.out        - en el caso de linux

Obteniendo lo siguiente al ejecutarlo



Un poco de Assembler

En este post veremos una serie de instrucciones útiles que podemos usar en Assembler
Image tomada de http://profile.ak.fbcdn.net

Modo Video

Para tener un modo video en ASM debemos utilizar la interrupción 10h que nos dará un tamaño de 320x200 = 13h
mov ax,0013h
int 10h
 Para salir del modo dos
mov ax,4c00h
int 21h

Leer Teclado

Instrucción que sirve para leer una tecla presionada y después de soltar la tecla el caracter se escribe en pantalla
mov ah,01h
int 21h
El valor (caracter) lo guarda en el registro al

La siguiente instrucción es útilizada para leer una tecla presionada pero no escribe nada en pantalla
mov ah,07h
int 21h
El valor (caracter) lo guarda en el registro al

Esta instrucción verifica si se presiona una tecla o no, solo sirve para eso XD y guarda el valor en el registro al
mov ah,0bh
int 21h
Para comprobar que si se presionó uno tecla se verifica con cmp y el número 255
cmp al,255

Escribir en pantalla

Para escribir un texto en pantalla
mov ah,02    ;Sirve para posicionarse
mov bh,00
mov dh,05h   ;Posicion en y
mov dl,05h   ;Posicion en x
int 10h
mov ah,09
mov dx,texto ;Escribe el texto
int 21h
Donde texto es una variable de la siguiente manera:
texto db “Mugre practica XD$”
El $ siempre se tiene que colocar al final, ¿por qué?, eso si no se XD.

Para escribir un caracter, solo se tiene que colocar el código ascii en este caso el 55 el cual es el número 7
mov dl,55
mov ah,02h
int 21h
Pintar en pantalla un pixel
mov ah,0ch ;Escribir en pantalla
mov al,02  ;Color 0-15
mov bh,0   ;Pagina (0 por default en esta aplicación)
mov cx,15  ;Posicion X
mov dx,16  ;Posicion Y
int 10h
Los macros son parecidos a los métodos
Ejemplo sintaxis:
macro <nombre> <parametro>,<parametro>,....<parametro> {
    ;<codigo>
    ;. . .
    ;. . .
    ;<codigo>
}

Macros

Si se quiere tener etiquetas dentro de los macros se debe declara de la siguiente manera dentro del macro:
local <nombre_etiqueta>
Si esto no se hace y si se llama dos veces al mismo macro entonces lanza un error en el cual indicará que la etiqueta esta repetida.
Ejemplo de macro
macro imprime_caracter {
    local et
    xor si,si    ;limpia el registro si
et:
    mov dx,si
    add dx,48
    mov ah,02h
    int 21h
    inc si
    cmp si,10
    jne et       ;si no es igual a 10 entonces regresa al ciclo
}
Para llamar un macro solo se coloca
imprime_caracter
Y si el macro tiene parametros:
imprime_caracter val,val2
Se puede pasar por parámetro variables como
texto db “parametro $”
También literales como 19, 20, 05h, a2h e incluso registros bx,dx,ax etc.

Colocó dos ejemplos uno sin macros y el otro con macros:
Sin Macros:
Con Macros:
Resultado del ejemplo -Compilado con FASM-
Espero que te sea útil :D. Dios te bendiga.

7 de abril de 2013

Agregar elementos a un JFrame

Creo que agregar un elemento a un JFrame es algo que nos va a tocas que hacer siempre y el concepto es similar para un JPanel, JWindow y JDialog.

Y como siempre lo e dicho hay personas que somos un poco desesperados :D así que acá va el código en general y luego doy -en este mismo post- una explicación un poco más detallada:
import javax.swing.JFrame;
import javax.swing.JButton;

public class Ventana extends JFrame {
 
    public static void main( String []arg ){
        new Ventana();
    }

    public Ventana(){
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400,400);
        //Esto permite que la ventana aparezca al centro
        this.setLocationRelativeTo(null);
        //
        //Para que el JFrame no tenga ningún formato
        //se coloca el Layout del JFrame en null 
        //no hay que olvidarse de colocarle tamaño y posición
        //a los elementos que se agregan
        this.setLayout(null);
        //

        JButton boton = new JButton();
        boton.setText("¡Presioname!");
        //Colocamos la posición y el tamaño
        boton.setBounds(135,150,130,50);
        //Esto se útiliza para agregar el botón al JFrame
        add(boton);

        this.setVisible(true);  
    }
}
El resultado es el siguiente:
Para agregar un elemento lo único que se debe hacer es útilizar el método add que tiene el JFrame.
Por ejemplo:
JFrame frame = new JFrame();
//Esto es necesario sino quieres Layout -formato-
frame.setLayout(null);
JLabel label = new JLabel("Etiqueta");
label.setBounds(10,10,100,75);
frame.add(label)
Al JFrame le puedes agrega Paneles, Botones, Etiquetas, Tablas etc.
Nota: Siempre coloca un tamaño al objeto que quieres agregar, si te preguntas porque es que no muestrá el objeto, es porque no le has dado un tamaño al objeto que quieres agregar.
En este caso útilizo setBounds para dar la posición y tamaño. Puedes también hacerlo con setLocation para indicar la posición y con setSize le indicas el tamaño.
JFrame frame = new JFrame();
//Esto es necesario sino quieres Layout -formato-
frame.setLayout(null);
JLabel label = new JLabel("Etiqueta");
label.setLocation(10,10);
label.setSize(100,75);
frame.add(label)
Pero más que decirte que lo agregas hay una cosa que necesitas saber y es que un JFrame utiliza algo que se llaman Layout y hay Layouts que pueden ser tan simples y otros complejos. Ahora un Layout es como un formato para definirlo en pocas palabras, y lo que se pretende es darnos una ayudadita al hora de agregar elementos. Creo que esto se entenderá un poco mejor colocando como ejemplo el siguiente Layout

BorderLayout -es el que más e usado- tiene un formato como el siguiente:
Imagen tomada de http://docs.oracle.com/
Este es el Layout que tiene por defecto un JFrame. La característica que tiene este Layout es que cuando se agrega un objeto automaticamente toma un tamaño aunque nosotros le hayamos asignado un tamaño, el tamaño que toma variará al tamaño del JFrame.

Por ejemplo si a un JFrame le agrego únicamento un botón entonces el botón tendría el tamaño del JFrame -me imagino que esto ya te a pasado, a mí también me paso :D-. Si hay más objetos entonces variará el tamaño, como en el ejemplo que muestra la imagen. La otra característica es que divide al JFrame en 5 partes, Arriba -PAGE_START-, Abajo -PAGE_END-, Izquierda -LINE_START-, Derecha -LINE_END- y Centro -CENTER-.

Por ejemplo si quires agregar una etiqueta al centro lo debes hacer de la siguiente manera:
JFrame frame = new JFrame();
//Esto es necesario sino quieres Layout -formato-
frame.setLayout(null);
JLabel label = new JLabel("Etiqueta");
label.setBounds(10,10,100,75);
//Se coloca BorderLayout.CENTER para indicar 
//que se debe colocará al centro
frame.add(label, BorderLayout.CENTER);
Si quisieras agregalo a:
  • La derecha: frame.add(label, BorderLayout.LINE_END);
  • La izquierda: frame.add(label, BorderLayout.LINE_START);
  • Arriba: frame.add(label, BorderLayout.PAGE_START);
  • Abajo: frame.add(label, BorderLayout.PAGE_END);
  • Centro: frame.add(label, BorderLayout.CENTER);
Hay varios tipos de Layout así que colocaré el nombre y una imagen. Las imagenes son tomadas de la página oficial y les dejo el link donde explican como usar cada uno de ellos http://docs.oracle.com/javase/tutorial/uiswing/layout/index.html.

BoxLayout
CardLayout
FlowLayout
GridBagLayout
GridLayout
GroupLayout
SpringLayout
Espero que te sea útil. Dios te bendiga.

6 de abril de 2013

Java: Agregar color al texto JEditorPane

Ente algunas de las limitantes que tiene el JTextArea de Java es que no solamente soporta texto plano, sin ningún tipo de modificación. Por lo que si se desea agregar color, imágenes, fonts y otros elementos resulta imposible. Por esta razón existe el componente JEditorPane el cual nos permite agregar texto en formato "text/html", "text/rtf" y texto plano. 

También tiene la funcionalidad de poder abrir páginas web directamente como se ve en la siguiente imagen:


Como se puede observar incluso puede agregar algunos los botones de la página web aunque se limita su funcionalidad. En el ejemplo se mando a llamar a la pagina http://javainutil.blogspot.com y el resultado fue la imagen anterior. El código se puede ver a continuación.

Como se menciona en el título también existe la posibilidad de cambiar el color y font del contenido. En la siguiente imagen se observa el resultado. 

Para poder realizar realizar esto es necesario indicar que el contenido es el tipo "text/html" y cada String que se agregue al texto debe ir dentro de etiquetas html que modifiquen sus propiedades. En este caso, se utiliza un font que le cambia el color y el ultimo caso el tamaño. El código se muestra a continuación.