zoukankan      html  css  js  c++  java
  • 基于有限状态自动机的数据类型识别功能(2)

    初始数组以及各标志位

     1     private final int[][] State_table;
     2     private int Now_state=0;
     3     private final int Char_m=0;//表示0-9的字符 49-48
     4     private final int Char_d=1;//表示.字符    45
     5     private final int Char_e=2;//表示e字符    69/101
     6     private final int Char_j=3;//表示-字符    46 
     7     //空格32
     8     
     9     private final int Int_result_code=1;//整型
    10     private final int Float_result_code=3;//浮点型
    11     private final int Scientif_result_code=6;//科学记数法
    12     private final int Scientif_result_code_2=7;//科学记数法
    13     // 0 2 4 5 状态不可输出

    State_table 就是上一章所提到的二维数组,用于存放各状态以及对应的转换关系。

    Now_state 表示当前所处的状态,这里初始化为状态0.

    Char_* 表示各纵轴数值

    剩下的表示可以输出的状态

    初始化数组

     1 FSM(){
     2     State_table=new int[8][4];
     3     int[] b={1,1,3,3,7,6,6,7};
     4     
     5     for(int i=0;i<8;i++)
     6     Arrays.fill(State_table[i],-1);//填满
     7     State_table[1][1]=2;
     8     State_table[1][2]=4;
     9     State_table[3][2]=4;
    10     State_table[4][3]=5;
    11     for(int i=1;i<=8;i++)
    12         State_table[i-1][0]=b[i-1];            
    13     }

    我的类名就叫FSM所以这是一个构造方法

    使用Arrays.fill可以方便的将所有数组填满-1.但是这个方法只支持一位数组。所以在这里用一个for循环来遍历8个一位数组

    最终的数组就是这个样子

    1  -1  -1  -1

    1   2   4  -1

    3  -1  -1  -1

    3  -1   4  -1

    7  -1  -1   5

    6  -1  -1  -1

    6  -1  -1  -1

    7  -1  -1  -1

    行输入并判断每一个字符属于(0还是1 ? 2? 3?) 0 1 2 3 对应开头定义的Char_*

     1     //对输入的字符串进行类型判断
     2     public void Input_Classificantion(String Nowline){        
     3         for(int i=0;i<Nowline.length();i++) {            
     4             if(Nowline.charAt(i)>='0'&&Nowline.charAt(i)<='9')
     5                 Change_state(Now_state,Char_m );
     6             else if(Nowline.charAt(i)=='.')
     7                 Change_state(Now_state, Char_d);
     8             else if(Nowline.charAt(i)=='e'||Nowline.charAt(i)=='E')
     9                 {    Check_science(Nowline,i);
    10                     Change_state(Now_state, Char_e);
    11                 }
    12             else if((Nowline.charAt(i)=='-'))
    13                 Change_state(Now_state, Char_j);
    14             else if(Nowline.charAt(i)==' ') {
    15                 //排除同行的空格
    16                     do {
    17                         i=Nowline.indexOf(' ',i)+1;}
    18                     while(Nowline.charAt(i)==' ');
    19                     i--;
    20                     Input();
    21                 }
    22             else 
    23                 {System.out.println("输入包含非法字符");
    24                 Erroe_code=1;    }        
    25         }
    26         
    27         Input();        
    28     }

    在这里总共出现了三个方法,分别是

    Change_state(int Old_state,int Char_code)

    Input()

    Check_science

    Change_state(int Old_state,int Char_code)

    这个方法是用于将现在所处的状态和对应的Char_*进行二维表对用,具体实现如下

    1     private boolean Output=false;//能否输出标志
    2     private boolean Check=false;//检查科学计数法书写是否规范
    3     
    4     private int Erroe_code=0;
     1     //通过读取对应数组的值来确定当前的状态值
     2     private void Change_state(int Old_state,int Char_code) {
     3         Now_state=State_table[Old_state][Char_code];        
     4         
     5         if(Now_state==0||Now_state==2||Now_state==4||Now_state==5) //不可输出状态                                     
     6             Output=false;
     7         else if(Now_state==-1){
     8                 System.out.println("输入错误");
     9                 Erroe_code=2;
    10                 System.exit(1);
    11             }
    12         else //可输出状态
    13             Output=true;
    14         
    15     }

    Input()

     1     //根据对应的当前状态输出该状态的类型
     2     private  void Input() {
     3         if(Output==true) {
     4             if(Now_state==Int_result_code) 
     5                 System.out.println("整型");
     6             else if(Now_state==Float_result_code)
     7                 System.out.println("浮点型");
     8             else if(Check) {
     9                 if(Now_state==Scientif_result_code)
    10                 System.out.println("科学计数法负");
    11                 else if(Now_state==Scientif_result_code_2)
    12                 System.out.println("科学计数法");
    13             }
    14             else 
    15                 System.out.println("科学计数法格式错误");
    16         }
    17         else{
    18             System.out.println("输入错误");
    19             Erroe_code=2;
    20             System.exit(1);
    21         }
    22         Now_state=0;
    23     }
    24     

    其中Check标志位代表科学记数法是否符合格式

  • 相关阅读:
    viewpaper
    mfc ui 3 swf
    mfc ui3
    mfc ui2
    mfc ui库
    将Cocos2dX渲染到MFC窗口上
    MFC 框架技术简单研讨
    不可忽略的数据库缓存重建
    google bookmarket api
    android 加载大图片
  • 原文地址:https://www.cnblogs.com/smallmomo/p/11129622.html
Copyright © 2011-2022 走看看