示例#1
0
        /// <summary>
        /// Передвигает читающие/пишущие головки в указанных направлениях.
        /// </summary>
        /// <param name="directions">Массив направлений головок.</param>
        public void MovePens(TuringPenDir[] directions)
        {
            if (directions == null)
                throw new ArgumentNullException("Массив направлений ячеек не может быть неопределенным");
            if (directions.Length != Count)
                throw new ArgumentException("Количество направлений и количество лент должны быть одинаковыми");

            int n = directions.Length;
            for(int i = 0; i < n; i++)
            {
                switch(directions[i])
                {
                    case TuringPenDir.Left:
                        _units[i].Position--;
                        break;
                    case TuringPenDir.Right:
                        _units[i].Position++;
                        break;
                }
            }
        }
        /// <summary>
        /// Получает переход машины Тьюринга из указанного исходного текста.
        /// </summary>
        /// <param name="src">Исходный текст программы.</param>
        /// <param name="ptr">Указатель текущего символа.</param>
        private static TuringConvert GetConvert(string src, ref int ptr)
        {
            char[] inputs;
            char[] outputs;
            int nextState;
            TuringPenDir[] directions;

            inputs = GetSymbols(src, ref ptr);
            ptr++;
            NextSymbol(src, ref ptr);
            if (src[ptr] != '=')
                throw new InvalidOperationTextException(string.Format("\"=\" ожидалось, но найдено \"{0}\"", src[ptr]));
            ptr++;

            outputs = GetSymbols(src, ref ptr);
            ptr++;
            NextSymbol(src, ref ptr);
            if (src[ptr] != '-' || src[ptr + 1] != '>')
                throw new InvalidOperationTextException(string.Format("\"->\" ожидалось, но найдено \"{0}{1}\"", src[ptr], src[ptr + 1]));
            ptr += 2;

            NextSymbol(src, ref ptr);
            try
            {
                nextState = ReadInt(src, ref ptr);
            }
            catch
            {
                throw new InvalidOperationTextException("Неверный формат номера");
            }

            ptr++;
            NextSymbol(src, ref ptr);
            if (src[ptr] != ',')
                throw new InvalidOperationTextException(string.Format("\",\" ожидалось, но найдено \"{0}\"", src[ptr]));

            ptr++;

            char[] dirs = GetSymbols(src, ref ptr);
            directions = new TuringPenDir[dirs.Length];
            int n = dirs.Length;
            for (int i = 0; i < n; i++ )
            {
                switch (char.ToUpper((char)dirs[i]))
                {
                    case 'L':
                        directions[i] = TuringPenDir.Left;
                        break;
                    case 'R':
                        directions[i] = TuringPenDir.Right;
                        break;
                    case 'S':
                        directions[i] = TuringPenDir.Stay;
                        break;
                    default:
                        throw new InvalidOperationTextException("Неверная команда для читающей/пишущей головки");
                }
            }

            if (inputs.Length != outputs.Length || inputs.Length != directions.Length)
                throw new InvalidOperationTextException("Все переходы машины Тьюринга должны соответствовать одинаковому количеству лент");

            return new TuringConvert(inputs, outputs, directions, nextState);
        }
 /// <summary>
 /// Инициализирует аргументы события указанными направлениями смещения головок соответствующих лент МТ.
 /// </summary>
 /// <param name="dirs">Массив направлений смещения читающих/пишущих головок МТ.</param>
 public TuringMachineStateChangedEventArgs(TuringPenDir[] dirs)
 {
     _penDirs = dirs.Clone() as TuringPenDir[];
 }