/// <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[]; }