HTML.it forum
HTML.it HTML.it forum Archive > Lato server > Programmazione > Java
 

[JAVA] Programma per il calcolo del determinante di una matrice quadrata

 
debbathebest
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:
codice:
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
Citazione:
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
è onere tuo dire quali sono i problemi riscontrati, dove vengono
riscontrati e, se necessario, con quali input.

Citazione:
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
Ok scusami :D, il problema è sicuramente qui:

codice:
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:

codice:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException:
0
	at applet_det.actionPerformed(applet_det.java:56)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
	at
javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
	at
javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at
javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.jav
a:236)
	at java.awt.Component.processMouseEvent(Component.java:6348)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at java.awt.Component.processEvent(Component.java:6113)
	at java.awt.Container.processEvent(Container.java:2085)
	at java.awt.Component.dispatchEventImpl(Component.java:4714)
	at java.awt.Container.dispatchEventImpl(Container.java:2143)
	at java.awt.Component.dispatchEvent(Component.java:4544)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4618)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4282)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4212)
	at java.awt.Container.dispatchEventImpl(Container.java:2129)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4544)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:635)
	at
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296
)
	at
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
	at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201
)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


Spero mi riusciate ad aiutare!
 
Pastore12
Ti spiacerebbe colorare in rosso la riga 56....?
 
LeleFT
Non è necessario, l'errore non è lì, ma all'inizio:

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


Ovvero, crei una bella matrice 0x0


Ciao. :ciauz:
 
debbathebest
fatto :)
 
debbathebest
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
Citazione:
Originariamente inviato da debbathebest
Quindi io dovrei mettere int rig_int = 0?

Assolutamente no, otterresti lo stesso identico risultato.

Citazione:

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
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
Citazione:
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.

Citazione:

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.

Citazione:

, 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:

codice:
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:

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


Non so proprio in quale altro modo spiegarmi...


Ciao. :ciauz:
 
debbathebest
Allora dovrei inserire codice:
int matrice [][]= new
int[rig_int][rig_int]
nell'ActionPerformed?
 
LeleFT
Citazione:
Originariamente inviato da debbathebest
Allora dovrei inserire codice:
int matrice [][]= new
int[rig_int][rig_int]
nell'ActionPerformed?


Domanda: stai andando a tentoni?
Conosci le basi della programmazione Java?
Conosci la differenza fra una dichiarazione di variabile e l'assegnazione di un
valore?
Sai cosa sono gli inizializzatori statici?
Conosci la differenza fra variabili di istanza e variabili locali?

Dal codice che hai postato si capisce alla perfezione che il metodo di calcolo
del determinante l'hai copiato papale papale da qualcun altro (l'hai scritto nei
commenti), ma devi anche comprendere che questo è un forum e non un centro di
assistenza dove viene fornita gratuitamente la manodopera per fare i compiti.

Ci si aspetta un minimo d'impegno da parte di chi pone la domanda e, di
conseguenza, da parte di colui che ha un problema da risolvere.

Siamo tutti qui per imparare qualcosa l'un l'altro, ma bisogna anche metterci
del proprio, non aspettarsi sempre la pappa pronta.

Il motivo per cui salta fuori quell'errore l'ho già ribadito più e più volte (e
chiunque, con un minimo di sforzo, avrebbe trovato il modo di risolvere).

Due fra le svariate possibili soluzioni le ho già proposte qualche post più su.

Più di così, sinceramente, mi sembra più una presa in giro che altro.


Ciao. :ciauz:
 
debbathebest
Hai ragione in tutto quello che hai detto, sono proprio alle prime armi e non mi
so ancora muovere bene con questo linguaggio, pertanto, ringraziandoti per
quanto mi hai già più e più volte detto, ti chiedo solamente come posso
re-inizializzare la matrice dimensionandola con il numero di righe e colonne che
l'utente ha indicato nella textfield.
Perchè ti giuro ho provato a fare come mi dici, ma mi continua a dare lo stesso
errore, quindi vuol dire che o, non so re-inizializzare la matrice (cosa
alquanto possibile), oppure non è quello causa di errore.
Saluti
 
LeleFT
Nel metodo actionPerformed, prima dei due for, effettua queste operazioni:

codice:
// Prima converto in numero intero ciò che l'utente ha scritto nella text-field
rig_int = Integer.parseInt( righe.getText() );

// Poi, ridimensiono la matrice in modo che sia della dimensione indicata
matrice = new int[rig_int][rig_int];


Non ho effettuato controlli sulla correttezza del contenuto della TextField...
mi aspetto che l'utente sia bravo e inserisca un numero correttamente.


Il resto dovrebbe andare bene.


Ciao. :ciauz:
 
Naruto 92
codice parzialmente corretto
codice:
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 [][];
    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
            boolean test=righe.getText().matches("\\d+");
            if(test){
                rig_int=Integer.parseInt(righe.getText());
                if(rig_int>=2 && rig_int<=6){
                    matrice=new int[rig_int][rig_int];
                    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();                                            
   
                    }
                }
            }else{
                System.out.println("Numero di righe errato!");
            }
        }else{
            System.out.println("Inserire solo numeri interi!");
        }
    }
 
    // 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);                              
    }                                                                  
}


in rosso la parte aggiunta/modificata
ora da problemi all'estarzione dei valori dalla tabella.
sicuro di averli inizializzati???
 
debbathebest
Grazie ad entrambi,

@LeleFT: continua a darmi lo stesso errore, tu hai provato e ti funzionava?
Per quanto riguarda il controllo invece quello lo so fare, ma l'avrei fatto in
un secondo momento.

@Naruto 92: Ho provato a vedere cosa succede, ma per qualunque valore l'utente
scelga di assegnare alle righe della matrice, compare il messaggio di errore con
scritto "Inserire solo numeri interi!"
 
debbathebest
Ragazzi, so che è stranissimo, ma funzionava tutto ancor prima che ponessi la
domanda iniziale.
In pratica quando scrivevo tutti i dati nella jtable, mi dava nel calcolo un
problema di oggetto nullo.
Adesso x caso ho schiacciato invio dopo aver compilato la Jtable e prima di
cliccare sul pulsante Calcola ed è uscito fuori il valore del determinante.
A questo punto ho risolto.
Grazie ragazzi che mi avete sopportato, riconosco di essere stato un pò
invasivo essendo anche molto inesperto in JAVA.
Chiudete pure, alla prossima!
 
Naruto 92
Citazione:
Originariamente inviato da debbathebest
@Naruto 92: Ho provato a vedere cosa succede, ma per qualunque valore l'utente
scelga di assegnare alle righe della matrice, compare il messaggio di errore con
scritto "Inserire solo numeri interi!"


Strano, a me funziona correttamente, comunque meglio che tu abbia risolto

Trova la soluzione al tuo problema, cerca tra le guide di HTML.it

Loading

Powered by: Search Engine Indexer and vBulletin v2.3.6
Copyright © 2000 - 2002, Jelsoft Enterprises Limited