示例#1
0
        public StateFunction(ITuringMachine tm, string currentState, string read, string newState, string write, string movement)
        {
            if ((read + write + movement).Trim().Length != tm.TapeAmount * 3)
                throw new ArgumentException("Parameter sind nicht korrekt", "read, write, movement");

            CurrentState = currentState;
            NewState = newState;
            Read = read;
            Write = write;
            Movement = new List<Direction>();

            for (int i = 0; i < movement.Length; i++)
            {
                Movement.Add((Direction)Enum.Parse(typeof(Direction), movement[i].ToString()));
            }
        }
示例#2
0
        public StateFunction(ITuringMachine tm, string currentState, string read, string newState, string write, string movement)
        {
            if ((read + write + movement).Trim().Length != tm.TapeAmount * 3)
            {
                throw new ArgumentException("Parameter sind nicht korrekt", "read, write, movement");
            }

            CurrentState = currentState;
            NewState     = newState;
            Read         = read;
            Write        = write;
            Movement     = new List <Direction>();

            for (int i = 0; i < movement.Length; i++)
            {
                Movement.Add((Direction)Enum.Parse(typeof(Direction), movement[i].ToString()));
            }
        }
示例#3
0
        private string init(string[] keyWords)
        {
            int dimensions           = 1;
            int qcount               = 3;
            int startq               = 0;
            int timelimit            = 10000;
            int memorylimit          = 100;
            int memorycheckfrequency = 10;

            for (int i = 1; i < keyWords.Length; ++i)
            {
                switch (keyWords[i])
                {
                case "d":
                case "dimensions":
                    if (i + 1 >= keyWords.Length)
                    {
                        return("Error: Не указано значение параметра dimensions! / init\\");
                    }
                    if (!(int.TryParse(keyWords[i + 1], out dimensions) && dimensions > 0))
                    {
                        return("Error: Значением параметра dimensions должно быть целое положительное число! / init\\");
                    }

                    ++i;
                    break;

                case "qc":
                case "qcount":
                    if (i + 1 >= keyWords.Length)
                    {
                        return("Error: Не указано значение параметра qcount! / init\\");
                    }
                    if (!(int.TryParse(keyWords[i + 1], out qcount) && qcount > 0))
                    {
                        return("Error: Значением параметра qcount должно быть целое положительное число! / init\\");
                    }

                    ++i;
                    break;

                case "sq":
                case "startq":
                    if (i + 1 >= keyWords.Length)
                    {
                        return("Error: Не указано значение параметра startq! / init\\");
                    }
                    if (!(int.TryParse(keyWords[i + 1], out startq) && startq >= 0))
                    {
                        return("Error: Значением параметра startq должно быть целое положительное число или 0! / init\\");
                    }

                    ++i;
                    break;

                case "tl":
                case "timelimit":
                    if (i + 1 >= keyWords.Length)
                    {
                        return("Error: Не указано значение параметра timelimit! / init\\");
                    }
                    if (!(int.TryParse(keyWords[i + 1], out timelimit) && timelimit > 0))
                    {
                        return("Error: Значением параметра timelimit должно быть целое положительное число! / init\\");
                    }

                    ++i;
                    break;

                case "ml":
                case "memorylimit":
                    if (i + 1 >= keyWords.Length)
                    {
                        return("Error: Не указано значение параметра memorylimit! / init\\");
                    }
                    if (!(int.TryParse(keyWords[i + 1], out memorylimit) && memorylimit > 0))
                    {
                        return("Error: Значением параметра memorylimit должно быть целое положительное число! / init\\");
                    }

                    ++i;
                    break;

                case "mcf":
                case "memorycheckfrequency":
                    if (i + 1 >= keyWords.Length)
                    {
                        return("Error: Не указано значение параметра memorycheckfrequency! / init\\");
                    }
                    if (!(int.TryParse(keyWords[i + 1], out memorycheckfrequency) && memorycheckfrequency > 0))
                    {
                        return("Error: Значением параметра memorycheckfrequency должно быть целое положительное число! / init\\");
                    }

                    ++i;
                    break;
                }
            }

            if (startq >= qcount)
            {
                return("Error: Значение параметра startq должно быть меньше количества состояний! / init\\");
            }
            turingMachine = new TuringMachine(dimensions, qcount, startq, timelimit, memorylimit, memorycheckfrequency);

            return("Инициализация прошла успешно!\\");
        }
示例#4
0
        private string clear()
        {
            turingMachine = null;

            return("Отчистка прошла успешно!\\");
        }
示例#5
0
        static int Main(string[] args)
        {
            SetWindowPos(MyConsole, 0, 0, 0, 0, 0, SWP_NOSIZE);
            Console.Clear();

            Console.Title = appTitle;
            Console.SetWindowSize(Console.LargestWindowWidth - 3, Console.LargestWindowHeight);

            try
            {
                if (args.Length >= 1)
                {
                    if (args[0] == "-diagram")
                    {
                        //this will launch the default browser
                        Process p = new Process()
                        {
                            StartInfo = new ProcessStartInfo(new FastTuringMachine(Conf.Q, Conf.E, Conf.T, Conf.Fn, Conf.S, Conf.F, "").DiagramUrl)
                        };
                        p.Start();
                        return(0);
                    }
                }

                var inp = initInput();
                initMode();

                Console.Clear();
                Console.CursorVisible = false;

                switch (_stepMode)
                {
                case StepModeEnum.Slow:
                    tm = new SlowTuringMachine(Conf.Q, Conf.E, Conf.T, Conf.Fn, Conf.S, Conf.F, inp);
                    break;

                default:
                case StepModeEnum.Normal:
                    tm = new NormalTuringMachine(Conf.Q, Conf.E, Conf.T, Conf.Fn, Conf.S, Conf.F, inp, _timeOut);
                    break;

                case StepModeEnum.Fast:
                    tm = new FastTuringMachine(Conf.Q, Conf.E, Conf.T, Conf.Fn, Conf.S, Conf.F, inp);
                    break;
                }

                tm.Print();

                Console.ReadLine();

                try
                {
                    Console.Title = appTitle + " - running";

                    Stopwatch sw = new Stopwatch();
                    sw.Start();
                    while (tm.MakeStep())
                    {
                    }
                    sw.Stop();

                    Console.Title = appTitle;

                    tm.Print();

                    if (_stepMode == StepModeEnum.Fast)
                    {
                        Tools.WriteTime(sw.Elapsed, tm.TapeAmount);
                    }

                    Tools.WriteResult(tm.TapeAmount, tm.Output.Replace("B", " ").Trim());
                }
                catch (Exception e)
                {
                    Tools.WriteError(0, 0, e);
                }
            }
            catch (Exception e)
            {
                Tools.WriteError(0, 0, e);
            }
            Console.ReadLine();
            Console.CursorVisible = true;

            return(0);
        }
示例#6
0
        static int Main(string[] args)
        {
            SetWindowPos(MyConsole, 0, 0, 0, 0, 0, SWP_NOSIZE);
            Console.Clear();

            Console.Title = appTitle;
            Console.SetWindowSize(Console.LargestWindowWidth - 3, Console.LargestWindowHeight);

            try
            {
                if (args.Length >= 1)
                {
                    if (args[0] == "-diagram")
                    {
                        //this will launch the default browser
                        Process p = new Process() { StartInfo = new ProcessStartInfo(new FastTuringMachine(Conf.Q, Conf.E, Conf.T, Conf.Fn, Conf.S, Conf.F, "").DiagramUrl) };
                        p.Start();
                        return 0;
                    }
                }

                var inp = initInput();
                initMode();

                Console.Clear();
                Console.CursorVisible = false;

                switch (_stepMode)
                {
                    case StepModeEnum.Slow:
                        tm = new SlowTuringMachine(Conf.Q, Conf.E, Conf.T, Conf.Fn, Conf.S, Conf.F, inp);
                        break;
                    default:
                    case StepModeEnum.Normal:
                        tm = new NormalTuringMachine(Conf.Q, Conf.E, Conf.T, Conf.Fn, Conf.S, Conf.F, inp, _timeOut);
                        break;
                    case StepModeEnum.Fast:
                        tm = new FastTuringMachine(Conf.Q, Conf.E, Conf.T, Conf.Fn, Conf.S, Conf.F, inp);
                        break;
                }

                tm.Print();

                Console.ReadLine();

                try
                {
                    Console.Title = appTitle + " - running";

                    Stopwatch sw = new Stopwatch();
                    sw.Start();
                    while (tm.MakeStep()) { }
                    sw.Stop();

                    Console.Title = appTitle;

                    tm.Print();

                    if (_stepMode == StepModeEnum.Fast)
                        Tools.WriteTime(sw.Elapsed, tm.TapeAmount);

                    Tools.WriteResult(tm.TapeAmount, tm.Output.Replace("B", " ").Trim());
                }
                catch (Exception e)
                {
                    Tools.WriteError(0, 0, e);
                }
            }
            catch (Exception e)
            {
                Tools.WriteError(0, 0, e);
            }
            Console.ReadLine();
            Console.CursorVisible = true;

            return 0;
        }