1118 实验三 有限自动机的构造与识别

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
    char    p[30][30];
    char    q[30][30];
    int    line = 0;
    int    n;
    int    i, j;
    int    count = 0;
    int    k, t = 0;
    int    flag = 0;
    int    l, m = 0;
    char    VN[30]    = { '\0' };
    char    VT[30]    = { '\0' };
    printf( "请输入规则个数" );
    scanf( "%d", &n );
    line = n;
    for ( i = 0; i < 30; i++ )
    {
        for ( j = 0; j < 30; j++ )
        {
            p[i][j] = '\0';
            q[i][j] = '\0';
        }
    }
    printf( "请输入文法:\n" );
    for ( i = 0; i < line; i++ )
    {
        scanf( "%s", p[i] );
    }
    l    = 0;
    m    = 0;
    for ( i = 0; i < line; i++ )
    {
        for ( j = 0; j < 30 && (p[i][j] != '\0'); j++ )
        {
            if ( p[i][j] <= 'z' && p[i][j] >= 'a' || (p[i][j] <= '9' && p[i][j] >= '0') )
            {
                flag = 0;
                for ( t = 0; VN[t] != '\0'; t++ )
                {
                    if ( VN[t] == p[i][j] )
                    {
                        flag = 1; break;
                    }
                }
                if ( flag == 0 )
                {
                    VN[l] = p[i][j];
                    l++;
                }
            }
            if ( p[i][j] <= 'Z' && p[i][j] >= 'A' )
            {
                flag = 0;
                for ( t = 0; t < 30 && (VT[t] != '\0'); t++ )
                {
                    if ( VT[t] == p[i][j] )
                    {
                        flag = 1;
                        break;
                    }
                }
                if ( flag == 0 )
                {
                    VT[m] = p[i][j];
                    m++;
                }
            }
        }
    }
    count    = 0;
    k    = 0;
    for ( i = 0; i < line; i++ )
    {
        for ( j = 4; j < 30 && (p[i][j] != '\0'); j++ )
        {
            if ( (p[i][j] <= 'z' && p[i][j] >= 'a') || (p[i][j] <= 'Z' && p[i][j] >= 'A') || (p[i][j] <= '9' && p[i][j] >= '0') )
            {
                q[count][k] = p[i][j];
                k++;
            }else  {
                count++;
                k = 0;
            }
        }
        count++;
        k = 0;
    }
    flag = 0;
    for ( i = 0; i < count; i++ )
    {
        for ( j = i + 1; j < count; j++ )
        {
            if ( strcmp( q[i], q[j] ) == 0 )
            {
                flag = 1;
                break;
            }
        }
    }
    if ( flag == 1 )
    {
        printf( "是非确定的有穷状态自动机,即NFA\n\n" );
        printf( "构造的有穷状态自动机为:\n" );
        printf( "NFA   N=(K,E(总和的意思),M,{S},{Z})\n" );
    }else  {
        printf( "是确定的有穷状态自动机,即DFA\n\n\n" );
        printf( "构造的有穷状态自动机为:\n" );
        printf( "DFA   N=(K,E(总和的意思),M,{S},{Z})\n" );
    }
    printf( "其中,\nK={S" );
    for ( i = 0; i < 30 && (VT != '\0'); i++ )
    {
        printf( ",%c", VT[i] );
    }
    printf( "}\n" );
    printf( "E={" );
    for ( i = 0; i < 30 && (VN[i] != '\0'); i++ )
    {
        printf( "%c   ", VN[i] );
    }
    printf( "}\n" );
    k    = 0;
    count    = 0;
    for ( i = 0; i < line; i++ )
    {
        j = 4;
        while ( p[i][j] != '\0' )
        {
            if ( k < 4 )
            {
                q[count][k] = p[i][k];
                k++;
            }else  {
                if ( (p[i][j] <= 'z' && p[i][j] >= 'a') || (p[i][j] <= 'Z' && p[i][j] >= 'A') || (p[i][j] <= '9' && p[i][j] >= '0') )
                {
                    q[count][k] = p[i][j];
                    k++;
                    j++;
                }
                if ( p[i][j] == 'l' )
                {
                    count++;
                    k = 0;
                    j++;
                }
            }
        }
        count++;
        k = 0;
    }
    printf( "\n" );
    printf( "M:\n" );
    l = 0;
    while ( VN[l] != '\0' )
    {
        printf( "M(S,%c)={", VN[l] );
        for ( i = 0; i < 30; i++ )
        {
            for ( j = 4; j < 30 && (q[i][j] != '\0'); j++ )
            {
                if ( VN[l] == q[i][j] && (q[i][j + 1] == '\0') && (q[i][j - 1] == '=') )
                    printf( "%c", q[i][0] );
            }
        }
        printf( "}\t" );
        l++;
    }
    printf( "\n" );
    l = 0; k = 0;
    while ( VT[k] != '\0' )
    {
        l = 0;
        while ( VN[l] != '\0' )
        {
            printf( "M(%c,%c)={", VT[k], VN[l] );
            for ( i = 0; i < 30; i++ )
            {
                for ( j = 4; j < 30 && (q[i][j] != '\0'); j++ )
                {
                    if ( VT[k] == q[i][j] && VN[l] == q[i][j + 1] )
                        printf( "%c", q[i][0] );
                }
            }
            printf( "}\t" );
            l++;
        }
        k++;
        printf( "\n" );
    }
    system( "pause" );
}

 

你可能感兴趣的:(1118 实验三 有限自动机的构造与识别)