图灵机

1.题目分析
对于给定的一台图灵机(UN+1和XN*2)和任意给定的字符串w ( w不含空格),编程模拟此图灵机的运行过程,要求输出从开始运行起的每一步骤的结果。
2.算法构造
UN+1图灵机XN×2图灵机

3.算法设计:

#include<stdio.h>

//UN+1图灵机算法
void F()
{
	char a[11];
	//定义一个内态为字符型
	char flag='0';
	int i;
	//在字符数组中存入数据
	printf("请输入一串二进制数(个数不大于十个):");
    for(i=0;i<10;i++)
	{
	scanf("%c",&a[i]);
	}
   //判断内态和输入值并更改输出值和内态	
   for(i=0;a[i]!='\0';i++)
	{
		if(a[i]=='0')
		{
			if(flag=='0')
			{
				flag='0';
			}
			else
			{
				flag='0';
				a[i]='1';
			
			}
		}
		else
		{
			if(flag=='0')
			{
				flag='1';
			}
			else
			{
				continue;
			}
		}
	}
    //输出修改后的字符数组
	for(i=0;i<10;i++)
	{
		printf("%c ",a[i]);
	}
	printf("\n");
}

//XN*2图灵机算法
void M()
{
	char a[10];
	//定义一个内态为整型
	int flag=0;
	int i;
	//存入数据
	printf("请输入一串二进制数:");
	scanf("%s",&a);
	//判断内态和输入值并更改输出值和内态
	for(i=0;a[i]!='\0';i++)
	{
		if(a[i]=='0'&&flag==0)
		{
			flag=0;
			a[i]='0';
            //输出修改后的字符数组
			printf("%s\n",a);
		}
		else if(a[i]=='1'&&flag==0)
		{
			flag=1;
			a[i]='0';
			//输出修改后的字符数组
			printf("%s\n",a);
		}
		else if(a[i]=='0'&&flag==1)
		{
			flag=0;
			a[i]='1';
			//输出修改后的字符数组
			printf("%s\n",a);
		}
		else if(a[i]=='1'&&flag==1)
		{
			flag=10;
			a[i]='0';
			//输出修改后的字符数组
			printf("%s\n",a);
		}
		else if(a[i]=='0'&&flag==10)
		{
			flag=11;
			a[i]='1';
			//输出修改后的字符数组
			printf("%s\n",a);
		}
		else if(a[i]=='1'&&flag==10)
		{
			flag=0;
			a[i]='0';
			//输出修改后的字符数组
			printf("%s\n",a);
		}
		else if(a[i]=='1'&&flag==11)
		{
			flag=0;
			a[i]=0;
			//输出修改后的字符数组
			printf("%s\n",a);
		}
		else if(a[i]=='0'&&flag==11)
		{
			flag=0;
			a[i]='1';
			//输出修改后的字符数组
            printf("%s\n",a);
		}
	}

}
void main()
{
	//调用函数F()和M()
	F();
	M();
}

4.调试、测试及运行结果
调试:
图灵机
测试:
图灵机
图灵机
在XN*2程序运行后添加数值时需要手动补零,否则两步结果就显示不出来

运行结果:
图灵机
5.经验归纳
通过这次上机实验,理解了图灵机的基本运作,实现UN+1和XN×2时运用了很多的判断语句和循环,在定义数组时用的字符型的,所以在判断时要加单引号,以前用的不多,很容易遗忘,在循环的时候老师指点了一下,把判断语句改成判空,这样就不用循环很多次。总的来说,还是很有收获,程序不难,但是要细心,要把基础打牢。我觉得程序还可以进一步改进,输入十进制数据得到二进制码,这样就更方便快捷。东西不是特别完善,要加以改进。