Calcular determinante de una matriz

Aprovechando que he tenido un poco de tiempo libre mientras trabajaba, he aprovechado para hacer un programilla en Java, para que no se me vaya olvidando el lenguaje.

Esto es una aplicación que crea una matriz de tamanno x tamanno (en este ejemplo, he puesto 6x6), y calcula su respectivo determinante a base de llamar a un algoritmo recursivo que se va llamando a si mismo hasta llegar a una matriz de 2x2.

Dejo el código fuente.

Determinante.java
class Determinante
{
 public static void main(String args[])
 {
  int tamanno = 6, i, j;
  int matriz[][] = new int[tamanno][tamanno];
  for (i=0;i<tamanno;i++)
  {
   for (j=0;j<tamanno;j++)
   {
    matriz[i][j] = (int)(Math.random()*10)-5;
   }
  }

  printmat(matriz);

  System.out.println(determin(matriz));
 }

 public static void printmat(int matriz[][])
 {
  int i, j;
  for (i=0;i<matriz.length;i++)
  {
   for (j=0;j<matriz.length;j++)
    System.out.print(String.valueOf(matriz[i][j]) + "\t");
   System.out.println();
  }
  System.out.println();
 }

 public static int[][] submatrize(int matriz[][], int x, int y)
 {
  int submatriz[][] = new int[matriz.length-1][matriz.length-1];
  int i, j, cur_x=0, cur_y=0;
  for (i=0;i<matriz.length;i++)
  {
   if (i != x)
   {
    cur_y=0;
    for (j=0;j<matriz.length;j++)
    {
     if (j != y)
     {
      submatriz[cur_x][cur_y] = matriz[i][j];
      cur_y++;
     }
    }
    cur_x++;
   }
  }
  return submatriz;
 }

 public static int determin(int matriz[][])
 {
  int deter=0;
  int i, mult = 1;
  if (matriz.length > 2)
  {
   for (i=0;i<matriz.length;i++)
   {
    deter += mult * matriz[i][0] * determin(submatrize(matriz,i,0));
    mult *= -1;
   }
   return deter;
  }else
   return matriz[0][0] * matriz[1][1] - matriz[0][1] * matriz[1][0];
 }
}

Resultados:
5x5
run:
-3        -4        -1        -4        -5        1        
-2        -5        -4        1        -4        -3        
0        0        -3        -3        2        -4        
1        1        0        -4        -3        0        
4        -2        -3        -4        2        2        
0        3        -2        4        3        -4        

9756
BUILD SUCCESSFUL (total time: 0 seconds)

10x10
run:
-5        -3        0        -2        4        -5        0        -2        3        -5        
1        3        -3        1        2        2        -1        0        -4        -4        
-5        -5        3        0        1        -4        3        4        -1        2        
-1        2        -4        -1        4        -2        -3        3        -2        2        
1        -3        -1        1        -1        -2        -4        1        0        1        
2        2        1        1        3        1        3        -5        -4        -1        
3        -3        -4        1        -3        4        1        4        -2        -2        
-5        -5        2        -5        1        -1        1        -3        -5        3        
1        -4        -4        2        -5        -5        1        4        3        4        
0        -5        -3        -5        2        1        -1        -1        -3        -4        

71736511
BUILD SUCCESSFUL (total time: 2 seconds)

A partir de ahi los tiempos de ejecución se disparan

Inactividad temporal

Por una vez que me animo a crear un blog, y a las dos semanas me surge un trabajillo con el que no tendre tiempo para seguir aprendiendo Java, ni para atender al blog (mientras que la temática principal siga siendo Java). Me da bastante rabia que, ahora que parecía estar acomodándome a este lenguaje, tenga que volver a dejarlo de lado. Espero estar de vuelta con Java lo antes posible.

Siguiendo con AWT

Despues de pasarme siguiendo el tutorial que especifiqué en Empezando con AWT, y viendo lo poco que me entero de todo el código que va apareciendo y demás, voy a probar a aprender de los códigos que Casidiablo tiene puestos en su apartado de Java.

He adaptado los códigos de los ejemplos de [GUIs de Java]. He vuelto a hacer la misma aplicación que en Primera aplicación con AWT, el de calcular el máximo común divisor, pero esta vez, en caso de que no se introduzcan números enteros en los campos de texto, no da error.


PruebaJFrame.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PruebaJFrame extends JFrame {
    private int ancho = 300, alto = 170, altofila = 25;
    Dimension entero, medio, tercio, cuarto;
   private JLabel etiqueta1, etiqueta2, etiqueta3;
   private JTextField numero1, numero2;
   private JButton mcdCalc;

   // configurar GUI
   public PruebaJFrame()
   {
      super( "Calcular mcd" );
      entero = new Dimension(ancho, altofila);
      medio = new Dimension((int)Math.floor(ancho / 2),altofila);
      tercio = new Dimension((int)Math.floor(ancho / 3),altofila);
      cuarto = new Dimension((int)Math.floor(ancho / 4),altofila);
      this.setResizable(false);

      // obtener panel de contenido y establecer su esquema
      Container contenedor = getContentPane();
      contenedor.setLayout( new FlowLayout() );

      etiqueta1 = new JLabel("Introduce un número: ");
      etiqueta1.setPreferredSize(medio);
      contenedor.add(etiqueta1);
      numero1 = new JTextField(5);
      numero1.setPreferredSize(medio);
      contenedor.add(numero1);
      etiqueta2 = new JLabel("Introduce un número: ");
      etiqueta2.setPreferredSize(medio);
      contenedor.add(etiqueta2);
      numero2 = new JTextField(5);
      numero2.setPreferredSize(medio);
      contenedor.add(numero2);
      mcdCalc = new JButton("Calcular mcd");
      mcdCalc.setPreferredSize(medio);
      contenedor.add(mcdCalc);
      ManejadorMCD manejarmcd = new ManejadorMCD();
      etiqueta3 = new JLabel("",JLabel.CENTER);
      etiqueta3.setPreferredSize(entero);
      contenedor.add(etiqueta3);
      mcdCalc.addActionListener(manejarmcd);


      setSize( ancho, alto );
      setVisible( true );

   } // fin del constructor

   public static void main( String args[] )
   {
      JFrame.setDefaultLookAndFeelDecorated(true);
      PruebaJFrame aplicacion = new PruebaJFrame();
      aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
   }

   private class ManejadorMCD implements ActionListener
   {
       public void actionPerformed(ActionEvent evento)
       {
           try
           {
               etiqueta3.setText(String.valueOf(mcd(Integer.parseInt(numero1.getText()), Integer.parseInt(numero2.getText()))));
           } catch (NumberFormatException e)
           {
               etiqueta3.setText("Introduzca números enteros, por favor");
           }
       }
   }

   private int mcd(int x, int y)
    {
       if (x % y == 0)
           return y;
       else
           return mcd(y, x % y);
   }
}

El resulstado:

Reparto invitaciones a Diaspora

Mediante el blog de Alejandro (BASHYC), he conseguido una invitacion a esta nueva red social libre llamada Diaspora. De momento, voy a dejar para mañana el indagar por sus funcionalidades, opciones y posibilidades.

El que necesite invitaciones, puede pedirlos aquí mismamente. Tengo habilitada la moderación de comentarios, por lo que podeis poner los e-mails, que no los pienso publicar ;-)

Primera aplicación con AWT

En momentos como este, hecho de menos la época en la que empecé a programar con Visual Basic. Todo era tan fácil... arrastrar campos de texto, hacer doble click en los botones, seleccionar eventos, escribir 3 lineas, y todo funcionaba. En cambio, es mirar lo que he tenido que hacer en Java para escribir un programa super cutre que no hace más que calcular el máximo común divisor, y se me cae el mundo encima. No dudo que haya formas más fáciles de hacerlo, de hecho, ni me he puesto a indagar entre las opciones que puede brindar NetBeans para la realización de interfaces. Lo que he hecho no es más que seguir un tutorial, que tiene pinta de estar bastante anticuado, e ir metiendo modificaciones y un poco de freestyle, pero por lo menos funciona correctamente, siempre que se metan valores válidos en los campos de texto. Próximamente, ya volveré a tocar este código para que funcione bien aunque no se metan valores válidos.

import java.awt.*;

public class AppAWT extends Frame {
    static final int ANCHO = 200;
    static final int ALTO  = 200;
    Dimension filas;
    Label eti1, eti2, lblmcd;
    TextField num1, num2;
    Button calc;

    public AppAWT()
    {
        super("Primera prueba con AWT"); //Ponerle un título a la ventana
        filas = new Dimension(ANCHO,30);
        setLayout(new FlowLayout());
        eti1 = new Label("Numero 1: ");
        num1 = new TextField(4);
        eti2 = new Label("Numero 2: ");
        num2 = new TextField(4);
        calc = new Button("Calcular mcd");
        lblmcd = new Label("",Label.CENTER);
        lblmcd.setPreferredSize(filas);
        Panel fila1 = new Panel();
        fila1.setPreferredSize(filas);
        fila1.add(eti1);
        fila1.add(num1);
        add(fila1);
        Panel fila2 = new Panel();
        fila2.setPreferredSize(filas);
        fila2.add(eti2);
        fila2.add(num2);
        add(fila2);
        Panel fila3 = new Panel();
        fila3.setPreferredSize(filas);
        fila3.add(calc);
        add(fila3);
        Panel fila4 = new Panel();
        fila4.setPreferredSize(filas);
        fila4.add(lblmcd);
        add(fila4);
        pack();
        resize(ANCHO,ALTO);
        show();
    }

    public boolean handleEvent(Event evt)
    {
        if (evt.id == Event.WINDOW_DESTROY)
        {
            System.exit(0);
            return true;
        }
        if (evt.target instanceof Button)
        {
            lblmcd.setText(String.valueOf(mcd(Integer.parseInt(num1.getText()),Integer.parseInt(num2.getText()))));
        }
        return false;
    }

    public static void main(String args[])
    {
        new AppAWT();
    }

    public int mcd(int x, int y)
    {
        if (x % y == 0)
            return y;
        else
            return mcd(y, x % y);
    }
}