C语言实现大计基作业之某种图灵机

大计基作业中有这么一道题:
某种图灵机
答案是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的字符串都能实现,但是要多敲几下回车,为了给后面的几个空字符赋值。

猜你喜欢

转载自blog.csdn.net/twentyonepilots/article/details/79866326