Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2018, 20:25   #1
DellXT
Пользователь
 
Регистрация: 17.04.2018
Сообщений: 28
Печаль Исправление кода C++

Проверяя работу на онлайн симуляторе машины тьюринга оказалось, что output 1.txt должен быть: 00V00000000011111000000000001111100 000000000000000000000000000000000H0 00000.
Output 1.txt моего кода: 00V*0000000001111A00*0000000001111B 0000000000000000000011110R000000000 H000000.
Как исправить?

#include <iostream>
#include <algorithm>
#include <vector>
#include <fstream>
#include <iterator>

// Инструкция машины Тюринга
struct instruction {
std::string current_state;
char current_char;
char next_char;
int move;
std::string next_state;
};

// Чтение инструкции из потока
std::istream & operator>>(std::istream &is, instruction &i) {
is >> i.current_state >> i.current_char >> i.next_char;
char move_ch; is >> move_ch;
i.move = (move_ch == 'R' ? 1 : -1);
return is >> i.next_state;
}

// Машина Тьюринга
struct machine {
int position; // Позиция
std::string state; // Состояние
std::string tape; // Лента
// Выполнить комманду
bool execute(const instruction &i);
bool end_of_tape() const {
return position < 0 || position > tape.size();
}
};

// Выполнить инструкцию
bool machine::execute(const instruction& i) {
if(i.current_state != state || tape[position] != i.current_char) return false;
state = i.next_state;
tape[position] = i.next_char;
position += i.move;
return true;
}

std::istream & operator>>(std::istream &is, machine &m) {
m.state = "0";
is >> m.position; m.position--;
return is >> m.tape;
}

int main() {
std::ifstream ifs("1.txt", std::ifstream::in);
machine m;
ifs >> m;
std::vector<instruction> program;
std::copy(std::istream_iterator<ins truction>(ifs),
std::istream_iterator<instruction>( ),
std::back_inserter(program));
for(std::size_t i = 0; !m.end_of_tape() && i < program.size(); ) {
if(m.execute(program[i])) i = 0;
else i++;
std::cout << m.tape << std::endl;
}
return 0;
}

1.txt:

1
00V0000000001111*A000000000001111*B 000000000000000000000000ZR000000000 H000000

0 0 0 R 0
0 1 1 R 0
0 V V R 0
0 * * L 1

1 0 * R 2
1 1 * R 3
1 V V R 20
1 V V R 20

2 * 0 R 4
3 * 1 R 5

4 A A R 4
4 0 0 R 4
4 1 1 R 4
5 A A R 5
5 0 0 R 5
5 1 1 R 5

4 * * L 6
5 * * L 7

6 0 * R 8
6 1 * R 9
7 0 * R 10
7 1 * R 11
6 A A R 20
7 A A R 20

8 * 0 R 12
9 * 1 R 13
10 * 0 R 14
11 * 1 R 15

12 B B R 12
12 0 0 R 12
12 1 1 R 12
13 B B R 13
13 0 0 R 13
13 1 1 R 13
14 B B R 14
14 0 0 R 14
14 1 1 R 14
15 B B R 15
15 0 0 R 15
15 1 1 R 15

12 Z 0 L 16
13 Z 1 L 16
14 Z 1 L 16
15 Z 0 L 17

12 C 1 L 16
13 C 0 L 17
14 C 0 L 17
15 C 1 L 17

16 0 Z L 18
17 0 C L 18

18 A A L 18
18 B B L 18
18 * * L 18
18 0 0 L 18
18 1 1 L 18
18 V V R 0

20 A A R 20
20 B B R 20
20 * * R 20
20 0 0 R 20
20 1 1 R 20
20 Z 0 R 21
20 C 1 R 21

21 0 0 R X
21 1 1 R X
DellXT вне форума Ответить с цитированием
Старый 18.09.2018, 22:29   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от DellXT Посмотреть сообщение
Проверяя работу на онлайн симуляторе машины тьюринга оказалось
Вы именно эту программу запускали на симуляторе? Тогда выбросьте этот симулятор. Он однозначно даёт неправильный результат. Ваш код на первый взгляд работает верно.
Black Fregat вне форума Ответить с цитированием
Старый 18.09.2018, 23:21   #3
DellXT
Пользователь
 
Регистрация: 17.04.2018
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
на симуляторе
Именно эту программу проверял тут: http://morphett.info/turing/turing.html
DellXT вне форума Ответить с цитированием
Старый 19.09.2018, 08:51   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Ну посмотрите сами. В программе нет ни одной команды, которая убрала бы из ленты A, B, Z. А в выходе симулятора их нет.

Кроме того, по логике работы Вашей программы как раз Ваш вывод - правильный.
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исправление кода C++ DellXT Общие вопросы C/C++ 3 20.05.2018 10:09
Исправление кода C++ DellXT Общие вопросы C/C++ 2 16.05.2018 00:06
Исправление кода remus-xe2 Фриланс 1 10.11.2017 22:04
Исправление кода... SwIm Помощь студентам 3 19.01.2010 01:43