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

一.实验目的

  1. 掌握图灵机的概念和基本结构,理解图灵机的基本指令和编码方式;
  2. 掌握图灵机的编程方法。
  • 实验内容

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

三.要求

1.题目分析

        用c语言模拟一个XN*2的图灵机。输入一个数的拓展二进制,然后将运算指令编译上去会输出这个数乘以2之后的拓展二进制码,定义一个数组用来存放纸带上的数字以及一个flag变量用来存放内态,用if以及多个else if进行判断内态和输入然后进行输出和内态的改变,进而输出每一步改变之后的结果。

3.算法构造

图灵机XN*2在拓展的二进位上实现这个运算的指令:

      0 0 ->0 0 R,

        0 1 ->1 0 R,

        1 0 ->0 1 R,

        1 1 ->10 0 R,

        10 0 ->11 1 R,

        11 0 ->0 1 STOP。

根据指令来设置if …else 来进行内态

3.算法实现

#include<stdio.h>

void main()

{

char a[20];     //定义一个数组用来存放纸带上的数字

int i,flag=0;            //定义内态变量flag

printf("请输入一个二进制数的拓展二进位:\n");

scanf("%s",&a);

for(i=0;i<=20;i++)        //循环纸带上的的每一个数字

{      

          if(flag==0&&a[i]=='0')       //内态和纸带上的数字都为0时,不改变

          {

                  flag=0;

                  a[i]='0';

          }

          else if(flag==0&&a[i]=='1')         //内态为0数字为1时,内态变为1数字变为0

          {

                          a[i]='0';

                          flag=1;

          }

          else if(flag==1&&a[i]=='1')         //内态为1数字为1时,内态变为10数字变为0

          {

                          a[i]='0';

                          flag=10;

          }

          else if(flag==1&&a[i]=='0')         //内态为1数字为0时,内态变为0数字变为1

          {

                          a[i]='1';

                          flag=0;

          }

          else if(flag==10&&a[i]=='0')      //内态为10数字为0时,内态变为11数字变为1

          {

                          flag=11;

                          a[i]='1';

          }

          else if(flag==10&&a[i]=='1')      //内态为10数字为1时,内态变为0数字变为0

          {

                          flag=0;

                          a[i]='0';

          }

          else if(flag==11&&a[i]=='1')      //内态为11数字为1时,内态变为0数字变为0

          {      

                  flag=0;

                  a[i]='0';

          }

          else if(flag==11&&a[i]=='0')      //内态为11数字为0时,内态变为0数字变为1

          {

                  flag=0;

                  a[i]='1';

          }

          printf("%s\n",a);  //输出改变后得纸带数字

}



}

3.调试、测试及运行结果

3.1调试

判等应该用==而不是=。

 

3.2测试

再给char数组赋值时用加单引号,不能直接写数字,否则运行结果会不对。

 

在最后一个应该停止的else if 中有break;所以不能执行到最后一步。

 

 

应该用%s输出,如果是%c就会输出错误。

 

 

3.3运行结果

 

5.经验归纳

        在进行模拟XN*2的图灵机的算法设计中,将输入一个数字的拓展二进位然后输出这个数字乘以2之后的拓展二进位,只需要定义一个数组以及一个内态变量然后将这些指令用if以及else if进行比较转换即可,但是出现了很多错误,比如第一,数组我定义的char类型所以进行比较数字时要带上单引号,否则会导致输出错误;第二我在用for循环进行每一个纸带上数组的比较时,里面的每一步只需要改变数组,刚开始我在每一个循环内部写成了i++所以导致了错误输出,第三最后一个stop不用在那个else if 里面加break,如果加的话就会导致最后一步不能实现,第四应该用%s输出字符串,用%c会有错误。

修改完程序后,我在思考如何将一个数字由程序转换成它的拓展二进位以便用户的输入并且对于输出结果不用再自己转换,将一个十进制数转换成二进制可以实现但是再变成拓展二进位出现了困难,因为转换后需要倒序输出,所以程序还欠缺,但是也学到了许多知识,比如图灵机的运算以及进制的转换,希望通过以后的学习可以解决自己没有解决的问题。

猜你喜欢

转载自blog.csdn.net/weixin_44358097/article/details/88697035