/*
Calcolo del determinante di una matrice quadrata di ordine
qualsiasi utilizzando le librerie grafiche di java (SWING & AWT)
by rand (rand@hackernetwork.com)
member of Pierotofy's community
http://www.pierotofy.it
*/
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.lang.*;
{
//componenti finestra
private JPanel pannellosopra2
;
private JPanel pannellosopra2_CONTAINER
;
//componenti pannellosopra
//componenti pannellosotto
//componenti x il calcolo del determinante
private double[][] mat; //puntatore x la matrice dinamica
private int matdim; //dimensione matrice
//metodo che inizializza il GUI del prg
public void init()
{
f
= new JFrame("..:::Calcolo determinante.... by rand (rand@hackernetwork.com):::..");
f.setSize(230,120);
centraFrame(230, 120);
content = f.getContentPane();
//pannellosopra
txtPrimo
= new JLabel("Inserisci la dimensione della matrice: ");
txtPrimo.
setForeground(Color.
GREEN);
btnCreaMat
= new JButton("Crea la Matrice!");
pannellosopra.add(txtPrimo,0);
pannellosopra.add(txtDim,1);
pannellosopra.add(btnCreaMat,2);
btnCreaMat.setActionCommand("creamat");
btnCreaMat.addActionListener(this);
pannellosopra.
setBackground(Color.
BLACK);
content.add(pannellosopra,0);
f.setResizable(false);
f.setVisible(true);
}
//metodo che gestisce le azioni
{
if (ae.getActionCommand() == "creamat")
{
try
{
matdim
= Integer.
parseInt(txtDim.
getText());
}
{
JOptionPane.
showMessageDialog(null,
"Non puoi inserire un numero negativo come dimensione x la matrice!! Riprova.",
"Errore...", 0
);
}
JOptionPane.
showMessageDialog(null,
"Dimensione non valida!! Riprova.",
"Errore...", 0
);
}
JOptionPane.
showMessageDialog(null,
"Hai scelto una dimensione x la matrice ingestibile dalla memoria heap del programma!! Riprova con una più piccola.",
"Errore...", 0
);
}
catch(Exception e
) { //x catturare l'eccezione in generale
JOptionPane.
showMessageDialog(null,
"Errore durante la creazione della matrice!! Riprova.",
"Errore...", 0
);
}
finally {
if(matdim<2) { //controllo che la dimensione della matrice non sia inferiore all'ordine 2
JOptionPane.
showMessageDialog(null,
"Non ha senso calcolare il determinante di questa matrice!! Riprova.",
"Errore...", 0
);
txtDim.setText("");
return;
}
}
//alloco dinamicamente la matrce in memoria
mat = new double[matdim][matdim];
//creo la matricegraficamente (uso un grid layout)
pannMatrice.
setLayout(new GridLayout(matdim,matdim
));
//alloco in memoriala matrice che uso x calcolare il determinante
for(int i=0; i<matdim; i++)
{
for(int k=0; k<matdim; k++)
{
//inizializzo la matrice grafica con tutti degli zeri
p.setText("0");
matrice[i][k] = p;
pannMatrice.add(matrice[i][k]);
}
}
//ri-imposto la finestra
content.removeAll();
content = f.getContentPane();
txtTerzo
= new JLabel("Il determinante vale: ");
txtTerzo.
setForeground(Color.
GREEN);
txtDeterm.setEditable(false);
txtDeterm.setBorder(null);
txtDeterm.
setForeground(Color.
RED);
txtDeterm.setText("NON CALCOLATO");
txtDeterm.
setBackground(Color.
BLACK);
btnCalcDeterm
= new JButton("Calcola il Determinante!");
btnCalcDeterm.setActionCommand("getdeterm");
btnCalcDeterm.addActionListener(this);
pannellosotto.add(pannMatrice,0);
pannellosopra2
= new JPanel();
pannellosopra2.add(txtTerzo,0);
pannellosopra2.add(txtDeterm,1);
pannellosopra2_CONTAINER
= new JPanel();
pannellosopra2_CONTAINER.
setLayout(new GridLayout(2,1
));
pannellosopra2_CONTAINER.add(pannellosopra2,0);
pannellosopra2_CONTAINER.add(btnCalcDeterm,1);
pannellosotto.
setBackground(Color.
BLACK);
pannellosopra2.
setBackground(Color.
BLACK);
pannellosopra2_CONTAINER.
setBackground(Color.
BLACK);
content.
setBackground(Color.
BLACK);
content.add(pannellosopra2_CONTAINER,0);
content.add(pannellosotto,1);
//creo il menu della finestra
mHelp.add(iAbout);
JOptionPane.
showMessageDialog(null,
"Determinante Matrice v1.0\nSviluppato da rand (rand@hackernetwork.com)\nCopyleft (C) 2006 by rand (rand@hackernetwork.com)\nMember of Pierotofy's community\nhttp://www.pierotofy.it",
"Info...", 1);
}
});
mb.add(mHelp);
f.getRootPane().setJMenuBar(mb);
f.pack(); //ridimensiono la finestra in base alla grandezzadegli oggetti dinamici presenti
f.setResizable(false);
centraFrame(f.getHeight(), f.getWidth());
f.setVisible(true);
}
if (ae.getActionCommand() == "getdeterm")
{
boolean allzero=true; //variabile che indica se la matrice è stata modificata con valori o no
//controllo se la matrice è stata riempita o no
for(int i=0; i<matdim; i++)
{
for(int k=0; k<matdim; k++)
{
p=matrice[i][k];
//controllo il valore
allzero=false;
mat
[i
][k
]=Double.
parseDouble(t
);
}
}
if(allzero==true) { //se nn è stata riempita (ha ancora gli zeri)
"Devi inserire dei valori x calcolare il determinante!!",
"Errore...", 0);
txtDeterm.setText("NON CALCOLATO");
return;
} else { //se è riempita corertatmente, calcolo il determinante
txtDeterm.
setText(String.
valueOf(getDeterm
()));
/*
//disabilito i campi di testo
for (int i = 0; i < matdim; i++) {
for (int k = 0; k < matdim; k++) {
matrice[i][k].setEnabled(false);
}
}
*/
}
}
}
//merodo che centra il frame sullo schermo
private void centraFrame(int h, int w) {
framePos
=Toolkit.
getDefaultToolkit().
getScreenSize();
f.setLocation ((framePos.width/2)-(w/2), (framePos.height/2)-(h/2));
}
//metodo che restituisce il valore del determinante calcolato
public double getDeterm()
{
return (calcDeterm(mat,matdim));
}
//metodo che permette di calcolare il determinante di una matrice quadrata di ordine qualsiasi
private double calcDeterm(double[][] m, int DIM)
{
double det=0.0;
int rig, col;
if(DIM==1) // se l'ordine della matrice è uno il determinante è l'unico elemento di essa
{
return m[0][0];
}
else
{ //calcolo il determinante in modo ricorsivo, x tutti gli elementi della riga
for(rig=0, col=0; col<DIM; col++)
det
+=Math.
pow(-1.0,
(rig
+col
))*m
[rig
][col
]*calcDeterm
(getSottoMat
(m,rig,col,DIM
),DIM
-1
);
return det;
}
}
//metodo che permette di estrapolare la matrice do ordine inferiore a partire da 1 elemento
private double[][] getSottoMat(double[][] m, int i, int j, int DIM)
{
double[][] newmat = new double[DIM-1][DIM-1];
int rignewmat=0, colnewmat=0, rig, col;
// rig => riga matrice in argomento
// col => colonna matrice in argomento
// rignewmat => riga sotto matrice
// colnewmat => colonna sotto matrice
// i e j => indici dell'elemento ele[i][j] da cui partire
for(rig=0; rig<DIM; rig++)
{
colnewmat=0;
if(rig!=i)
{
for(col=0; col<DIM; col++)
{
if(col!=j)
{
newmat[rignewmat][colnewmat]=m[rig][col];
colnewmat++;
}
}
rignewmat++;
}
}
return newmat;
}
//costruttore classe
randDeterm()
{
super();
init();
}
//metodo main
public static void main
(String[] args
)
{
randDeterm p = new randDeterm();
}
}