Beispiel #1
0
        public MaquinaDeTuring Step()
        {
            try
            {
                Transicion transicionDeLaTabla = ObtenerSiguienteTransicion(EstadoActual, Cabezal.Leer());

                IndiceEnLaTablaAnterior = IndiceEnLaTabla;
                IndiceEnLaTabla         = transicionDeLaTabla.RowIndex;

                Cabezal.Escribir(transicionDeLaTabla.Escribir);
                Cabezal.Moverse(transicionDeLaTabla.Direccion);

                EstadoActual    = transicionDeLaTabla.EstadoSiguiente;
                IndiceEnLaTabla = transicionDeLaTabla.RowIndex;

                Pasos++;

                return(this);
            }
            catch (ArgumentException)
            {
                throw;
            }
            catch (Exception)
            {
                throw;
            }
        }
Beispiel #2
0
        public Transicion ObtenerSiguienteTransicion(string estadoActual, char charALeer)
        {
            try
            {
                Transicion transicionDeLaTabla = TablaTransiciones.FirstOrDefault(t => t.Estado == estadoActual && t.Leer == charALeer);

                if (transicionDeLaTabla == null)
                {
                    throw new ArgumentException(string.Format("No se encontró una transición válida para el estado '{0}' leyendo el caracter '{1}'.", estadoActual, charALeer));
                }

                bool puedoMoverme = true;

                if (transicionDeLaTabla.Direccion == Direccion.Derecha)
                {
                    puedoMoverme = Cabezal.PuedoMovermeALaDerecha();

                    if (!puedoMoverme)
                    {
                        throw new ArgumentException(string.Format(
                                                        "No se encontró una transición válida para el estado '{0}' leyendo el caracter '{1}'." +
                                                        " El cabezal no se puede mover más hacia la derecha.", estadoActual, charALeer));
                    }

                    return(transicionDeLaTabla);
                }
                else
                {
                    puedoMoverme = Cabezal.PuedoMovermeALaIzquierda();

                    if (!puedoMoverme)
                    {
                        throw new ArgumentException(string.Format(
                                                        "No se encontró una transición válida para el estado '{0}' leyendo el caracter '{1}'." +
                                                        " El cabezal no se puede mover más hacia la izquierda.", estadoActual, charALeer));
                    }

                    return(transicionDeLaTabla);
                }
            }
            catch (ArgumentException)
            {
                throw;
            }
            catch (Exception)
            {
                throw;
            }
        }
Beispiel #3
0
        public MaquinaDeTuring(string estadoActual, Cabezal cabezal, DataGridView dataGridView, int intervaloDeTiempo)
        {
            try
            {
                TablaTransiciones = Utilidades.Utilidades.GenerarTablaDeTransiciones(dataGridView);

                Transicion transicionInicial = TablaTransiciones.FirstOrDefault(t => t.Estado == estadoActual && t.Leer == cabezal.Leer());

                if (transicionInicial == null)
                {
                    throw new ArgumentException(string.Format("Por favor, verifique el estado inicial y/o la tabla de transiciones. No se encontró transición para el estado {0} leyendo el caracter {1}.", estadoActual, cabezal.Leer()));
                }

                if (!TablaTransiciones.Any(x => x.Estado.Contains("accept")) && !TablaTransiciones.Any(x => x.EstadoSiguiente.Contains("accept")))
                {
                    throw new ArgumentException(string.Format("Por favor, verifique la tabla de transiciones. No se encontro ningún estado 'accept'.", estadoActual, cabezal.Leer()));
                }

                EstadoActual = estadoActual;
                Cabezal      = cabezal;

                IntervaloDeTiempo = intervaloDeTiempo;
                Estado            = Estado.Pausada;

                IndiceEnLaTabla         = transicionInicial.RowIndex;
                IndiceEnLaTablaAnterior = IndiceEnLaTabla;

                Pasos = 0;
            }
            catch (ArgumentException)
            {
                throw;
            }
            catch (Exception)
            {
                throw;
            }
        }