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

  • 相关阅读:
    [译文] 实体与值对象到底是不是一回事?
    实现 WebApi 自托管服务宿主于 WinForms 及其交互
    [译文] C# 8 已成旧闻, 向前, 抵达 C# 9!
    [译文] 为什么你在 C# 里总是应该使用 "var" 关键字
    通过设置iis在局域网中访问网页
    windows 10 安装使用kafka
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 4) 整合Polly实现瞬时故障处理
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 3) 使用Handler实现传出请求中间件
    ASP.NET Core 2.1 中的 HttpClientFactory (Part 2) 定义命名化和类型化的客户端
    Asp.net Core 2.0 OpenId Connect Handler缺失Claims?
  • 原文地址:https://www.cnblogs.com/smallmomo/p/11129622.html
Copyright © 2011-2022 走看看