基于有限狀態(tài)自動機的數(shù)據(jù)類型識別功能(2)
初始數(shù)組以及各標志位
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;//科學(xué)記數(shù)法 12 private final int Scientif_result_code_2=7;//科學(xué)記數(shù)法 13 // 0 2 4 5 狀態(tài)不可輸出
State_table 就是上一章所提到的二維數(shù)組,用于存放各狀態(tài)以及對應(yīng)的轉(zhuǎn)換關(guān)系。
Now_state 表示當前所處的狀態(tài),這里初始化為狀態(tài)0.
Char_* 表示各縱軸數(shù)值
剩下的表示可以輸出的狀態(tài)
初始化數(shù)組
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所以這是一個構(gòu)造方法
使用Arrays.fill可以方便的將所有數(shù)組填滿-1.但是這個方法只支持一位數(shù)組。所以在這里用一個for循環(huán)來遍歷8個一位數(shù)組
最終的數(shù)組就是這個樣子
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 對應(yīng)開頭定義的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 }
在這里總共出現(xiàn)了三個方法,分別是
Change_state(int Old_state,int Char_code)
Input()
Check_science
Change_state(int Old_state,int Char_code)
這個方法是用于將現(xiàn)在所處的狀態(tài)和對應(yīng)的Char_*進行二維表對用,具體實現(xiàn)如下
1 private boolean Output=false;//能否輸出標志 2 private boolean Check=false;//檢查科學(xué)計數(shù)法書寫是否規(guī)范 3 4 private int Erroe_code=0;
1 //通過讀取對應(yīng)數(shù)組的值來確定當前的狀態(tài)值 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) //不可輸出狀態(tài) 6 Output=false; 7 else if(Now_state==-1){ 8 System.out.println("輸入錯誤"); 9 Erroe_code=2; 10 System.exit(1); 11 } 12 else //可輸出狀態(tài) 13 Output=true; 14 15 }
Input()
1 //根據(jù)對應(yīng)的當前狀態(tài)輸出該狀態(tài)的類型 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("科學(xué)計數(shù)法負"); 11 else if(Now_state==Scientif_result_code_2) 12 System.out.println("科學(xué)計數(shù)法"); 13 } 14 else 15 System.out.println("科學(xué)計數(shù)法格式錯誤"); 16 } 17 else{ 18 System.out.println("輸入錯誤"); 19 Erroe_code=2; 20 System.exit(1); 21 } 22 Now_state=0; 23 } 24
其中Check標志位代表科學(xué)記數(shù)法是否符合格式
posted on 2019-07-03 22:52 三好學(xué)生_小標標 閱讀(267) 評論(0) 收藏 舉報
浙公網(wǎng)安備 33010602011771號