ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

基于有限状态自动机的数据类型识别功能(2)

2019-07-03 23:02:07  阅读:124  来源: 互联网

标签:code int 数据类型 private 识别 Char Now state 自动机


初始数组以及各标志位

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

 

标签:code,int,数据类型,private,识别,Char,Now,state,自动机
来源: https://www.cnblogs.com/smallmomo/p/11129622.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有