Electra
Versión Java

/*

 Applet para aplicar el método Electra.
 El applet permite evaluar como máximo cuatro
 alternativas en base a diez criterios.

 Autor : Víctor Martínez Ortiz.

 El código del applet está basado en las notas de 
 la clase de Diseño de Procesos, impartida por el
 Dr. Enrique Arce Medina de la ESIQIE-IPN.

 Marzo de 2001.

*/

import java.io.*;
import java.awt.*;
import java.util.*;
import java.applet.*;
import java.awt.event.*;

public class AppletElectra extends Applet
{
    // algoritmo
    private int na=0,nc=0;
    private Integer p=new Integer(-1);
    private Integer q=new Integer(-1);
    private Integer mat_cal[][];
    private Integer mat_con[][];
    private Integer mat_dis[][];
    // vectores para tabla de dominancias
    Vector DominaA;
    boolean generarInforme=false;
    Vector DominadaPor;
    // applet
    String archivo="";
    TextArea resultados;
    Button calcular;
    Button ASCII;
    Button LaTeX;
    Button abrir;
    Button guardar;
    TextField celdas[][];
    TextField alternativas[];
    TextField criterios[];
    Checkbox dadoQ;
    Checkbox dadoP;
    TextField valorQ;
    TextField valorP;

    private void parametrosElectra()
    {
        int C=0,A=0;
        String ast="";
        // establece número de criterios y de alternativas
        for (int i=0;i<4;i++)
        {
            ast=alternativas[i].getText();
            if (!ast.equals("*")) A++;
        }
        for (int i=0;i<10;i++)
        {
            ast=criterios[i].getText();
            if (!ast.equals("*")) C++;
        }
        // dimensiona arreglos
        na=A;
        nc=C;
        // dimensiona arreglos
        mat_cal=new Integer[na+1][nc];
        mat_dis=new Integer[na][na];
        mat_con=new Integer[na][na];
        // dimensiona vectores
        DominaA=new Vector();
        DominadaPor=new Vector();
        // agrega vectores vacios al vector "contenedor"
        for (int i=0;i<na;i++)
        {
            DominaA.addElement(new Vector());
            DominadaPor.addElement(new Vector());
        }
        // lee datos de las celdas
        leerCeldas();
    }

    private void algoritmoElectra()
    {
        int i,j,k,g,suma,max;
        try
        {
        // cálculo de matriz de concordancia
        for (i=0;i<na;i++)
        {
            for (j=0;j<na;j++)
            {
                // evita la diagonal
                suma=0;
                if (i!=j)
                {
                    for (k=0;k<nc;k++)
                    {
                        g=0;
                        if(mat_cal[i][k].intValue()>=mat_cal[j][k].intValue())
                        {
                            g=1;
                        }
                        suma+=g*mat_cal[na][k].intValue();
                    }
                }
                mat_con[i][j]=new Integer(suma);
            }
        }
        // cálculo de matriz de discordancia
        for (i=0;i<na;i++)
        {
            for (j=0;j<na;j++)
            {
                mat_dis[i][j]=new Integer(0);
                // evita la diagonal
                if (i!=j)
                {
                    max=mat_cal[j][0].intValue()-mat_cal[i][0].intValue();
                    for (k=1;k<nc;k++)
                    {
                        if((mat_cal[j][k].intValue()-mat_cal[i][k].intValue())>max)
                        {
                            max=mat_cal[j][k].intValue()-mat_cal[i][k].intValue();
                        }
                    }
                    mat_dis[i][j]=new Integer(max);
                    if (max<0) mat_dis[i][j]=new Integer(0);
                }
            }
        }
        // cálculo de p
        suma=0;
        for (i=0;i<na;i++)
        {
            for (j=0;j<na;j++)
            {
                suma+=mat_con[i][j].intValue();
            }
        }
        p=new Integer((int)Math.ceil((double)suma/(double)(na*na-na)));
        //cálculo de q
        suma=0;
        for (i=0;i<na;i++)
        {
            for (j=0;j<na;j++)
            {
                suma+=mat_dis[i][j].intValue();
            }
        }
        q=new Integer((int)Math.ceil((double)suma/(double)(na*na-na)));
        // verifica si q y p se dan o se calculan
        if (dadoP.getState()==true)
            p=Integer.valueOf(valorP.getText());
        if (dadoQ.getState()==true)
            q=Integer.valueOf(valorQ.getText());
        // elabora tabla "Domina a"
        for (i=0;i<na;i++)
        {
            for (j=0;j<na;j++)
            {
                if(i!=j)
                {
                    if (mat_con[i][j].intValue()>=p.intValue())
                    {
                        if (mat_dis[i][j].intValue()<=q.intValue())
                        {
                            // agrega altenativa a la lista (i: domina a j)
                            ((Vector)DominaA.elementAt(i)).addElement(new String("A"+(j+1)));
                        }
                    }
                }
            }
        }
        // elabora tabla "Dominada por"
        for (j=0;j<na;j++)
        {
            for (i=0;i<na;i++)
            {
                if(i!=j)
                {
                    if (mat_con[j][i].intValue()>=p.intValue())
                    {
                        if (mat_dis[j][i].intValue()<=q.intValue())
                        {
                            // agrega alternativa a la lista (i: es dominada por j)
                            ((Vector)DominadaPor.elementAt(i)).addElement(new String("A"+(j+1)));
                        }
                    }
                }
            }
        }
        }
        catch(Exception e)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("ERROR: Algunos de lo datos\n");
            resultados.append("proporcionados son erróneos...\n");
        }
    }

    private void escribeResultados()
    {
        resultados.append("\n----------------------------------------------\n");
        resultados.append("\nAltenativas\n\n");
        for (int i=0;i<na;i++)
            resultados.append("A"+(i+1)+" : "+alternativas[i].getText()+"\n");
        resultados.append("\nCriterios\n\n");
        for (int i=0;i<nc;i++)
            resultados.append("C"+(i+1)+" : "+criterios[i].getText()+"\n");
        resultados.append("\nResultados\n");
        resultados.append("\nMatriz de calificaciones y pesos\n\n");
        for (int i=0;i<na+1;i++)
        {
            if (i==0)
                resultados.append("\t");
            else
                resultados.append("A"+i+"\t");
        }
        resultados.append("Pesos"+"\n");
        for (int j=0;j<nc;j++)
        {
            for (int i=-1;i<na+1;i++)
            {
                if (i==-1)
                    resultados.append("C"+(j+1)+"\t");
                else
                    resultados.append(mat_cal[i][j]+"\t");
            }
            resultados.append("\n");
        }
        resultados.append("\nMatriz de concordancias\n\n");
        for (int i=0;i<na+1;i++)
        {
            if (i==0)
                resultados.append("\t");
            else
                resultados.append("A"+i+"\t");
        }
        resultados.append("\n");
        for (int i=0;i<na;i++)
        {
            for (int j=-1;j<na;j++)
            {
                if (j==-1)
                    resultados.append("A"+(i+1)+"\t");
                else
                    resultados.append(mat_con[i][j]+"\t");
            }
            resultados.append("\n");
        }
        resultados.append("\np = "+p+"\n\n");
        resultados.append("\nMatriz de discordancias\n\n");
        for (int i=0;i<na+1;i++)
        {
            if (i==0)
                resultados.append("\t");
            else
                resultados.append("A"+i+"\t");
        }
        resultados.append("\n");
        for (int i=0;i<na;i++)
        {
            for (int j=-1;j<na;j++)
            {
                if (j==-1)
                    resultados.append("A"+(i+1)+"\t");
                else
                    resultados.append(mat_dis[i][j]+"\t");
            }
            resultados.append("\n");
        }
        resultados.append("\nq = "+q+"\n");
        int k;
        resultados.append("\nDomina a :\n\n");
        k=0;
        Enumeration e1=DominaA.elements();
        while(e1.hasMoreElements())
        {
            resultados.append("A"+(k+1)+" :\t");
            Enumeration e2=((Vector)e1.nextElement()).elements();
            while (e2.hasMoreElements())
                resultados.append((String)e2.nextElement()+"\t");
            k++;
            resultados.append("\n");
        }
        resultados.append("\nDominada por :\n\n");
        k=0;
        Enumeration e3=DominadaPor.elements();
        while(e3.hasMoreElements())
        {
            resultados.append("A"+(k+1)+" :\t");
            Enumeration e4=((Vector)e3.nextElement()).elements();
            while (e4.hasMoreElements())
                resultados.append((String)e4.nextElement()+"\t");
            k++;
            resultados.append("\n");
        }
    }

    public void llenarCeldas()
    {
        // pone en ceros todas las celdas
        for (int i=0;i<10;i++)
        {
            for (int j=0;j<5;j++)
                celdas[i][j].setText(""+0);
        }
        // copia calificaciones
        for (int i=0;i<nc;i++)
        {
            for (int j=0;j<na;j++)
            {
                celdas[i][j].setText(""+mat_cal[j][i].intValue());
            }
        }
        // copia pesos
        for (int i=0;i<nc;i++)
        {
            int j=na;
            celdas[i][4].setText(""+mat_cal[j][i].intValue());
        }
        // carga p y q
        valorP.setText(""+p);
        valorQ.setText(""+q);
        resultados.append("\n----------------------------------------------\n");
        resultados.append("Llenando las celdas con datos\n");
    }

    public void leerCeldas()
    {
        // lee calificaciones
        for (int i=0;i<nc;i++)
        {
            for (int j=0;j<na;j++)
            {
                mat_cal[j][i]=Integer.valueOf(celdas[i][j].getText());
            }
        }
        // lee pesos        
        for (int i=0;i<nc;i++)
            mat_cal[na][i]=Integer.valueOf(celdas[i][4].getText());
        resultados.append("\n----------------------------------------------\n");
        resultados.append("Leyendo datos de las celdas\n");
    }

    public void init()
    {
        Panel panelDescripcion;
        Panel contenedorCeldas;
        Panel etiquetasDescripcion;
        Panel contenedorDescripcion;
        Panel contenedorPQ;
        Panel botones;
        Panel derecho;
        // layout del applet
        setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
        // dimensiona vectores de descripción y altenativas
        alternativas=new TextField[4];
        criterios=new TextField[10];
        for (int i=0;i<4;i++)
            alternativas[i]=new TextField("*",20);
        for (int i=0;i<10;i++)
            criterios[i]=new TextField("*",20);
        // dimensiona matriz de celdas
        celdas=new TextField[10][5];
        for (int f=0;f<10;f++)
            for (int c=0;c<5;c++)
                celdas[f][c]=new TextField("0",6);
        // configura interfaz de usuario
        setBackground(new Color(255,255,255));
        // botones de abrir y cerrar archivos
        guardar=new Button("Guardar datos");
        // agrega manejador
        guardar.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    guardarDatos();
                }
            }
        );
        abrir=new Button("Leer datos");
        // agrega manejador
        abrir.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    abrirDatos();
                }
            }
        );
        //agrega elementos al panel
        contenedorDescripcion=new Panel(new GridLayout(16,1));
        etiquetasDescripcion=new Panel(new GridLayout(16,1));
        etiquetasDescripcion.add(new Label());
        contenedorDescripcion.add(new Label("Alternativas"));
        for (int i=0;i<4;i++)
        {
            etiquetasDescripcion.add(new Label("A"+(i+1)+" : ",Label.LEFT));
            contenedorDescripcion.add(alternativas[i]);
        }
        etiquetasDescripcion.add(new Label());
        contenedorDescripcion.add(new Label("Criterios"));
        for (int j=0;j<10;j++)
        {
            etiquetasDescripcion.add(new Label("C"+(j+1)+" : ",Label.LEFT));
            contenedorDescripcion.add(criterios[j]);
        }
        panelDescripcion=new Panel(new BorderLayout());
        panelDescripcion.add(BorderLayout.WEST,etiquetasDescripcion);
        panelDescripcion.add(BorderLayout.CENTER,contenedorDescripcion);
        // agrega celdas
        contenedorCeldas=new Panel(new GridLayout(11,6));
        // inserta celda invisible
        contenedorCeldas.add(new Label());
        // inserta primera fila
        for (int f=1;f<=4;f++)
            contenedorCeldas.add(new Label("A"+f,Label.CENTER));
        contenedorCeldas.add(new Label("Pesos"));
        int k=1;
        for (int f=1;f<=10;f++)
            for (int c=0;c<6;c++)
                if (c==0)
                    contenedorCeldas.add(new Label("C"+(f),Label.CENTER));
                else
                    contenedorCeldas.add(celdas[f-1][c-1]);
        dadoQ=new Checkbox("q = ",false);
        // agrega manejador
        dadoQ.addItemListener(new ItemListener()
            {
                public void itemStateChanged(ItemEvent e)
                {
                    if(dadoQ.getState()==false)
                        valorQ.setEnabled(false);
                    else
                        valorQ.setEnabled(true);
                }
            }
        );
        dadoP=new Checkbox("p = ",false);
        // agrega manejador
        dadoP.addItemListener(new ItemListener()
            {
                public void itemStateChanged(ItemEvent e)
                {
                    if(dadoP.getState()==false)
                        valorP.setEnabled(false);
                    else
                        valorP.setEnabled(true);
                }
            }
        );
        calcular=new Button("Evaluar alternativas");
        // agrega manejador
        calcular.addActionListener( new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    evaluaAlternativas();
                }
            }
        );
        // espacio para resultados
        resultados=new TextArea("",13,80,TextArea.SCROLLBARS_BOTH);
        resultados.setFont(new Font("Courier New",Font.PLAIN,12));
        // botones de exportación de resultados
        ASCII=new Button("Informe en ASCII");
        // agrega manejador
        ASCII.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    informeASCII();
                }
            }
        );
        LaTeX=new Button("Informe en LaTeX");
        // agrega manejador
        LaTeX.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    informeLaTeX();
                }
            }
        );
        // contenedor PQ
        valorQ=new TextField();
        valorQ.setEnabled(false);
        valorP=new TextField();
        valorP.setEnabled(false);
        contenedorPQ=new Panel(new GridLayout(1,5,5,0));
        contenedorPQ.add(new Label(""));
        contenedorPQ.add(dadoP);
        contenedorPQ.add(valorP);
        contenedorPQ.add(dadoQ);
        contenedorPQ.add(valorQ);
        // panel de botones
        botones=new Panel(new GridLayout(1,5,0,0));
        botones.add(abrir);
        botones.add(guardar);
        botones.add(calcular);
        botones.add(ASCII);
        botones.add(LaTeX);
        // panel del lado derecho
        derecho=new Panel(new BorderLayout(0,10));
        derecho.add(BorderLayout.CENTER,contenedorCeldas);
        derecho.add(BorderLayout.SOUTH,contenedorPQ);
        // agrega elementos al layout principal
        add(panelDescripcion);
        add(derecho);
        add(botones);
        add(resultados);
        // carga los datos del ejemplo
        cargarEjemplo();
    }

    private void evaluaAlternativas()
    {
        parametrosElectra();
        algoritmoElectra();
        escribeResultados();
        generarInforme=true;
        // carga p y q
        valorP.setText(""+p);
        valorQ.setText(""+q);
    }

    private void guardarDatos()
    {
        // lee datos de las celdas y carga en la memoria
        parametrosElectra();
        // lee nombre del archivo con diálogo
        Frame marco=new Frame();
        FileDialog guardar=new FileDialog(marco,"Guardar en archivo local",FileDialog.SAVE);
        try
        {
            guardar.setFile(archivo);
            guardar.show();
        }
        catch(Exception e)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("El applet no tiene permiso para abrir\n");
            resultados.append("archivos en su sistema...\n");
        }
        //archivo=guardar.getDirectory()+guardar.getFile();
        archivo=guardar.getFile();
        marco.dispose();
        guardar.dispose();
        // acccion ante la cancelación de usuario
        if (archivo==null)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("Se canceló el proceso de almacenamiento\n");
            archivo="";
            return;
        }
        // guarda datos en archivo
        try
        {
            DataOutputStream salida=
                new DataOutputStream(
                    new BufferedOutputStream(
                        new FileOutputStream(archivo)));
            // escribe datos
            salida.writeInt(p.intValue());
            salida.writeInt(q.intValue());
            salida.writeInt(na);
            salida.writeInt(nc);
            // escribe calificaciones
            for (int i=0;i<na;i++)
            {
                for (int j=0;j<nc;j++)
                {
                    salida.writeInt(mat_cal[i][j].intValue());
                }
            }
            // escribe pesos
            for (int j=0;j<nc;j++)
            {
                salida.writeInt(mat_cal[na][j].intValue());
            }
            // guarda descripciones
            for (int i=0;i<na;i++)
                salida.writeUTF(alternativas[i].getText());
            for (int i=0;i<nc;i++)
                salida.writeUTF(criterios[i].getText());
            salida.close();
            resultados.append("\n----------------------------------------------\n");
            resultados.append("Se guardaron los datos en el archivo "+archivo+"\n");
        }
        catch(IOException e)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("Error en el proceso de escritura\n");
        }
    }

    private void abrirDatos()
    {
        // lee nombre del archivo con diálogo
        Frame marco=new Frame();
        FileDialog abrir=new FileDialog(marco,"Abrir en archivo local",FileDialog.LOAD);
        try
        {
            abrir.show();
        }
        catch(Exception e)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("El applet no tiene permiso para guardar\n");
            resultados.append("archivos en su sistema...\n");
        }
        // archivo=abrir.getDirectory()+abrir.getFile();
        archivo=abrir.getFile();
        marco.dispose();
        abrir.dispose();
        if (archivo==null)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("Se canceló el proceso de lectura\n");
            archivo="";
            return;
        }
        // guarda datos en archivo
        try
        {
            DataInputStream entrada=
                new DataInputStream(
                    new BufferedInputStream(
                        new FileInputStream(archivo)));
            // escribe datos
            p=new Integer(entrada.readInt());
            q=new Integer(entrada.readInt());
            na=entrada.readInt();
            nc=entrada.readInt();
            // pone en cero todas las celdas
            for (int i=0;i<4;i++)
            {
                for (int j=0;j<10;j++)
                    celdas[j][i].setText(""+0);
            }
            // escribe calificaciones
            for (int i=0;i<na;i++)
            {
                for (int j=0;j<nc;j++)
                    celdas[j][i].setText(""+entrada.readInt());
            }
            // escribe pesos
            for (int j=0;j<nc;j++)
                celdas[j][4].setText(""+entrada.readInt());
            // inicializa celdas de descripción
            for (int i=0;i<4;i++)
                alternativas[i].setText("*");
            for (int i=0;i<10;i++)
                criterios[i].setText("*");
            // escribe nombre de las alternativas
            for (int i=0;i<na;i++)
                alternativas[i].setText(entrada.readUTF());
            for (int i=0;i<nc;i++)
                criterios[i].setText(entrada.readUTF());
            entrada.close();
            resultados.append("\n----------------------------------------------\n");
            resultados.append("Se leyeron datos del archivo "+archivo+"\n");
        }
        catch(IOException e)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("Error en el proceso de lectura\n");
        }
    }

    private void cargarEjemplo()
    {
        // carga descripción
        for (int i=0;i<4;i++)
            alternativas[i].setText("Alternativa "+(i+1));
        for (int i=0;i<4;i++)
            criterios[i].setText("Criterio "+(i+1));
        // carga celdas
        celdas[0][0].setText(""+0);
        celdas[0][1].setText(""+1);
        celdas[0][2].setText(""+4);
        celdas[0][3].setText(""+4);
        celdas[0][4].setText(""+2);
        celdas[1][0].setText(""+2);
        celdas[1][1].setText(""+2);
        celdas[1][2].setText(""+3);
        celdas[1][3].setText(""+5);
        celdas[1][4].setText(""+3);
        celdas[2][0].setText(""+1);
        celdas[2][1].setText(""+3);
        celdas[2][2].setText(""+2);
        celdas[2][3].setText(""+4);
        celdas[2][4].setText(""+4);
        celdas[3][0].setText(""+4);
        celdas[3][1].setText(""+4);
        celdas[3][2].setText(""+2);
        celdas[3][3].setText(""+3);
        celdas[3][4].setText(""+5);
    }

    private void informeASCII()
    {
        String archivoASCII="";
        // verifica que exista que reportar
        if (generarInforme==false)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("No hay nada que reportar\n");
            return;
        }
        // lee nombre del archivo con diálogo
        Frame marco=new Frame();
        FileDialog guardar=new FileDialog(marco,"Exportar informe ASCII",FileDialog.SAVE);
        try
        {
            guardar.setFile(archivoASCII);
            guardar.show();
        }
        catch(Exception e)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("El applet no tiene permiso para abrir\n");
            resultados.append("archivos en su sistema...\n");
        }
        //archivo=guardar.getDirectory()+guardar.getFile();*************
        archivoASCII=guardar.getFile();
        marco.dispose();
        guardar.dispose();
        // acccion ante la cancelación de usuario
        if (archivoASCII==null)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("Se canceló la generación del informe\n");
            return;
        }
        // guarda datos en archivo
        try
        {
            DataOutputStream salidaASCII=
                new DataOutputStream(
                    new BufferedOutputStream(
                        new FileOutputStream(archivoASCII)));
            salidaASCII.writeBytes("\nAltenativas\n\n");
            for (int i=0;i<na;i++)
                salidaASCII.writeBytes("A"+(i+1)+" : "+alternativas[i].getText()+"\n");
            salidaASCII.writeBytes("\nCriterios\n\n");
            for (int i=0;i<nc;i++)
                salidaASCII.writeBytes("C"+(i+1)+" : "+criterios[i].getText()+"\n");
            salidaASCII.writeBytes("\nMatriz de calificaciones y pesos\n\n");
            for (int i=0;i<na+1;i++)
            {
                if (i==0)
                    salidaASCII.writeBytes("\t");
                else
                    salidaASCII.writeBytes("A"+i+"\t");
            }
            salidaASCII.writeBytes("Pesos"+"\n");
            for (int j=0;j<nc;j++)
            {
                for (int i=-1;i<na+1;i++)
                {
                    if (i==-1)
                        salidaASCII.writeBytes("C"+(j+1)+"\t");
                    else
                        salidaASCII.writeBytes(mat_cal[i][j]+"\t");
                }
                salidaASCII.writeBytes("\n");
            }
            salidaASCII.writeBytes("\nMatriz de concordancias\n\n");
            for (int i=0;i<na+1;i++)
            {
                if (i==0)
                    salidaASCII.writeBytes("\t");
                else
                    salidaASCII.writeBytes("A"+i+"\t");
            }
            salidaASCII.writeBytes("\n");
            for (int i=0;i<na;i++)
            {
                for (int j=-1;j<na;j++)
                {
                    if (j==-1)
                        salidaASCII.writeBytes("A"+(i+1)+"\t");
                    else
                        salidaASCII.writeBytes(mat_con[i][j]+"\t");
                }
                salidaASCII.writeBytes("\n");
            }
            salidaASCII.writeBytes("\np = "+p+"\n\n");
            salidaASCII.writeBytes("\nMatriz de discordancias\n\n");
            for (int i=0;i<na+1;i++)
            {
                if (i==0)
                    salidaASCII.writeBytes("\t");
                else
                    salidaASCII.writeBytes("A"+i+"\t");
            }
            salidaASCII.writeBytes("\n");
            for (int i=0;i<na;i++)
            {
                for (int j=-1;j<na;j++)
                {
                    if (j==-1)
                        salidaASCII.writeBytes("A"+(i+1)+"\t");
                    else
                        salidaASCII.writeBytes(mat_dis[i][j]+"\t");
                }
                salidaASCII.writeBytes("\n");
            }
            salidaASCII.writeBytes("\nq = "+q+"\n");
            int k;
            salidaASCII.writeBytes("\nDomina a :\n\n");
            k=0;
            Enumeration e1=DominaA.elements();
            while(e1.hasMoreElements())
            {
                salidaASCII.writeBytes("A"+(k+1)+" :\t");
                Enumeration e2=((Vector)e1.nextElement()).elements();
                while (e2.hasMoreElements())
                    salidaASCII.writeBytes((String)e2.nextElement()+"\t");
                k++;
                salidaASCII.writeBytes("\n");
            }
            salidaASCII.writeBytes("\nDominada por :\n\n");
            k=0;
            Enumeration e3=DominadaPor.elements();
            while(e3.hasMoreElements())
            {
                salidaASCII.writeBytes("A"+(k+1)+" :\t");
                Enumeration e4=((Vector)e3.nextElement()).elements();
                while (e4.hasMoreElements())
                    salidaASCII.writeBytes((String)e4.nextElement()+"\t");
                k++;
                salidaASCII.writeBytes("\n");
            }
            salidaASCII.close();
            resultados.append("\n----------------------------------------------\n");
            resultados.append("Se generó reporte en ASCII\n");
        }
        catch(IOException e)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("Error en el proceso de escritura\n");
        }
    }

    private void informeLaTeX()
    {
        String archivoLaTeX="";
        // verifica que exista que reportar
        if (generarInforme==false)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("No hay nada que reportar\n");
            return;
        }
        String esp="\\hspace{20pt}";
        // lee nombre del archivo con diálogo
        Frame marco=new Frame();
        FileDialog guardar=new FileDialog(marco,"Exportar informe LaTeX",FileDialog.SAVE);
        try
        {
            guardar.setFile(archivoLaTeX);
            guardar.show();
        }
        catch(Exception e)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("El applet no tiene permiso para abrir\n");
            resultados.append("archivos en su sistema...\n");
        }
        //archivo=guardar.getDirectory()+guardar.getFile();*************
        archivoLaTeX=guardar.getFile();
        marco.dispose();
        guardar.dispose();
        // acccion ante la cancelación de usuario
        if (archivoLaTeX==null)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("Se canceló la generación del informe\n");
            return;
        }
        // guarda datos en archivo
        try
        {
            DataOutputStream salidaLaTeX=
                new DataOutputStream(
                    new BufferedOutputStream(
                        new FileOutputStream(archivoLaTeX)));
            // escribe preámbulo de LaTeX
            salidaLaTeX.writeBytes("\\documentclass[letterpaper,10pt]{report}\n");
            salidaLaTeX.writeBytes("\\usepackage[spanish, activeacute]{babel}\n");
            salidaLaTeX.writeBytes("\\usepackage[latin1]{inputenc}\n");
            salidaLaTeX.writeBytes("\\begin{document}\n");
            salidaLaTeX.writeBytes("{\\Huge M'etodo Electra}\n"); //'
            // describe las alternativas
            salidaLaTeX.writeBytes("\\section*{Altenativas}\n");
            salidaLaTeX.writeBytes("\\begin{description}\n");
            for (int i=0;i<na;i++)
                salidaLaTeX.writeBytes("\\item[A"+(i+1)+" :]{"+alternativas[i].getText()+"}\n");
            salidaLaTeX.writeBytes("\\end{description}\n");
            // describe a los criterios
            salidaLaTeX.writeBytes("\\section*{Criterios}\n");
            salidaLaTeX.writeBytes("\\begin{description}\n");
            for (int i=0;i<nc;i++)
                salidaLaTeX.writeBytes("\\item[C"+(i+1)+" :]{"+criterios[i].getText()+"}\n");
            salidaLaTeX.writeBytes("\\end{description}\n");
            // matriz de calificaciones y pesos
            salidaLaTeX.writeBytes("\\section*{Matriz de calificaciones y pesos}\n");
            salidaLaTeX.writeBytes("\\begin{tabular}{");
            for (int i=0;i<na+2;i++)
                salidaLaTeX.writeBytes("r");
            salidaLaTeX.writeBytes("}\n\\hline\n");
            for (int i=0;i<na+1;i++)
            {
                if (i==0)
                    salidaLaTeX.writeBytes("&");
                else
                    salidaLaTeX.writeBytes("A"+i+"&");
            }
            salidaLaTeX.writeBytes("Pesos"+"\\\\\n");
            for (int j=0;j<nc;j++)
            {
                for (int i=-1;i<na+1;i++)
                {
                    if (i==-1)
                        salidaLaTeX.writeBytes("C"+(j+1)+"&");
                    else if(i==na)
                        salidaLaTeX.writeBytes(mat_cal[i][j]+"\\\\");
                    else
                        salidaLaTeX.writeBytes(mat_cal[i][j]+"&");
                }
                salidaLaTeX.writeBytes("\n");
            }
            salidaLaTeX.writeBytes("\\hline\n\\end{tabular}\n");
            // matriz de concordancias
            salidaLaTeX.writeBytes("\\section*{Matriz de concordancias}\n");
            salidaLaTeX.writeBytes("\\begin{tabular}{");
            for (int i=0;i<na+1;i++)
                            salidaLaTeX.writeBytes("}\n\\hline\n");
            for (int i=0;i<na+1;i++)
            {
                if (i==0)
                    salidaLaTeX.writeBytes("&");
                else if(i==na)
                    salidaLaTeX.writeBytes("A"+i+"\\\\\n");
                else
                    salidaLaTeX.writeBytes("A"+i+"&");
            }
            for (int i=0;i<na;i++)
            {
                for (int j=-1;j<na;j++)
                {
                    if (j==-1)
                        salidaLaTeX.writeBytes("A"+(i+1)+"&");
                    else if(j==na-1)
                        salidaLaTeX.writeBytes(mat_con[i][j]+"\\\\\n");
                    else
                        salidaLaTeX.writeBytes(mat_con[i][j]+"&");
                }
            }
            salidaLaTeX.writeBytes("\\hline\n\\end{tabular}\n");
            // escribe valor de p
            salidaLaTeX.writeBytes("\\begin{description}\n");
            salidaLaTeX.writeBytes("\\item[p = ]{"+p+"}\n");
            salidaLaTeX.writeBytes("\\end{description}\n");
            // matriz de discordancias
            salidaLaTeX.writeBytes("\\section*{Matriz de discordancias}\n");
            salidaLaTeX.writeBytes("\\begin{tabular}{");
            for (int i=0;i<na+1;i++)
                salidaLaTeX.writeBytes("r");
            salidaLaTeX.writeBytes("}\n\\hline\n");
            for (int i=0;i<na+1;i++)
            {
                if (i==0)
                    salidaLaTeX.writeBytes("&");
                else if (i==na)
                    salidaLaTeX.writeBytes("A"+i+"\\\\\n");
                else
                    salidaLaTeX.writeBytes("A"+i+"&");
            }
            for (int i=0;i<na;i++)
            {
                for (int j=-1;j<na;j++)
                {
                    if (j==-1)
                        salidaLaTeX.writeBytes("A"+(i+1)+"&");
                    else if(j==na-1)
                        salidaLaTeX.writeBytes(mat_dis[i][j]+"\\\\\n");
                    else
                        salidaLaTeX.writeBytes(mat_dis[i][j]+"&");
                }
            }
            salidaLaTeX.writeBytes("\\hline\n\\end{tabular}\n");
            // escribe valor de q
            salidaLaTeX.writeBytes("\\begin{description}\n");
            salidaLaTeX.writeBytes("\\item[q = ]{"+q+"}\n");
            salidaLaTeX.writeBytes("\\end{description}\n");
            // tabla "domina a"
            int k;
            salidaLaTeX.writeBytes("\\section*{Domina a :}\n");
            k=0;
            Enumeration e1=DominaA.elements();
            salidaLaTeX.writeBytes("\\begin{description}\n");
            while(e1.hasMoreElements())
            {
                salidaLaTeX.writeBytes("\\item[A"+(k+1)+" : ]{");
                Enumeration e2=((Vector)e1.nextElement()).elements();
                while (e2.hasMoreElements())
                    salidaLaTeX.writeBytes((String)e2.nextElement()+esp);
                k++;
                salidaLaTeX.writeBytes("}\n");
            }
            salidaLaTeX.writeBytes("\\end{description}\n");
            // tabla "dominada por"
            salidaLaTeX.writeBytes("\\section*{Dominada por :}\n");
            k=0;
            Enumeration e3=DominadaPor.elements();
            salidaLaTeX.writeBytes("\\begin{description}\n");
            while(e3.hasMoreElements())
            {
                salidaLaTeX.writeBytes("\\item[A"+(k+1)+" : ]{");
                Enumeration e4=((Vector)e3.nextElement()).elements();
                while (e4.hasMoreElements())
                    salidaLaTeX.writeBytes((String)e4.nextElement()+esp);
                k++;
                salidaLaTeX.writeBytes("}\n");
            }
            salidaLaTeX.writeBytes("\\end{description}\n");
            // finaliza documento LaTeX
            salidaLaTeX.writeBytes("\\end{document}");
            salidaLaTeX.close();
            resultados.append("\n----------------------------------------------\n");
            resultados.append("Se generó informe en formato para LaTeX\n");
        }
        catch(IOException e)
        {
            resultados.append("\n----------------------------------------------\n");
            resultados.append("Error en el proceso de escritura\n");
        }
    }
}

 

Regresar a Electra