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.spa
Char_* 表示各縱軸數值code
剩下的表示能夠輸出的狀態blog
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因此這是一個構造方法ci
使用Arrays.fill能夠方便的將全部數組填滿-1.可是這個方法只支持一位數組。因此在這裏用一個for循環來遍歷8個一位數組字符串
最終的數組就是這個樣子it
1 -1 -1 -1io
1 2 4 -1for循環
3 -1 -1 -1table
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
這個方法是用於將如今所處的狀態和對應的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 }
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標誌位表明科學記數法是否符合格式