PDA

Visualizza la versione completa : [JAVA] Programma per il calcolo del determinante di una matrice quadrata


debbathebest
03-06-2010, 16:20
Ciao ragazzi, visto che al post precedente che ho fatto non mi avete risposto, ritento con questo.
Come da titolo sto facendo un programma per il calcolo del determinante di matrici quadrate, ormai dovrebbe essere finito, tuttavia non funziona.

Ecco il codice, il problema sta sicuramente nei 2 for, ma non riesco a capire quale sia:


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;


public class applet_det extends JFrame
implements ActionListener {

JTextField righe;
JPanel cont_tab;
JLabel titolo;
JTable tabella;
JButton calcola;
int rig_int;
int matrice [][]= new int[rig_int][rig_int];
Font font;
JScrollPane sp;
DefaultTableModel dtm;

public applet_det() {
Container layout = getContentPane();
layout.setLayout(new BorderLayout());
titolo = new JLabel("Calcolo determinante matrici quadrate");
layout.add(titolo, BorderLayout.NORTH);
JPanel corpo = new JPanel();
JPanel header = new JPanel();
JLabel cons = new JLabel("Righe e colonne (max 6):");
header.add(cons);
righe = new JTextField(5);
righe.addActionListener(this);
header.add(righe);
corpo.add(header);
cont_tab = new JPanel();
dtm = new DefaultTableModel();
tabella = new JTable(dtm);
sp = new JScrollPane(tabella);
sp.setVisible(false);
cont_tab.add(sp);
corpo.add(cont_tab);
calcola = new JButton("calcola!");
calcola.addActionListener(this);
corpo.add(calcola);
layout.add(corpo, BorderLayout.NORTH);
this.pack();
}

public void actionPerformed(ActionEvent evt) {
Object src = evt.getSource();
if (src == calcola){ // qui dovrebbe essere il problema
for (int i=0; i<rig_int; i++) {

for (int j=0; j<rig_int; j++) {
//String c=tabella.getModel().getValueAt(i, j).toString();
Object estraz=tabella.getModel().getValueAt(i, j);
matrice[i][j] = Integer.parseInt(estraz.toString());
}
}
long d = det(matrice, rig_int);
JOptionPane.showMessageDialog(null, d , "Calcolo Determinante Matrice", 1);

}
else {
try {
rig_int = Integer.valueOf(righe.getText());
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(null, "Non è ammesso l'inserimento di valori alfanumerici!", "Calcolo Determinante Matrice", 1);
}
if (rig_int < 2 || rig_int > 6) {
JOptionPane.showMessageDialog(null, "Le righe possono variare da 2 a 6", "Calcolo Determinante Matrice", 1);
} else {
dtm.setColumnCount(rig_int);
dtm.setRowCount(rig_int);
sp.setVisible(true);
this.pack();
}
}
}

// copiato ASSOLUTAMENTE non roba mia
private static long det(int mat[][], int ord) {
long l = 0L;
if(ord == 1) l = mat[0][0];
else if(ord == 2) l = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0];
else {
int matm1[][] = new int[ord - 1][ord - 1];
for(int col = 0; col < ord; col++) {
for(int ri = 1; ri < ord; ri++) {
int nuovacol = 0;
for(int scan = 0; scan < ord; scan++)
if(scan != col) {
matm1[ri - 1][nuovacol] = mat[ri][scan];
nuovacol++;
}
}
if(col % 2 == 0) l += (long)mat[0][col] * det(matm1, ord - 1);
else l -= (long)mat[0][col] * det(matm1, ord - 1);
}
}
return l;
}

public static void main(String[] args)
{
new applet_det().setVisible(true);
}
}


Se avete possibilità di darci un'occhiata mi fate un favore!

LeleFT
03-06-2010, 16:23
Originariamente inviato da debbathebest
Se avete possibilità di darci un'occhiata mi fate un favore!
E se tu avessi l'accortezza di dire anche cosa c'è che non va, faciliteresti la vita a tutti.

Come espressamente indicato nel Regolamento interno (http://forum.html.it/forum/showthread.php?s=&threadid=973889) è onere tuo dire quali sono i problemi riscontrati, dove vengono riscontrati e, se necessario, con quali input.


Punto 8
Nello scrivere il quesito sul forum, abbiate cura di riportare quante più informazioni possibili per aiutare gli eventuali interessati a comprendere il problema senza dovervi "estorcere" tali informazioni: avrete senz'altro maggiori probabilità di ottenere una risposta in tempi più brevi.


Ciao. :ciauz:

debbathebest
03-06-2010, 16:28
Ok scusami :D, il problema è sicuramente qui:


for (int i=0; i<rig_int; i++) {

for (int j=0; j<rig_int; j++) {
//String c=tabella.getModel().getValueAt(i, j).toString();
Object estraz=tabella.getModel().getValueAt(i, j);
matrice[i][j] = Integer.parseInt(estraz.toString());
}
}


Viene compilato correttamente ma quando esegue il calcolo, riporta questo errore:



Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
at applet_det.actionPerformed(applet_det.java:56)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:2028)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2351)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.jav a:6348)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3267)
at java.awt.Component.processEvent(Component.java:611 3)
at java.awt.Container.processEvent(Container.java:208 5)
at java.awt.Component.dispatchEventImpl(Component.jav a:4714)
at java.awt.Container.dispatchEventImpl(Container.jav a:2143)
at java.awt.Component.dispatchEvent(Component.java:45 44)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4618)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:4282)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:4212)
at java.awt.Container.dispatchEventImpl(Container.jav a:2129)
at java.awt.Window.dispatchEventImpl(Window.java:2478 )
at java.awt.Component.dispatchEvent(Component.java:45 44)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 635)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:122)


Spero mi riusciate ad aiutare!

Pastore12
03-06-2010, 16:32
Ti spiacerebbe colorare in rosso la riga 56....?

LeleFT
03-06-2010, 16:35
Non è necessario, l'errore non è lì, ma all'inizio:



int rig_int; <-- nessun valore? default = 0!!
int matrice [][]= new int[rig_int][rig_int];


Ovvero, crei una bella matrice 0x0


Ciao. :ciauz:

debbathebest
03-06-2010, 16:35
fatto :)

debbathebest
03-06-2010, 16:37
Quindi io dovrei mettere int rig_int = 0?
Perchè se è così ho provato ma non funziona. :confused:
Io + che altro sospetto ci siano problemi nei 2 cicli, però non sapendoli identificare non so neanche come correggerli

LeleFT
03-06-2010, 16:44
Originariamente inviato da debbathebest
Quindi io dovrei mettere int rig_int = 0?

Assolutamente no, otterresti lo stesso identico risultato.



Perchè se è così ho provato ma non funziona. :confused:
Io + che altro sospetto ci siano problemi nei 2 cicli, però non sapendoli identificare non so neanche come correggerli

Quello che ho evidenziato è l'unico punto del programma dove tu dimensioni la matrice... ma la stai dimensionando con 0 righe e 0 colonne... dovrai dare a rig_int un valore diverso da 0 se vuoi ottenere qualcosa...

Poi, hai una textfield dove chiedi quante righe ha la matrice... bene, in tutto il resto del codice te ne freghi di qualunque cosa ci venga scritto dentro... quindi la tua matrice rimane di dimensione 0x0...

Poi, nei due for, cerchi di riempirla con "N x N" numeri... ma la matrice può contenerne solo 0x0.

I casi sono 2:

1) Inizializzi la matrice dimensionandola fin da subito con un numero di righe e colonne diverso da 0

2) Prima di andare a "riempire" la matrice, la re-inizializzi dimensionandola con il numero di righe e colonne che l'utente ha indicato nella textfield.


Ciao. :ciauz:

debbathebest
03-06-2010, 16:53
Non è che puoi evidenziarmi la correzione direttamente sul codice?
L'ho postato qui http://pastebin.com/pNt0c3iq.
Onestamente mi sembra che sia inizializzato rig_int , e poi dopo quando l'utente imposta il numero delle righe cambia.

LeleFT
03-06-2010, 17:33
Originariamente inviato da debbathebest
Non è che puoi evidenziarmi la correzione direttamente sul codice?
Ma te l'ho già detto: devi dare un valore alla variabile "rig_int". Nel codice che hai postato e anche in quello che hai linkato quella variabile non ha alcun valore, quindi, di default, vale 0.



Onestamente mi sembra che sia inizializzato rig_int
E dove, di grazia? Io non vedo alcuna istruzione che dia un valore alla variabile rig_int da nessuna parte nel codice. E anche se da qualche parte, vi fosse un'istruzione di assegnazione di un qualche valore a quella variabile, ciò non toglie che ormai la matrice è già stata dimensionata con 0 righe e 0 colonne, quindi andrebbe ridimensionata con una nuova istruzione new.



, e poi dopo quando l'utente imposta il numero delle righe cambia.

Certo: quello della JTable, non quello della variabile matrice, che rimane, come ho giò detto tante volte, dimensionata con 0 righe e 0 colonne.

Quel è l'unica istruzione in cui viene dimensionata la matrice? Quella evidenziata in grassetto qui sotto:



int rig_int;
int matrice [][]= new int[rig_int][rig_int];


Quanto vale "rig_int" al momento di quella inizializzazione? Risposta: 0.

A cosa equivale, quindi, quella inizializzazione? Risposta: a questa cosa qui sotto:



int matrice [][]= new int[ 0 ][ 0 ];


Non so proprio in quale altro modo spiegarmi...


Ciao. :ciauz:

Loading