Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

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

    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!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

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

    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.

    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Ok scusami , 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.java: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!

  4. #4
    Utente di HTML.it L'avatar di Pastore12
    Registrato dal
    Oct 2008
    Messaggi
    1,051
    Ti spiacerebbe colorare in rosso la riga 56....?
    "Ethics are to me something private. Whenever you use it as an argument for why somebody_else should do something, you’re no longer being ethical, you’re just being a sanctimonious dick-head"
    Linus Torvalds

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    fatto

  7. #7
    Quindi io dovrei mettere int rig_int = 0?
    Perchè se è così ho provato ma non funziona.
    Io + che altro sospetto ci siano problemi nei 2 cicli, però non sapendoli identificare non so neanche come correggerli

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    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.
    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    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.

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    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:

    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.