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标志位代表科学记数法是否符合格式

  • 相关阅读:
    堆栈学习
    需要阅读的书籍
    Rust Book Lang Ch.19 Fully Qualified Syntax, Supertraits, Newtype Pattern, type aliases, never type, dynamic sized type
    Rust Lang Book Ch.19 Placeholder type, Default generic type parameter, operator overloading
    Rust Lang Book Ch.19 Unsafe
    Rust Lang Book Ch.18 Patterns and Matching
    Rust Lang Book Ch.17 OOP
    Rust Lang Book Ch.16 Concurrency
    Rust Lang Book Ch.15 Smart Pointers
    HDU3966-Aragorn's Story-树链剖分-点权
  • 原文地址:https://www.cnblogs.com/smallmomo/p/11129622.html
Copyright © 2011-2022 走看看