x+1图灵机文档.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
x1图灵机文档

一、问题描述设计一个图灵机,实现二进制数x的加1运算,同时保存进位。最高位如果有进位的话可以保存该进位。二、实现思路1、图灵机设计:图灵机M是一个七元组,M=(Q,∑,Γ,δ,q0,B,F),Q:状态的有穷集合;∑?Γ-{B}为输入字母表;Γ:带符号表;q0:q0∈Q是M的开始状态;B:B∈Γ称为空白符;F:F∈Q是终止状态集合;δ:M的转换函数。在该x+1图灵机中,开始状态为s,终止状态为f,状态集合Q为{s,A,B,f},空白符为*,字母表为{0,1},进位标志位c,状态转移函数如下:状态A:表示无进位的加法;状态B:表示有进位加法状态转移函数为:δ(s,0)=(A,1,L)c=0δ(s,1)=(B,0,L)c=1δ(A,0)=(A,0,L)c=0δ(A,0)=(A,1,L) c=0δ(B,0)=(A,1,L) c=0δ(B,1)=(B,0,L) c=1δ(A,*)=(f,*,R)2、实现过程初始化图灵机,分别初始化数据带为*0,这样结束符就是*,最左端的0是为了接收最高位的进位,如果有溢出的话直接丢弃可能使得计算结果不正确。然后是接收输入二进制数x,将该数据初始化到图灵机数据带上。初始化状态带为初始状态s,初始化进位标志位0。然后就是按照状态转移函数开始执行,修改数据带,状态带,和进位标志,遇到最左端的*时终止图灵机的执行,同时输出此时图灵机的数据带数据,和状态带状态,以及进位标志位,最后输出计算结果。三、实现程序#includestdio.h#includestdlib.h#includestring.h#define MAX_num 100char x[MAX_num];char str[MAX_num];char s[4]=s;int c=0;//进位标志位/*状态个数:4;状态名: S,A,B,F; 字母表:0,1,*;状态说明:s:表示初始状态A:表示为进位状态B:表示有进位状态f:表示结束状态字母表说明: 0,1,*,都是课识别的字符,其中*表示结束字符*/void show(char str[],char s[],int c){printf(\n运算之后图灵机状态 \n);printf(\n运算结束时状态:%s,s);printf(\n运算结束时数据带:%s\n,str);printf(运算结束时进位标志:%d\n\a,c);}void Fun_A(char s[],char str[],intc,int n)//无进位加法状态转移函数{if(str[n-1]==0(str[n]==0||1))Fun_A(s,str,c,n-1);else if(str[n-1]==*){strcpy(s,f);show(str,s,c);}}void Fun_B(char s[],char str[],intc,int n)//有进位加法状态转移函数{if(str[n]==0){str[n]=1;strcpy(s,A);c=0;Fun_A(s,str,c,n-1);}else if(str[n]==1){str[n]=0;Fun_B(s,str,c,n-1);}}void show_x(char str[],char x[])//,输出最后计算结果,即将数据带字符数组中的数值复制给x{inti=0,j=0;int n=strlen(str)-2;while(j=n){if(str[j]==1)x[i++]=1;else if(str[j]==0) x[i++]=0;j=j+1;}x[i]=\0;printf(\n\n运算结果 x:);printf(%s\n,x);}void init(intn,charstr[]){//初始化图灵机inti=0; while(in){if(x[i]==1){strcat(str,1);//把1放进数据带}else if(x[i]==0) strcat(str,0);//把0放进数据带 else ;i++;}strcat(str,*);printf(\n初始化图灵机:\n\n);printf(初始化状态:%s,s);printf(\n初始化数据带:%s\n,str);printf(初始化进位标志:%d\n,c);}void start(int n){ //执行开始函数if(str[n]==0){strcpy(s,A);str[n]=1;c=0;Fun_A(s,str,c,n-1);}else if(str[n]==1){strcpy(s,B);str[n]=0;c=1;Fun_B(s,str,c,n-1);}}int main (){int b=1;inti=0;int n;x[0]=\0;//初始化x字符数组,也就是存放要进行加1运算的字符的数组printf(\

文档评论(0)

zhuliyan1314 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档