1.题目分析
对于给定的一台图灵机(UN+1和XN*2)和任意给定的字符串w ( w不含空格),编程模拟此图灵机的运行过程,要求输出从开始运行起的每一步骤的结果。
2.算法构造
UN+1XN×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时运用了很多的判断语句和循环,在定义数组时用的字符型的,所以在判断时要加单引号,以前用的不多,很容易遗忘,在循环的时候老师指点了一下,把判断语句改成判空,这样就不用循环很多次。总的来说,还是很有收获,程序不难,但是要细心,要把基础打牢。我觉得程序还可以进一步改进,输入十进制数据得到二进制码,这样就更方便快捷。东西不是特别完善,要加以改进。