jueves, 5 de julio de 2012

Generador de arbol gramatical "(nivel) cadena"

#include<iostream>
#include<vector>
#include<sstream>
using namespace std;

struct Estado{
    Estado(string s, string c):simbolo(s), cadena(c){}
    string simbolo;
    string cadena;
};

int buscarTerminal(string c, string S[], int n){
    while( (--n) >= 0 ){
        if( c == S[n] )
            break;
    }
    return n;
}

int buscarNoTerminal(string c, string V[], int n){
    while( (--n) >= 0 ){
        if( c == V[n] )
            break;
    }
    return n;
}

vector<string> getTokens(string cad, string V[], int v){
    int i = 0, j , tam = cad.length();
    vector<string> tokens ;
    string actual;
    bool encontrado;
    actual = cad.substr(i,1);
    while(i<tam){
        encontrado = false;
        j = 0;
        while( j < v ){
            if(actual == V[j]){
                tokens.push_back(actual);
                encontrado = true;
                break;
            }
            ++j;
        }
        if(!encontrado){
            actual.append(cad.substr(++i,1));
            continue;
        }
        ++i;
        actual = cad.substr(i,1);
    }
    return tokens;
}

vector<string> getNivel(string estado, Estado E[], int n){
    vector<string> lineas ;
    int i = 0;
    bool encontrado = false;
    while( (i < n ) & ~encontrado ){
        if( estado == E[i].simbolo ){
            lineas.push_back(E[i].cadena);
            encontrado = true;
        }
        ++i;
    }
    while( i < n ){
        if( estado != E[i].simbolo ){
            break;
        }
        lineas.push_back(E[i].cadena);
        ++i;
    }
    return lineas;
}

vector<string> mostrarNiveles(string nivel , int nivel_raiz , Estado E[], string S[] , string V[] ,
                    int e, int s, int v, ostringstream &os){

    //cout << "MOSTRAR NIVELES 1.. " << nivel_raiz << " - NIVEL : "<< nivel << endl;

    vector<string> tokens = getTokens(nivel,V,v);
    vector<string> salida ;
    string tmp ;
    int i = 0, j, k;
    int terminal;
        //cout << "tokens : " ;
    while( i < tokens.size() ){
        //cout << tokens.at(i) << " - ";
        terminal = buscarTerminal(tokens.at(i),S,s);
        if( terminal != -1 ){
            if( salida.size() == 0 )
                tmp.append(tokens.at(i));
            else{
                k = 0;
                while( k < salida.size() ){
                    salida.at(k).append(tokens.at(i));
                    ++k;
                }
            }
        }else{
            vector<string> _tokens = getNivel(tokens.at(i),E,e);
            j = 0;
            if( salida.size() == 0 ){
                while( j < _tokens.size() ){
                    salida.push_back( tmp + _tokens.at(j) );
                    ++j;
                }
                tmp = "";
            }else{
                vector<string> _tmp ;
                while( j < _tokens.size() ){
                    k = 0;
                    while( k < salida.size() ){
                        _tmp.push_back(salida.at(k) + _tokens.at(j) );
                        ++k;
                    }
                    salida.insert(salida.begin(),_tmp.begin(),_tmp.end());
                    ++j;
                }
            }
        }
        ++i;
    }
    //cout << endl;
    i = 0;
    if(salida.size() == 0)
        salida.push_back(tmp);
    while ( i < salida.size() ){
        os << ( nivel_raiz < 100 ? "0" : ( nivel_raiz < 10 ? "00" : "" ) ) << nivel_raiz << " " << salida.at(i) << endl;
        ++i;
    }
    return salida;
}

void mostrarNiveles(vector<string> nivel , int nivel_raiz , Estado E[], string S[] , string V[] ,
                    int e, int s, int v, ostringstream &os){
    if(nivel_raiz==0)
        return;
    int i = 0;
    vector< vector < string > > tmp;
    while( i < nivel.size() ){
        tmp.push_back( mostrarNiveles( nivel.at(i), nivel_raiz, E, S, V, e, s, v , os) );
        ++i;
    }
    i = 0;
    while( i < tmp.size() ){
        //cout << "Recursividad("<<nivel_raiz<<","<<i<<")." << endl;
        mostrarNiveles( tmp.at(i), nivel_raiz-1, E, S, V, e, s, v, os );
        ++i;
    }
}

int main(){
    string V[] = {"v0","v1","v2","a","b","c"};
    string S[] = {"a","b","c"};
    Estado E[] = {
        Estado("v0","aav0"),
        Estado("v0","bv1"),
        Estado("v1","cv2b"),
        Estado("v1","cb"),
        Estado("v2","bbv2"),
        Estado("v2","bb")
    };
    vector<string> ini;
    ini.push_back("v0");
    ostringstream os;
    os << "04 v0" << endl;
    mostrarNiveles(ini,8,E,S,V,6,3,6,os);
    cout << os.str();
    return 0;
}

miércoles, 20 de junio de 2012

<html>
  <head>
    <script>
      function agregarFila(){
        var nombre = document.getElementById("txtNombre").value;
        var apellido = document
        .getElementById("txtApellido").value;
        var telefono = document
        .getElementById("txtTelefono").value;
        var direccion = document
        .getElementById("txtDireccion").value;
    var tabla = document
        .getElementById("tblDinamica");
    tabla.innerHTML = tabla.innerHTML +
        "<tr bgcolor=\"#f0ffff\" name=\"fila\">"+
                  "<td>"+(nombre==""?"&nbsp":nombre)+"</td>"+
          "<td>"+(apellido==""?"&nbsp":apellido)+"</td>"+
          "<td>"+(telefono==""?"&nbsp":telefono)+"</td>"+
          "<td>"+(direccion==""?"&nbsp":direccion)+"</td>"+
          "<td align=\"center\"><input type=\"checkbox\" "+
            "name=\"marca\"/"+"></td>"+
                "</tr>";
      }

      function modificarFila(){
    /* alert("Modificar"); */

        var nombre = document.getElementById("txtNombre").value;
        var apellido = document
        .getElementById("txtApellido").value;
        var telefono = document
        .getElementById("txtTelefono").value;
        var direccion = document
        .getElementById("txtDireccion").value;
    var tabla = document
        .getElementById("tblDinamica");

    var tabla =  document.getElementById("tblDinamica");
    var marcas = document.getElementsByName("marca");

    for( i = marcas.length - 1 ; i >= 0 ; --i ){
      if(marcas[i].checked){       
        marcas[i]
        .parentNode.parentNode.parentNode.innerHTML =
          "<tr bgcolor=\"#f0ffff\" name=\"fila\">"+
                  "<td>"+(nombre==""?"&nbsp":nombre)+"</td>"+
          "<td>"+(apellido==""?"&nbsp":apellido)+"</td>"+
          "<td>"+(telefono==""?"&nbsp":telefono)+"</td>"+
          "<td>"+(direccion==""?"&nbsp":direccion)+"</td>"+
          "<td align=\"center\"><input type=\"checkbox\" "+
            "name=\"marca\"/"+"></td>"+
                  "</tr>";
      }
    }
      }

      function eliminarFila(){
    var tabla =  document.getElementById("tblDinamica");
    var marcas = document.getElementsByName("marca");
    for( i = marcas.length - 1 ; i >= 0 ; --i ){
      if(marcas[i].checked){
        tabla.removeChild(marcas[i]
            .parentNode.parentNode.parentNode);       
      }
    }     
      }

    </script>
  </head>
  <body>
    <form name="form1">
      <H1 align="center"> TABLA DINAMICA </H1>   
      <table id="tblDinamica" border="2" rules="none" bgcolor="#0000ff">
        <tr align="center" bgcolor="#0f0f0f">
      <td colspan="5" >
            <input type="button" id="btnAgregar" value="Agregar" onclick="agregarFila()"/>
            <input type="button" value="Modificar"
        onclick="modificarFila()"/>
            <input type="button" value="Eliminar"
        onclick="eliminarFila()"/>  
          </td>
        </tr>
    <tr align="center" bgcolor="#0f0f0f">
          <td width="200">
            <input type="text" id="txtNombre" size="10"/>
          </td>
          <td width="200">
            <input type="text" id="txtApellido" size="10"/>
          </td>
          <td width="200">
            <input type="text" id="txtTelefono" size="10"/>
          </td>
          <td width="200">
            <input type="text" id="txtDireccion" size="10"/>
          </td>
          <td width="200" rowspan="2">
            <font color="white">
              MARCAR FILA A ELIMINAR O MODIFICAR
            </font>
          </td>
        </tr>
        <tr align="center" bgcolor="#ffffff" >
          <td width="200">
            NOMBRES
          </td>
          <td width="200">
            APELLIDOS   
          </td>
          <td width="200">
            TELEFONO
          </td>
          <td width="200">
            DIRECCION
          </td>
        </tr>
      </table>
    </form>
  </body>
</html>


Codigo html - javascript para una tabla dinámica con opciones de agregar, modificar, eliminar fila.