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