博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于有限状态自动机的数据类型识别功能(2)
阅读量:5138 次
发布时间:2019-06-13

本文共 3996 字,大约阅读时间需要 13 分钟。

初始数组以及各标志位

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

 

转载于:https://www.cnblogs.com/smallmomo/p/11129622.html

你可能感兴趣的文章
SNF快速开发平台MVC-EasyQuery-拖拽生成SQL脚本
查看>>
DrawerLayout实现双向侧滑
查看>>
MySQL入门很简单-触发器
查看>>
LVM快照(snapshot)备份
查看>>
绝望的第四周作业
查看>>
一月流水账
查看>>
数论四大定理
查看>>
npm 常用指令
查看>>
20几个正则常用正则表达式
查看>>
TextArea中定位光标位置
查看>>
非常棒的Visual Studo调试插件:OzCode 2.0 下载地址
查看>>
判断字符串在字符串中
查看>>
hdu4374One hundred layer (DP+单调队列)
查看>>
类间关系总结
查看>>
properties配置文件读写,追加
查看>>
Linux环境下MySql安装和常见问题的解决
查看>>
lrzsz——一款好用的文件互传工具
查看>>
ZPL语言完成条形码的打印
查看>>
这20件事千万不要对自己做!
查看>>
Linux环境下Redis安装和常见问题的解决
查看>>