Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Rand's Determinante con Laplace - randDeterm.java

randDeterm.java

Caricato da:
Scarica il programma completo

  1. /*
  2.    Calcolo del determinante di una matrice quadrata di ordine
  3.    qualsiasi utilizzando le librerie grafiche di java (SWING & AWT)
  4.  
  5.    by rand (rand@hackernetwork.com)
  6.    member of Pierotofy's community
  7.    http://www.pierotofy.it
  8. */
  9.  
  10.  
  11. import java.awt.*;
  12. import javax.swing.*;
  13. import java.awt.event.*;
  14. import java.lang.*;
  15.  
  16.  
  17. public class randDeterm extends JFrame implements ActionListener
  18. {
  19.         //componenti finestra
  20.         private JFrame f;
  21.         private Dimension framePos;
  22.         private Container content;
  23.         private JPanel pannellosopra;
  24.         private JPanel pannellosotto;
  25.         private JPanel pannellosopra2;
  26.         private JPanel pannellosopra2_CONTAINER;
  27.  
  28.         //componenti pannellosopra
  29.         private JLabel txtPrimo;
  30.         private JTextField txtDim;
  31.         private JButton btnCreaMat;
  32.  
  33.         //componenti pannellosotto
  34.         private JPanel pannMatrice;
  35.         private JLabel txtSec;
  36.         private JLabel txtTerzo;
  37.         private JTextField txtDeterm;
  38.         private JButton btnCalcDeterm;
  39.         private JTextField[][] matrice;
  40.  
  41.         //componenti x il calcolo del determinante
  42.         private double[][] mat; //puntatore x la matrice dinamica
  43.         private int matdim; //dimensione matrice
  44.  
  45.  
  46.         //metodo che inizializza il GUI del prg
  47.         public void init()
  48.         {
  49.                 f = new JFrame("..:::Calcolo determinante.... by rand (rand@hackernetwork.com):::..");
  50.                 f.setSize(230,120);
  51.                 centraFrame(230, 120);
  52.  
  53.                 content = f.getContentPane();
  54.                 content.setLayout(new GridLayout(1,1));
  55.  
  56.                 //pannellosopra
  57.                 pannellosopra = new JPanel();
  58.                 pannellosopra.setLayout(new FlowLayout());
  59.                 txtPrimo = new JLabel("Inserisci la dimensione della matrice: ");
  60.                 txtPrimo.setForeground(Color.GREEN);
  61.                 txtDim = new JTextField(18);
  62.                 btnCreaMat = new JButton("Crea la Matrice!");
  63.                 pannellosopra.add(txtPrimo,0);
  64.                 pannellosopra.add(txtDim,1);
  65.                 pannellosopra.add(btnCreaMat,2);
  66.                 btnCreaMat.setActionCommand("creamat");
  67.                 btnCreaMat.addActionListener(this);
  68.                 pannellosopra.setBackground(Color.BLACK);
  69.  
  70.                 content.add(pannellosopra,0);
  71.  
  72.                 f.setResizable(false);
  73.                 f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  74.                 f.setVisible(true);
  75.         }
  76.  
  77.         //metodo che gestisce le azioni
  78.         public void actionPerformed(ActionEvent ae)
  79.         {
  80.                 if (ae.getActionCommand() == "creamat")
  81.                 {
  82.                         try
  83.                         {
  84.                                 matdim = Integer.parseInt(txtDim.getText());
  85.                         }
  86.                         catch (NegativeArraySizeException e) //se viene inserito un numero negativo
  87.                         {
  88.                                 JOptionPane.showMessageDialog(null, "Non puoi inserire un numero negativo come dimensione x la matrice!! Riprova.", "Errore...", 0);
  89.                         }
  90.                         catch(IllegalArgumentException e) {  //se viene inserito tutto fuorchè un numero
  91.                                 JOptionPane.showMessageDialog(null, "Dimensione non valida!! Riprova.", "Errore...", 0);
  92.                         }
  93.                         catch(OutOfMemoryError e) {  //se si verifica un buffer overflow
  94.                                 JOptionPane.showMessageDialog(null, "Hai scelto una dimensione x la matrice ingestibile dalla memoria heap del programma!! Riprova con una più piccola.", "Errore...", 0);
  95.                         }
  96.                         catch(Exception e) { //x catturare l'eccezione in generale
  97.                                 JOptionPane.showMessageDialog(null, "Errore durante la creazione della matrice!! Riprova.", "Errore...", 0);
  98.                         }
  99.                         finally {
  100.                           if(matdim<2) { //controllo che la dimensione della matrice non sia inferiore all'ordine 2
  101.                             JOptionPane.showMessageDialog(null, "Non ha senso calcolare il determinante di questa matrice!! Riprova.", "Errore...", 0);
  102.                             txtDim.setText("");
  103.                             return;
  104.                           }
  105.                         }
  106.                                 //alloco dinamicamente la matrce in memoria
  107.                                 mat = new double[matdim][matdim];
  108.  
  109.                                 //creo la matricegraficamente (uso un grid layout)
  110.                                 pannMatrice = new JPanel();
  111.                                 pannMatrice.setLayout(new GridLayout(matdim,matdim));
  112.  
  113.                                 //alloco in memoriala matrice che uso x calcolare il determinante
  114.                                 matrice = new JTextField[matdim][matdim];
  115.  
  116.                                 for(int i=0; i<matdim; i++)
  117.                                 {
  118.                                         for(int k=0; k<matdim; k++)
  119.                                         {
  120.                                                 //inizializzo la matrice grafica con tutti degli zeri
  121.                                                 JTextField p = new JTextField(4);
  122.                                                 p.setText("0");
  123.                                                 matrice[i][k] = p;
  124.                                                 pannMatrice.add(matrice[i][k]);
  125.                                         }
  126.                                 }
  127.  
  128.                                 //ri-imposto la finestra
  129.                                 content.removeAll();
  130.                                 content = new Container();
  131.                                 content = f.getContentPane();
  132.                                 content.setLayout(new FlowLayout());
  133.  
  134.                                 pannellosotto = new JPanel();
  135.                                 pannellosotto.setLayout(new FlowLayout());
  136.                                 txtTerzo = new JLabel("Il determinante vale: ");
  137.                                 txtTerzo.setForeground(Color.GREEN);
  138.                                 txtDeterm = new JTextField(10);
  139.                                 txtDeterm.setEditable(false);
  140.                                 txtDeterm.setBorder(null);
  141.                                 txtDeterm.setForeground(Color.RED);
  142.                                 txtDeterm.setText("NON CALCOLATO");
  143.                                 txtDeterm.setBackground(Color.BLACK);
  144.                                 btnCalcDeterm = new JButton("Calcola il Determinante!");
  145.                                 btnCalcDeterm.setActionCommand("getdeterm");
  146.                                 btnCalcDeterm.addActionListener(this);
  147.  
  148.                                 pannellosotto.add(pannMatrice,0);
  149.  
  150.                                 pannellosopra2 = new JPanel();
  151.                                 pannellosopra2.setLayout(new FlowLayout());
  152.                                 pannellosopra2.add(txtTerzo,0);
  153.                                 pannellosopra2.add(txtDeterm,1);
  154.  
  155.                                 pannellosopra2_CONTAINER = new JPanel();
  156.                                 pannellosopra2_CONTAINER.setLayout(new GridLayout(2,1));
  157.                                 pannellosopra2_CONTAINER.add(pannellosopra2,0);
  158.                                 pannellosopra2_CONTAINER.add(btnCalcDeterm,1);
  159.  
  160.                                 pannellosotto.setBackground(Color.BLACK);
  161.                                 pannellosopra2.setBackground(Color.BLACK);
  162.                                 pannellosopra2_CONTAINER.setBackground(Color.BLACK);
  163.                                 content.setBackground(Color.BLACK);
  164.  
  165.                                 content.add(pannellosopra2_CONTAINER,0);
  166.                                 content.add(pannellosotto,1);
  167.  
  168.                                 //creo il menu della finestra
  169.                                 JMenuBar mb = new JMenuBar();
  170.                                 JMenu mHelp = new JMenu("Aiuto");
  171.                                 JMenuItem iAbout = new JMenuItem("Info sul prg...");
  172.                                 mHelp.add(iAbout);
  173.                                 iAbout.addActionListener(new ActionListener() {
  174.                                   public void actionPerformed(ActionEvent e) {
  175.                                     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",
  176.                                         "Info...", 1);
  177.                                   }
  178.                                 });
  179.                                 mb.add(mHelp);
  180.                                 f.getRootPane().setJMenuBar(mb);
  181.  
  182.                                 f.pack(); //ridimensiono la finestra in base alla grandezzadegli oggetti dinamici presenti
  183.                                 f.setResizable(false);
  184.                                 centraFrame(f.getHeight(), f.getWidth());
  185.                                 f.setVisible(true);
  186.                         }
  187.  
  188.  
  189.                 if (ae.getActionCommand() == "getdeterm")
  190.                 {
  191.                   boolean allzero=true; //variabile che indica se la matrice è stata modificata con valori o no
  192.  
  193.                         //controllo se la matrice è stata riempita o no
  194.                         for(int i=0; i<matdim; i++)
  195.                         {
  196.                                 for(int k=0; k<matdim; k++)
  197.                                 {
  198.                                        JTextField p = new JTextField(4);
  199.                                         p=matrice[i][k];
  200.                                         String t = p.getText();
  201.                                         //controllo il valore
  202.                                         if(Double.parseDouble(t)!=0)
  203.                                             allzero=false;
  204.                                         mat[i][k]=Double.parseDouble(t);
  205.                                 }
  206.                         }
  207.                         if(allzero==true) { //se nn è stata riempita (ha ancora gli zeri)
  208.                           JOptionPane.showMessageDialog(null,
  209.                                             "Devi inserire dei valori x calcolare il determinante!!",
  210.                                             "Errore...", 0);
  211.                           txtDeterm.setText("NON CALCOLATO");
  212.                           return;
  213.                         } else { //se è riempita corertatmente, calcolo il determinante
  214.                           txtDeterm.setText(String.valueOf(getDeterm()));
  215.  
  216.                          /*
  217.                           //disabilito i campi di testo
  218.                           for (int i = 0; i < matdim; i++) {
  219.                             for (int k = 0; k < matdim; k++) {
  220.                               matrice[i][k].setEnabled(false);
  221.                             }
  222.                           }
  223.                           */
  224.                         }
  225.                 }
  226.         }
  227.  
  228.         //merodo che centra il frame sullo schermo
  229.         private void centraFrame(int h, int w) {
  230.                 framePos=new Dimension();
  231.                 framePos=Toolkit.getDefaultToolkit().getScreenSize();
  232.                 f.setLocation ((framePos.width/2)-(w/2), (framePos.height/2)-(h/2));
  233.         }
  234.  
  235.         //metodo che restituisce il valore del determinante calcolato
  236.         public double getDeterm()
  237.         {
  238.                 return (calcDeterm(mat,matdim));
  239.         }
  240.  
  241.         //metodo che permette di calcolare il determinante di una matrice quadrata di ordine qualsiasi
  242.         private double calcDeterm(double[][] m, int DIM)
  243.         {
  244.                 double det=0.0;
  245.                 int rig, col;
  246.                 if(DIM==1) // se l'ordine della matrice è uno il determinante è l'unico elemento di essa
  247.                 {
  248.                         return m[0][0];
  249.                 }
  250.                 else
  251.                 {       //calcolo il determinante in modo ricorsivo, x tutti gli elementi della riga
  252.                         for(rig=0, col=0; col<DIM; col++)
  253.                                 det+=Math.pow(-1.0,(rig+col))*m[rig][col]*calcDeterm(getSottoMat(m,rig,col,DIM),DIM-1);
  254.                         return det;
  255.                 }
  256.         }
  257.  
  258.         //metodo che permette di estrapolare la matrice do ordine inferiore a partire da 1 elemento
  259.         private double[][] getSottoMat(double[][] m, int i, int j, int DIM)
  260.         {
  261.                 double[][] newmat = new double[DIM-1][DIM-1];
  262.                 int rignewmat=0, colnewmat=0, rig, col;
  263.                 // rig => riga matrice in argomento
  264.                 // col => colonna matrice in argomento
  265.                 // rignewmat => riga sotto matrice
  266.                 // colnewmat => colonna sotto matrice
  267.                 // i e j => indici dell'elemento ele[i][j] da cui partire
  268.                 for(rig=0; rig<DIM; rig++)
  269.                 {
  270.                         colnewmat=0;
  271.                         if(rig!=i)
  272.                         {
  273.                                 for(col=0; col<DIM; col++)
  274.                                 {
  275.                                         if(col!=j)
  276.                                         {
  277.                                                 newmat[rignewmat][colnewmat]=m[rig][col];
  278.                                                 colnewmat++;
  279.                                         }
  280.                                 }
  281.                                 rignewmat++;
  282.                         }
  283.                 }
  284.                 return newmat;
  285.         }
  286.  
  287.         //costruttore classe
  288.         randDeterm()
  289.         {
  290.                 super();
  291.                 init();
  292.         }
  293.  
  294.  
  295.         //metodo main
  296.         public static void main(String[] args)
  297.         {
  298.                 randDeterm p = new randDeterm();
  299.         }
  300. }