基于有限状态自动机的数据类型识别功能(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     }

这个函数用于检查所输入的行里的科学计数法是否符合格式

输入输出如下:

从图中可以看到第四位是科学计数法数字

在一行中判断科学计数法的格式是否正确有点困难,我用的算法如下

(1)找到离字母e左边最近的小数点

(2)找到离字母e左边最近的空格

(3)如果空格在小数点左边 那么该小数点属于科学记数法的小数点

  3.1如果空格在小数点右边那么这个科学计数法没有小数点 错误格式

(4)再判断空格与小数点之间的数字个数,只有一位0-9之间的数字即为正确的格式

(5)若第2步没有找到空格说明该科学记数法在最左边,那么判断离e最近的左边小数点前面又几位数字

测试&调用:

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
原文地址:https://www.cnblogs.com/smallmomo/p/11171839.html