2021-04-10

C语言实现图灵机XN*2的模拟

  1. 实验题目
    对于XN+1或XN*2图灵机进行模拟,任意给定的十进制数a,转换为收缩扩展二进制的编码,再编程模拟此Turing机的运行过程,要求输出从开始运行起的每一步骤的结果。 用C或C++或java或python语言实现程序解决问题。
  2. 算法设计 C语言的函数库可以帮助实现,使用其中的五个函数实现图灵机流程:transform()函数实现将输入的十进制数转换为二进制,extend()函数实现扩展二进制,realize()函数实现对扩展二进制的按指令操作,shrink()函数实现将扩展二进制收缩为普通二进制,reverse()函数实现将二进制转换为十进制。
  3. 代码
  4. `#include <stdio.h>
    #include <math.h>

int size1 = 0; // size1存储二进制数的长度
int size2 = 0; // size2存储扩展二进制的长度
int size3 = 0; // size3存储按指令操作后的二进制长度
int size4 = 0; // size4存储收缩二进制的长度

// 通过transform()函数实现十进制转二进制
int* transform(int x)
{
int rem; // 存储x对2取余后的余数
int i = 0, j = 0;
int r;
int a[100]; // 数组a[]倒序存储十进制转换后的二进制
static int b[100]; // 数组b[]正序存储十进制转换后的二进制

while (x != 0)    // 十进制转二进制
{
	rem = x % 2;
	a[i] = rem;
	i++;
	x /= 2;
}

for (r = i - 1; r >= 0; r--)    // 通过for循环将二进制数正序存入数组b[]中
{
	b[j] = a[r];
	j++;
}

size1 = j;

return b;

}

// 通过extend()函数实现二进制的扩展
int* extend(int p[])
{
int i = 0, j, k;
static int c[100]; // 数组c[]存储扩展二进制

c[i] = 0;    // 数组首位存入0
i++;

for (j = 0; j < size1; j++)
{
	k = p[j];

	if (k == 0)    // 若从二进制数组中扫描到0,则将一个0存入扩展二进制数组c[]中
	{
		c[i] = 0;
		i++;
	}
	else if (k == 1)    // 若从二进制数组中扫描到1,则将一个1、一个0依次存入扩展二进制数组c[]中
	{
		c[i] = 1;
		i++;
		c[i] = 0;
		i++;
	}
}

c[i] = 1;
i++;
c[i] = 1;
i++;
c[i] = 0;

size2 = i + 1;

return c;

}

// 通过realize()函数实现对扩展二进制的按指令操作
int* realize(int q[])
{
int i, j = 0, k = 0;
int inner = 0; // inner为内态

for (i = 0; i < size2 + 2; i++)
{
	k = q[i];

	if (k == 0 && inner == 0)    // 输入为0,内态为0
	{
		q[i] = 0;
		inner = 0;
	}
	else if (k == 0 && inner == 1)    // 输入为0,内态为1
	{
		q[i] = 1;
		inner = 0;
	}
	else if (k == 0 && inner == 10)    // 输入为0,内态为10
	{
		q[i] = 1;
		inner = 11;
	}
	else if (k == 0 && inner == 11)    // 输入为0,内态为11
	{
		q[i] = 1;
		inner = 0;
	}
	else if (k == 1 && inner == 0)    // 输入为1,内态为0
	{
		q[i] = 0;
		inner = 1;
	}
	else if (k == 1 && inner == 1)    // 输入为1,内态为1
	{
		q[i] = 0;
		inner = 10;
	}
	else if (k == 1 && inner == 10)    // 输入为1,内态为10
	{
		q[i] = 0;
		inner = 0;
	}
}

size3 = i;
printf("%d", size3);

return q;

}

// 通过shrink()函数实现对操作结果的收缩
int* shrink(int r[])
{
int i, j = 0;
static int d[100];

for (i = 1; i < size3 - 3; i++)
{
	if (r[i] == 0 && r[i + 1] == 0)
	{
		d[j] = 0;
		j++;
		continue;
	}
	if (r[i] == 0 && r[i + 1] == 1 && r[i + 2] == 0)
	{
		d[j] = 1;
		j++;
		continue;
	}
}

size4 = j;

return d;

}

// 通过reverse()函数实现二进制转十进制
int reverse(int s[])
{
int sum = 0;
int i;

for (i = 0; i < size4; i++)
{
	sum += s[i] * (int)pow(2, (size4 - 1 - i));
}

return sum;

}

void main()
{
int x; // 存放用户键入的整数
int i = 0;
printf(“请输入一个十进制整数:\n”);
scanf("%d", &x);

int* p;
p = transform(x);
printf("十进制数转换成二进制数为:\n");
for (i = 0; i < size1; i++)
	printf("%d", p[i]);
printf("\n");


int* q;
q = extend(p);
printf("扩展二进制数为:\n");
for (i = 0; i < size2; i++)
	printf("%d", q[i]);
printf("\n");

int* r;
r = realize(q);
printf("指令执行结束生成的二进制数:\n");
for (i = 0; i < size3; i++)
	printf("%d", r[i]);
printf("\n");

int* s;
s = shrink(r);
printf("图灵机计算结果的二进制数:\n");
for (i = 0; i < size4; i++)
	printf("%d", s[i]);
printf("\n");

int y;
y = reverse(s);
printf("图灵机计算结果的十进制数:\n");
printf("%d", y);
printf("\n");

}`
5. 测试及结果
6. 测试1
测试2

  1. 总结
    此次作业主要了解并运用了一些C语言函数的知识,大部分函数都是查阅书本找出来的,对于收缩扩展二进制的函数方法是在专门查阅了相关资料进行的。C语言在进行编程时有一些函数不能直接进行调用而是需要自定义。Java和C++还有Python可以直接调用。希望下次可以多多尝试其他语言进行编程。此次作业发现自己还有很多需要学习的地方,希望之后多多实践,多多查阅资料,在实践中发现问题并解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值