rendered paste bodypackage afn_landa;import java.awt.Point;import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;import java.util.Vector;import javax.swing.JButton;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.UIManager;public class Demo extends JFrame{ private static final long serialVersionUID = 1L; public Demo() { super(); initComponents(); this.setVisible(true); } private void testeazaButActionPerformed(ActionEvent e) { testeazaAutomat(); } private void masinaNouaButActionPerformed(ActionEvent e) { alfabetTx.setText(""); stariTx.setText(""); stariStartTx.setText(""); stariFinaleTx.setText(""); tranzitiiTx.setText(""); inputTf.setText(""); logTx.setText(""); } private void incarcaFisierButActionPerformed(ActionEvent e) { // TODO add your code here } private void button2ActionPerformed(ActionEvent e) { // TODO add your code here } private void initComponents() { scrollPane1 = new JScrollPane(); alfabetTx = new JTextArea(); scrollPane2 = new JScrollPane(); stariTx = new JTextArea(); scrollPane3 = new JScrollPane(); stariStartTx = new JTextArea(); scrollPane4 = new JScrollPane(); stariFinaleTx = new JTextArea(); scrollPane5 = new JScrollPane(); tranzitiiTx = new JTextArea(); inputTf = new JTextField(); testeazaBut = new JButton(); inputL = new JLabel(); scrollPane6 = new JScrollPane(); logTx = new JTextArea(); rezultatFinalL = new JLabel(); finalResultL = new JLabel(); logL = new JLabel(); label3 = new JLabel(); label4 = new JLabel(); label5 = new JLabel(); label6 = new JLabel(); label7 = new JLabel(); masinaNouaBut = new JButton(); incarcaFisierBut = new JButton(); button2 = new JButton(); //======== this ======== setLayout(null); addWindowListener(wl); setTitle("AFN cu Landa Tranzitii Pacher Dragos"); setSize(618, 565); setResizable(false); this.setLocation(300, 200); //======== scrollPane1 ======== { scrollPane1.setViewportView(alfabetTx); } add(scrollPane1); scrollPane1.setBounds(10, 170, 105, 120); //======== scrollPane2 ======== { scrollPane2.setViewportView(stariTx); } add(scrollPane2); scrollPane2.setBounds(125, 170, 100, 120); //======== scrollPane3 ======== { scrollPane3.setViewportView(stariStartTx); } add(scrollPane3); scrollPane3.setBounds(235, 170, 90, 120); //======== scrollPane4 ======== { scrollPane4.setViewportView(stariFinaleTx); } add(scrollPane4); scrollPane4.setBounds(335, 170, 100, 120); //======== scrollPane5 ======== { scrollPane5.setViewportView(tranzitiiTx); } add(scrollPane5); scrollPane5.setBounds(445, 170, 160, 120); add(inputTf); inputTf.setBounds(90, 310, 345, 20); //---- testeazaBut ---- testeazaBut.setText("Testeaza Masina"); testeazaBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { testeazaButActionPerformed(e); } }); add(testeazaBut); testeazaBut.setBounds(450, 307, 155, testeazaBut.getPreferredSize().height); //---- inputL ---- inputL.setText("String intrare"); add(inputL); inputL.setBounds(10, 311, 80, inputL.getPreferredSize().height); //======== scrollPane6 ======== { scrollPane6.setViewportView(logTx); } add(scrollPane6); scrollPane6.setBounds(5, 365, 600, 135); //---- rezultatFinalL ---- rezultatFinalL.setText("Rezultat final"); add(rezultatFinalL); rezultatFinalL.setBounds(new Rectangle(new Point(6, 510), rezultatFinalL.getPreferredSize())); add(finalResultL); finalResultL.setBounds(100, 510, 80, finalResultL.getPreferredSize().height); //---- logL ---- logL.setText("Log"); add(logL); logL.setBounds(10, 340, 20, 15); //---- label3 ---- label3.setText("Alfabet"); add(label3); label3.setBounds(new Rectangle(new Point(15, 145), label3.getPreferredSize())); //---- label4 ---- label4.setText("Stari"); add(label4); label4.setBounds(new Rectangle(new Point(130, 145), label4.getPreferredSize())); //---- label5 ---- label5.setText("Stari start"); add(label5); label5.setBounds(new Rectangle(new Point(240, 145), label5.getPreferredSize())); //---- label6 ---- label6.setText("Stari finale"); add(label6); label6.setBounds(new Rectangle(new Point(335, 145), label6.getPreferredSize())); //---- label7 ---- label7.setText("Tranzitii"); add(label7); label7.setBounds(new Rectangle(new Point(450, 145), label7.getPreferredSize())); //---- masinaNouaBut ---- masinaNouaBut.setText("Creaza masina noua"); masinaNouaBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { masinaNouaButActionPerformed(e); } }); add(masinaNouaBut); masinaNouaBut.setBounds(170, 20, 265, masinaNouaBut.getPreferredSize().height); //---- incarcaFisierBut ---- incarcaFisierBut.setText("Incarca din fisier"); incarcaFisierBut.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { incarcaFisierButActionPerformed(e); } }); add(incarcaFisierBut); incarcaFisierBut.setBounds(170, 55, 265, incarcaFisierBut.getPreferredSize().height); //---- button2 ---- button2.setText("Salveaza rezultat"); button2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { button2ActionPerformed(e); } }); add(button2); button2.setBounds(170, 90, 265, button2.getPreferredSize().height); /*{ // compute preferred size Dimension preferredSize = new Dimension(); for(int i = 0; i < getComponentCount(); i++) { Rectangle bounds = getComponent(i).getBounds(); preferredSize.width = Math.max(bounds.x + bounds.width, preferredSize.width); preferredSize.height = Math.max(bounds.y + bounds.height, preferredSize.height); } Insets insets = getInsets(); preferredSize.width += insets.right; preferredSize.height += insets.bottom; setMinimumSize(preferredSize); setPreferredSize(preferredSize); }*/ alfabetTx.setText("l\n0\n1"); stariTx.setText("s0\ns1\ns2\ns3\ns4"); stariStartTx.setText("s0"); stariFinaleTx.setText("s1\ns3"); tranzitiiTx.setText("s0 0\ns0 1\ns0 l s1 s3\ns1 0 s2\ns1 1 s1\ns1 l\ns2 0 s1\ns2 1 s2\ns2 l\ns3 0 s3\ns3 1 s4\ns3 l\ns4 0 s4\ns4 1 s3\ns4 l"); inputTf.setText("010"); } private JScrollPane scrollPane1; private static JTextArea alfabetTx; private JScrollPane scrollPane2; private static JTextArea stariTx; private JScrollPane scrollPane3; private static JTextArea stariStartTx; private JScrollPane scrollPane4; private static JTextArea stariFinaleTx; private JScrollPane scrollPane5; private static JTextArea tranzitiiTx; private static JTextField inputTf; private JButton testeazaBut; private JLabel inputL; private JScrollPane scrollPane6; private JTextArea logTx; private JLabel rezultatFinalL; private JLabel finalResultL; private JLabel logL; private JLabel label3; private JLabel label4; private JLabel label5; private JLabel label6; private JLabel label7; private JButton masinaNouaBut; private JButton incarcaFisierBut; private JButton button2; WindowListener wl = new WindowListener() { public void windowActivated(WindowEvent e) { } public void windowClosed(WindowEvent e) { } public void windowClosing(WindowEvent e) { System.exit(0); } public void windowDeactivated(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowOpened(WindowEvent e) { } }; /*TODO * 1. nouldelandat nu stiu daca face corect ce trebuie, mai are un bug pe undeva, debug klumea * 2. de progrmat landaInchiderea * 3. de testat angrenajul * */ public void TestMethods() { String []ion = {"s1, s2"}; String []fin = {"s2, s3"}; //boolean bau = recunoscut(ion, fin); //System.out.println(bau); //String []rez = reuniuneStariLandaTranzitii(ion, fin); //for (int i = 0; i < rez.length; i++) // System.out.print(rez[i] + " "); String [][] tranz = { {"", "l", "0", "1"}, {"s0", "s1"}, {"s1", "s2"}, {"s1", "s0"}, {"s2", "s1"}, }; String []test = noulDeLandat(tranz, ion, "1"); for (int i = 0; i < test.length; i++) System.out.print(test[i] + " "); log(ion, fin); JOptionPane.showMessageDialog(this, "bau"); System.exit(0); } public void testeazaAutomat() { //TestMethods(); ///Pt ca am incarcat cu \n, s-ar putea sa fie probleme la split ///cand incarcam din fisier sau cand le dam gata din memorie int nrStari = stariTx.getLineCount(); int nrAlfabet = alfabetTx.getLineCount(); String []liniiAlfabet = alfabetTx.getText().split("\n"); String []liniiStari = stariTx.getText().split("\n"); String []tranzitiiLinii = tranzitiiTx.getText().split("\n"); String []stFinale = stariFinaleTx.getText().split("\n"); // bagam in matrice [stari x alfabet] tranzitiile String [][] tranz = new String[nrStari + 1][nrAlfabet + 1]; //prima linie este formata din alfabet si landa for (int i = 1; i < nrAlfabet+1; i++) { tranz[0][i] = liniiAlfabet[i-1]; } logTx.append("-> [incarcare alfabet] "); for (int i = 1; i < liniiAlfabet.length; i++) logTx.append(liniiAlfabet[i] + " "); //prima coloana este formata din stari for (int i = 1; i < nrStari+1; i++) { tranz[i][0] = liniiStari[i-1]; } logTx.append("\n-> [incarcare stari] "); for (int i = 0; i < liniiStari.length; i++) logTx.append(liniiStari[i] + " "); logTx.append("\n"); for (int i = 0; i < nrStari + 1; i++) { for (int j = 0; j < nrAlfabet + 1; j++) { if (tranz[i][j] != null) logTx.append(tranz[i][j] + " "); } logTx.append("\n"); } // acuma incarcam tranzitiile in matrice, una din partile hardcore int k = tranzitiiTx.getLineCount(); int indice = 0; while (indice < k) //cat timp nu am citit toate liniile { String []linie = tranzitiiLinii[indice].split(" "); //bug aici - rezolvat String stare = linie[0]; String element = linie[1]; String destinatie = null; StringBuilder sb = new StringBuilder(""); for (int i = 2; i < linie.length; i++) { sb.append(linie[i]); } destinatie = sb.toString(); System.out.println(destinatie); //cauta celula de intersectie a lui stare cu element si acolo pune destinatie int x = -1, y = -1; for (int i = 0; i < nrStari + 1; i++) if (tranz[i][0] != null) if (tranz[i][0].equals(stare)) { x = i; break; } for (int i = 0; i < nrAlfabet + 1; i++) if (tranz[0][i] != null) if (tranz[0][i].equals(element)) { y = i; break; } if (destinatie != null) tranz[x][y] = destinatie; //sa avem grija aici ce se intampla indice++; } logTx.append("\n-> [matrice incarcata]\n "); for (int i = 0; i < nrStari + 1; i++) { for (int j = 0; j < nrAlfabet + 1; j++) { if (tranz[i][j] != null) logTx.append(tranz[i][j] + " "); else logTx.append("x"); } logTx.append("\n"); } //aici pastram elementele pentru care calculam landa tranzitia String []deLandat = stariStartTx.getText().split("\n"); logTx.append("-> [stari de start] "); for (int i = 0; i < deLandat.length; i++) logTx.append(deLandat[i] + " "); // Aici este Creierul int maiAvemInput = 0; String[] temp = null; while (maiAvemInput < inputTf.getText().length()) { indice = 0; //va retine rezultatul lui deLandat temp = null; //calculam landa tranzitiile pentru starile din deLandat while (indice < deLandat.length) { String[] rez = landaInchidere(tranz, deLandat); //daca vreun caracter din rez nu se afla in temp il copiem acolo if (temp == null) { temp = new String[rez.length]; for (int i = 0; i < rez.length; i++) temp[i] = rez[i]; } else temp = reuniuneStariLandaTranzitii(rez, temp); indice++; } log(deLandat, temp); //deLandat va fii vidat deLandat = null; //cautam in matrice sa vedem cine merge cu caracter din input(temp) in alta stare si-l bagat in deLandat StringBuilder sb = new StringBuilder(inputTf.getText().charAt(maiAvemInput)); //String caracter = sb.toString(); deLandat = noulDeLandat(tranz, temp, sb.toString()); maiAvemInput++; } //daca temp contine una din starile finale cuvantul este recunoscut altfel nu boolean recunoscut = recunoscut(temp, stFinale); if (recunoscut) rezultatFinalL.setText("Recunoscut"); else rezultatFinalL.setText("Nerecunoscut"); } /** returneaza landa inchiderea unei multimi */ public String[] landaInchidere(String[][] mat, String[] elemente) { //incepem de la pozitia de start si ii facem landa inchiderea //TODO String [] temp = undeMerge(mat, elemente); return temp; } Vector<String> sir = new Vector<String>(); public String[] undeMerge(String[][] mat, String[] elemente) { Vector<String> rez = new Vector<String>(); boolean getOut = false; for (int i = 0; i < elemente.length; i++) { //unde merge element[i], merge in rez[i], daca nu merge nicaieri return; for (int j = 1; j < mat.length; j++) { if (mat[j][0].equals(elemente[i])) { if (mat[j][1] != null) { //Smecherie..daca e mai mare de 2 caractere il split-uim la doua if (mat[j][1].length() > 2) for (int j2 = 0; j2 < mat[j][1].length(); j2+=2) rez.add(mat[j][1].substring(j2,j2+2)); else { if (mat[j][1].equals("")) { getOut = true; break; } else rez.add(mat[j][1]); } //rez.add(mat[j][1]); } } } if (getOut) break; //daca nu e in lista il bagam in []sir for (int k = 0; k < rez.size(); k++) { boolean este = false; for (int j = 0; j < sir.size(); j++) { if (rez.get(k).equals(sir.get(j))) { este = true; } } if (!este) { sir.add(rez.get(k)); } } //undemerge(mat, rez[i]); if (getOut) return null; if (rez.get(i) != null) { String []temp = new String[rez.size()]; for (int j = 0; j < temp.length; j++) temp[j] = rez.get(j); // if getOut undeMerge(mat, temp); } else { String []s = new String[sir.size()]; for (int j = 0; j < s.length; j++) s[j] = sir.get(j); return s; } } String[] s = new String[sir.size()]; for (int i = 0; i < s.length; i++) s[i] = sir.get(i); return s; } /** Sirurile trebuie sa aiba cel putin un element */ public void log(String[] temp, String[] rezultatLandaTranzitie) { logTx.append("\n-> landa tranzitie ({"); for (int i = 0; i < temp.length-1; i++) logTx.append(temp[i] + ", "); logTx.append(temp[temp.length-1]); logTx.append("}) = {"); for (int i = 0; i < rezultatLandaTranzitie.length-1; i++) logTx.append(rezultatLandaTranzitie[i] + ", "); logTx.append(rezultatLandaTranzitie[rezultatLandaTranzitie.length-1]); logTx.append("}"); } /** DE VERIFICAT CORECTITUDINEA LUI !!! */ public String[] noulDeLandat(String [][]tranz, String[] temp, String caracter) { Vector<String> tempLandat = new Vector<String>(); for (int i = 0; i < temp.length; i++) { for (int j = 1; j < tranz.length; j++) { if (temp[i].equals(tranz[j][0])) { if (tranz[j][1].equals(caracter)) tempLandat.add(tranz[j][2]); } } } temp = new String[tempLandat.size()]; for (int i = 0; i < tempLandat.size(); i++) { temp[i] = tempLandat.get(i); } return temp; } public String[] reuniuneStariLandaTranzitii(String[] rez, String[] temp) { //bagam elementele lui temp in vector Vector<String> tempVec = new Vector<String>(); for (int i = 0; i < temp.length; i++) tempVec.add(temp[i]); //caut fiecare element din primul in al doilea daca nu se gaseste il adaug for (int i = 0; i < rez.length; i++) { boolean este = false; for (int j = 0; j < temp.length; j++) { if (rez[i].equals(temp[j])) { este = true; } } if (!este) { tempVec.add(rez[i]); } } //facem un nou temp pe care il returnam temp = new String[tempVec.size()]; for (int i = 0; i < tempVec.size(); i++) temp[i] = tempVec.get(i); return temp; } /** Verifica daca ultimul rezultat al landa tranzitiei se afla printre starile finale */ public boolean recunoscut(String[] temp, String[] finale) { boolean recunoscut = false; for (int i = 0; i < finale.length; i++) for (int l = 0; l < temp.length; l++) if (finale[i].equals(temp[l])) { System.out.println("Cuvant recunoscut!"); recunoscut = true; return true; } if (!recunoscut) System.out.println("Cuvant nerecunoscut!"); return false; } public static void main(String[] args) { JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception ex) { System.out.println("Failed loading L&F: "); System.out.println(ex); } Demo d = new Demo(); }}