基於有限狀態自動機的數據類型識別功能(3)

Check_science()

 1     private void Check_science(String Nowline,int i) {
 2         int k=Nowline.lastIndexOf('.',i)-1;//找到e最近的左邊.
 3         int j=Nowline.lastIndexOf(' ',i);
 4         if(j!=-1) {//有空格時
 5             if(k<=j)//點在空格前面或者點前一個位置就是空格
 6                 Check=false;
 7             else if(Nowline.charAt(k)>='0'
 8                     &&Nowline.charAt(k)<='9'
 9                     &&(Nowline.charAt(k-1)==' ')
10                     )
11                         Check=true;
12             else
13                 Check=false;
14         }
15         else if(k==0)
16             Check=true;
17         else 
18             Check=false;
19     }

這個函數用於檢查所輸入的行裏的科學計數法是否符合格式java

輸入輸出以下:算法

從圖中能夠看到第四位是科學計數法數字數組

在一行中判斷科學計數法的格式是否正確有點困難,我用的算法以下ide

(1)找到離字母e左邊最近的小數點函數

(2)找到離字母e左邊最近的空格測試

(3)若是空格在小數點左邊 那麼該小數點屬於科學記數法的小數點spa

  3.1若是空格在小數點右邊那麼這個科學計數法沒有小數點 錯誤格式code

(4)再判斷空格與小數點之間的數字個數,只有一位0-9之間的數字即爲正確的格式blog

(5)若第2步沒有找到空格說明該科學記數法在最左邊,那麼判斷離e最近的左邊小數點前面又幾位數字ci

 

測試&調用:

1     public static void main(String[] args) {
2         Scanner input=new Scanner(System.in);
3         String nowline=input.nextLine().trim();
4         FSM a=new FSM();
5         a.Input_Classificantion(nowline);
6             
7     }

 

完整代碼:

  1 import java.util.Arrays;
  2 import java.util.Scanner;
  3 public class FSM {
  4     private final int[][] State_table;
  5     private int Now_state=0;
  6     private final int Char_m=0;//表示0-9的字符 49-48
  7     private final int Char_d=1;//表示.字符    45
  8     private final int Char_e=2;//表示e字符    69/101
  9     private final int Char_j=3;//表示-字符    46 
 10     //空格32
 11     
 12     private final int Int_result_code=1;//整型
 13     private final int Float_result_code=3;//浮點型
 14     private final int Scientif_result_code=6;//科學記數法
 15     private final int Scientif_result_code_2=7;//科學記數法
 16     // 0 2 4 5 狀態不可輸出
 17     
 18     private boolean Output=false;//可否輸出標誌
 19     private boolean Check=false;//檢查科學計數法書寫是否規範
 20     
 21     private int Erroe_code=0;
 22     //錯誤1:輸入非(數字.e-)字符
 23     //錯誤2:處於沒法輸出的狀態中
 24     
 25     //初始化二維表
 26     FSM(){
 27     State_table=new int[8][4];
 28     int[] b={1,1,3,3,7,6,6,7};
 29     
 30     for(int i=0;i<8;i++)
 31     Arrays.fill(State_table[i],-1);//填滿
 32     State_table[1][1]=2;
 33     State_table[1][2]=4;
 34     State_table[3][2]=4;
 35     State_table[4][3]=5;
 36     for(int i=1;i<=8;i++)
 37         State_table[i-1][0]=b[i-1];            
 38     }
 39     
 40     //經過讀取對應數組的值來肯定當前的狀態值
 41     private void Change_state(int Old_state,int Char_code) {
 42         Now_state=State_table[Old_state][Char_code];        
 43         
 44         if(Now_state==0||Now_state==2||Now_state==4||Now_state==5) //不可輸出狀態                                     
 45             Output=false;
 46         else if(Now_state==-1){
 47                 System.out.println("輸入錯誤");
 48                 Erroe_code=2;
 49                 System.exit(1);
 50             }
 51         else //可輸出狀態
 52             Output=true;
 53         
 54     }
 55 
 56     //對輸入的字符串進行類型判斷
 57     public void Input_Classificantion(String Nowline){        
 58         for(int i=0;i<Nowline.length();i++) {            
 59             if(Nowline.charAt(i)>='0'&&Nowline.charAt(i)<='9')
 60                 Change_state(Now_state,Char_m );
 61             else if(Nowline.charAt(i)=='.')
 62                 Change_state(Now_state, Char_d);
 63             else if(Nowline.charAt(i)=='e'||Nowline.charAt(i)=='E')
 64                 {    Check_science(Nowline,i);
 65                     Change_state(Now_state, Char_e);
 66                 }
 67             else if((Nowline.charAt(i)=='-'))
 68                 Change_state(Now_state, Char_j);
 69             else if(Nowline.charAt(i)==' ') {
 70                 //排除同行的空格
 71                     do {
 72                         i=Nowline.indexOf(' ',i)+1;}
 73                     while(Nowline.charAt(i)==' ');
 74                     i--;
 75                     Input();
 76                 }
 77             else 
 78                 {System.out.println("輸入包含非法字符");
 79                 Erroe_code=1;    }        
 80         }
 81         
 82         Input();        
 83     }
 84     
 85     //根據對應的當前狀態輸出該狀態的類型
 86     private  void Input() {
 87         if(Output==true) {
 88             if(Now_state==Int_result_code) 
 89                 System.out.println("整型");
 90             else if(Now_state==Float_result_code)
 91                 System.out.println("浮點型");
 92             else if(Check) {
 93                 if(Now_state==Scientif_result_code)
 94                 System.out.println("科學計數法負");
 95                 else if(Now_state==Scientif_result_code_2)
 96                 System.out.println("科學計數法");
 97             }
 98             else 
 99                 System.out.println("科學計數法格式錯誤");
100         }
101         else{
102             System.out.println("輸入錯誤");
103             Erroe_code=2;
104             System.exit(1);
105         }
106         Now_state=0;
107     }
108     
109     
110     private void Check_science(String Nowline,int i) {
111         int k=Nowline.lastIndexOf('.',i)-1;//找到e最近的左邊.
112         int j=Nowline.lastIndexOf(' ',i);
113         if(j!=-1) {//有空格時
114             if(k<=j)//點在空格前面或者點前一個位置就是空格
115                 Check=false;
116             else if(Nowline.charAt(k)>='0'
117                     &&Nowline.charAt(k)<='9'
118                     &&(Nowline.charAt(k-1)==' ')
119                     )
120                         Check=true;
121             else
122                 Check=false;
123         }
124         else if(k==0)
125             Check=true;
126         else 
127             Check=false;
128     }
129     
130     public static void main(String[] args) {
131         Scanner input=new Scanner(System.in);
132         String nowline=input.nextLine().trim();
133         FSM a=new FSM();
134         a.Input_Classificantion(nowline);
135             
136     }
137     
138 }
View Code
相關文章
相關標籤/搜索