大计基作业中有这么一道题:
答案是D项。
那么如何实现这个图灵机的功能呢?
首先想到需要创建一个不定长度的数组。实际上,如果让用户输入字符串的长度,再输入字符串,就没有什么意义了,所以才想到找个办法根据用户输入的字符串长度创建数组。时间所限,还没有好好研究,现在贴下有关的链接:
https://bbs.csdn.net/topics/391041428
那么我们先做个固定长度的,比如8个的,也就是输入00001111,输出XXXXYYYY,按照所给图灵机的步骤。
经过多次修改后,最终代码如下:
#include<stdio.h>
#include<stdlib.h>
#define N 8
char a[N];
int i;
char X, Y;
void Input();
void Change();
int main()
{
for (i = 0; i < N; i++)
a[i] = 0;
Input();
Change();
printf("The array that you want is:");
for (i = 0; i<N; i++)
printf("%c", a[i]);
printf("\n");
return 0;
}
void Input()
{
int sign1 = 0, sign2 = 0, sign3 = 0;
printf("Please input a binary array.\n");
while (1)
{
for (i = 0; i<N; i++)
{
a[i] = getchar();//可改为scanf("%c",&a[i]);
if (a[i] == 0)break;
}
for (i = 0; i<N; i++)
{
if (a[i] == 48)sign1++;
if (a[i] == 49)sign2++;
if (a[i] == 48 && a[i + 1] == 49)sign3++;
}
if ((sign1 == sign2) && (sign3 == 1) && (a[0] == 48))break;
printf("FORMAT ERROR!TYR AGAIN.\n");
fflush(stdin);
}
printf("\nThe array is:");
for (i = 0; i<N; i++)
printf("%c", a[i]);
printf("\n");
}
void Change()
{
char *ptr;
ptr = a;
while (*ptr == '0')
{
*ptr = 'X';
ptr++;
while ((*ptr == '0') || (*ptr == 'Y'))
{
ptr++;
}
*ptr = 'Y';
ptr--;
while ((*ptr == '0') || (*ptr == 'Y'))
ptr--;
ptr++;
}
ptr++;
while (*ptr == 'Y')
ptr++;
}
注意的点:
- 1和0在本例中是字符型常量,所以Input函数中的判断程序判断的是1和0是否等于ASCII码。而Change函数中直接使用的’0’,避免了这一问题,但是千万不要忘了单引号;
- 判断的双等号不要漏!小问题检查了很多遍才检查出来,因为IDE不会提示(因为合法);
while循环是为了输错之后能继续输入,注意要清除缓存区。
依旧存在的问题就是无法对任意长度的数组实现操作。实际上小于8的字符串都能实现,但是要多敲几下回车,为了给后面的几个空字符赋值。