实验名称:模拟图灵机
实验内容:
对于任意给定的一台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; } |
运行结果