lunes, 25 de mayo de 2015

Trabajos y tareas del cuaderno








FIRMAS




CÓDIGO EN C++ DE LAS REGLAS DE PRODUCCIÓN (Muestra de los símbolos terminales).


              CENTRO UNIVERSITARIO UAEM 

              ATLACOMULCO


            LICENCIATURA EN INGENIERÍA EN COMPUTACIÓN

              NOMBRE DEL DOCENTE:
         INGENIERO. HÉCTOR CABALLERO HERNÁNDEZ

              NOMBRE MATERIA:
AUTÓMATAS Y LENGUAJES FORMALES

              NOMBRE DE LA ALUMNA:
HEIVILINA PÉREZ ARIAS

              GRUPO:
ICO-19

              TURNO:

MATÚTINO

               TRABAJO A ENTREGAR:
                            CÓDIGO EN C++ DE LAS REGLAS DE                                                                       PRODUCCIÓN (Muestra de los símbolos terminales).
            
          FECHA DE ENTREGA:
MAYO DE 2015.   




CÓDIGO EN C++ DE LAS REGLAS DE PRODUCCIÓN (Muestra de los símbolos terminales).
#include <iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>
#include <fstream>
FILE *doc;
using namespace std;

void introducirLetra (char *,char *,char *, int);
void mostrarReglasDeProduccion();
void lecturaDeArchivo();

const int num=1000;
struct Gramaticas{
                char regla[100];
                        char produccion[100];
                        char letras[100];

};
Gramaticas gram[num];

int main(int argc, char** argv) {
            cout<<"\nCENTRO UNIVERSITARIO UAEM ATLACOMULCO "<<endl;
            cout<<"\nAUTOMATAS Y LENGUAJES FORMALES"<<endl;
            cout<<"\nPROGRAMA DE REGLAS DE PRODUCCION"<<endl;
            cout<<"\t(Salida de simbolos terminales)"<<endl;
            cout<<"\nELABORADO POR:"<<endl;
            cout<<"----> HEIVILINA PEREZ ARIAS"<<endl;
            cout<<"----> MAYTE RICARDO CRUZ"<<endl;
           
            lecturaDeArchivo();
            mostrarReglasDeProduccion ();
            system("pause");
    return EXIT_SUCCESS;                                                   
}
void lecturaDeArchivo(){
                        ifstream lecturaArchivo("produccion.txt", ios::in);
                        if(!lecturaArchivo){
                                   cerr<<"No se pudo abrir el archivo"<<endl;
                                   exit(1);
                        }
                        char reglas[100];
                        char producciones[100];
                        char variables[100];
                        int i=0;
                        while(lecturaArchivo>>reglas>>producciones>>variables){
                                               introducirLetra(reglas,producciones,variables,i);
                                               i++;
                        }
}

void introducirLetra(char *nx,char *ox,char *dx, int posicion){
            if(posicion==-1){
                        cout<<"Ya no hay lugar"<<endl;
                        return;
            }
            strcpy (gram[posicion].regla,  nx);
            strcpy (gram[posicion].produccion,ox);
            strcpy (gram[posicion].letras, dx);
           
           
}
void mostrarReglasDeProduccion(){
            ofstream salida("salida.txt");
            doc=fopen("salida.txt","a+");
            cout<<endl;
            cout<<setw(10)<<"REGLAS DE PRODUCCION(simbolos terminales)"<<' '<<endl;
            cout<<endl;
                                                                        
            for(int i=0; i<num;i++){
                        if(strcmp(gram[i].letras,"")!=0){

                                   cout<<setw(10)<<gram[i].letras<<' '<<endl;

                                                          
                                   doc=fopen("salida.txt", "a+");            
                        }
            }
           
}




domingo, 24 de mayo de 2015

CODIGO EN C++ PARA REALIZAR UN ARBOL BINARIO Y SUS RECORRIDOS


              CENTRO UNIVERSITARIO UAEM 
              ATLACOMULCO
            LICENCIATURA EN INGENIERÍA EN COMPUTACIÓN

              NOMBRE DEL DOCENTE:
         INGENIERO. HÉCTOR CABALLERO HERNÁNDEZ

              NOMBRE MATERIA:
AUTÓMATAS Y LENGUAJES FORMALES

              NOMBRE DE LA ALUMNA:
HEIVILINA PÉREZ ARIAS

              GRUPO:
ICO-19

              TURNO:
MATÚTINO

               TRABAJO A ENTREGAR:
                CODIGO EN C++ PARA REALIZAR UN ARBOL BINARIO Y SUS RECORRIDOS

              FECHA DE ENTREGA:
MAYO DE 2015.   



CODIGO EN C++ PARA REALIZAR UN ARBOL BINARIO Y SUS RECORRIDOS
#include <iostream>
#include <string>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#include <cstdlib>

using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//PROGRAMA QUE DEBERA AGRAGAR NUMEROS EN UNA ESTRUCTURA DE DATOS DE UN ARBOL BINARIO
struct nodo{
     int numero;
     struct nodo *izquierdo, *derecho;
};
typedef struct nodo *ARB;

ARB empezarNodo(int z){
     ARB nuevonodo = new(struct nodo);
     nuevonodo->numero = z;
     nuevonodo->izquierdo = NULL;
     nuevonodo->derecho = NULL;
     return nuevonodo;
}
void insertar(ARB &arbol, int z){
     if(arbol==NULL){
           arbol=empezarNodo(z);
     }
     else if(z<arbol->numero)
          insertar(arbol->izquierdo, z);
     else if(z>arbol->numero)
          insertar(arbol->derecho, z);
}
void checarArbol(ARB arbol, int n){
     if(arbol==NULL)
          return;
     checarArbol(arbol->derecho, n+1);
     for(int i=0; i<n; i++)
         cout<<"--->";
     cout<<arbol->numero<<endl;
     checarArbol(arbol->izquierdo, n+1);
}
void Pre_Orden(ARB arbol){
     if(arbol!=NULL){
          cout<<arbol->numero<<" ";
          Pre_Orden(arbol->izquierdo);
          Pre_Orden(arbol->derecho);
     }
}
void In_Orden(ARB arbol){
     if(arbol!=NULL){
          In_Orden(arbol->izquierdo);
          cout<<arbol->numero<<" ";
          In_Orden(arbol->derecho);
     }
}
void Post_Orden(ARB arbol){
     if(arbol!=NULL){
          Post_Orden(arbol->izquierdo);
          Post_Orden(arbol->derecho);
          cout<<arbol->numero<<" ";
     }
}
int main(int argc, char** argv){
                 system("Color 3");
                 cout<<"\nCENTRO UNIVERSITARIO UAEM ATLACOMULCO"<<endl;
                 cout<<"\nAUTOMATAS Y LENGUAJES FORMALES"<<endl;
                 cout<<"\nINTEGRANTES:"<<endl;
                 cout<<"\n   ->HEIVILINA PEREZ ARIAS"<<endl;
                 cout<<"\nELABORACION DE UN ARBOL BINARIO Y SUS RECORRIDOS "<<endl;
                 cout<<" "<<endl;
                int i;
    ARB arbol = NULL;  
    int n; 
    int z;
    cout<<"Introdruzca la cantidad de nodos del arbol:  ";
    cin>>n;
    cout<<endl;
    for(int i=0;i<n; i++){
        cout<<"Introducir nodo numero "<<i+1<<": ";
        cin>>z;
        insertar(arbol, z);
    }
   
    cout<<"\n Representacion de  arbol"<<endl;
    checarArbol( arbol, 0);
    cout<<"\n\n Recorrido que realiza el arbol"<<endl;
    cout<< "..."<<endl;
                cout<<"\n In-orden   : "; In_Orden(arbol);
    cout<<"\n Pre-Orden  : "; Pre_Orden(arbol);
    cout<<"\n Post-Orden : "; Post_Orden(arbol);
    return 0;

}

Expresiones regulares

              CENTRO UNIVERSITARIO UAEM 
              ATLACOMULCO
            LICENCIATURA EN INGENIERÍA EN COMPUTACIÓN

              NOMBRE DEL DOCENTE:
         INGENIERO. HÉCTOR CABALLERO HERNÁNDEZ

              NOMBRE MATERIA:
AUTÓMATAS Y LENGUAJES FORMALES

              NOMBRE DE LA ALUMNA:
HEIVILINA PÉREZ ARIAS

              GRUPO:
ICO-19

              TURNO:
MATÚTINO

               TRABAJO A ENTREGAR:
                                                      LENGUAJES REGULARES
              FECHA DE ENTREGA:
MAYO DE 2015.   



LENGUAJES REGULARES
*GRAMATICAS REGULARES - EXPRESIONES REGULARES
**LENGUAJES REGULARES
Sea S = { a1, …, an} entonces definimos el conjunto de los lenguajes regulares en forma recursiva como
sigue:
Casos Base:
· { } es un lenguaje regular
· {l} es un lenguaje regular
· " 1 £ i £ n {a1} es un lenguaje regular
Casos Inductivos
· Si L1 es un lenguaje regular Ù L2 es un lenguaje regular ⇒ (L1.L2) es un lenguaje regular
· Si L1 es un lenguaje regular Ù L2 es un lenguaje regular ⇒ (L1ÈL2) es un lenguaje regular
· Si L1 es un lenguaje regular ⇒ L* es un lenguaje regular
· Si L1 es un lenguaje regular ⇒ L+ es un lenguaje regular
Ejemplo:
S = { a,b,c}
L1 = {a, ab, b, ccc} es regular? SI.
Demostración:
1. Si considero los lenguajes:
L11 ={a} L12 ={ab} L13 ={b} L14 ={ccc}
puedo decir que L1 = L11 È L12 È L13 È L14
2. L11 es regular? Sí, por 3er caso base.
Lo mismo ocurre con L13
3. L12 es regular?
Puedo decir que L12 = L11 . L13
Por lo tanto, por primer caso inductivo, L12 es regular
4. L14 es regular?
Si considero el lenguaje L15 = {c}
Puedo decir que L14 = L15 . L15 . L15
Por lo tanto, por primer caso inductivo, L14 es regular
5. Entonces, si volvemos al principio:
L1= {a} È {ab} È {b} È {ccc}
Podemos decir, por 2do caso inductivo, que L1 es regular

**Expresiones regulares
Se denominan expresiones regulares sobre un alfabeto A, a las expresiones que se pueden construir a
partir de las siguientes reglas:
- Æ es una expresión regular que describe el lenguaje vacío;
- l es una expresión regular que describe el lenguaje {l}, esto es el lenguaje que contiene
únicamente la cadena vacía;
- Para cada símbolo a Î A, a es una expresión regular que describe el lenguaje {a}, esto es el
lenguaje que contiene únicamente la cadena a;
- Si r y s son expresiones regulares que describen los lenguajes L(r) y L(s) respectivamente:
i) r / s es una expresión regular que describe el lenguaje L(r) È L(s)
ii) r . s es una expresión regular que describe el lenguaje L(r) . L(s)
iii)r* es una expresión regular que describe el lenguaje L(r)*.
El operador de clausura es el que tiene mayor precedencia, seguido por el operador de concatenación y
por último el operador de unión.
Las expresiones regulares describen los lenguajes regulares (aquellos reconocidos por autómatas finitos).
Por ejemplo las siguientes son expresiones regulares válidas:
- a* . b que describe el lenguaje L = {anb / n ³ 0}
- (a / b)* que describe el lenguaje L = { x / x Î {a, b}* }

UNIDAD ARITMÉTICA Y LÓGICA (ALU)

              CENTRO UNIVERSITARIO UAEM 
              ATLACOMULCO
            LICENCIATURA EN INGENIERÍA EN COMPUTACIÓN

              NOMBRE DEL DOCENTE:
         INGENIERO. HÉCTOR CABALLERO HERNÁNDEZ

              NOMBRE MATERIA:
AUTÓMATAS Y LENGUAJES FORMALES

              NOMBRE DE LA ALUMNA:
HEIVILINA PÉREZ ARIAS

              GRUPO:
ICO-19

              TURNO:
MATÚTINO

               TRABAJO A ENTREGAR:
                   UNIDAD ARITMÉTICA Y LÓGICA (ALU)
          FECHA DE ENTREGA:
MAYO DE 2015.   



UNIDAD ARITMÉTICA Y LÓGICA (ALU)
Una unidad aritmética lógica puede realizar un conjunto de operaciones aritméticas básicas y un conjunto de operaciones lógicas, a través de líneas de selección. En inglés ALU significa Arithmetic Logic Unit (Unidad Aritmética Lógica). La figura 3.12.1. Muestra el diagrama de bloques de una ALU.RE
Figura 3.12.1. Diagrama de bloques de una ALU
Las cuatro entradas de A se combinan con las de B generando una operación de salida de cuatro bits en F. La entrada de selección de modo S2 distingue entre las operaciones aritméticas y lógicas. Las entradas de selección S0 y S1 determinan la operación aritmética o lógica. Con las entradas S0 S1 se pueden elegir cuatro operaciones aritméticas (con S2 en un estado) y cuatro logicas (con S2 en otro estado). Los acarreos de entrada y salida tienen sentido únicamente en las operaciones aritmét icas. El diseño de una ALU implica el diseño de la sección aritmética, la sección lógica y la modificación de la sección aritmética para realizar las operaciones aritméticas y lógicas.
Sección Lógica
Los datos de entrada en una operación lógica son manipulados en forma separada y los bits son tratados como variables binarias. En la tabla 3.12.1. se listan cuatro operaciones lógicas OROR - ExclusivaAND NOT. En el circuito, las dos líneas de selección (S1S0) permiten seleccionar una de las compuertas de entrada, correspondientes a la función Fi .
S1
S0
Salida
Función Fi
0
0
F=Ai+Bi
OR
0
1
F=AiÅBi
XOR
1
0
F=Ai·Bi
AND
1
1
F=A'i
NOT
Tabla 3.12.1. Tabla de Función Lógica.
El circuito lógico de la fig ura 3.12.2 es una etapa de un circuito lógico de bits.
Figura 3.12.2. Diagrama lógico de un circuito lógico de una ALU
Sección Aritmética
El componente básico de la sección aritmética es un sumador en paralelo. Las operaciones aritméticas configuradas en el circuito aritmético se presentan en la tabla 3.12.2. En una ALU, la suma aritmética se puede implementar con un número binario en A, otro número en la entrada y el acarreo de entrada Cin en un valor lógico 0. El resto de las funciones se enuncian en la columna descripción.
Selección de Función
Salida N
Función
Descripción
S1
S0
Cin
 N
F

0
0
0
0
A
Transferir A
0
0
1
0
A+1
Incrementar A
0
1
0
B
A+B
Suma ó agregar B a A
0
1
1
B
A+B+1
Suma con accarreo ó agregar B a A más 1
1
0
0
B’
A+B’
Agregar el complemento de 1 de B a A
1
0
1
B’
A+B’+1
Agregar el complemento de 2 de B a A
1
1
0
Todos unos
A-1
Decrementar A
1
1
1
Todos unos
A
Trasferir A
 Tabla 3.12.2. Tabla de la Función F en un Circuito Aritmético
La implementación de las funciones anteriores por medio de un circuito lógico sencillo se describe a continuación. El circuito se diseña bajo el precepto de intervenir cada entrada Bi para obtener las siguientes funciones:
S1
S0
Ni
0
0
0
0
1
Bi
1
0
Bi'
1
1
1
Tabla 3.12.3. Tabla del circuito para la entrada Bi
La figura 3.12.3. muestra el circuito.
Figura 3.12.3. Circuito para la tabla 3.12.2.
Por medio de estas funciones se pueden lograr las funciones de la tabla 3.12.2 al agregar el número Ni (tabla 3.12.3) a la entrada A a través de un sumador en paralelo para cada etapa, teniendo en cuenta el valor de la entrada Cin. El circuito combinacional aritmético se muestra en la figura 3.12.4. En la figura, la entrada A se denomina Mi en el sumador completo.
Figura 3.12.4. Circuito aritmético
Diseño de una Unidad Aritmética Lógica
En el diseño de una ALU se deben seguir los siguientes pasos:
1.    Diseñar la sección aritmética independientemente de la sección lógica.
2.    Determinar las operaciones lógicas del circuito aritmético, asumiendo que los acarreos de salida de todas las etapas son 0.
3.    Modificar el circuito aritmético para obtener las operaciones lógica requeridas.
El diseño simple de una ALU se hace utilizando el sumador completo para generar las operaciones lógicas de la unidad. Por lo tanto es necesario introducir una variable de control adicional (S2), con el fin de seleccionar entre las operaciones lógicas y aritméticas. En este diseño, un valor S= 1 hace que el circuito efectúe operaciones lógicas. Recordando la salida de un sumador completo:
F = (Ai Å Bi) Å Cin
A partir de esta ecuación, es posible obtener la función lógica requerida, utilizando la debida manipulación lógica. La función requerida se expone en la tabla 3.12.4.
S2
S1
S0
Ai
Bi
Cin
Operación Sumador Completo
Función requerida Fi
Manipulación
Salida
1
0
0
Ai
0
0
Ai
OR
Aplicar una función OR Ai + Bi
Ai+Bi
1
0
1
Ai
Bi
0
Ai Å Bi
XOR
Ninguna
AiÅBi
1
1
0
Ai
Bi'
0
Ai·Bi
AND
Aplicar una función OR Ai + Bi'
Ai·Bi
1
1
1
Ai
1
0
A'i
NOT
Ninguna
A'i
Tabla 3.12.4. Tabla de obtención de las funciones lógicas con un sumador completo
Partiendo de la tabla 3.12.4., las entradas Mi, Ni Cini en un sumador completo, son equivalentes a las siguientes expresiones:
Mi = Ai S2·S1'·S0'·Bi SSS0'·Bi'
Ni = S0·Bi + S1·Bi'
Cini = S2'·Ci
La figura 3.12.5. muestra el diagrama de la unidad aritmética lógica de dos etapas.
Figura 3.12.5. Diagrama lógico de una ALU
Las doce operaciones generadas en el ALU se resumen en la tabla 3.12.5., la función en particular se selecciona a través de S2S1S0 y Cin. Las operaciones aritméticas son las mismas del circuito aritmético.

Selección
Salida F
hDescripción
hS2
hS1
hS0
Cin
F

0
0
0
0
A
Trasferir A
0
0
0
1
A+1
Incrementar A
0
0
1
0
A+B
Suma
0
0
1
1
A+B+1
Suma con accarreo
0
1
0
0
A-B-1
Resta con préstamo
0
1
0
1
A-B
Sustracción
0
1
1
0
A-1
Decrementar A
0
1
1
1
A
Transferir A
1
0
0
X
A+B
OR
1
0
1
X
Å B
OR-Exclusiva
1
1
0
X
A·B
AND
1
1
1
X
A’
Complementar A

Tabla 3.12.5. Tabla de verdad de una ALU