c++模拟图灵机


实验名称:模拟图灵机

实验内容:

对于任意给定的一台Turing机和任意给定的字符串w?(?w不含空格),编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。本文主要实现un+1图灵机。

实验步骤:

1. 需求分析

用户需要输入十进制的数字,输出每一步骤的结果,用将此十进制数字加一后的一进位表示。

2. 概要设计(包括数据结构及算法绘制流程图或伪代码表示)

数据结构:借助字符串,以及字符指针

在这里插入图片描述

1. 主要模块实现(包含关键模块的源代码及注释,注意程序编码风格良好)

1
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include<iostream>

using namespace std;

//将字符型的数字转换为int型

int
ascii_to_int(char*s)//参数为字符指针,可做字符串用

{

       int value=0;

       while(*s>='0'&&*s<='9')//指针s所指向的字符在'0'和'9'之间

       {

              value*=10;

              value+=*s-'0';//通过字符与'0'作差可以得到字符的int值

              s++; //指针指向下一个字符

       }

       if(*s!='\0')//如果输入的不是字符串,即输入的为一个字符。value为0,即只做一次转换,

       value=0;

       return value;

}

//将输入的字符串转换为un图灵机可以识别的一进位

char* zhuanhuan(int
number)//函数返回类型为字符数组型

{

       char a[number+6];//定义一个字符数组用于记录最后结果

       a[number+6]='\0';//字符数组结尾加标志

       a[0]='0';//前面第一位加0

       for(int i=1;i<=number;i++)//输入为几就有几个1


       {

              a[i]='1';

       }

       for(int i=1;i<=5;i++)//后面再加五个'0'

       {

              a[number+i]='0';

       }

  return a;//返回结果

 

}

//实现图灵机运行过程

void tulingji(string
a,int b)

{

       char t[b+6];//定义一个字符数组,用于存放内态

       t[0]='0';//内态第一步默认为0

       for(int i=0;i<b+6;i++)//从左往右依次读入

       {

       if(t[i]=='0'&&a[i]=='0')//内态为0,读入0


       {

       t[i+1]='0';a[i]='0';//内态不变,当前数据不变 ,继续向右

       }

       if(t[i]=='0'&&a[i]=='1')//内态为0,读入1


       {

       t[i+1]='1';a[i]='1';//内态改为1,当前数据不变  ,继续向右

       }

       if(t[i]=='1'&&a[i]=='0')//内态为1,读入0


       {

       t[i+1]='0';a[i]='1';//内态改为1,当前数据改为1,stop


              cout<<a<<endl;//输出此条指令

       break;

       }

       if(t[i]=='1'&&a[i]=='1')//内态为1,读入1


       {

       t[i+1]='1';a[i]='1';//内态不变,当前数据不变  ,继续向右

       }

       cout<<a<<endl;//输出当前过程的指令

       }

}

int main()

{string str;//定义字符串变量str


       int a;

       cout<<"欢迎来到un+1图灵机模拟实验室"<<endl;

       cout<<"请输入需要进行计算的十进制数:"
<<endl;

       cin>>str;//输入字符串

       a=ascii_to_int(&str[0]);

       string b=zhuanhuan(a);

       cout<<"下面将展示图灵机运行过程每一步骤的结果:"<<endl;

       tulingji(b,a);//调用图灵机

       return 0;

 }

运行结果

在这里插入图片描述