zoukankan      html  css  js  c++  java
  • 有限自动机

    #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] = {''};           //存放非终结符号   
        char VT[30] = {''};           //存放终结符号
        printf("请输入规则个数:");       
        scanf("%d",&n);      
        line = n;          
        for(i = 0; i < 30; i++)      //给字符串数组p、q全部赋值为'' 
            for(j=0;j<30;j++)    
            {   
                p[i][j]='';     
                q[i][j]='';
            }     
            printf("请输入文法:
    ");      
            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] != '');j++)            
                {                   
                    // 非终结符号放入数组VN中
                    if((p[i][j]<='z' && p[i][j]>='a')||(p[i][j]<='9' && p[i][j]>='0'))                    
                    {                            
                        flag = 0;                        
                        for(t=0; VN[t] != '';t++)      
                        {                                
                            if(VN[t] == p[i][j])             
                            {                                 
                                flag = 1;                  
                                break;
                            }                            
                        }                             
                        if(flag == 0)                            
                        {                                  
                            VN[l] = p[i][j];                        
                            l++;                  
                        }                     
                    }                      
                    // 终结符号放入数组VT中                      
                    if(p[i][j]<='Z' && p[i][j]>='A')                    
                    { 
                        flag = 0;                            
                        for(t = 0; t<30&&(VT[t] != ''); t++)           
                        {                                  
                            if(VT[t] == p[i][j])           
                            {
                                flag = 1;                      
                                break;                           
                            }                                
                        }                             
                        if(flag==0)                            
                        {                                   
                            VT[m] = p[i][j];                                
                            m++;                            
                        }                     
                    }   
                }     
            }   
            //把规则右部分分离  放入数组q中   
            count = 0;    
            k =0;       
            for(i = 0;i < line;i++)    
            {
                for(j = 4;j < 30 && (p[i][j] != '');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;     
            }
            //判断是确定的还是非确定的有穷状态自动机  并进行前半部分打印     
            //判断依据:q数组中每一行字符串是否相同      
            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
    
    ");    
                printf("构造的有穷状态自动机为:
    ");            
                printf("NFA  N =(K,∑,M,{S},{Z})
    ");     
            }     
            else   
            {    
                printf("是确定的有穷状态自动机,即DFA
    
    
    "); 
                printf("构造的有穷状态自动机为:
    ");            
                printf("DFA  D =(K,∑,M,{S},{Z})
    ");    
            }       
            printf("其中,
    K = {S");    
            for(i = 0;i < 30 && (VT[i]!='');i++)      
            {                  
                printf(",%c",VT[i]);   
            }    
            printf("}
    ");          
            printf("∑= {");     
            for(i = 0;i < 30 && (VN[i]!='');i++)    
            {                 
                printf("%c  ",VN[i]);   
            }     
            printf("}
    ");     
            //分离文法;           
            k = 0;
            count = 0;         
            for(i = 0; i < line; i++)    
            {          
                j = 4;      
                while(p[i][j] != '')      
                {      
                    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] == '|')     
                        {                      
                            count++;                   
                            k = 0;                            
                            j++;                     
                        }           
                    }                
                }
                count++;      
                k=0;     
            }        
            printf("
    ");            
            //打印M后半部分         
            printf("M:
    ");      
            l =0;       
            while(VN[l] != '')     
            {                    
                printf("M(S,%c)={",VN[l]);                   
                for(i = 0; i < 30; i++)                    
                {                           
                    for(j = 4; j<30 && (q[i][j] != '');j++)                       
                    {                              
                        if(VN[l]==q[i][j]&&(q[i][j+1] == '')&&(q[i][j-1] == '='))               
                            printf("%c ",q[i][0]);                     
                    } 
                    }                    
                    printf("}	");      
                    l++;           
                }        
                printf("
    ");                  
                l = 0;      
                k = 0;
                while(VT[k] != '')     
                {   
                    l =0;
                    while(VN[l] != '')   
                    {                     
                        printf("M(%c,%c)={",VT[k],VN[l]);    
                        for(i = 0; i < 30 ;i++)                  
                        {                         
                            for(j = 4; j<30 && (q[i][j] != '');j++)               
                            {                            
                                if(VT[k] == q[i][j] && VN[l] == q[i][j+1])         
                                    printf("%c ",q[i][0]);                      
                            }                    
                        }                    
                        printf("}	");            
                        l++;           
                    }
                    k++;         
                    printf("
    ");    
                }    
                system("pause"); 
    }

  • 相关阅读:
    WPF 窗口图标与背景
    WPF Convert和RelativeSource
    属性更改通知(INotifyPropertyChanged)——针对ObservableCollection
    WPF 输入异常提示
    WPF 异常处理
    WPF DataGrid 触发器
    拉格朗日乘子法(Lagrange multiplier)和KKT条件
    在同一台电脑上添加多个ssh key
    重积分的换元法
    Matlab之显示输出
  • 原文地址:https://www.cnblogs.com/blueYE00/p/5017309.html
Copyright © 2011-2022 走看看